|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r83213 - in sandbox/contract: . doc doc/html doc/html/contract doc/html/contract__ doc/src doc/src/images doc/src/images/callouts example example/cline90 example/concepts example/contracts example/meyer97 example/mitchell02 example/mitchell02/counter example/mitchell02/observer example/n1962 example/n2081 example/named_parameters example/named_parameters/deduced_params_pydef_module example/named_parameters/named_template_params_pyclass_module example/stroustrup97 example/virtual_specifiers include include/contract include/contract/aux_ include/contract/aux_/call include/contract/aux_/call/impl_ include/contract/aux_/macro include/contract/aux_/macro/code_ include/contract/aux_/macro/code_/named_params_ include/contract/aux_/preprocessor include/contract/aux_/preprocessor/iteration include/contract/aux_/subcontract include/contract/detail include/contract/detail/preprocessor include/contract/detail/preprocessor/array include/contract/detail/preprocessor/facilities include/contract/detail/preprocessor/keyword include/contract/detail/preprocessor/keyword/contract include/contract/detail/preprocessor/keyword/cstddef include/contract/detail/preprocessor/keyword/cxx11 include/contract/detail/preprocessor/keyword/cxx11/cstddef include/contract/detail/preprocessor/keyword/facilities include/contract/detail/preprocessor/list include/contract/detail/preprocessor/punctuation include/contract/detail/preprocessor/seq include/contract/detail/preprocessor/traits include/contract/detail/preprocessor/traits/aux_ include/contract/detail/preprocessor/traits/base include/contract/detail/preprocessor/traits/class include/contract/detail/preprocessor/traits/func include/contract/detail/preprocessor/traits/func_param include/contract/detail/preprocessor/traits/oldof include/contract/detail/preprocessor/traits/params include/contract/detail/preprocessor/traits/template_param include/contract/detail/preprocessor/tuple include/contract/detail/preprocessor/variadic tools tools/boost_setup
From: lorcaminiti_at_[hidden]
Date: 2013-02-28 17:57:58
Author: lcaminiti
Date: 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
New Revision: 83213
URL: http://svn.boost.org/trac/boost/changeset/83213
Log:
Added Contract++ 0.4.1 into Boost sandbox. This code (reviewed and accepted into Boost) will serve as the base for Boost.Contract.
Added:
sandbox/contract/
sandbox/contract/COPYRIGHT.txt (contents, props changed)
sandbox/contract/Jamroot (contents, props changed)
sandbox/contract/LICENSE_1_0.txt (contents, props changed)
sandbox/contract/README.txt (contents, props changed)
sandbox/contract/doc/
sandbox/contract/doc/Jamfile.v2 (contents, props changed)
sandbox/contract/doc/acknowledgments.qbk (contents, props changed)
sandbox/contract/doc/advanced_topics.qbk (contents, props changed)
sandbox/contract/doc/bibliography.qbk (contents, props changed)
sandbox/contract/doc/bjam.py (contents, props changed)
sandbox/contract/doc/concepts.qbk (contents, props changed)
sandbox/contract/doc/contract_programming_overview.qbk (contents, props changed)
sandbox/contract/doc/contractpp.qbk (contents, props changed)
sandbox/contract/doc/examples.qbk (contents, props changed)
sandbox/contract/doc/full_table_of_contents.qbk (contents, props changed)
sandbox/contract/doc/getting_started.qbk (contents, props changed)
sandbox/contract/doc/grammar.qbk (contents, props changed)
sandbox/contract/doc/html/
sandbox/contract/doc/html/CONTRACT_BLOCK_INVARIANT.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_BLOCK_INVARIANT_TPL.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_CLASS.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_CLASS_INVARIANT.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_CLASS_INVARIANT_TPL.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_CLASS_TPL.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_CONFIG_ARRAY_DIMENSION_MAX.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_CONFIG_FUNCTION_ARITY_MAX.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_CONFIG_INHERITANCE_MAX.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_CONFIG_NO_BLOCK_INVARIANTS.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_CONFIG_NO_CLASS_INVARIANTS.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_CONFIG_NO_LOOP_VARIANTS.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_CONFIG_NO_POSTCONDITIONS.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_CONFIG_NO_PRECONDITIONS.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_CONFIG_OLDOF_MAX.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_CONFIG_THREAD_SAFE.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_CONSTRUCTOR.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_CONSTRUCTOR_ARG.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_CONSTRUCTOR_BODY.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_CONSTRUCTOR_TPL.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_DESTRUCTOR.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_DESTRUCTOR_BODY.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_DESTRUCTOR_TPL.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_FREE_BODY.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_FUNCTION.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_FUNCTION_TPL.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_LIMIT_OLDOFS.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_LOOP.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_LOOP_VARIANT.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_LOOP_VARIANT_TPL.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_MEMBER_BODY.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_OLDOF.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_PARAMETER.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_PARAMETER_BODY.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_PARAMETER_TYPEOF.html (contents, props changed)
sandbox/contract/doc/html/CONTRACT_TEMPLATE_PARAMETER.html (contents, props changed)
sandbox/contract/doc/html/contract/
sandbox/contract/doc/html/contract/block_invariant_broken.html (contents, props changed)
sandbox/contract/doc/html/contract/broken.html (contents, props changed)
sandbox/contract/doc/html/contract/broken_contract_handler.html (contents, props changed)
sandbox/contract/doc/html/contract/class_invariant_b_id488563.html (contents, props changed)
sandbox/contract/doc/html/contract/class_invariant_b_id488641.html (contents, props changed)
sandbox/contract/doc/html/contract/class_invariant_b_id488719.html (contents, props changed)
sandbox/contract/doc/html/contract/copy.html (contents, props changed)
sandbox/contract/doc/html/contract/from.html (contents, props changed)
sandbox/contract/doc/html/contract/has_oldof.html (contents, props changed)
sandbox/contract/doc/html/contract/loop_variant_broken.html (contents, props changed)
sandbox/contract/doc/html/contract/postcondition_broken.html (contents, props changed)
sandbox/contract/doc/html/contract/precondition_broken.html (contents, props changed)
sandbox/contract/doc/html/contract__/
sandbox/contract/doc/html/contract__/acknowledgments.html (contents, props changed)
sandbox/contract/doc/html/contract__/advanced_topics.html (contents, props changed)
sandbox/contract/doc/html/contract__/bibliography.html (contents, props changed)
sandbox/contract/doc/html/contract__/concepts.html (contents, props changed)
sandbox/contract/doc/html/contract__/contract_programming_overview.html (contents, props changed)
sandbox/contract/doc/html/contract__/examples.html (contents, props changed)
sandbox/contract/doc/html/contract__/full_table_of_contents.html (contents, props changed)
sandbox/contract/doc/html/contract__/getting_started.html (contents, props changed)
sandbox/contract/doc/html/contract__/grammar.html (contents, props changed)
sandbox/contract/doc/html/contract__/named_parameters.html (contents, props changed)
sandbox/contract/doc/html/contract__/no_variadic_macros.html (contents, props changed)
sandbox/contract/doc/html/contract__/release_notes.html (contents, props changed)
sandbox/contract/doc/html/contract__/tutorial.html (contents, props changed)
sandbox/contract/doc/html/contract__/virtual_specifiers.html (contents, props changed)
sandbox/contract/doc/html/contractpp.pdf (contents, props changed)
sandbox/contract/doc/html/index.html (contents, props changed)
sandbox/contract/doc/html/reference.html (contents, props changed)
sandbox/contract/doc/introduction.qbk (contents, props changed)
sandbox/contract/doc/named_parameters.qbk (contents, props changed)
sandbox/contract/doc/navbar.xsl (contents, props changed)
sandbox/contract/doc/no_variadic_macros.qbk (contents, props changed)
sandbox/contract/doc/release_notes.qbk (contents, props changed)
sandbox/contract/doc/src/
sandbox/contract/doc/src/boost.xml (contents, props changed)
sandbox/contract/doc/src/boostbook.css (contents, props changed)
sandbox/contract/doc/src/docutils.css (contents, props changed)
sandbox/contract/doc/src/images/
sandbox/contract/doc/src/images/alert.png (contents, props changed)
sandbox/contract/doc/src/images/blank.png (contents, props changed)
sandbox/contract/doc/src/images/callouts/
sandbox/contract/doc/src/images/callouts/1.png (contents, props changed)
sandbox/contract/doc/src/images/callouts/1.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/10.png (contents, props changed)
sandbox/contract/doc/src/images/callouts/10.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/11.png (contents, props changed)
sandbox/contract/doc/src/images/callouts/11.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/12.png (contents, props changed)
sandbox/contract/doc/src/images/callouts/12.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/13.png (contents, props changed)
sandbox/contract/doc/src/images/callouts/13.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/14.png (contents, props changed)
sandbox/contract/doc/src/images/callouts/14.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/15.png (contents, props changed)
sandbox/contract/doc/src/images/callouts/15.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/16.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/17.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/18.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/19.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/2.png (contents, props changed)
sandbox/contract/doc/src/images/callouts/2.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/20.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/21.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/22.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/23.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/24.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/25.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/26.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/27.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/28.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/29.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/3.png (contents, props changed)
sandbox/contract/doc/src/images/callouts/3.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/30.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/4.png (contents, props changed)
sandbox/contract/doc/src/images/callouts/4.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/5.png (contents, props changed)
sandbox/contract/doc/src/images/callouts/5.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/6.png (contents, props changed)
sandbox/contract/doc/src/images/callouts/6.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/7.png (contents, props changed)
sandbox/contract/doc/src/images/callouts/7.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/8.png (contents, props changed)
sandbox/contract/doc/src/images/callouts/8.svg (contents, props changed)
sandbox/contract/doc/src/images/callouts/9.png (contents, props changed)
sandbox/contract/doc/src/images/callouts/9.svg (contents, props changed)
sandbox/contract/doc/src/images/caution.png (contents, props changed)
sandbox/contract/doc/src/images/caution.svg (contents, props changed)
sandbox/contract/doc/src/images/draft.png (contents, props changed)
sandbox/contract/doc/src/images/home.png (contents, props changed)
sandbox/contract/doc/src/images/home.svg (contents, props changed)
sandbox/contract/doc/src/images/important.png (contents, props changed)
sandbox/contract/doc/src/images/important.svg (contents, props changed)
sandbox/contract/doc/src/images/next.png (contents, props changed)
sandbox/contract/doc/src/images/next.svg (contents, props changed)
sandbox/contract/doc/src/images/next_disabled.png (contents, props changed)
sandbox/contract/doc/src/images/note.png (contents, props changed)
sandbox/contract/doc/src/images/note.svg (contents, props changed)
sandbox/contract/doc/src/images/prev.png (contents, props changed)
sandbox/contract/doc/src/images/prev.svg (contents, props changed)
sandbox/contract/doc/src/images/prev_disabled.png (contents, props changed)
sandbox/contract/doc/src/images/smiley.png (contents, props changed)
sandbox/contract/doc/src/images/tip.png (contents, props changed)
sandbox/contract/doc/src/images/tip.svg (contents, props changed)
sandbox/contract/doc/src/images/toc-blank.png (contents, props changed)
sandbox/contract/doc/src/images/toc-minus.png (contents, props changed)
sandbox/contract/doc/src/images/toc-plus.png (contents, props changed)
sandbox/contract/doc/src/images/up.png (contents, props changed)
sandbox/contract/doc/src/images/up.svg (contents, props changed)
sandbox/contract/doc/src/images/up_disabled.png (contents, props changed)
sandbox/contract/doc/src/images/warning.png (contents, props changed)
sandbox/contract/doc/src/images/warning.svg (contents, props changed)
sandbox/contract/doc/src/minimal.css (contents, props changed)
sandbox/contract/doc/src/reference.css (contents, props changed)
sandbox/contract/doc/tutorial.qbk (contents, props changed)
sandbox/contract/doc/virtual_specifiers.qbk (contents, props changed)
sandbox/contract/example/
sandbox/contract/example/Jamfile.v2 (contents, props changed)
sandbox/contract/example/cline90/
sandbox/contract/example/cline90/calendar.cpp (contents, props changed)
sandbox/contract/example/cline90/stack.cpp (contents, props changed)
sandbox/contract/example/cline90/vector.hpp (contents, props changed)
sandbox/contract/example/cline90/vector_app.hpp (contents, props changed)
sandbox/contract/example/cline90/vector_main.cpp (contents, props changed)
sandbox/contract/example/cline90/vstack.cpp (contents, props changed)
sandbox/contract/example/concepts/
sandbox/contract/example/concepts/class_member_concept_vector.cpp (contents, props changed)
sandbox/contract/example/concepts/class_member_concept_vector.hpp (contents, props changed)
sandbox/contract/example/concepts/class_member_concept_vector_constructor_error.cpp (contents, props changed)
sandbox/contract/example/concepts/class_member_concept_vector_error.cpp (contents, props changed)
sandbox/contract/example/concepts/class_member_concept_vector_member_error.cpp (contents, props changed)
sandbox/contract/example/concepts/concept_def.cpp (contents, props changed)
sandbox/contract/example/concepts/concept_def_npaper.cpp (contents, props changed)
sandbox/contract/example/concepts/free_concept_operator_preinc.cpp (contents, props changed)
sandbox/contract/example/concepts/free_concept_operator_preinc.hpp (contents, props changed)
sandbox/contract/example/concepts/free_concept_operator_preinc_error.cpp (contents, props changed)
sandbox/contract/example/contracts/
sandbox/contract/example/contracts/assertion_complexity_factorial.cpp (contents, props changed)
sandbox/contract/example/contracts/assertion_requirements_push_back.cpp (contents, props changed)
sandbox/contract/example/contracts/assertion_statement_ialloc.cpp (contents, props changed)
sandbox/contract/example/contracts/blockinv_loopvar_gcd.cpp (contents, props changed)
sandbox/contract/example/contracts/body_natural.cpp (contents, props changed)
sandbox/contract/example/contracts/body_natural.hpp (contents, props changed)
sandbox/contract/example/contracts/body_natural_impl.hpp (contents, props changed)
sandbox/contract/example/contracts/broken_handler_sqrt.cpp (contents, props changed)
sandbox/contract/example/contracts/class_ivector.cpp (contents, props changed)
sandbox/contract/example/contracts/class_template_vector.cpp (contents, props changed)
sandbox/contract/example/contracts/class_template_vector_seq.cpp (contents, props changed)
sandbox/contract/example/contracts/class_template_vector_seq_nova.cpp (contents, props changed)
sandbox/contract/example/contracts/const_assertion_number.cpp (contents, props changed)
sandbox/contract/example/contracts/const_assertion_number_global_error.cpp (contents, props changed)
sandbox/contract/example/contracts/const_assertion_number_static_error.cpp (contents, props changed)
sandbox/contract/example/contracts/const_select_assertion_factorial.cpp (contents, props changed)
sandbox/contract/example/contracts/const_select_assertion_factorial_error.cpp (contents, props changed)
sandbox/contract/example/contracts/contract_failure.cpp (contents, props changed)
sandbox/contract/example/contracts/copy_inc.cpp (contents, props changed)
sandbox/contract/example/contracts/default_subcontracting_base.cpp (contents, props changed)
sandbox/contract/example/contracts/exception_array.cpp (contents, props changed)
sandbox/contract/example/contracts/friend_counter.cpp (contents, props changed)
sandbox/contract/example/contracts/function_template_postinc.cpp (contents, props changed)
sandbox/contract/example/contracts/has_oldof_inc.cpp (contents, props changed)
sandbox/contract/example/contracts/macro_commas_symbols_integral_map.cpp (contents, props changed)
sandbox/contract/example/contracts/macro_commas_symbols_integral_map_seq.cpp (contents, props changed)
sandbox/contract/example/contracts/macro_commas_symbols_integral_map_seq_nova.cpp (contents, props changed)
sandbox/contract/example/contracts/member_operator_string.cpp (contents, props changed)
sandbox/contract/example/contracts/nested_class_bitset.cpp (contents, props changed)
sandbox/contract/example/contracts/no_contract_ivector.cpp (contents, props changed)
sandbox/contract/example/contracts/no_contract_postinc.cpp (contents, props changed)
sandbox/contract/example/contracts/no_pre_post_postinc.cpp (contents, props changed)
sandbox/contract/example/contracts/nova.hpp (contents, props changed)
sandbox/contract/example/contracts/params_funcptr_array_apply.cpp (contents, props changed)
sandbox/contract/example/contracts/params_postinc.cpp (contents, props changed)
sandbox/contract/example/contracts/post_also_postinc.cpp (contents, props changed)
sandbox/contract/example/contracts/pre_only_postinc.cpp (contents, props changed)
sandbox/contract/example/contracts/push_back.cpp (contents, props changed)
sandbox/contract/example/contracts/push_back_lines.cpp (contents, props changed)
sandbox/contract/example/contracts/push_back_npaper.cpp (contents, props changed)
sandbox/contract/example/contracts/pushable.hpp (contents, props changed)
sandbox/contract/example/contracts/pushable_seq.hpp (contents, props changed)
sandbox/contract/example/contracts/select_assertion_factorial.cpp (contents, props changed)
sandbox/contract/example/contracts/static_assertion_memcopy.cpp (contents, props changed)
sandbox/contract/example/contracts/static_contract_instance_counter.cpp (contents, props changed)
sandbox/contract/example/contracts/subcontract_identifiers.cpp (contents, props changed)
sandbox/contract/example/contracts/subcontract_pre_natural_failure.cpp (contents, props changed)
sandbox/contract/example/contracts/template_params.cpp (contents, props changed)
sandbox/contract/example/contracts/template_specializations_vector.cpp (contents, props changed)
sandbox/contract/example/contracts/typed_counter.cpp (contents, props changed)
sandbox/contract/example/contracts/volatile_contract_shared_instance.cpp (contents, props changed)
sandbox/contract/example/meyer97/
sandbox/contract/example/meyer97/gcd.cpp (contents, props changed)
sandbox/contract/example/meyer97/gcd.e (contents, props changed)
sandbox/contract/example/meyer97/maxarray.cpp (contents, props changed)
sandbox/contract/example/meyer97/stack3.cpp (contents, props changed)
sandbox/contract/example/meyer97/stack4.e (contents, props changed)
sandbox/contract/example/meyer97/stack4.hpp (contents, props changed)
sandbox/contract/example/meyer97/stack4_main.cpp (contents, props changed)
sandbox/contract/example/mitchell02/
sandbox/contract/example/mitchell02/counter/
sandbox/contract/example/mitchell02/counter/counter.hpp (contents, props changed)
sandbox/contract/example/mitchell02/counter/decrement_button.hpp (contents, props changed)
sandbox/contract/example/mitchell02/counter/push_button.hpp (contents, props changed)
sandbox/contract/example/mitchell02/counter_main.cpp (contents, props changed)
sandbox/contract/example/mitchell02/courier.cpp (contents, props changed)
sandbox/contract/example/mitchell02/courier.hpp (contents, props changed)
sandbox/contract/example/mitchell02/courier_main.cpp (contents, props changed)
sandbox/contract/example/mitchell02/customer_manager.cpp (contents, props changed)
sandbox/contract/example/mitchell02/customer_manager.hpp (contents, props changed)
sandbox/contract/example/mitchell02/customer_manager_main.cpp (contents, props changed)
sandbox/contract/example/mitchell02/dictionary.cpp (contents, props changed)
sandbox/contract/example/mitchell02/name_list.cpp (contents, props changed)
sandbox/contract/example/mitchell02/name_list.hpp (contents, props changed)
sandbox/contract/example/mitchell02/name_list_main.cpp (contents, props changed)
sandbox/contract/example/mitchell02/observer/
sandbox/contract/example/mitchell02/observer/observer.hpp (contents, props changed)
sandbox/contract/example/mitchell02/observer/subject.hpp (contents, props changed)
sandbox/contract/example/mitchell02/observer_main.cpp (contents, props changed)
sandbox/contract/example/mitchell02/simple_queue.cpp (contents, props changed)
sandbox/contract/example/mitchell02/stack.cpp (contents, props changed)
sandbox/contract/example/n1962/
sandbox/contract/example/n1962/block_invariant.cpp (contents, props changed)
sandbox/contract/example/n1962/circle.cpp (contents, props changed)
sandbox/contract/example/n1962/equal.hpp (contents, props changed)
sandbox/contract/example/n1962/equal_main.cpp (contents, props changed)
sandbox/contract/example/n1962/equal_not.hpp (contents, props changed)
sandbox/contract/example/n1962/factorial.cpp (contents, props changed)
sandbox/contract/example/n1962/sqrt.cpp (contents, props changed)
sandbox/contract/example/n1962/sqrt.d (contents, props changed)
sandbox/contract/example/n1962/sum.cpp (contents, props changed)
sandbox/contract/example/n1962/sum.hpp (contents, props changed)
sandbox/contract/example/n1962/sum_main.cpp (contents, props changed)
sandbox/contract/example/n1962/vector.cpp (contents, props changed)
sandbox/contract/example/n1962/vector.hpp (contents, props changed)
sandbox/contract/example/n1962/vector_npaper.hpp (contents, props changed)
sandbox/contract/example/n2081/
sandbox/contract/example/n2081/add.cpp (contents, props changed)
sandbox/contract/example/n2081/add.hpp (contents, props changed)
sandbox/contract/example/n2081/add_error.cpp (contents, props changed)
sandbox/contract/example/n2081/advance.cpp (contents, props changed)
sandbox/contract/example/n2081/apply.cpp (contents, props changed)
sandbox/contract/example/n2081/convert.cpp (contents, props changed)
sandbox/contract/example/n2081/convert.hpp (contents, props changed)
sandbox/contract/example/n2081/convert_error.cpp (contents, props changed)
sandbox/contract/example/n2081/count.cpp (contents, props changed)
sandbox/contract/example/n2081/deref.cpp (contents, props changed)
sandbox/contract/example/n2081/equal.cpp (contents, props changed)
sandbox/contract/example/n2081/equal.hpp (contents, props changed)
sandbox/contract/example/n2081/equal_error.cpp (contents, props changed)
sandbox/contract/example/n2081/find.cpp (contents, props changed)
sandbox/contract/example/n2081/find.hpp (contents, props changed)
sandbox/contract/example/n2081/find_error.cpp (contents, props changed)
sandbox/contract/example/n2081/for_each.cpp (contents, props changed)
sandbox/contract/example/n2081/less_eq.cpp (contents, props changed)
sandbox/contract/example/n2081/min.cpp (contents, props changed)
sandbox/contract/example/n2081/min.hpp (contents, props changed)
sandbox/contract/example/n2081/min_error.cpp (contents, props changed)
sandbox/contract/example/n2081/transform.cpp (contents, props changed)
sandbox/contract/example/named_parameters/
sandbox/contract/example/named_parameters/constructor_named_params_family.cpp (contents, props changed)
sandbox/contract/example/named_parameters/deduced_params_pydef.cpp (contents, props changed)
sandbox/contract/example/named_parameters/deduced_params_pydef.py (contents, props changed)
sandbox/contract/example/named_parameters/deduced_params_pydef_module/
sandbox/contract/example/named_parameters/deduced_params_pydef_module/named_parameters_deduced_params_pydef_module.cpp (contents, props changed)
sandbox/contract/example/named_parameters/deduced_params_pydef_module/nob_named_parameters_deduced_params_pydef_module.cpp (contents, props changed)
sandbox/contract/example/named_parameters/deduced_params_pydef_module/nobl_named_parameters_deduced_params_pydef_module.cpp (contents, props changed)
sandbox/contract/example/named_parameters/deduced_params_pydef_module/noe_named_parameters_deduced_params_pydef_module.cpp (contents, props changed)
sandbox/contract/example/named_parameters/deduced_params_pydef_module/noei_named_parameters_deduced_params_pydef_module.cpp (contents, props changed)
sandbox/contract/example/named_parameters/deduced_params_pydef_module/noeo_named_parameters_deduced_params_pydef_module.cpp (contents, props changed)
sandbox/contract/example/named_parameters/deduced_params_pydef_module/noeoi_named_parameters_deduced_params_pydef_module.cpp (contents, props changed)
sandbox/contract/example/named_parameters/deduced_params_pydef_module/noeoibl_named_parameters_deduced_params_pydef_module.cpp (contents, props changed)
sandbox/contract/example/named_parameters/deduced_params_pydef_module/noi_named_parameters_deduced_params_pydef_module.cpp (contents, props changed)
sandbox/contract/example/named_parameters/deduced_params_pydef_module/nol_named_parameters_deduced_params_pydef_module.cpp (contents, props changed)
sandbox/contract/example/named_parameters/deduced_params_pydef_module/noo_named_parameters_deduced_params_pydef_module.cpp (contents, props changed)
sandbox/contract/example/named_parameters/deduced_params_pydef_module/nooi_named_parameters_deduced_params_pydef_module.cpp (contents, props changed)
sandbox/contract/example/named_parameters/member_named_params_callable2.cpp (contents, props changed)
sandbox/contract/example/named_parameters/named_param_identifiers_failure.cpp (contents, props changed)
sandbox/contract/example/named_parameters/named_param_identifiers_positive.cpp (contents, props changed)
sandbox/contract/example/named_parameters/named_params_dfs.cpp (contents, props changed)
sandbox/contract/example/named_parameters/named_template_params_pyclass.cpp (contents, props changed)
sandbox/contract/example/named_parameters/named_template_params_pyclass.py (contents, props changed)
sandbox/contract/example/named_parameters/named_template_params_pyclass_module/
sandbox/contract/example/named_parameters/named_template_params_pyclass_module/named_parameters_named_template_params_pyclass_module.cpp (contents, props changed)
sandbox/contract/example/named_parameters/named_template_params_pyclass_module/nob_named_parameters_named_template_params_pyclass_module.cpp (contents, props changed)
sandbox/contract/example/named_parameters/named_template_params_pyclass_module/nobl_named_parameters_named_template_params_pyclass_module.cpp (contents, props changed)
sandbox/contract/example/named_parameters/named_template_params_pyclass_module/noe_named_parameters_named_template_params_pyclass_module.cpp (contents, props changed)
sandbox/contract/example/named_parameters/named_template_params_pyclass_module/noei_named_parameters_named_template_params_pyclass_module.cpp (contents, props changed)
sandbox/contract/example/named_parameters/named_template_params_pyclass_module/noeo_named_parameters_named_template_params_pyclass_module.cpp (contents, props changed)
sandbox/contract/example/named_parameters/named_template_params_pyclass_module/noeoi_named_parameters_named_template_params_pyclass_module.cpp (contents, props changed)
sandbox/contract/example/named_parameters/named_template_params_pyclass_module/noeoibl_named_parameters_named_template_params_pyclass_module.cpp (contents, props changed)
sandbox/contract/example/named_parameters/named_template_params_pyclass_module/noi_named_parameters_named_template_params_pyclass_module.cpp (contents, props changed)
sandbox/contract/example/named_parameters/named_template_params_pyclass_module/nol_named_parameters_named_template_params_pyclass_module.cpp (contents, props changed)
sandbox/contract/example/named_parameters/named_template_params_pyclass_module/noo_named_parameters_named_template_params_pyclass_module.cpp (contents, props changed)
sandbox/contract/example/named_parameters/named_template_params_pyclass_module/nooi_named_parameters_named_template_params_pyclass_module.cpp (contents, props changed)
sandbox/contract/example/stroustrup97/
sandbox/contract/example/stroustrup97/string.cpp (contents, props changed)
sandbox/contract/example/stroustrup97/string.hpp (contents, props changed)
sandbox/contract/example/stroustrup97/string_main.cpp (contents, props changed)
sandbox/contract/example/virtual_specifiers/
sandbox/contract/example/virtual_specifiers/final_class.cpp (contents, props changed)
sandbox/contract/example/virtual_specifiers/final_class.hpp (contents, props changed)
sandbox/contract/example/virtual_specifiers/final_class_error.cpp (contents, props changed)
sandbox/contract/example/virtual_specifiers/final_member.cpp (contents, props changed)
sandbox/contract/example/virtual_specifiers/final_member.hpp (contents, props changed)
sandbox/contract/example/virtual_specifiers/final_member_error.cpp (contents, props changed)
sandbox/contract/example/virtual_specifiers/new_member.cpp (contents, props changed)
sandbox/contract/example/virtual_specifiers/new_member.hpp (contents, props changed)
sandbox/contract/example/virtual_specifiers/new_member_error.cpp (contents, props changed)
sandbox/contract/example/virtual_specifiers/override_member.cpp (contents, props changed)
sandbox/contract/example/virtual_specifiers/override_member.hpp (contents, props changed)
sandbox/contract/example/virtual_specifiers/override_member_error.cpp (contents, props changed)
sandbox/contract/include/
sandbox/contract/include/contract/
sandbox/contract/include/contract.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/
sandbox/contract/include/contract/aux_/arg_const.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/bind_old.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/call/
sandbox/contract/include/contract/aux_/call/constructor_entry.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/call/constructor_exit.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/call/destructor.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/call/free_function.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/call/globals.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/call/impl_/
sandbox/contract/include/contract/aux_/call/impl_/define.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/call/impl_/function.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/call/impl_/include.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/call/impl_/undef.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/call/nonstatic_member_function.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/call/static_member_function.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/concept_assert.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/config.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/constructor_inits_eval.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/constructor_try_block_guard.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/copy_result.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/debug.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/has_xxx_member_function.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/identity_equal.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/loop_variant.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/
sandbox/contract/include/contract/aux_/macro/block_invariant.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/body.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/class.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/class_invariant.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/
sandbox/contract/include/contract/aux_/macro/code_/assert.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/assertion_func.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/base.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/body.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/class.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/class_concept.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/class_final.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/class_invariant_const.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/class_invariant_const_volatile.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/class_invariant_static.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/const_expr.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/constructor_entry.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/exception_spec.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/final.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/func.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/loop_variant.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/name.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/named_params_/
sandbox/contract/include/contract/aux_/macro/code_/named_params_/boost_.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/named_params_/constructor.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/named_params_/contracted.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/named_params_/function.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/named_params_class_template.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/named_params_func.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/new.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/oldof.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/oldof_type.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/override.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/postcondition.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/precondition.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/result_type.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/signature.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/subcontract.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/template.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/typename.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/code_/virtual.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/function.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/loop_variant.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/macro/parameter.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/mpl_assert.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/named_params.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/oldof.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/preprocessor/
sandbox/contract/include/contract/aux_/preprocessor/func_kind.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/preprocessor/iteration/
sandbox/contract/include/contract/aux_/preprocessor/iteration/arity_1.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/preprocessor/iteration/cv_member_2.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/preprocessor/iteration/params.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/result_const.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/signature_traits.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/subcontract/
sandbox/contract/include/contract/aux_/subcontract/class_invariant.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/subcontract/from.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/subcontract/has_class_invariant.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/subcontract/oldof.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/subcontract/postcondition.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/subcontract/precondition.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/subcontract/static_class_invariant.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/symbol.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/thread_variable.hpp (contents, props changed)
sandbox/contract/include/contract/aux_/uninitialized.hpp (contents, props changed)
sandbox/contract/include/contract/block_invariant.hpp (contents, props changed)
sandbox/contract/include/contract/body.hpp (contents, props changed)
sandbox/contract/include/contract/broken.hpp (contents, props changed)
sandbox/contract/include/contract/class.hpp (contents, props changed)
sandbox/contract/include/contract/class_invariant.hpp (contents, props changed)
sandbox/contract/include/contract/config.hpp (contents, props changed)
sandbox/contract/include/contract/constructor.hpp (contents, props changed)
sandbox/contract/include/contract/copy.hpp (contents, props changed)
sandbox/contract/include/contract/destructor.hpp (contents, props changed)
sandbox/contract/include/contract/detail/
sandbox/contract/include/contract/detail/preprocessor/
sandbox/contract/include/contract/detail/preprocessor/array/
sandbox/contract/include/contract/detail/preprocessor/array/first_n-generate.py (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/array/first_n.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/array/rem.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/array/rest_n-generate.py (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/array/rest_n.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/facilities/
sandbox/contract/include/contract/detail/preprocessor/facilities/is_digit-generate.py (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/facilities/is_digit.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/
sandbox/contract/include/contract/detail/preprocessor/keyword/and.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/and_eq.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/asm.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/auto.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/bitand.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/bitor.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/bool.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/break.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/case.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/catch.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/char.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/class.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/compl.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/const.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/const_cast.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/continue.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/contract/
sandbox/contract/include/contract/detail/preprocessor/keyword/contract/comma.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/contract/deduce.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/contract/extends.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/contract/in.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/contract/initialize.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/contract/out.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/contract/postcondition.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/contract/precondition.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/contract/requires.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/cstddef/
sandbox/contract/include/contract/detail/preprocessor/keyword/cstddef/ptrdiff_t.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/cstddef/size_t.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/
sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/char16_t.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/char32_t.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/constexpr.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/cstddef/
sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/cstddef/nullptr_t.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/decltype.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/final.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/nullptr.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/override.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/static_assert.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/default.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/delete.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/do.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/double.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/dynamic_cast.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/else.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/enum.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/explicit.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/export.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/extern.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/facilities/
sandbox/contract/include/contract/detail/preprocessor/keyword/facilities/add.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/facilities/is.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/facilities/remove.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/false.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/float.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/for.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/friend.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/goto.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/if.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/inline.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/int.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/long.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/mutable.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/namespace.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/new.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/not.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/not_eq.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/operator.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/or.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/or_eq.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/private.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/protected.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/public.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/register.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/reinterpret_cast.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/return.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/short.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/signed.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/sizeof.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/static.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/static_cast.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/struct.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/switch.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/template.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/this.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/throw.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/true.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/try.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/typedef.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/typeid.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/typename.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/union.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/unsigned.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/using.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/virtual.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/void.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/volatile.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/wchar_t.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/while.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/xor.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/keyword/xor_eq.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/list/
sandbox/contract/include/contract/detail/preprocessor/list/to_array.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/punctuation/
sandbox/contract/include/contract/detail/preprocessor/punctuation/curly.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/punctuation/has_paren.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/seq/
sandbox/contract/include/contract/detail/preprocessor/seq/to_list.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/
sandbox/contract/include/contract/detail/preprocessor/traits/assertion.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/aux_/
sandbox/contract/include/contract/detail/preprocessor/traits/aux_/apply-generate.py (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/aux_/apply.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/aux_/apply_1.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/aux_/assertion.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/aux_/comma.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/aux_/keyword.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/aux_/list-generate.py (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/aux_/list.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/aux_/list_1.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/aux_/name.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/aux_/nil.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/aux_/oldof.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/aux_/select_assertion.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/aux_/select_assertion_-generate.py (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/aux_/select_assertion_1.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/aux_/select_assertion_2.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/aux_/select_assertion_3.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/aux_/select_assertion_4.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/aux_/select_assertion_5.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/aux_/type.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/base/
sandbox/contract/include/contract/detail/preprocessor/traits/base.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/base/access.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/base/type.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/base/virtual.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/body.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/class/
sandbox/contract/include/contract/detail/preprocessor/traits/class.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/class/access.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/class/bases.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/class/concepts.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/class/export.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/class/final.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/class/friend.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/class/kind.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/class/name.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/class/specializations.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/class/template.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/class_invariant.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/const_expr.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func/
sandbox/contract/include/contract/detail/preprocessor/traits/func.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func/access.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func/catches-generate.py (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func/catches.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func/concepts.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func/const.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func/exceptions.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func/explicit.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func/export.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func/extern.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func/final.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func/friend.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func/initializers.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func/inline.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func/name.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func/new.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func/override.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func/param_concepts.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func/params.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func/postconditions-generate.py (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func/postconditions.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func/preconditions.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func/result_type.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func/static.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func/template.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func/virtual.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func/volatile.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func_param/
sandbox/contract/include/contract/detail/preprocessor/traits/func_param.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func_param/classifier.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func_param/default.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func_param/name.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/func_param/type.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/oldof/
sandbox/contract/include/contract/detail/preprocessor/traits/oldof.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/oldof/assignment.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/oldof/expr.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/oldof/type.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/params/
sandbox/contract/include/contract/detail/preprocessor/traits/params.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/params/group.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/params/namespace.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/params/void.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/static_assert.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/template_param/
sandbox/contract/include/contract/detail/preprocessor/traits/template_param.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/template_param/default.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/template_param/kind.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/template_param/name.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/traits/template_param/requirement.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/tuple/
sandbox/contract/include/contract/detail/preprocessor/tuple/split-generate.py (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/tuple/split.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/variadic/
sandbox/contract/include/contract/detail/preprocessor/variadic/eat.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/variadic/is.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/variadic/rem.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/variadic/size.hpp (contents, props changed)
sandbox/contract/include/contract/detail/preprocessor/variadic/to_seq.hpp (contents, props changed)
sandbox/contract/include/contract/function.hpp (contents, props changed)
sandbox/contract/include/contract/limits.hpp (contents, props changed)
sandbox/contract/include/contract/loop_variant.hpp (contents, props changed)
sandbox/contract/include/contract/oldof.hpp (contents, props changed)
sandbox/contract/include/contract/parameter.hpp (contents, props changed)
sandbox/contract/include/generate.py (contents, props changed)
sandbox/contract/index.html (contents, props changed)
sandbox/contract/logo.png (contents, props changed)
sandbox/contract/screenshot1.png (contents, props changed)
sandbox/contract/screenshot2.png (contents, props changed)
sandbox/contract/screenshot3.png (contents, props changed)
sandbox/contract/tools/
sandbox/contract/tools/boost_setup/
sandbox/contract/tools/boost_setup/cygwin-boost-env.sh (contents, props changed)
sandbox/contract/tools/boost_setup/cygwin-user-config.jam (contents, props changed)
sandbox/contract/tools/boost_setup/linux-boost-env.sh (contents, props changed)
sandbox/contract/tools/boost_setup/linux-user-config.jam (contents, props changed)
sandbox/contract/tools/boost_setup/windows-boost-env.bat (contents, props changed)
sandbox/contract/tools/boost_setup/windows-user-config.jam (contents, props changed)
sandbox/contract/tools/copyright_header.py (contents, props changed)
sandbox/contract/tools/release_instructions.txt (contents, props changed)
sandbox/contract/tools/sh.py (contents, props changed)
Added: sandbox/contract/COPYRIGHT.txt
==============================================================================
--- (empty file)
+++ sandbox/contract/COPYRIGHT.txt 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,5 @@
+Copyright (C) 2008-2012 Lorenzo Caminiti
+Distributed under 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)
+Home at http://sourceforge.net/projects/contractpp
Added: sandbox/contract/Jamroot
==============================================================================
--- (empty file)
+++ sandbox/contract/Jamroot 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,26 @@
+
+# Copyright (C) 2008-2012 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).
+# Documentation at http://contractpp.sourceforge.net.
+
+import os ;
+
+if ! [ os.environ BOOST_ROOT ]
+{
+ exit "Error: Set BOOST_ROOT environment variable to the Boost root directory" ;
+}
+local BOOST_ROOT = [ os.environ BOOST_ROOT ] ;
+echo "Using Boost libraries from:" $(BOOST_ROOT) ;
+
+use-project boost : $(BOOST_ROOT) ;
+
+project
+ : requirements
+ # Add this library headers to include path.
+ <include>"./include"
+ # Add Boost library headers to include path.
+ <include>$(BOOST_ROOT)
+ ;
+
Added: sandbox/contract/LICENSE_1_0.txt
==============================================================================
--- (empty file)
+++ sandbox/contract/LICENSE_1_0.txt 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,23 @@
+Boost Software License - Version 1.0 - August 17th, 2003
+
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by
+this license (the "Software") to use, reproduce, display, distribute,
+execute, and transmit the Software, and to prepare derivative works of the
+Software, and to permit third-parties to whom the Software is furnished to
+do so, all subject to the following:
+
+The copyright notices in the Software and this entire statement, including
+the above license grant, this restriction and the following disclaimer,
+must be included in all copies of the Software, in whole or in part, and
+all derivative works of the Software, unless such copies or derivative
+works are solely in the form of machine-executable object code generated by
+a source language processor.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
Added: sandbox/contract/README.txt
==============================================================================
--- (empty file)
+++ sandbox/contract/README.txt 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,29 @@
+
+Contract++
+
+Contract Programming Library for C++
+
+DESCRIPTION
+
+C++ Contract Programming (a.k.a. Design by Contract or DbC).
+All Eiffel features supported: subcontracting, postcondition old and result
+values, optional contract compilation, customizable action on assertion
+failure, block invariants, loop variants, etc.
+Plus virtual specifiers, concept checking, named parameters.
+See: http://contractpp.sourceforge.net
+
+FEATURES
+
+* Support for preconditions, postconditions, class invariants, block
+ invariants, and loop variants.
+* Subcontract derived classes (with support for pure virtual functions and
+ multiple inheritance).
+* Access expression old values and function return value in postconditions.
+* Optional compilation and checking of preconditions, postconditions, class
+ invariants, block invariants, and loop variants.
+* Customizable actions on contract assertion failure (terminate by default but
+ it can throw, exit, etc).
+* Virtual specifiers.
+* Concept checking.
+* Named parameters.
+
Added: sandbox/contract/doc/Jamfile.v2
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/Jamfile.v2 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,65 @@
+
+# Copyright (C) 2008-2012 Lorenzo Caminiti
+# Distributed under 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)
+# Home at http://sourceforge.net/projects/contractpp
+
+import quickbook ;
+using boostbook ;
+
+doxygen reference
+ :
+ ../include/contract/function.hpp
+ ../include/contract/constructor.hpp
+ ../include/contract/destructor.hpp
+ ../include/contract/class.hpp
+ ../include/contract/class_invariant.hpp
+ ../include/contract/body.hpp
+ ../include/contract/block_invariant.hpp
+ ../include/contract/loop_variant.hpp
+ ../include/contract/parameter.hpp
+ ../include/contract/oldof.hpp
+ ../include/contract/copy.hpp
+ ../include/contract/broken.hpp
+ ../include/contract/config.hpp
+ ../include/contract/limits.hpp
+ :
+ <reftitle>"Reference"
+ <prefix>contract # Strip path prefix.
+ <doxygen:param>PREDEFINED="DOXYGEN"
+ <doxygen:param>QUIET=YES
+ <doxygen:param>WARN_IF_UNDOCUMENTED=NO
+ <doxygen:param>HIDE_UNDOC_MEMBERS=YES
+ <doxygen:param>HIDE_UNDOC_CLASSES=YES
+ <doxygen:param>SHORT_NAMES=NO
+ <doxygen:param>ALIASES=" Params=\"<b>Parameters:</b> <table border="0">\" Param{2}=\"<tr><td><b><tt>\\1</tt></b></td><td>\\2</td></tr>\" EndParams=\"</table>\" Returns=\"<b>Returns:</b>\" Note=\"<b>Note:</b>\" Warning=\"<b>Warning:</b>\" SeeAlso=\"<b>See also:</b>\" RefSect{2}=\"\\xmlonly<link linkend='contract__.\\1'>\\2</link>\\endxmlonly\" RefClass{1}=\"\\xmlonly<computeroutput><classname alt='\\1'>\\1</classname></computeroutput>\\endxmlonly\" RefFunc{1}=\"\\xmlonly<computeroutput><functionname alt='\\1'>\\1</functionname></computeroutput>\\endxmlonly\" RefMacro{1}=\"\\xmlonly<computeroutput><macroname alt='\\1'>\\1</macroname></computeroutput>\\endxmlonly\" RefEnum{1}=\"\\xmlonly<computeroutput><enumname alt='\\1'>\\1</enumname></computeroutput>\\endxmlonly\" "
+ ;
+
+xml contractpp : contractpp.qbk
+ : <dependency>reference
+ ;
+
+boostbook bjampy : contractpp
+ : <location>html
+ <xsl:param>toc.max.depth=1
+ <xsl:param>boost.defaults=Boost
+ <xsl:param>boost.root=../../
+ <xsl:param>admon.graphics.path=../../doc/src/images/
+ <xsl:param>html.stylesheet=../../doc/src/boostbook.css
+ <format>pdf:<xsl:param>admon.graphics.extension=".svg"
+ <format>pdf:<xsl:param>img.src.path=html/
+ <format>pdf:<xsl:param>draft.more="no"
+ <format>pdf:<xsl:param>page.orientation="landscape"
+ <format>pdf:<xsl:param>paper.type="A3"
+ ;
+
+explicit bjampy contractpp reference ;
+
+echo """
+Usage: python bjam.py [bjam-options-and-targets]
+Build documentation using Bjam via Python (to customize navbar, etc).
+
+NOTE: Use `python bjam.py pdf` to update PDF documentation.
+""" ;
+
Added: sandbox/contract/doc/acknowledgments.qbk
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/acknowledgments.qbk 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,33 @@
+
+[/ Copyright (C) 2008-2012 Lorenzo Caminiti ]
+[/ Distributed under 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) ]
+[/ Home at http://sourceforge.net/projects/contractpp ]
+
+[section Acknowledgments]
+
+This section aims to recognize the contributions of /all/ the different people that participated directly or indirectly to the design and development of this library.
+
+Sincere thanks to my parents for their support with my education and my studies in computer science.
+
+Sincere thanks to Marina for her kindness and continuous support.
+
+Many thanks to Bertrand Meyer for his pioneering and thorough work on Contract Programming in __Meyer97__.
+
+Many thanks to Thorsten Ottosen for his work with __N1962__ (and previous revisions) and for clarifying the __N1962__ requirements directly with the library authors when needed.
+
+Many thanks to Andrzej Krzemienski for reviewing earlier versions of this library providing valuable insights, for exchanging ideas on implementing assertion requirements, and for suggesting to support named parameters.
+
+Many thanks to Vicente J. Botet Escriba for reviewing earlier versions of this library providing valuable insights and for suggesting to use `contract::copy`.
+
+Thanks to Steven Watanabe for providing valuable insights on C++ and for hinting to use template meta-programming introspection to detect if a base class has a given member function (technique which turned out to be essential to fully automate subcontracting).
+
+Thanks to Dave Abrahams for providing valuable comments on the library syntax and especially on the syntax to support named parameters.
+
+Thanks to David Maley for having shared source code form his inspiring work in __Maley99__ on emulating Contract Programming in C++.
+
+Finally, many thanks to the entire __Boost__ community and [@http://lists.boost.org mailing list] for providing valuable comments about this library and great insights on the C++ programming language.
+
+[endsect]
+
Added: sandbox/contract/doc/advanced_topics.qbk
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/advanced_topics.qbk 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,835 @@
+
+[/ Copyright (C) 2008-2012 Lorenzo Caminiti ]
+[/ Distributed under 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) ]
+[/ Home at http://sourceforge.net/projects/contractpp ]
+
+[section Advanced Topics]
+
+This section explains advanced usages of this library in programming contracts.
+See the __Grammar__ section for a complete guide on this library syntax.
+
+[section Commas and Leading Symbols in Macros]
+
+C++ macros cannot correctly parse a macro parameter if it contains a comma `,` that is not wrapped within round parenthesis `()` (because the preprocessor interprets such a comma as separation between two distinct macro parameters instead that as part of one single macro parameter, see also __Boost_Utility_IdentityType__).
+Furthermore, syntactic elements specified to this library macros cannot start with a non-alphanumeric symbol (`-1`, `1.23`, `"abc"`, `::`, etc).
+[footnote
+Note that for the preprocessor a number with decimal period `1.23`, `0.12`, `.34` is considered a symbol (because its concatenation will not result in a valid macro identifier).
+]
+For example, the parameter type `::std::pair<OtherKey, OtherT> const&` cannot be passed to this library for two reasons: It starts with the non-alphanumeric symbol `::` and it contains the comma `OtherKey, OtherT` which is not wrapped by round parenthesis.
+
+The __Boost_Utility_IdentityType__ macro `BOOST_IDENTITY_TYPE` can be used as usual to overcome this issue.
+However, using the `BOOST_IDENTITY_TYPE` macro presents two limitations: It makes the syntax of this library macros more cumbersome and, more importantly, it does not allow C++ to automatically deduce function template parameters (see __Boost_Utility_IdentityType__ for more information).
+Therefore, the syntax of this library provides an alternative to `BOOST_IDENTITY_TYPE` to handle commas and leading symbols within macro parameters:
+
+# Commas and leading symbols can be used freely within elements of the syntax that already require wrapping parenthesis (e.g., non-fundamental parameter types `(::std::pair<OtherKey, OtherT> const&)`).
+# Extra parenthesis can always be used to wrap elements of the syntax that might contain commas and leading symbols (e.g, the base class type `public (::sizeable<Key, T>)`).
+# Extra parenthesis can always be used to wrap value expressions so they can contain commas and leading symbols (e.g., a class invariants assertion `(::sizeable<Key, T>::max_size >= size())`).
+
+For example (see also [file example/contracts macro_commas_symbols_integral_map.cpp]):
+
+[import ../example/contracts/macro_commas_symbols_integral_map.cpp]
+[macro_commas_symbols_integral_map]
+
+(Concepts and other advanced constructs used in this example are explained in the rest of this section and in later sections of this documentation.)
+
+All these extra wrapping parenthesis are optional when there is no unwrapped comma and no leading symbol.
+Programmers could chose to always program the extra parenthesis for consistency but it is the authors' opinion that the syntax is harder to read with the extra parenthesis so it is recommended to use them only when strictly necessary.
+
+It is also recommended to avoid using commas and leading symbols whenever possible so to limit the cases when it is necessary to use the extra wrapping parenthesis.
+For example, in many cases the leading symbol `::` might not be necessary and leading symbols like `!` can be replaced by the alternative keywords like `not`.
+Furthermore, in some cases `typedef` can be programmed just before class and function declarations to avoid passing types within multiple template parameters separated by commas.
+Declarations of class templates and function templates are the most common cases were commas cannot be avoided and extra wrapping parenthesis are necessarily used.
+
+[warning
+Preconditions, postconditions, and class invariants composed of one single assertion that needs to be wrapped within extra parenthesis need to use double parenthesis (this should be a relatively rare case).
+[footnote
+*Rationale.*
+This limitation is introduced by the need to support also the sequence syntax for preprocessor without variadic macros (see the __No_Variadic_Macros__ section).
+]
+This is the case in the above example for `precondition( ((!full())) )` (but note that these extra parenthesis could have been avoided all together simply using `not` instead of `!` as in the more readable `precondition( not full() )`).
+]
+
+[endsect]
+
+[section Static Assertions]
+
+This library allows to use [@http://en.wikipedia.org/wiki/C%2B%2B11#Static_assertions /static assertions/] to program preconditions, postconditions, class invariants, and block invariants so that they are checked at compile-time instead of at run-time.
+The __CXX11__ syntax is used (but __Boost_MPL__ `BOOST_MPL_ASSERT_MSG` is used to implement static assertions so no __CXX11__ feature is required):
+
+ static_assert(``/constant-boolean-condition/``, ``/constant-string-literal/``)
+
+For example (see also [file example/contracts static_assertion_memcopy.cpp]):
+
+[import ../example/contracts/static_assertion_memcopy.cpp]
+[static_assertion_memcopy]
+
+Static assertions are always checked at compile-time (regardless of them appearing in preconditions, postconditions, etc).
+However, static assertions can be selectively disabled depending on where they are specified using [macroref CONTRACT_CONFIG_NO_PRECONDITIONS], [macroref CONTRACT_CONFIG_NO_POSTCONDITIONS], etc so it is still important to logically associate them with preconditions, postconditions, etc.
+
+The string message passed as the second parameter of `static_assert` is ignored by the current implementation of this library (but it could be used by future revisions of this library that take advantage of __CXX11__ features).
+It is recommended to always specify meaningful messages for static assertions to increase the readability and documentation of contracts.
+Similarly, it might be useful to put a short code comment following each assertions (`// pointer not null`, etc) to increase contract readability and documentation.
+[footnote
+*Rationale.*
+__Eiffel__ supports /assertion labeling/ to further document assertions.
+However, when designing this library for C++, the authors judged that it is sufficient to add a short code comment after each assertion to achieve a similar effect.
+]
+
+In case of a static assertion failure, this library will generated a compile-time error containing text similar to the following:
+
+[pre
+static_assertion_memcopy.cpp:18 ... ERROR_statically_checked_precondition_number_1_failed_at_line_18 ...
+]
+
+This message is similar to the run-time assertion errors generated by this library, note how it contains all the information to uniquely identify the assertion that failed.
+
+[endsect]
+
+[section Constant Assertions]
+
+As explained in the __Constant_Correctness__ section, contract assertions shall not change the state of the program because contracts are only supposed to check (and not to alter) the state of the program.
+This library automatically makes member functions, function parameters, function result, and old values constant so the compiler will correctly generate an error if assertions mistakenly try to change the object, the function parameters, the function result, or the old values (this should be sufficient in most cases when programming contracts).
+
+[important
+This library cannot automatically make constant other variables that might be accessible by the contract assertions (e.g., global and static variables).
+[footnote
+*Rationale.*
+The library needs to know at least the variable name in order to make it constant.
+There is no way for this library to know the name of a global variable that is implicitly accessible from the contract assertion scope so such a variable cannot be automatically made constant.
+Non-static data members are automatically made constant by making constant the member function that checks the contract, but that does not apply to static data members.
+Not even __CXX11__ lambda implicit captures could be used in this context because they make variables constant only when captured by value and that introduces a __CopyConstructible__ requirement of the captured variable types.
+]
+]
+
+This library provides /constant assertions/ that can be used by programmers to explicitly make constant the variables used by the asserted boolean expression:
+
+ const( ``/variable1/``, ``/variable2/``, ...) ``/boolean-expression-using-variable1-variable2-.../``
+
+The following example calculates the next even and odd numbers that are stored (for some reason) in a global variable and static data member respectively (see also [file example/contracts const_assertion_number.cpp]):
+
+[import ../example/contracts/const_assertion_number.cpp]
+[const_assertion_number]
+
+Note know the postconditions use constant assertions to force the `even` and `odd` variables to be constant within each boolean expression that evaluates the assertion.
+If for example the assignment operator `=` were mistakenly used instead of the equality operator `==` in the above postconditions, the compiler would correctly generate an error.
+
+[endsect]
+
+[section Select Assertions]
+
+In the __Tutorial__ section we have used the ternary operator `:?` to program assertions that are guarded by a boolean condition:
+
+ old_found ? true : std::find(begin(), end(), id) != end(),
+ old_found ? true : size() == old_size + 1
+
+However, in cases like this one when the same boolean condition guards multiple assertions, it might be more efficient to evaluate the guard condition only once using one /select assertion/ instead of multiple ternary operators `:?`.
+In addition, some programmers might find the select assertion syntax more readable than the ternary operator `:?`.
+For example, the above guarded assertions could have been programmed using select assertions as:
+
+ if(not old_found) ( // Guard condition evaluated only once.
+ std::find(begin(), end(), id) != end(),
+ size() == old_size + 1
+ )
+
+Select assertion allow to specify an optional else-block:
+
+ if(``/boolean-condition/``) ( // Round parenthesis `()`.
+ ... // Comma-separated assertions.
+ ) else ( // Else optional as usual.
+ ... // Comma-separated assertions.
+ )
+
+Note that round parenthesis `( ... )` are used to program the then-block and else-block instead of the usual C++ curly parenthesis `{ ... }`:
+Select assertions can be nested into one another (the [macroref CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS] macro specifies the maximum nesting level for select assertions).
+
+For example, consider the postconditions of the following function which calculates the factorial of a natural number (see also [file example/contracts select_assertion_factorial.cpp]):
+
+[import ../example/contracts/select_assertion_factorial.cpp]
+[select_assertion_factorial]
+
+Using the same syntax used for constant assertions, it is possible to force all variables (global, static, etc) used to evaluate the if-condition of the select assertion to be constant (see also [file example/contracts const_select_assertion_factorial.cpp]):
+
+[import ../example/contracts/const_select_assertion_factorial.cpp]
+[const_select_assertion_factorial]
+
+[endsect]
+
+[section Assertion Statements]
+
+Only assertions can be programmed within the contracts while normal C++ statements are not allowed.
+This is keeps contracts simple making programming errors within the contracts less likely and therefore increasing the probably that error-free contracts can properly check the correctness of the implementation.
+
+However, `using` directives, `namespace` aliases, and `typedef` statements are allowed within the contracts because they only affect compilation (not altering the state of the program at run-time) and they can be used to write more readable contracts (for example, shortening namespaces within contract assertions).
+When used, these statements have effect only locally within the preconditions, postconditions, class invariants, etc where they appear.
+[footnote
+Assertion statements might be especially useful because contracts appear with the class and function declarations usually in header files where `using` directives and `namespace` aliases should only be used with extreme care and, for example, at local scope as assertion statements allow to do.
+]
+
+For example (see also [file example/contracts assertion_statement_ialloc.cpp]):
+
+[import ../example/contracts/assertion_statement_ialloc.cpp]
+[assertion_statement_ialloc]
+
+These statements follow their usual C++ syntax but they are terminated with a comma `,` instead of a semicolon `;`.
+(The `BOOST_IDENTITY_TYPE` macro can be used to wrap eventual commas within the `typedef` statement.)
+
+[endsect]
+
+[section Assertion Requirements]
+
+In general, programming contract assertions can introduce a new set of requirements on the types used by the program.
+Some of these type requirements might be necessary only to program the assertions and they might not be required by the implementation itself.
+In such cases, if the code is compiled with contracts disabled ([macroref CONTRACT_CONFIG_NO_PRECONDITIONS], etc), the program might compile but it might no longer compile when contracts are enabled because some of the types do not provide all the operations necessary to check the contract assertions.
+
+# More in general, in some cases it might be acceptable or even desirable to cause a compile-time error when a program uses types that do not provide all the operations needed to check the contracts (because it is not possible to fully check the correctness of the program).
+In these cases, programmers specify contract assertions as we have seen so far (and maybe even use concepts to explicitly specify the contract type requirements, see the __Concepts__ section).
+# However, in other cases it might be desirable that adding contracts to a program does not change its type requirements and that assertions are simply not checked when the types do not provide all the operations necessary to evaluate the asserted conditions.
+In these cases, programmers can use /assertion requirements/ to disable compilation and run-time checking of specific assertions:
+[footnote
+*Rationale.*
+The assertion requirement syntax takes a constant boolean expression instead of a nullary boolean meta-function because the authors have found no reason to use a meta-function in this context.
+Furthermore, constant boolean expressions can be manipulated via the usual operators `not`, `and`, etc, therefore more naturally than boolean meta-functions which need to use `boost::mpl::not_`, `boost::mpl::and_`, etc instead.
+]
+
+ ``/assertion/``, requires ``/constant-boolean-expression/``
+
+(The constant boolean expression of an assertion requirement can be wrapped within round parenthesis `()` if it contains unwrapped commas.)
+
+Let's consider the STL `std::vector<T>` class template.
+This template normally does not require the value type `T` to be __EqualityComparable__ (i.e., to have an equality operator `==`), it only requires `T` to be __CopyConstructible__ (i.e., to have a copy constructor).
+However, in order to check the following `std::vector<T>::push_back` postcondition the type `T` must to be __EqualityComparable__:
+
+ back() == value // Compiler error if not `EqualityComparable<T>`.
+
+Therefore, the __EqualityComparable__ requirement on `T` is introduced only by the contract assertions and it is not required by the `std::vector<T>` implementation.
+
+In some cases, programmers might want compilation to fail when `T` is not __EqualityComparable__ because in these cases it is not possible to fully check the `std::vector<T>` contracts and therefore its correctness (in these cases programmers do not specify assertion requirements and let the compilation fail, or even better programmers can explicitly specify the assertion type requirements using concepts which will also fail compilation but hopefully with more informative error messages, see the __Concepts__ section).
+
+However, in other cases programmers might want to use the contracted version of `std::vector<T>` exactly as they use the non-contracted version of the template and therefore without failing compilation if `T` is not __EqualityComparable__.
+This can be achieved specifying assertion requirements for the `std::vector<T>::push_back` postcondition:
+
+ back() == value, requires boost::has_equal_to<T>::value // No error if not `EqualityComparable<T>`.
+
+This postcondition will be checked only when `T` is __EqualityComparable__, otherwise the postcondition will be ignored causing no compilation error.
+
+For example (see also [file example/contracts assertion_requirements_push_back.cpp]):
+[footnote
+Future revisions of this library might provide wrappers that program contracts for the STL in appropriate header files =contract/std/vector.hpp=, =contract/std/algorithm.hpp=, etc (see also [@http://www.sgi.com/tech/stl/ SGI STL] and [@http://sourceforge.net/apps/trac/contractpp/ticket/47 Ticket 47]).
+However, given that STL implementations are usually considered to be ["correct], it is not clear if STL class invariants and postconditions would add any value, maybe programmers would only find STL preconditions useful.
+]
+
+[import ../example/contracts/assertion_requirements_push_back.cpp]
+[assertion_requirements_push_back]
+[assertion_requirements_push_back_call]
+
+The `i.push_back(123)` call will check the postcondition `back() == value` because `int` is __EqualityComparable__ and the assertion requirement `boost::has_equal_to<int>::value` is true.
+However, the `n.push_back(num(123))` call will not check, and in fact not even compile, the postconditions `back() == value` because `num` is not __EqualityComparable__ and the assertion requirement `boost::has_equal_to<num>::value` is false.
+[footnote
+Assertion requirements where first introduced by this library and they are not supported by __N1962__, __D__, or __Eiffel__ (even if they all allow to write contracts for templates).
+Based on the authors' experience, assertion requirements are necessary for a language that make extensive use of templates like C++.
+Furthermore, C++ does not automatically define equality operators `==` while it automatically defines copy constructors and that makes the use of the assertion requirements for __EqualityComparable__ a rather common practise (in __Eiffel__ instead types can be both copied and compared for equality by default).
+It has been argued that it is not possible to check a program for correctness if types that are copyable cannot also be compared for equality and the authors experience with programming contracts confirms such an argument.
+]
+
+The __Boost_TypeTraits__ library provides a set of meta-functions that are very useful to program assertion requirements.
+[footnote
+As of __Boost__ 1.50, `boost::has_equal_to` and similar traits always return true for an STL container even if the value type of the container does not have an operator `==`.
+This is arguably a defect of the STL that always defines an operator `==` for its containers even when a container template is instantiated with a value type that has no operator `==`, in which case the container operator `==` will produce a compiler error (the STL should instead use __SFINAE__ to disable the declaration of the container operator `==` when the value type has no operator `==`).
+Future versions of __Boost_TypeTraits__ will probably specialize `boost::has_equal_to` and similar traits to work around this behaviour of the STL.
+In the meanwhile, programmers can specialize these traits themselves if needed:
+``
+// Header: std_has_equal_to.hpp
+#include <boost/type_traits/has_equal_to.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/mpl/and.hpp>
+#include <vector>
+
+// STL defines `operator==` only between two identical containers (same value
+// type, allocator, etc) and returning a type convertible to `bool`.
+
+namespace boost {
+
+// Specializations for `std::vector`.
+
+template< typename T, class Alloc >
+struct has_equal_to < std::vector<T, Alloc>, std::vector<T, Alloc> > :
+ has_equal_to<T, T, bool>
+{};
+
+template< typename T, class Alloc, typename Ret >
+struct has_equal_to < std::vector<T, Alloc>, std::vector<T, Alloc>, Ret > :
+ mpl::and_<
+ has_equal_to<T, T, bool>
+ , is_convertible<Ret, bool>
+ >
+{};
+
+// ... specialize `has_equal_to` for more STL containers.
+
+} // namespace
+``
+]
+However, C++ does not allow to inspect every trait of a type so there might be some assertion requirements that unfortunately cannot be programmed within the language.
+
+Another interesting use of assertion requirements is to model assertion computational complexity.
+In some cases, checking assertions can be as computationally expensive as executing the function body or even more.
+While preconditions, postconditions, etc can be disabled in groups at compile-time to improve performance (using [macroref CONTRACT_CONFIG_NO_PRECONDITIONS], [macroref CONTRACT_CONFIG_NO_POSTCONDITIONS], etc), it is also useful to be able to disable only specific assertions that are very computationally expensive while keeping all other preconditions, postconditions, etc enabled.
+For example (see also [file example/contracts assertion_complexity_factorial.cpp]):
+
+[import ../example/contracts/assertion_complexity_factorial.cpp]
+[assertion_complexity_factorial]
+
+In this case the postcondition `result = n * factorial(n - 1)` has factorial computational complexity and it is compiled and checked at run-time only if the macro `COMPLEXITY_MAX` is defined to be `O_FACTN` or greater.
+Similarly, macros like `O_SMALLER_BODY`, `O_BODY`, and `O_GREATER_BODY` could have been defined to express computational complexity in relative terms with respect to the body computational complexity (see the __Examples__ section).
+[footnote
+__N1866__, an earlier version of __N1962__, introduced the notion of /importance ordering/ that could be used to selectively disable assertions that where too expensive computationally.
+Importance ordering was then dropped by __N1962__.
+Among other things, assertion requirements can be used to achieve the importance ordering functionality.
+]
+
+Assertion requirements can be used with assertions, constant assertions, and static assertions but they cannot be used with assertion statements and with the if-condition of select assertions (however, if select assertions are programmed using the ternary operator `:?` then assertion requirements will disable the entire ternary operator `:?` expression including its if-condition).
+
+[endsect]
+
+[section Old-Of Requirements]
+
+Assertion requirements can be specified also for postconditions that use old values.
+However, old values have the additional requirement that the type of the expression passed to the [macroref CONTRACT_OLDOF] macro must be __ConstantCopyConstructible__.
+If such a requirement is not met:
+
+# Either, programmers want the compiler to error because the postconditions using the old value cannot be evaluated (in which case programmers will not specify assertion requirements and they might explicitly specify type requirements using concepts so to get more informative error messages, see the __Concepts__ section).
+# Or, programmers want the old value declaration that uses the [macroref CONTRACT_OLDOF] macro to have no effect (because the old value cannot be copied) and the postconditions using such an old value to not be evaluated.
+
+Unfortunately, C++ cannot automatically detect if a type has a copy constructor therefore a special trait [classref contract::has_oldof] has to be introduced to support this second case.
+The `contract::has_oldof<T>` trait is a unary boolean meta-function which is `boost::mpl::true_` by default for any type `T` and it must be specialized by programmers for types which old values cannot be copied.
+
+For example, consider the following increment function (see also [file example/contracts has_oldof_inc.cpp]):
+
+[import ../example/contracts/has_oldof_inc.cpp]
+[has_oldof_inc]
+[has_oldof_inc_call]
+
+In this example, the `num` type is non-copyable so the `contract::has_oldof<num>` specialization inherits from `boost::mpl::false_`.
+As a consequence, the call `inc(n, m)` will automatically skip the old value declaration:
+
+ auto old_value = CONTRACT_OLDOF value
+
+The following postcondition will also be skipped because its assertion requirement lists `contract::has_oldof<T>` (where `T` is indeed the type of `value` passed to the [macroref CONTRACT_OLDOF] macro):
+
+ value == old_value + offset, requires contract::has_oldof<T>::value and ...
+
+Note how this postcondition actually requires the type `T` to have an old value, a plus operator `+`, and an equality operator `==` thus all of these requirements are programmed in the assertion requirements.
+
+Finally, return value declarations are never skipped so there is no `has_result` trait.
+[footnote
+*Rationale.*
+The result type needs to be copyable in order for the function itself to return a value so this library can always evaluate return value declarations.
+]
+
+[endsect]
+
+[section Old and Result Value Copies]
+
+This library uses the class template [classref contract::copy] to copy old values and the result value for postconditions.
+
+ namespace contract
+ {
+ template< typename T >
+ class copy
+ {
+ public: copy ( T const& object ) ;
+ public: T const& value ( void ) const ;
+ };
+ } // namespace
+
+The default implementation of the [classref contract::copy] class template requires that the type of the old value expression passed to the [macroref CONTRACT_OLDOF] macro and the result type are __ConstantCopyConstructible__ (i.e., these types provide a copy constructor that copies the object from a constant reference, the reference has to be constant so to ensure the constant-correctness of the copy operations that are executed within the contracts, see also the __Constant_Correctness__ section):
+
+ // `ConstantCopyConstructible<T>` (which implies `CopyConstructible<T>`):
+ T::T ( T const& source ) ; // OK: constant-correct copy constructor.
+
+ // `CopyConstructible<T>` (but not `ConstantCopyConstructible<T>`):
+ T::T ( T& source ) ; // Error, copy constructor is not constant-correct.
+
+Programmers can specialize the [classref contract::copy] class template to allow old value and result value copies even for types that are not __ConstantCopyConstructible__ (in this case it is the programmers' responsibility to make sure that the copy operations that they define are constant-correct, otherwise the contracts will no longer be constant-correct).
+[footnote
+Currently, it is not possible to force constant-correctness of the expression passed to the [macroref CONTRACT_OLDOF] macro.
+Future revisions of this library will support `CONTRACT_OLDOF const( ... ) ...` to allow to make constant all variables (including global, static, etc) used by old value expressions (see also [@http://sourceforge.net/apps/trac/contractpp/ticket/52 Ticket 52]).
+]
+
+In the following example the old and result value declarations use the specialization `contract::copy<num>` so it is possible to access the old and result value of variables of type `num` even if `num` is non-copyable (see also [file example/contracts copy_inc.cpp]):
+
+[import ../example/contracts/copy_inc.cpp]
+[copy_inc]
+[copy_inc_call]
+
+Both calls `inc(i, j)` and `inc(n, m)` check all postconditions.
+The first call copies the old and result values using `int`'s default copy constructor, the second call copies the old and result values using the copy operation implemented by the `contract::copy<num>` specialization.
+
+[endsect]
+
+[section Pure Virtual Functions]
+
+It is possible to program contracts for pure virtual functions.
+Pure virtual functions are specified with the usual `= 0;` symbol replacing the function definition just after the contract macros, for example (see also [file example/contracts pushable.hpp]):
+
+[import ../example/contracts/pushable.hpp]
+[pushable]
+
+Furthermore, using the [macroref CONTRACT_MEMBER_BODY] macro, a derived class can be programmed without using the [macroref CONTRACT_CLASS] and [macroref CONTRACT_FUNCTION] macros even when the base class has pure virtual functions (see also [file example/contracts default_subcontracting_base.cpp]):
+
+[import ../example/contracts/default_subcontracting_base.cpp]
+[default_subcontracting_base]
+
+This use of the [macroref CONTRACT_MEMBER_BODY] macro does not force programmers of derived classes to use the library macros [macroref CONTRACT_CLASS] and [macroref CONTRACT_FUNCTION] which would otherwise introduce the unusual library syntax in the derived class declaration.
+However, in this case the derived class is forced to inherit the base class invariants, preconditions, and postconditions exactly as they are without the possibility to truly subcontract the base class (which is instead possible when the [macroref CONTRACT_CLASS] and [macroref CONTRACT_FUNCTION] macros are used in declaring the derived class).
+[footnote
+*Rationale.*
+Older revisions of this library defined the macro `CONTRACT_MEMBER_BODY(class_type, function_name)` taking two parameters so this macro could not be used in declaring derived classes and the [macroref CONTRACT_CLASS] and [macroref CONTRACT_FUNCTION] macros where required when programming a class inheriting from a base class with contracts.
+However, the authors prefer to leave the choice of programming full contracts for derived classes to the derived class programmers because of the unusual declaration syntax introduced by this library might not be necessary when derived classes do not need to alter the base's class contract.
+]
+Correctly, the derived class can never avoid checking the base class contracts neither when declared using the [macroref CONTRACT_CLASS] and [macroref CONTRACT_FUNCTION] macros, nor when declared using the [macroref CONTRACT_MEMBER_BODY] macro.
+
+[endsect]
+
+[section Subcontracting Preconditions]
+
+While subcontracting is theoretically sound and justified by the __substitution_principle__, in practise subcontracted preconditions might be confusing for programmers because of the implications of evaluating overriding preconditions in __logic_or__ with overridden preconditions (this is not the case for subcontracted postconditions and class invariants which usually behave as programmers expect because they are evaluated in __logic_and__).
+
+For example, consider the following base class `integer` which holds an integral value and its derived class `natural` which holds a natural (i.e., non-negative integer) value (see also [file example/contracts subcontract_pre_natural_failure.cpp]):
+
+[import ../example/contracts/subcontract_pre_natural_failure.cpp]
+[subcontract_pre_natural_failure]
+
+From reading the contracts we conclude that:
+
+* `integer::get` returns the latest value set (as specified by `integer::set` postconditions).
+* There is no constraint on the integer value that is passed to `integer::set` (because `integer::set` has no precondition).
+* `natural::get` always returns a non-negative value (as specified by the `natural` class invariants).
+* Only non-negative values can be passed to `natural::set` (as specified by `natural::set` preconditions).
+
+This last conclusion is incorrect!
+Negative values can be passed to `natural::set` because they can be passed to its base virtual function `integral::set` (preconditions cannot only be weakened).
+The complete set of `natural::set` preconditions is given by its base virtual function `integer::set` preconditions (which are always `true` because they are not specified) evaluated in __logic_or__ with the preconditions explicitly specified by `natural::set` (i.e., `value >= 0`):
+
+ (true) or (value >= 0)
+
+Obviously, this always evaluates to `true` regardless of `value` being non-negative.
+This is correct in accordance with the __substitution_principle__ for which `natural::set` can be called in any context where `integer::set` is called because `natural` inherits from `integer`.
+Given that `integer::set` can be called regardless of `value` being non-negative (because it has no precondition) there is no precondition that we can later specify for `natural::set` that will change that and in fact `natural::set` can also be called with negative values without failing its subcontracted preconditions.
+For example, the call:
+
+[subcontract_pre_natural_failure_call]
+
+Fails the class invariants checked while exiting `natural::set`:
+
+[pre
+class invariant (on exit) number 1 "get() >= 0" failed: file "natural_subcontractpre.cpp", line 30
+]
+
+Ideally, this call would have failed much earlier at `natural::set` preconditions (in fact, the `natural::set` body is executed with the logically invalid negative value `-123` which could in general lead to catastrophic errors and mysterious bugs).
+
+The issue here is in the design.
+A natural number is not an integer number because while it is valid to use an integer number in a context where it is assigned to a negative number, it is not valid to use a natural number in such a context so a natural number should not inherit from an integer number.
+Inheritance models the [@http://en.wikipedia.org/wiki/Is-a /is-a/] relationship which should not be used in this case as the contracts and the __substitution_principle__ are telling us.
+
+[note
+Note that if a virtual member function has no preconditions, it means that it is always valid to call it, and (in accordance with the __substitution_principle__) this semantic cannot be changed by the contracts of any overriding function no matter what preconditions we specify for it.
+Similarly, if an overriding member function has no preconditions, it means that is is always valid to call it regardless of possible preconditions specified by any function that it overrides.
+]
+
+An overriding function can specify `precondition( false )` if it wants to keep the same preconditions of the functions that is overriding.
+A pure virtual function can specify `precondition( false )` to indicate that overriding functions will specify preconditions (this only makes sense for pure virtual functions because a function with `precondition( false )` can never be called successfully unless it is overridden and its preconditions are weakened, that might be acceptable for pure virtual because they must always be overridden).
+
+If programmers find subcontracted preconditions confusing, this library allows to forbid them by defining the configuration macro [macroref CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS].
+When this macro is defined, the library will generate a compile-time error if a derived class tries to override preconditions of member functions of any of its base classes (this is also the subcontracting behaviour specified by __N1962__).
+However, note that in case of multiple-inheritance preconditions from the overridden function from all bases classes will always be checked in __logic_or__ with each other so preconditions from a base class could still be weaken by the preconditions of another base class even when the [macroref CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS] macro is defined.
+By default the [macroref CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS] macro is not defined and this library allows to override preconditions (as specified by for __Eiffel__ by __Meyer97__ and in accordance with the __substitution_principle__).
+
+Another difference between subcontracted preconditions and subcontracted postconditions or class invariants is that subcontracted preconditions will always report a failure of the overridden preconditions.
+For example, consider a set of base classes [^b['N]] and a derived class `d`:
+
+ CONTRACT_CLASS(
+ struct (a)
+ ) {
+ ... // No member function `f`.
+ };
+
+ CONTRACT_CLASS(
+ struct (b``/N/``)
+ ) {
+ CONTRACT_CLASS_INVARIANT( ... )
+
+ CONTRACT_FUNCTION(
+ public virtual void (f) ( void ) // Overridden function.
+ precondition( ... )
+ postcondition( ... )
+ ) {}
+
+ ...
+ };
+
+ CONTRACT_CLASS(
+ struct (c)
+ ) {
+ ... // No member function `f`.
+ };
+
+ CONTRACT_CLASS(
+ struct (d) extends( b1, a, b2, c, b3 )
+ ) {
+ CONTRACT_CLASS_INVARIANT( ... )
+
+ CONTRACT_FUNCTION(
+ public virtual void (f) ( void ) // Overriding function.
+ precondition( ... )
+ postcondition( ... )
+ ) {}
+
+ ...
+ };
+
+When `d::f` is called, its subcontracted class invariants, postconditions, and preconditions are evaluated using the following expressions (the base classes `a` and `c` do not declare a virtual function `f` so they are automatically excluded from `d::f` subcontracting):
+
+ b1::``/class-invariants/`` and b2::``/class-invariants/`` and b3::``/class-invariants/`` and d::``/class-invariants/`` // `d::f` subcontracted class invariants.
+ b1::f::``/postconditions/`` and b2::f::``/postconditions/`` and b3::f::``/postconditions/`` and d::f::``/postconditions/`` // `d::f` subcontracted postconditions.
+ b1::f::``/preconditions/`` or b2::f::``/preconditions/`` or b3::f::``/preconditions/`` or d::f::``/preconditions/`` // `d::f` subcontracted preconditions.
+
+When subcontracted class invariants or subcontracted postconditions fail, this library reports the first failed condition which can in general be in the base class contracts because they are checked first in the __logic_and__ chain (this can report a failure from any subcontracted class invariants [^b['N]::/class-invariants/] or [^d::/class-invariants/], and subcontracted postconditions [^b['N]::f::/postconditions/] or [^d::f::/postconditions/]).
+However, when subcontracted preconditions fail it means that all overridden preconditions as well as the overriding preconditions have failed (because subcontracted preconditions are evaluated in __logic_or__).
+In this case, this library will report the last evaluated failure which will always be in the overriding preconditions (always report a failure from [^d::f::/preconditions/]).
+If programmers want instead the library to report the failure from the first overridden precondition that failed, they can define the configuration macro [macroref CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE] (always report a failure from [^b1::f::/preconditions/]).
+
+[endsect]
+
+[section Static Member Functions]
+
+It is possible to program contracts for static member functions.
+Static member functions cannot access the object therefore their preconditions and postconditions also cannot access the object and they can only access other static members.
+This library allows to specify a subset of class invariants called /static class invariants/ which do not access the object and that are checked at entry and exit of every constructor, destructor, and member functions even if static.
+(Non-static class invariants are instead not checked at constructor entry, at destructor exit, and at entry and exit of static member functions because they require accessing the object, see also the __Contract_Programming_Overview__ section.)
+
+Static class invariants are empty (`void`) by default unless they are explicitly specified within the [macroref CONTRACT_CLASS_INVARIANT] macro using the following syntax:
+[footnote
+Static class invariants are not part of __N1962__ and they were first introduced by this library.
+]
+
+ static class( ``/assertion1/``, ``/assertion2/``, ... )
+
+For example (see also [file example/contracts static_contract_instance_counter.cpp]):
+
+[import ../example/contracts/static_contract_instance_counter.cpp]
+[static_contract_instance_counter]
+
+In this example there is only one static class invariant assertion `count() >= 0` and it is checked at entry and exit of every constructor, destructor, and member function including the static member function `count`.
+If the static member function `count` had preconditions or postconditions, they would not be able to access the object (i.e., preconditions and postconditions will also be executed in static context).
+
+[endsect]
+
+[section Volatile Member Functions]
+
+It is possible to program contracts for volatile member functions.
+Volatile member functions access the object as volatile therefore their preconditions and postconditions also access the object as volatile and can only access other volatile members.
+This library allows to specify a different set of class invariants called /volatile class invariants/ which can only access the object as volatile and that are checked at entry and exit of every volatile member function.
+(Constructors and destructors never access the object as volatile so volatile class invariants are not checked by constructors and destructors, see also the __Contract_Programming_Overview__ section.)
+
+Volatile class invariants are assumed to be the same as non-volatile class invariants unless they are explicitly specified within the [macroref CONTRACT_CLASS_INVARIANT] macro using the following syntax:
+[footnote
+Volatile class invariants are not part of __N1962__ and they were first introduced by this library.
+It is not clear if there are real applications for volatile class invariants mainly because real applications of `volatile` itself are not clear in C++.
+One very interesting use of `volatile` has been to [@http://www.drdobbs.com/cpp/184403766 avoid race conditions] in concurrent programming (but contracts are not useful for such an application of `volatile`).
+]
+
+
+ volatile class( ``/assertion1/``, ``/assertion2/``, ... )
+
+In most cases, it will be necessary to explicitly specify volatile class invariants when using volatile member functions (unless volatile overloads are provided for every member function that is used by the non-volatile class invariants).
+
+For example (see also [file example/contracts volatile_contract_shared_instance.cpp]):
+
+[import ../example/contracts/volatile_contract_shared_instance.cpp]
+[volatile_contract_shared_instance]
+
+As usual, contracts are checked in constant-correct context therefore only `const volatile` members can be accessed from volatile class invariants, preconditions, and postconditions.
+
+[endsect]
+
+[section Operators]
+
+It is possible to program contracts for operators (both member function operators and free function operators).
+The operator name must be specified using the following syntax when passed to the [macroref CONTRACT_FUNCTION], [macroref CONTRACT_FREE_BODY], and [macroref CONTRACT_MEMBER_BODY] macros:
+
+ operator(``/symbol/``)(``/arbitrary-alphanumeric-name/``)
+
+The first parameter is the usual operator symbol (`==`, `+`, etc) the second parameter is an arbitrary but alphanumeric name (`equal`, `plus`, etc).
+The operator `new`, the operator `delete`, and implicit type conversion operators for fundamental types containing no symbol can also be specified simply as:
+
+ operator new
+ operator delete
+ operator ``/fundamental-type-without-symbols/``
+
+The comma operator must be specified as:
+[footnote
+*Rationale.*
+The comma operator cannot be specified using the comma symbol as in `operator(,)(my_comma_operator)` because the preprocessor uses commas to separate macro parameters so it is not possible to distinguish that from an implicit type conversion operator like `operator(std::vector<T, Allocator>)(std_vector)` (note that the operator name is arbitrary so it also cannot be used to distinguish these two cases).
+]
+
+ operator comma
+
+For example (see also [file example/contracts member_operator_string.cpp]):
+
+[import ../example/contracts/member_operator_string.cpp]
+[member_operator_string]
+
+The memory operators `new`, `delete`, `new[]`, and `delete[]` must always be specified `static` when they are programmed as member function operators.
+[footnote
+*Rationale.*
+C++ automatically promotes memory member operators to static members so the `static` keyword is optional for these member operators.
+However, this library cannot inspect the operator symbol using the preprocessor to check if the operator is a memory member operator or not because the symbol contains non-alphanumeric tokens (which cannot be concatenated by the preprocessor).
+Therefore, this library always requires memory member operators to be explicitly declared as static member functions.
+]
+
+Free function operators are programmed using the same syntax for the operator names.
+
+[endsect]
+
+[section Nested Classes]
+
+It is possible to program contracts for nested classes noting that:
+
+# The access level `public`, `protected`, or `private` must be specified for contracted members and therefore also for nested classes.
+# The `_TPL` macros must be used within templates so the [macroref CONTRACT_CLASS_TPL] macro needs to be used when programming a class nested within a class template.
+
+For example (see also [file example/contracts nested_class_bitset.cpp] and the __Concepts__ section):
+
+[import ../example/contracts/nested_class_bitset.cpp]
+[nested_class_bitset]
+
+[endsect]
+
+[section Friends]
+
+It is possible to program contracts for friend classes and friend functions.
+Classes can be declared friends and later contracted using the [macroref CONTRACT_CLASS] macro as usual:
+
+ CONTRACT_CLASS( // Not even necessary to contract this class.
+ class (x)
+ ) {
+ CONTRACT_CLASS_INVARIANT( void )
+
+ friend class y ;
+
+ // ...
+ };
+
+ CONTRACT_CLASS(
+ class (y)
+ ) {
+ CONTRACT_CLASS_INVARIANT( void )
+
+ // ...
+ };
+
+Friend functions that are declared and defined within the enclosing class use the `friend` keyword within the [macroref CONTRACT_FUNCTION] macro (note that the access level `public`, `protected`, or `private` is optional in this case because these friend functions are not member functions).
+Friend functions that are either forward declared friends or that are defined friends within the enclosing class, must use the [macroref CONTRACT_FREE_BODY] macro.
+For example (see also [file example/contracts friend_counter.cpp]):
+
+[import ../example/contracts/friend_counter.cpp]
+[friend_counter]
+
+The class enclosing the friend declarations might or might not be contracted.
+
+[endsect]
+
+[section Template Specializations]
+
+It is possible to program contracts for class template specializations.
+The generic class template might or might not be contracted (see also [file example/contracts template_specializations_vector.cpp]):
+
+[import ../example/contracts/template_specializations_vector.cpp]
+[template_specializations_vector]
+
+The template specialization types follow the class name as usual but they are wrapped within round parenthesis `( bool, Allocator )` instead than angular parenthesis `< bool, Allocator >` as in the following partial specialization:
+
+[template_specializations_vector_bool_allocator]
+
+The syntax `template( void )` must be used instead of `template< >` to indicate explicit specializations:
+
+[template_specializations_vector_bool]
+
+[endsect]
+
+[section Exception Specifications and Function-Try Blocks]
+
+It is possible to program exception specifications and function-try blocks for constructors, destructors, member functions, and free functions with contracts.
+Exception specifications are part of the function declarations therefore they are programmed within the contract macros but the special syntax `throw( void )` must be used instead of `throw( )` to specify that no exception is thrown:
+
+ throw( ``/exception-type1/``, ``/exception-type2/``, ... ) // As usual.
+ throw( void ) // Instead of `throw( )`.
+
+Function-try blocks are part of the function definition so they are normally programmed outside the contract macros.
+However, for constructors with member initializers, the member initializers must be programmed within the [macroref CONTRACT_CONSTRUCTOR] macro and therefore also the function-try blocks must be programmed within the macro using the following syntax:
+
+ try initialize( ``/initializer1/``, ``/initializer2/``, ... )
+ catch(``/exception-declaration1/``) ( ``/instruction1/``; ``/instruction2/``; ... )
+ catch(``/exception-declaration2/``) ( ``/instruction1/``; ``/instruction2/``; ... )
+ catch(...) ( ``/instruction1/``; ``/instruction2/``; ... )
+
+As usual, only one catch statement must be specified and the other catch statements are optional plus `catch(...)` can be used to catch all exceptions.
+Note however that round parenthesis `( ... )` are used instead of curly parenthesis `{ ... }` to wrap the catch statement instructions (then the catch instructions are programmed with the usual syntax and separated by semicolons `;`).
+(The maximum number of catch statements that can be programmed for constructor-try blocks is specified by the [macroref CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES] macro.)
+
+In the following example the constructor uses a function-try block to throw only `out_of_memory` and `error` exceptions while the destructor uses exception specifications to throw no exception (see also [file example/contracts exception_array.cpp]):
+
+[import ../example/contracts/exception_array.cpp]
+[exception_array]
+
+(The `BOOST_IDENTITY_TYPE` macro can be used to wrap the catch statement exception declaration types if they contain unwrapped commas.)
+
+Exception specifications and function-try blocks apply only to exceptions thrown by the function body and not to exceptions thrown by the contracts themselves (if any) and by the contract checking code generated by this library macros.
+[footnote
+*Rationale.*
+__N1962__ specifies that function-try blocks should only apply to the body code and not to the contract code.
+No explicit requirement is stated in __N1962__ for exception specifications but the authors have decided to adopt the same requirement that applies to function-try blocks (because it seemed of little use for the contract to throw an exception just so it is handled by the exception specification).
+]
+
+[endsect]
+
+[section Specifying Types (no Boost.Typeof)]
+
+This library uses __Boost_Typeof__ to automatically deduces postcondition old value types and constant assertion variable types.
+If programmers do not want the library to use __Boost_Typeof__ they can explicitly specify these types.
+
+The types of postcondition old values are specified instead of using `auto` and they must be wrapped within round parenthesis unless they are fundamental types containing no symbol (these must match the type of the specified old-of expressions):
+
+ (``/type/``) ``/variable/`` = CONTRACT_OLDOF ``/oldof-expression/``
+
+The types of constant assertion variables are specified just before each variable name and they also must be wrapped within round parenthesis unless they are fundamental types containing no symbol:
+
+ const( (``/type1/``) ``/variable1/``, (``/type2/``) ``/variable2/``, ... ) ``/boolean-expression/``
+
+For example (see also [file example/contracts typed_counter.cpp]):
+
+[import ../example/contracts/typed_counter.cpp]
+[typed_counter]
+
+Note that postcondition result values are always specified using `auto`:
+
+ auto ``/result-variable/`` = return
+
+This is because the function return type is know by the library as specified in the function declaration within the [macroref CONTRACT_FUNCTION] macro.
+Therefore, the postcondition result value type is never explicitly specified by programmers (but __Boost_Typeof__ is never used to deduce it).
+
+[note
+It is recommended to not specify these types explicitly and let the library internally use __Boost_Typeof__ to deduce them because the library syntax is more readable without the explicit types.
+However, all types must be properly registered with __Boost_Typeof__ as usual in order to use type-of emulation mode on __CXX03__ compilers that do not support native type-of (see __Boost_Typeof__ for more information).
+]
+
+[endsect]
+
+[section Block Invariants and Loop Variants]
+
+/Block invariants/ can be used anywhere within the function body and they are used to assert correctness conditions of the implementation (very much like `assert`).
+They are programmed specifying a list of assertions to the [macroref CONTRACT_BLOCK_INVARIANT] macro (including static, constant, and select assertions):
+
+ CONTRACT_BLOCK_INVARIANT( ``/assertion1/``, ``/assertion2/``, ... )
+
+When block invariants are used within a loop, they are also called /loop invariants/ (e.g., __Eiffel__ uses this terminology).
+
+Furthermore, this library allows to specify [@http://en.wikipedia.org/wiki/Loop_variant ['loop variants]].
+A loop variant is a non-negative monotonically decreasing number that is updated at each iteration of the loop.
+The specified loop variant expression is calculated by this library at each iteration of the loop and it is automatically asserted to be non-negative (`>= 0`) and to decrease monotonically from the previous loop iteration.
+Because the loop variant monotonically decreases and it cannot be smaller than zero, either the loop terminates or one of the two library assertions will eventually fail in which case the library will call the [funcref contract::loop_variant_broken] handler therefore detecting and stopping infinite loops.
+Each given loop can only have one variant which is specified using the [macroref CONTRACT_LOOP_VARIANT] macro.
+The enclosing loop (`while`, `for`, `do`, etc) must be declared using the [macroref CONTRACT_LOOP] macro:
+
+ CONTRACT_LOOP( ``/loop-declaration/`` ) {
+ CONTRACT_LOOP_VARIANT( ``/non-negative-monotonically-decreasing-expression/`` )
+ ...
+ }
+
+Note that the library cannot automatically make constant any of the variables within the function body therefore constant block invariant assertions and constant loop variant expressions should be used by programmers if they want to enforce constant-correctness for block invariants and loop variants.
+
+The following example uses a loop to calculate the [@http://en.wikipedia.org/wiki/Greatest_common_divisor Greatest Common Divisor (GCD)] of two integral numbers (see also [file example/contracts blockinv_loopvar_gcd.cpp]):
+
+[import ../example/contracts/blockinv_loopvar_gcd.cpp]
+[blockinv_loopvar_gcd]
+
+__Eiffel__ supports loop variants but __N1962__ does not.
+Loop variants might not be very useful especially if __Boost_Foreach__ or similar constructs are used to ensure loop termination.
+
+[endsect]
+
+[section Contract Broken Handlers (Throw on Failure)]
+
+When a contract assertion fails, this library prints a message on the standard error `std::cerr` and it terminates the program calling `std::terminate`.
+Programmers can change this behavior customizing the actions that the library takes on contract assertion failure by setting the contract broken handler functions.
+By default the library terminates the program because a contract failure indicates that the program is in an invalid state that programmers specified it should never happen (so the only sensible assumption is that the program execution should not continue).
+However, in some cases programmers might need to handle even such catastrophic failures by executing some fail-safe code instead of terminating the program and that can be done customizing the contract broken handlers.
+
+The library functions [funcref contract::set_precondition_broken], [funcref contract::set_postcondition_broken], [funcref contract::set_class_invariant_broken], [funcref contract::set_block_invariant_broken], and [funcref contract::set_loop_variant_broken] can be used to customize the action to taken in case of precondition, postcondition, class invariant, block invariant, and loop variant failure respectively.
+Furthermore, class invariants are checked at entry, at normal exit, and at exit but when exceptions are thrown so more granular handlers can be set for each of these cases using [funcref contract::set_class_invariant_broken_on_entry], [funcref contract::set_class_invariant_broken_on_exit], and [funcref contract::set_class_invariant_broken_on_throw] (using [funcref contract::set_class_invariant_broken] is equivalent to setting all these class invariant broken handles to the same handler).
+[footnote
+__N1962__ does not allow to configure class invariant broken handlers differently for entry, exit, and throw.
+]
+
+This library passes a parameter of type [enumref contract::from] to the contract broken handler functions indicating the context that failed the contract assertion (e.g., this parameter will be set to `contract::FROM_DESTRUCTOR` if the contract assertion failed from a destructor):
+[footnote
+The `contract::from` parameter was not part of __N1962__ contract broken handlers but the proposal hinted that it might be needed (need that was confirmed by the implementation of this library).
+]
+
+ void ``/contract-broken-handler/`` ( contract::from const& context )
+
+[important
+In order to comply with the STL exception safety requirements, destructors should never throw.
+Therefore, even if programmers customize the contract broken handlers to throw exceptions instead of terminating, the handlers should never throw when contract assertions fail from a destructor (and the [enumref contract::from] parameter can be used to discriminate this case).
+]
+
+The contract broken handlers are always invoked with an active exception that refers to the exception that failed the contract:
+[footnote
+*Rationale.*
+Exceptions are used to signal a contract assertion failure because it is not possible to directly call the contract broken handler ([funcref contract::precondition_broken], etc) instead of throwing the exception in oder to properly implement subcontracting.
+For example, if an overriding precondition fails but the overridden precondition is true then the library will not call the broken handler even if the overriding precondition threw an exception (as required by subcontracting).
+Contract assertion failures are critical error conditions so it is actually natural that the library uses exceptions to signal them (note that the library will always handle the exceptions by calling the contract broken handlers which terminate the program by default so the fact that the library signals contract assertion failures using exceptions does not imply that an exception will be thrown if a contract assertion fails, that is entirely decided by the implementation of the broken handlers).
+]
+
+# Either an exception that was explicitly thrown by the user from the contract (e.g. `not_a_number` in the example blow).
+# Or, an exception that was thrown ["behind the scene] while evaluating a contract assertion (e.g., the assertion calls an STL algorithm and that throws `std::bad_alloc`).
+# Or, an exception automatically thrown by this library in case a contract assertion is evaluated to be false (these exceptions are always [classref contract::broken] objects and they contained detailed information about the contract assertion that was evaluated to be false: file name, line number, assertion number, and assertion code).
+[footnote
+The assertion number is meaningful only within a specific handler.
+For example, if assertion number `2` failed within the class invariant broken handler that mean that the class invariant number `2` failed.
+Therefore, the assertion number is not useful if a single handler is programmed for all types of contracts because such an handler can no longer distinguish between class invariants, preconditions, postconditions, etc.
+]
+
+In all these cases the contract assertion is considered failed because it was not evaluated to be true (and that is the case not only for assertions that are evaluated to be false but also for assertions that throw exceptions while being evaluated).
+[footnote
+*Rationale.*
+Threating an exception thrown while evaluating an assertion as a failure of the contract assertion is a clear policy established by this library under the principle that a contract assertion fails unless it is evaluated to be true.
+__N1962__ does not completely clarify this point.
+]
+The customized contract broken handlers can re-throw the active exception and catch it so to inspect it for logging or for any other customized behaviour that might need to be implemented by the programmers.
+
+The following example customizes the contract broken handlers to throw exceptions (both user-defined exceptions like `not_a_number` and the [classref contract::broken] exception that the library automatically throws in case of a contract assertion failure).
+However, the customized handlers never throw from within a destructor to comply with STL exception safety requirements (see also [file example/contracts broken_handler_sqrt.cpp]):
+[footnote
+In this example, contract failures from destructors are logged and then simply ignored.
+That might be acceptable in this simple example but it is probably a very bad idea in general.
+]
+
+[import ../example/contracts/broken_handler_sqrt.cpp]
+[broken_handler_sqrt]
+
+Note how the ternary operator `:?` can be used to program assertions that throw exceptions on failure:
+
+ x >= 0.0 ? true : throw not_a_number
+
+Then the contract broken handlers are customized to propagate the exceptions instead of handling them by calling `std::terminate` (default behaviour).
+
+See also [file example/contracts contract_failure.cpp] for a more complex example that redefines the contract broken handlers to throw exceptions in order to automatically check that the correct contract broken handlers are called when assertions fail in accordance with the call semantics explained in the __Contract_Programming_Overview__ section.
+
+[endsect]
+
+[endsect]
+
Added: sandbox/contract/doc/bibliography.qbk
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/bibliography.qbk 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,77 @@
+
+[/ Copyright (C) 2008-2012 Lorenzo Caminiti ]
+[/ Distributed under 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) ]
+[/ Home at http://sourceforge.net/projects/contractpp ]
+
+[section Bibliography]
+
+[#Bright04_anchor] [Bright04] W. Bright. [@http://www.digitalmars.com/d/2.0/dbc.html /Contract Programming for the D Programming Language/]. 2004.
+
+[#Bright04b_anchor] [Bright04b] W. Bright. [@http://www.digitalmars.com/ctg/contract.html /Contract Programming for the Digital Mars C++ Compiler/]. 2004.
+
+[#C2_anchor] [C2] Aechmea. [@http://www.programmersheaven.com/app/news/DisplayNews.aspx?NewsID=3843 /C^2 Contract Programming add-on for C++/]. 2005.
+
+[#Chrome02_anchor] [Chrome02] RemObjects. [@http://blogs.remobjects.com/blogs/mh/2008/05/01/p216 /Chrome: Contract Programming for Object Pascal in .NET/]. 2002.
+
+[#Clarke06_anchor] [Clarke06] L. A. Clarke and D. S. Rosenblum. [@http://discovery.ucl.ac.uk/4991/1/4991.pdf /A Historical Perspective on Runtime Assertion Checking in Software Development/]. Newsletter ACM SIGSOFT Software Engineering Notes, 2006.
+
+[#Cline90_anchor] [Cline90] M. Cline and D. Lea. /The Behaviour of C++ Classes/ and [@http://surface.syr.edu/cgi/viewcontent.cgi?article=1116&context=eecs /Using Annotated C++/]. Proc. of the Symposium on Object Oriented Programming Emphasizing Practical Applications, Maris College, 1990.
+
+[#Ellis90_anchor] [Ellis90] M. A. Ellis and B. Stroustrup. /The Annotated C++ Reference Manual/. ANSI Base Document, Addison Wesley, 1990.
+
+[#Gautron92_anchor] [Gautron92] P. Gautron. /An Assertion Mechanism Based on Exceptions/. Fourth C++ Technical Conference, 1992.
+
+[#Hoare73_anchor] [Hoare73] C. A. R. Hoare. /Hints on Programming Language Design/. Stanford University Artificial Intelligence memo AIM-224/STAN-CS-73-403, pages 193-216, 1973.
+
+[#CodeContracts_anchor] [CodeContracts] Microsoft Research. [@http://research.microsoft.com/en-us/projects/contracts/ /Code Contracts: Design-By-Contract Programming for All .NET Programming Languages/]. 2012.
+
+[#iContract_anchor] [iContract] O. Enseling. [@http://www.javaworld.com/javaworld/jw-02-2001/jw-0216-cooltools.html /iContract: Contract Programming for Java/]. 2001.
+
+[#Jcontract_anchor] [Jcontract] Parasoft. [@http://www.parasoft.com/jsp/products/article.jsp?label=product_info_Jcontract /Jcontract: Contract Programming for Java/].
+
+[#Lindrud04_anchor] [Lindrud04] J. Lindrud. [@http://www.codeproject.com/Articles/8293/Design-by-Contract-in-C /Design by Contract in C++/]. 2004.
+
+[#Maley99_anchor] [Maley99] D. Maley and I. Spence. [@http://www.computer.org/portal/web/csdl/doi/10.1109/TOOLS.1999.779000 /Emulating Design by Contract in C++/]. Proceedings of TOOLS, IEEE Computer Society, 1999.
+
+[#Meyer97_anchor] [Meyer97] B. Meyer. /Object Oriented Software Construction/. Prentice-Hall, 2nd edition, 1997.
+
+[#Mitchell02_anchor] [Mitchell02] R. Mitchell and J. McKim. /Design by Contract, by Example/. Addison-Wesley, 2002.
+
+[#N1613_anchor] [N1613] T. Ottosen. [@http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2004/n1613.pdf /Proposal to add Design by Contract to C++/]. The C++ Standards Committee, N1613, 2004.
+
+[#N1653_anchor] [N1653] C. Nelson. [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1653.htm /Working draft changes for C99 preprocessor synchronization/]. C++ Standards Committee, N1653, 2004.
+
+[#N1669_anchor] [N1669] T. Ottosen. [@http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2004/n1669.html /Proposal to add Contract Programming to C++ (revision 1)/]. The C++ Standards Committee, N1669, 2004.
+
+[#N1773_anchor] [N1773] D. Abrahams, L. Crowl, T. Ottosen, and J. Widman. [@http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1773.html /Proposal to add Contract Programming to C++ (revision 2)/]. The C++ Standards Committee, N1773, 2005.
+
+[#N1866_anchor] [N1866] L. Crowl and T. Ottosen. [@http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1866.html /Proposal to add Contract Programming to C++ (revision 3)/]. The C++ Standards Committee, N1866, 2005.
+
+[#N1895_anchor] [N1895] H. Sutter and F. Glassborow. [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1895.pdf /Delegating Constructors (revision 2)/]. C++ Standards Committee, N1895, 2005.
+
+[#N1962_anchor] [N1962] L. Crowl and T. Ottosen. [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1962.html /Proposal to add Contract Programming to C++ (revision 4)/]. The C++ Standards Committee, N1962, 2006.
+
+[#N2081_anchor] [N2081] D. Gregor, B. Stroustrup. [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2081.pdf /Concepts (revision 1)/]. The C++ Standards Committee, N2081, 2006.
+
+[#N2914_anchor] [N2914] P. Becker. [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2914.pdf /Working Draft, Standard for Programming Language C++/]. The C++ Standards Committee, N2914, 2009.
+
+[#N2906_anchor] [N2906] B. Stroustrup. [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2906.pdf /Simplifying the sue of concepts/]. The C++ Standards Committee, N2906, 2009.
+
+[#Rosenblum95_anchor] [Rosenblum95] D. S. Rosenblum. [@http://www.cs.toronto.edu/~chechik/courses06/csc410/rosenblum_assert95.pdf /A practical Approach to Programming With Assertions/]. IEEE Transactions on Software Engineering, 1995.
+
+[#SPARKAda_anchor] [SPARKAda] Praxis. [@http://www.praxis-his.com/sparkada/language.asp /SPARKAda (Ada-like Language with Contract Programming)/].
+
+[#SpecSharp_anchor] [SpecSharp] Microsoft. [@http:://research.microsoft.com/en-us/projects/specsharp/ /Spec# (C# Extension)/].
+
+[#Stroustrup94_anchor] [Stroustrup94] B. Stroustrup. /The Design and Evolution of C++/. Addison Wesley, 1994.
+
+[#Stroustrup97_anchor] [Stroustrup97] B. Stroustrup. /The C++ Programming Language/. Prentice-Hall, 2nd Edition, 1997.
+
+[#Tandin04_anchor] [Tandin04] A. Tandin. [@http://www.codeproject.com/KB/macros/DbC_and_Doxygen.aspx /Design by Contract macros for C++ and link to Doxygen/]. 2004.
+
+[#Wilson06_anchor] [Wilson06] M. Wilson. [@http://www.artima.com/cppsource/deepspace.html /Contract Programming 101 - The Nuclear Reactor and the Deep Space Probe/]. The C++ Source, 2006.
+
+[endsect]
+
Added: sandbox/contract/doc/bjam.py
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/bjam.py 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,42 @@
+
+# Copyright (C) 2008-2012 Lorenzo Caminiti
+# Distributed under 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)
+# Home at http://sourceforge.net/projects/contractpp
+
+import os
+import sys
+import shutil
+
+# Simple script that customizes Boost's navbar before building the docs.
+# Unfortunately, Boost does not have mechanism to customize its navbar
+# (essentially only on/off is supported), this script replaces files manually.
+
+BOOST_ROOT = os.getenv("BOOST_ROOT")
+boost_navbar = BOOST_ROOT + "/tools/boostbook/xsl/navbar.xsl"
+backup_navbar = "navbar.xsl.bak"
+my_navbar = "navbar.xsl"
+
+args = " "
+for i in range(1, len(sys.argv)): args = args + sys.argv[i] + " "
+
+print 'Saving Boost "navbar.xsl"...'
+shutil.copyfile(boost_navbar, backup_navbar)
+
+try:
+ print 'Installing customized "navbar.xsl"...'
+ shutil.copyfile(my_navbar, boost_navbar)
+ print 'Building documentation...'
+ print
+ os.system("bjam" + args + " bjampy")
+ print
+except:
+ print 'Error: Unable to build documentation'
+
+try:
+ print 'Restoring Boost "navbar.xsl"...'
+ shutil.copyfile(backup_navbar, boost_navbar)
+except:
+ print 'Error: Unable to restore Boost "navbar.xsl"'
+
Added: sandbox/contract/doc/concepts.qbk
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/concepts.qbk 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,219 @@
+
+[/ Copyright (C) 2008-2012 Lorenzo Caminiti ]
+[/ Distributed under 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) ]
+[/ Home at http://sourceforge.net/projects/contractpp ]
+
+[section Concepts]
+
+This section explains how to use this library to check concepts.
+Concepts are part of the program specifications because they enforce requirements on generic types at compile-time and therefore they are within the scope of this library.
+
+Concepts were proposed for addition to __CXX11__ but they were unfortunately never adopted (see __N2081__).
+The concepts that are checked using this library need to be defined using the __Boost_ConceptCheck__ library.
+This library does not add any extra functionality with respect to the concept checking features already provided by __Boost_ConceptCheck__ but it allows to specify both concepts and contracts together within a unified syntax.
+
+[section Class Templates]
+
+It is possible to list the concepts to check for class templates using `requires` within the [macroref CONTRACT_CLASS] macro, after the template parameter declarations (see also the __Grammar__ section):
+
+ template( ``/template-parameter1/``, ``/template-parameter2/``, ... ) requires( ``/concept1/``, ``/concept2/``, ... )
+
+The following example requires that the generic type `T` specified for the class template `vector` is always __CopyConstructible__ and it uses the `boost::CopyConstructible` concept defined by __Boost_ConceptCheck__ (see also [file example/concepts class_member_concept_vector.hpp], [file example/concepts class_member_concept_vector_error.cpp], and [file example/concepts class_member_concept_vector.cpp]):
+
+[import ../example/concepts/class_member_concept_vector.hpp]
+[class_member_concept_vector_class]
+
+If the class template `vector` is instantiated on a type `T` that is not __CopyConstructible__, the compiler will generate an error (with the usual format of __Boost_ConceptCheck__ errors).
+
+[endsect]
+
+[section Function Templates]
+
+It is possible to list concepts to check for function templates using `requires` within the [macroref CONTRACT_FUNCTION] macro, after the template parameter declarations (see also the __Grammar__ section).
+
+For example, for a constructor function template (see also [file example/concepts class_member_concept_vector.hpp], [file example/concepts class_member_concept_vector_constructor_error.cpp], and [file example/concepts class_member_concept_vector.cpp]):
+
+[class_member_concept_vector_constructor]
+
+And, for a member function template (see also [file example/concepts class_member_concept_vector.hpp], [file example/concepts class_member_concept_vector_member_error.cpp], and [file example/concepts class_member_concept_vector.cpp]):
+
+[class_member_concept_vector_member]
+
+If the `vector` constructor template or the `vector::insert` member function template are instantiated on a type `Iterator` that is not an __InputIterator__, the compiler will generate an error (with the usual format of __Boost_ConceptCheck__ errors).
+
+So far we have used concepts that are predefined by __Boost_ConceptCheck__ but it is also possible to check user-defined concepts as long as they are defined using __Boost_ConceptCheck__.
+For example, consider the following user-defined `Addable` concept (see also [file example/concepts free_concept_operator_preinc.hpp], [file example/concepts free_concept_operator_preinc_error.cpp], and [file example/concepts free_concept_operator_preinc.cpp]):
+
+[import ../example/concepts/free_concept_operator_preinc.hpp]
+[free_concept_operator_preinc]
+
+If this templated operator `++` is instantiated on a type `T` that is not __Assignable__ or not `Addable`, the compiler will generate an error (with the usual format of __Boost_ConceptCheck__ error).
+
+Note that concepts can also be specified for free function templates, for free operator templates, and for member operator templates (as illustrated in some of the above examples).
+
+[endsect]
+
+[section Concept Definitions (Not Implemented)]
+
+Using the preprocessor parsing techniques introduced by the library, it should be possible to implement the following syntax to define [@http://en.wikipedia.org/wiki/Concepts_(C%2B%2B) concepts].
+Note how this syntax resembles the syntax proposed by __N2081__ for adding concepts to __CXX11__ (__N2081__ and concepts were unfortunately not adopted by the standard committee).
+
+ CONTRACT_CONCEPT( // A concept definition.
+ auto concept (LessThanComparable) ( typename T )
+ (
+ bool operator(<)(less) ( T , T )
+ )
+ )
+
+ CONTRACT_CONCEPT( // Concepts with multiple parameters.
+ auto concept (Convertible) ( typename T, typename U )
+ (
+ operator(U)(U_type) ( T const& )
+ )
+ )
+
+ CONTRACT_CONCEPT( // Concept composition.
+ concept (InputIterator) ( typename Iterator, typename Value )
+ (
+ requires Regular<Iterator>,
+
+ (Value) operator(*)(deref) ( Iterator const& ),
+ (Iterator&) operator(++)(preinc) ( Iterator& ),
+ (Iterator) operator(++)(postinc) ( Iterator&, int )
+ )
+ )
+
+ CONTRACT_CONCEPT( // Derived concepts.
+ concept (ForwardIterator) ( typename Iterator, typename Value )
+ extends( InputIterator<Iterator, Value> )
+ (
+ // Other requirements here...
+ )
+ )
+
+ CONTRACT_CONCEPT( // Typenames within concepts.
+ concept (InputIterator) ( typename Iterator )
+ (
+ typename value_type,
+ typename reference,
+ typename pointer,
+ typename difference_type,
+
+ requires Regular<Iterator>,
+ requires (Convertible<reference, value_type>),
+
+ (reference) operator(*)(deref) ( const Iterator& ),
+ (Iterator&) operator(++)(preinc) ( Iterator& ),
+ (Iterator) operator(++)(postinc) ( Iterator&, int )
+ )
+ )
+
+ CONTRACT_CONCEPT( // Concept maps.
+ concept_map (InputIterator<char*>)
+ (
+ typedef char value_type,
+ typedef (char&) reference,
+ typedef (char*) pointer,
+ typedef ptrdiff_t difference_type
+ )
+ )
+
+ CONTRACT_CONCEPT( // Concept maps can be templated.
+ template( typename T )
+ concept_map (InputIterator) ( T* )
+ (
+ typedef (T&) value_type,
+ typedef (T&) reference,
+ typedef (T*) pointer,
+ typedef ptrdiff_t difference_type
+ )
+ )
+
+ CONTRACT_CONCEPT( // Concept maps as mini-types.
+ concept (Stack) ( typename X )
+ (
+ typename value_type,
+
+ void (push) ( X&, value_type const& ),
+ void (pop) ( X& ),
+ (value_type) (top) ( X const& ),
+ bool (empty) ( X const& )
+ )
+ )
+
+ CONTRACT_CONCEPT( // Concept maps as mini-types (specializations).
+ template( typename T )
+ concept_map (Stack) ( std::vector<T> )
+ (
+ typedef (T) value_type,
+
+ void (push) ( (std::vector<T>&) v, (T const&) x )
+ (
+ v.push_back(x);
+ ),
+
+ void (pop) ( (std::vector<T>&) v )
+ (
+ v.pop_back();
+ ),
+
+ (T) (top) ( (std::vector<T> const&) v )
+ (
+ return v.back();
+ ),
+
+ bool (empty) ( (std::vector<T> const&) v )
+ (
+ return v.emtpy();
+ )
+ )
+ )
+
+ CONTRACT_CONCEPT( // Axioms.
+ concept (Semigroup) ( typename Op, typename T )
+ extends( CopyConstructible<T> )
+ (
+ (T) operator(())(call) ( Op, T, T ),
+
+ axiom (Associativity) ( (Op) op, (T) x, (T) y, (T) z )
+ (
+ op(x, op(y, z)) == op(op(x, y), z);
+ )
+ )
+ )
+
+Note that:
+
+# Parenthesis around function parameter types can be always allowed but they should be required only when the parameter name is also specified.
+# The function bodies need to be specified within the macros and that will make compiler errors very hard to use (because the errors will all refer to the same line number, the line number on which the `CONTRACT_CONCEPT` macro expanded).
+However, concept definitions, including possible function bodies, might be simple enough for this not to be a major issue at least in the most common cases (the authors do not have enough experience with programming concept definitions to truly assess this).
+
+The authors /think/ this syntax can be implemented and parsed using the preprocessor however the authors have not tried to implement this yet.
+If this syntax can indeed be implemented, it should then be investigated if the actual concept definitions can be programmed from the parsed concept traits using C++ (this seems possible at least for __CXX11__ based on some work done for the [@http://zao.se/~zao/boostcon/11/slides/Boost.Generic.pdf Generic] library).
+
+The authors recognize that implementing concept definitions would be a nice addition to this library (again, concepts are parts of the program specifications, they are contracts on the type system that are checked at compile-time, so both concept checking and concept definition are within the scope of this library).
+However, at the moment there are no concrete plans for extending this library with the concept definitions (see also [@https://sourceforge.net/apps/trac/contractpp/ticket/49 Ticket 49]).
+
+The following is a side-by-side comparison of this possible concept definition syntax with the syntax proposed by __N2081__:
+
+[import ../example/concepts/concept_def.cpp]
+[import ../example/concepts/concept_def_npaper.cpp]
+[table
+[ [Possible Extension of This Library (not implemented)] [\[N2081\] Proposal (not part of C++)] ]
+[ [[concept_def]] [[concept_def_npaper]] ]
+]
+
+Note that:
+
+# Extra wrapping parenthesis are used when expressions contain unwrapped commas `,` or leading symbols.
+# The specifiers `constructor`, `destructor`, and `member` follow the same syntax as the [macroref CONTRACT_CONSTRUCTOR_BODY] and [macroref CONTRACT_DESTRUCTOR_BODY], and they serve a purpose similar to these macros in naming the constructors, destructors, and member functions outside class declarations.
+
+If concept definitions were added to this library, concepts would still be checked using the `requires` specifier in class and function declarations as we have seen so far (it might even be possible for concepts defines using __Boost_ConceptCheck__ to be still specified using some type tagging of this library concept types to internally distinguish between __Boost_ConceptCheck__ concepts and concepts define using this library).
+Furthermore, this library could provide all the standard concepts defined in __N2914__ in an header file =contract/std/concept.hpp=.
+
+[endsect]
+
+[endsect]
+
Added: sandbox/contract/doc/contract_programming_overview.qbk
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/contract_programming_overview.qbk 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,528 @@
+
+[/ Copyright (C) 2008-2012 Lorenzo Caminiti ]
+[/ Distributed under 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) ]
+[/ Home at http://sourceforge.net/projects/contractpp ]
+
+[section Contract Programming Overview]
+
+[:['["It is absurd to make elaborate security checks on debugging runs, when no trust is put in the results, and then remove them in production runs, when an erroneous result could be expensive or disastrous. What would we think of a sailing enthusiast who wears his life-jacket when training on dry land but takes it off as soon as he goes to sea?]]]
+[:['-- Charles Antony Richard Hoare (see __Hoare73__)]]
+
+This section gives an overview of Contract Programming (see __Meyer97__, __Mitchell02__, and __N1613__ for a detailed introduction to Contract Programming).
+
+[note
+The objective of this library is /not/ to convince programmers to use Contract Programming.
+It is assumed that programmes understand the benefits and trade-offs associated with Contract Programming and they have already decided to use this methodology to formally program specifications.
+Then, this library aims to be the best Contract Programming library for C++.
+]
+
+[section Assertions]
+
+Contract Programming is characterized by the following type of assertion mechanisms.
+
+[table
+[ [Assertion] [Purpose] ]
+[ [Preconditions] [
+These are logical conditions that programmers expect to be true when the function is called (e.g., to check constraints on the function arguments).
+] ]
+[ [Postconditions] [
+These are logical conditions that programmers expect to be true when the function has ended normally (e.g., to check the result and any side effect that a function might have).
+Postconditions can usually access the function result value (for non-void functions) and /old values/ that expressions had before the body execution.
+] ]
+[ [Class Invariants] [
+These are logical conditions that programmers expect to be true after the constructor has been executed successfully, before and after the execution of every non-static public member function, and before the destructor is executed (e.g, class invariants can define valid states of all objects of a class).
+It is possible to describe a different set of class invariants for volatile member functions but /volatile class invariants/ are assumed to be same as class invariants unless differently specified.
+It is also possible to describe /static class invariants/ which are excepted to be true before and after the execution of any public member function (even if static), including constructor entry and destructor exit.
+[footnote
+*Rationale.*
+Static and volatile class invariants were first introduced by this library to reflect the fact that C++ support both static and volatile member functions.
+Static and volatile class invariants are not part of __N1962__.
+]
+] ]
+[ [Subcontracting] [
+Subcontracting is defined using the __substitution_principle__ and it predicates that: Preconditions cannot be strengthen, postconditions and class invariants cannot be weaken.
+] ]
+[ [Block Invariants] [
+These are logical conditions that programmers except to be true every time the execution reaches the point where the condition is asserted.
+When used within a loop (i.e., a block of code that can be executed in iteration), block invariants are also called /loop invariants/ and they assert conditions that are expected to be true for every loop iteration.
+] ]
+[ [Loop Variants] [
+For a given loop, a [@http://en.wikipedia.org/wiki/Loop_variant loop variant] is a non-negative integer expression (`>= 0`) with a value that is expected to decrease at every subsequent loop iteration.
+Loop variants are used to ensure that loops terminate avoiding infinite iterations.
+] ]
+]
+
+It is a common Contract Programming requirement to disable other contracts while a contract assertions is being evaluated (in order to avoid infinite recursive calls).
+This library implement this feature however it should be noted that in order to globally disable assertions while checking another assertion, some type of global variable needs to be used.
+In multi-threaded environments, programmers can define the [macroref CONTRACT_CONFIG_THREAD_SAFE] configuration macro to protect such a global variable from racing conditions (but that will effectively introduce a global lock in the program).
+
+A limited form of Contract Programming is the use of the C++ `assert` macro.
+Using `assert` is common practice for many programmers but unfortunately it suffers from the following problems (that are instead resolved by using Contract Programming):
+
+# `assert` is used within the implementation therefore the asserted conditions are not easily visible to the caller which is only familiar with the class and function declarations.
+# `assert` does not distinguish between preconditions and postconditions.
+In well-tested production code, postconditions can be disabled trusting the correctness of the implementation while preconditions might still need to remain enabled because of the evolution of the calling code.
+Using `assert` it is not possible to selectively disable only postconditions and all assertions must be disabled at once.
+# `assert` requires to manually program extra code to check class invariants (e.g., extra member functions and try blocks).
+# `assert` does not support subcontracting.
+
+[endsect]
+
+[section Benefits]
+
+The main use of Contract Programming is to improve software quality.
+__Meyer97__ discusses how Contract Programming can be used as the basic tool to write ["correct] software.
+Furhtermore, __Stroustrup97__ discusses the key importance of class invariants plus advantages and disadvantages of preconditions and postconditions.
+The following is a short summary of the benefits associated with Contract Programming mainly taken from __N1613__.
+
+[table
+[ [#] [Topic] [Benefit] ]
+[ [1.] [Preconditions and Postconditions] [
+Using function preconditions and postconditions, programmers can give a precise semantic description of what a function requires at its entry and what it ensures under its (normal) exit.
+In particular, using postcondition old values, Contract Programming provides a mechanism that allows programmers to compare values of an expression before and after the function body execution.
+This mechanism is powerful enough to enable programmers to express many constraints within the code, constraints that would otherwise have to be captured at best only informally by the code documentation.
+] ]
+[ [2.] [Class Invariants] [
+Using class invariants, programmers can describe what to expect from a class and the logic dependencies between the class members.
+It is the job of the constructor to ensure that the class invariants are satisfied when the object is first created.
+Then the implementation of the member functions can be largely simplified as they can be written knowing that the class invariants are satisfied because Contract Programing checks them before and after the execution of every member function.
+Finally, the destructor makes sure that the class invariants hold for the entire life of the object, checking the class invariants one last time before the object is destructed.
+] ]
+[ [3.] [Self-Documenting Code] [
+Contracts are part of the source code, they are executed and verified at run-time so they are always up to date with the code itself.
+Therefore the specifications, as documented by the contracts, can be trusted to always be up to date with the implementation code.
+] ]
+[ [4.] [Easier Debugging] [
+Contract Programming can provide a powerful debugging facility because, if contracts are well written, bugs will cause contract assertions to fail exactly where the problem first occurs instead than at some later stage of the program execution in an apparently unrelated manner.
+Note that a precondition failure points to a bug in the function caller, a postcondition failure points instead to a bug in the function implementation.
+Furthermore, in case of contract failure, this library provides detailed error messages that greatly helps debugging.
+[footnote Of course, if the contract is ill written then Contract Programming is of little use.
+However, it is less likely to have a bug in both the function body and the contract than in the function body only.
+For example, consider the validation of a result in postconditions.
+Validating the return value might seem redundant, but in this case we actually want that redundancy.
+When programmers write a function, there is a certain probability that they make a mistake in implementing the function body.
+When programmers specify the result of the function in the postconditions, there is also a certain probability that they make a mistake in writing the contract.
+However, the probability that programmers make a mistake twice (in both the body /and/ the contract) is lower than the probability that the mistake is made just once (in either the body or the contract).]
+] ]
+[ [5.] [Easier Testing] [
+Contract Programming facilitates testing because a contract naturally specifies what a test should check.
+For example, preconditions of a function state which inputs cause the function to fail and postconditions state which outputs are produced by the function on normal exit.
+] ]
+[ [6.] [Formal Design] [
+Contract Programming can serve to reduce the gap between designers and programmers by providing a precise and unambiguous specification language.
+Moreover, contracts can make code reviews easier.
+] ]
+[ [7.] [Formal Inheritance] [
+Contract Programming formalizes the virtual function overriding mechanism using subcontracting as justified by the __substitution_principle__.
+This keeps the base class programmers in control as overriding functions still have to fully satisfy the base class contracts.
+] ]
+[ [8.] [Replace Defensive Programming] [
+Contract Programming assertions can replace [@http://en.wikipedia.org/wiki/Defensive_programming Defensive Programming] checks localizing these checks within the contract and making the code more readable.
+] ]
+]
+
+[endsect]
+
+[section Costs]
+
+Contract Programming benefits come to the cost of performance as discussed in detail by both __Stroustrup97__ and __Meyer97__.
+However, while performance trade-offs should be carefully considered depending on the specific application domain, software quality cannot be sacrificed (it is difficult to see the value of software that quickly and efficiently provides an incorrect result).
+
+The run-time performances are negatively impacted by Contract Programming mainly because of the following:
+
+# The extra processing required to check the assertions.
+# The extra processing required by the additional function calls (additional functions are invoked to check preconditions, postconditions, class invariants, etc).
+# The extra processing required to copy expression results when old values that are used in postconditions.
+
+To mitigate the run-time performance impact, programmers can selectively turn off some of the contract compilation and the related run-time checking.
+Programmers will have to decide based on the performance trade-offs required by their applications but a reasonable approach usually is to:
+
+* Always write contracts to clarify the semantics of the design embedding the specifications directly into the code and making the code self-documenting.
+* Enable preconditions, postconditions, and class invariants compilation and checking during initial testing.
+* Enable only preconditions (and possibly class invariants) during release testing and for the final release (see also [macroref CONTRACT_CONFIG_NO_PRECONDITIONS], [macroref CONTRACT_CONFIG_NO_POSTCONDITIONS], and [macroref CONTRACT_CONFIG_NO_CLASS_INVARIANTS]).
+
+This approach is usually reasonable because in well-tested production code, validating the function body implementation using postconditions and class invariants is rarely needed since the function has shown itself to be ["correct] during testing.
+On the other hand, checking function arguments using postconditions is always needed because of the evolution of the calling code.
+Furthermore, postconditions are usually computationally more expensive to check (see the __Assertion_Requirements__ section for a mechanism to selectively enable assertions also based on their computational complexity).
+
+Compile-time performances are also impacted by this library mainly because:
+
+# The contracts appear in class and function declarations (usually header files) so they have to be re-compiled for each translation unit.
+# The library implementation extensively uses preprocessor and template meta-programming which significantly stress compiler performances.
+
+[#compilation_time_warning_anchor]
+[warning
+Unfortunately, the current implementation of this library significantly slows down compilation.
+For example, for a project with 122 files and 15,471 lines of code, adding contracts to a total of 50 classes and 302 functions increased compilation time from 1 minute to 26 minutes when compilation was enabled for all contracts, and from 1 minute to 2 minutes when contracts were left in the code but contract compilation was disabled using this library configuration macros `CONTRACT_CONFIG_NO_...`.
+[footnote
+This library macros always need to expand to generate the class and function declarations even when contract compilation is disabled.
+That is why there is a compile-time overhead, even if significantly smaller, also when contracts are all disabled (in this case however there is zero run-time overhead).
+The compilation time overhead when all contracts are turned off could be further reduced by optimizing the library implementation to not include internal headers that are not required when contracts are off (this type of optimizations will be a major focus on future releases).
+]
+
+On compilers that support [@http://en.wikipedia.org/wiki/Precompiled_header pre-compiled headers] (GCC, MSVC, etc), these can be used to reduce re-compilation time.
+For example, re-compilation time of [link contract__.examples.__n1962___vector__comparison_with_c___proposed_syntax =vector.cpp=] from the __Examples__ section is reduced from 44 seconds to 24 seconds (55% faster) when its header [link contract__.examples.__n1962___vector__comparison_with_c___proposed_syntax =vector.hpp=] is pre-compiled (with all contracts enabled).
+[footnote
+There is essentially no gain in pre-compiling this library headers because most of the compilation time is taken by expanding and compiling this library macros as they appear in the user code (and not by the library implementation code itself).
+Furthermore, pre-compiled headers should be used with the usual care because they can complicate the build system and they introduce extra dependencies that might limit the amount of targets that can be built simultaneously in a parallel build.
+However, if properly used, pre-compiled headers can significantly reduce re-compilation time when using this library.
+]
+
+The authors have not done a detailed preprocessing-time and compile-time analysis of the performances of this library.
+Therefore, the authors have not yet tried to optimize this library compilation-time.
+Reducing compilation-time will be a major focus of future releases (see also [@https://sourceforge.net/apps/trac/contractpp/ticket/48 Ticket 48]).
+]
+
+Finally, Contract Programming should be seen as a tool to complement (and not to substitute) testing.
+
+[endsect]
+
+[section Free Function Calls]
+
+A /free function/
+[footnote
+In C++, a free function is any function that is not a member function.
+]
+call executes the following steps:
+
+# Check the function preconditions.
+# Execute the function body.
+# Check the function postconditions.
+
+[endsect]
+
+[section Member Function Calls]
+
+A member function call executes the following steps:
+
+# Check the static class invariants.
+# Check the non-static class invariants (in __logic_and__ with the base class invariants when subcontracting).
+These are checked only for non-static member functions.
+[footnote
+Static member functions cannot be virtual so they cannot be overridden and they do not subcontract.
+]
+Volatile member functions check volatile class invariants instead.
+# Check the function preconditions (in __logic_or__ with the overridden function preconditions when subcontracting).
+# Execute the function body.
+# Check the static class invariants (even if the body throws an exception).
+# Check the non-static class invariants (in __logic_and__ with the base class invariants when subcontracting).
+These are checked only for non-static member functions and even if the body throws an exception.
+Volatile member functions check volatile class invariants instead.
+# Check the function postconditions (in __logic_and__ with the overridden function postconditions when subcontracting).
+These are checked only if the body does not throw an exception.
+
+[#logic_and_anchor] [#logic_or_anchor]
+In this documentation __logic_and__ and __logic_or__ are the logic /and/ and /or/ operations evaluated in short-circuit:
+
+* `p` __logic_and__ `q` is true if and only if both `p` and `q` are true but `q` is evaluated only when `p` is true.
+* `p` __logic_or__ `q` is true if and only if either `p` or `q` is true but `q` is evaluated only when `p` is false.
+
+Class invariants are checked before preconditions and postconditions so that preconditions and postconditions assertions can be simplified by being programmed under the assumption that class invariants are satisfied (e.g., if class invariants assert that a pointer cannot be null then preconditions and postconditions can safety dereference the pointer without additional checking).
+Similarly, subcontracting checks contracts of base classes before checking the derived class contracts so that the base class contract can be programmed under the assumption that the base class contracts are satisfied.
+When a member function overrides more than one virtual base function because of multiple inheritance:
+
+* Class invariants are checked in __logic_and__ with the class invariants of all base classes following the inheritance order.
+* Preconditions are checked in __logic_or__ with the preconditions of all overridden functions following the inheritance order.
+* Postconditions are checked in __logic_and__ with the postconditions of all overridden functions following the inheritance order.
+
+Note that:
+
+* Preconditions and postconditions of static member functions cannot access the object.
+* Preconditions, postconditions, and volatile class invariants of volatile member functions access the object as (constant) volatile.
+
+[endsect]
+
+[section Constructor Calls]
+
+A constructor call executes the following steps:
+
+# Check the constructor preconditions.
+# Initialize base classes and members executing the constructor member initialization list if present.
+# Check the static class invariants (but not the non-static class invariants).
+# Execute the constructor body.
+# Check the static class invariants (even if the body throws an exception).
+# Check the non-static class invariants, but only if the body did not throw an exception.
+# Check the constructor postconditions, but only if the body did not throw an exception.
+
+Preconditions are checked before initializing base classes and members so that these initializations can relay on preconditions to be true (for example to validate constructor arguments before they are used to initialize member variables).
+C++ object construction mechanism will automatically check base class contracts when subcontracting.
+
+Note that:
+
+* Non-static class invariants are not checked at constructor entry (because there is no object before the constructor body is executed).
+* Preconditions cannot access the object (because there is no object before the constructor body is executed).
+* Postconditions cannot access the object old value (because there was no object before the constructor body was executed).
+* The object is never volatile within constructors so constructors do not check volatile class invariants.
+
+[endsect]
+
+[section Destructor Calls]
+
+A destructor call executes the following steps:
+
+# Check the static class invariants.
+# Check the non-static class invariants.
+# Execute the destructor body.
+# Check the static class invariants (even if the body throws an exception).
+[footnote
+For generality, this library does not require the destructor body to not throw exceptions.
+However, in order to comply with the STL exception safety requirements, destructors should never throw.
+]
+# Check the non-static class invariants, but only if the body threw an exception.
+
+C++ object destruction mechanism will automatically check base class contracts when subcontracting.
+
+Note that:
+
+* Destructors have no parameter and they can be called at any time after object construction so they have no preconditions.
+* After the destructor body is executed, the object no longer exists so non-static class invariants do not have to be true and they are not checked at destructor exit.
+* Destructors have no postconditions because they have no parameter and after the body execution there is no object.
+[footnote
+In theory, destructors could have static postconditions (i.e., postconditions that are not allowed to access the object which no longer exists after destruction).
+Still destructors shall never have preconditions because a destructor can be called at any point after the object is constructed as long the class invariants hold.
+None of the Contract Programming references that the authors have studied propose static postconditions for destructor (neither __N1962__ nor __Meyer97__, but __Eiffel__ has no static data member).
+Future revisions of this library might implement destructor static postconditions (e.g., a destructor postconditions of a class that counts object instances could assert that the instance counter stored in a static data member should be decreased of one because the object has been destructed, see also [@https://sourceforge.net/apps/trac/contractpp/ticket/41 Ticket 41]).
+]
+* The object is never volatile within destructors so destructors do not check volatile class invariants.
+
+[endsect]
+
+[section Constant-Correctness]
+
+Contracts are only responsible to check the program state in oder to ensure its compliance with the specifications.
+Therefore, contracts should not be able to modify the program state and exclusively "read-only" operations (or /queries/) should be used to program contracts.
+
+This library enforces this constraint at compile-time using C++ `const` qualifier.
+[footnote
+As usual in C++, constant-correctness can be enforced at compile-time only as long as programmers do not use `const_cast` and `mutable`.
+]
+Contracts only have access to the object, function arguments, and function return value via constant references `const&` or pointers `const*`.
+Other variables (static data members, global variables, etc) can be explicitly made constant using /constant assertions/ (see the __Advanced_Topics__ section).
+
+[endsect]
+
+[section Specification vs. Implementation]
+
+Contracts are part of the program specification and not of its implementation.
+Therefore, contracts should appear within C++ declarations and not within definitions.
+[footnote
+This is a major conceptual difference with respect to [@http://en.wikipedia.org/wiki/Defensive_programming Defensive Programming] and using `assert` because they program assertions within the function body instead that with the function declaration.
+]
+
+Contracts are most useful when they assert conditions only using public members.
+For example, the caller of a member function cannot in general make sure that the member function preconditions are satisfied if these preconditions use private members that are not accessible by the caller.
+Therefore, a failure in the preconditions will not necessarily indicate a bug in the caller given that the caller was not able to fully check the preconditions before calling the member function.
+In most cases, the need of using non-public members to check contracts indicates an error in the design of the class.
+However, given that C++ provides programmers ways around access level restrictions (e.g., `friend` and function pointers), this library leaves it up to the programmers to make sure that only public members are used in contract assertions (__N1962__ follows the same approach not forcing contracts to only use public members, __Eiffel__ instead generates a compiler error if preconditions use non-public members).
+[footnote
+*Rationale.*
+In theory, if C++ [@http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#45 defect 45] were not fixed, this library could have generated a compile-time error for preconditions that use non-public members.
+]
+
+Finally, only public member functions shall check class invariants.
+Private and protected member functions are allowed to brake class invariants because private and protected member are part of the class implementation and not of its specification.
+
+[endsect]
+
+[section Broken Contracts]
+
+After programmers specify contracts, this library automatically checks preconditions, postconditions, class invariants, block invariants, and loop variants at run-time.
+If a precondition, postcondition, class invariant, block invariants, or loop variant is checked to be false or throws an exception then the library invokes the [funcref contract::precondition_broken], [funcref contract::postcondition_broken], [funcref contract::class_invariant_broken_on_entry] or [funcref contract::class_invariant_broken_on_exit] or [funcref contract::class_invariant_broken_on_throw], [funcref contract::block_invariant_broken], and [funcref contract::loop_variant_broken] function respectively.
+
+These function invoke `std::terminate()` by default but programmers can redefine them to take a different action (throw an exception, exit the program, etc) using [funcref contract::set_precondition_broken], [funcref contract::set_postcondition_broken], [funcref contract::set_class_invariant_broken], [funcref contract::set_block_invariant_broken], and [funcref contract::set_loop_variant_broken] (this mechanism is similar to the one of C++'s `std::terminate()`).
+See the __Contract_Broken_Handlers__ section for an example.
+
+[endsect]
+
+[section Features]
+
+The design of this library was largely based on __N1962__ and on the __Eiffel__ programming language as specified by __Meyer97__.
+The following table compares features between this library, the proposal for adding Contract Programming to the C++ standard __N1962__, the __Eiffel__ programming language __Meyer97__, and the __D__ programming language __Bright04__.
+
+[table
+[
+ [Feature]
+ [This Library (C++03)]
+ [\[N1962\] Proposal (not part of C++)]
+ [ISE Eiffel 5.4]
+ [D]
+][
+ [['Keywords and Specifiers]]
+ [`precondition`, `postcondition`, `extends`, `initialize`, `requires`, `in`, `out`, `deduce`, `comma` (these are specifiers and not keywords, they have special meaning only in specific positions within the declarations passed to this library macros)]
+ [`invariant`, `precondition`, `postcondition`, `oldof`]
+ [=invariant=, =require=, =ensure=, =do=, =require else=, =ensure then=, =old=, =result=, =variant=]
+ [=invariant=, =in=, =out=, =assert=, =static=]
+][
+ [['On contract failure]]
+ [Default to `std::terminate()` (but can be customized to exit, abort, throw exceptions, etc).]
+ [Default to `std::terminate()` (but can be customized to exit, abort, throw exceptions, etc).]
+ [Throw exceptions]
+ [Throw exceptions]
+][
+ [['Result value in postconditions]]
+ [Yes, `auto `[^['result-variable-name]]` = return`.]
+ [Yes, `postcondition (`[^['result-variable-name]]`)`.]
+ [Yes, =result= keyword.]
+ [No.]
+][
+ [['Old values in postconditions]]
+ [Yes, `auto `[^['old-variable-name]]` = CONTRACT_OLDOF `[^['oldof-expression]].]
+ [Yes, `oldof `[^['oldof-expression]].]
+ [Yes, [^old ['old-expression]].]
+ [No.]
+][
+ [['Subcontracting]]
+ [Yes, also support multiple base contracts for multiple inheritance (can force preconditions to be specified only by base classes using [macroref CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS]).]
+ [Yes, also support multiple base contracts but only base classes can specify preconditions.]
+ [Yes.]
+ [Yes.]
+][
+ [['Contracts for pure virtual functions]]
+ [Yes.]
+ [Yes.]
+ [Yes (contracts for abstract functions).]
+ [No (but planned).]
+][
+ [['Arbitrary code in contracts]]
+ [No, assertions only.]
+ [No, assertions only.]
+ [No, assertions only plus preconditions can only access public members.]
+ [Yes.]
+][
+ [['Constant-correct]]
+ [Yes.]
+ [Yes.]
+ [Yes.]
+ [No.]
+][
+ [['Function code ordering]]
+ [Preconditions, postconditions, body.]
+ [Preconditions, postconditions, body.]
+ [Preconditions, body, postconditions.]
+ [Preconditions, postconditions, body.]
+][
+ [['Static assertions]]
+ [Yes, can use `static_assert` (internally implemented using `BOOST_MPL_ASSERT_MSG`, no __CXX11__ required).]
+ [Yes, can use __CXX11__ `static_assert`.]
+ [No.]
+ [Yes.]
+][
+ [['Block invariants]]
+ [Yes, [macroref CONTRACT_BLOCK_INVARIANT].]
+ [Yes, `invariant`.]
+ [Yes (`check` instruction and loop invariants).]
+ [No (just `assert`).]
+][
+ [['Loop variants]]
+ [Yes, [macroref CONTRACT_LOOP_VARIANT].]
+ [No.]
+ [Yes.]
+ [No.]
+][
+ [['Disable assertion checking within assertions checking]]
+ [
+ Yes (use [macroref CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION] for preconditions to disable no assertion).
+ Use [macroref CONTRACT_CONFIG_THREAD_SAFE] to make the implementation of this feature thread-safe in multi-threaded programs (but it will introduce a global lock).
+ ]
+ [Yes for class invariants and postconditions but preconditions disable no assertion.]
+ [Yes.]
+ [No.]
+][
+ [['Assertion requirements]]
+ [Yes (compilation and run-time checking of single assertions can be disabled when specific assertion requirements are not met).]
+ [No.]
+ [No (but all types are __CopyConstructible__, __Assignable__, and __EqualityComparable__ in __Eiffel__ so there is not a real need for this).]
+ [No.]
+][
+ [['Nested member function calls]]
+ [
+ Disable nothing.
+ [footnote
+ *Rationale.*
+ Older versions of this library automatically defined a data member used to disable checking of class invariants within member function calls.
+ However, this feature, which was required by older revisions of __N1962__, is no longer required by __N1962__, it complicates the implementation, and in multi-thread programs would introduce a lock that synchronizes all member functions calls for a given object so it was removed in the current revision of the library.
+ ]
+ ]
+ [Disable nothing.]
+ [Disable all checks.]
+ [Disable nothing.]
+][
+ [['Non-static class invariants checking]]
+ [
+ At constructor exit, at destructor entry, and at public member function entry, exit, and on throw (but only if programmers declare these functions using this library macros).
+ Same for volatile class invariants.]
+ [At constructor exit, at destructor entry, and at public member function entry, exit, and on throw (volatile class invariants not supported).]
+ [At constructor exit, and around public member functions.]
+ [At constructor exit, at destructor entry, an around public member functions.]
+][
+ [['Static class invariants checking]]
+ [At entry and exit of any (also static) member function, constructor, and destructor.]
+ [No.]
+ [No (but __Eiffel__ does not have static members).]
+ [No.]
+][
+ [['Removable from object code]]
+ [Yes, using any combination of [macroref CONTRACT_CONFIG_NO_PRECONDITIONS], [macroref CONTRACT_CONFIG_NO_POSTCONDITIONS], [macroref CONTRACT_CONFIG_NO_CLASS_INVARIANTS], [macroref CONTRACT_CONFIG_NO_BLOCK_INVARIANTS], and [macroref CONTRACT_CONFIG_NO_LOOP_VARIANTS].]
+ [Yes.]
+ [Yes (but predefined combinations only).]
+ [Yes.]
+]
+]
+
+Contract Programming is also provided by the following references.
+
+[table
+[ [Reference] [Language] [Notes] ]
+[ [__Bright04b__] [C++] [
+The Digital Mars C++ compiler extends C++ adding Contract Programming language support (among many other features).
+] ]
+[ [__Lindrud04__] [C++] [
+This supports class invariants and old values but it does not support subcontracting, contracts are specified within definitions instead of declarations, assertions are not constant-correct (unfortunately, these missing features are all essential to Contract Programming).
+] ]
+[ [__Tandin04__] [C++] [
+Interestingly, these contract macros automatically generate __Doxygen__ documentation
+[footnote
+*Rationale.*
+Older versions of this library used to automatically generate __Doxygen__ documentation from the contract macros.
+This functionality was abandoned for a number of reasons: this library macros became too complex and the __Doxygen__ preprocessor is no longer able to expand them; the __Doxygen__ documentation was just a repeat of the contract code (so programmers can directly look at contracts in the header files), __Doxygen__ might not necessarily be the documentation tool chosen by all programmers.
+]
+but old values, class invariants, and subcontracting are not supported plus contracts are specified within definitions instead of declarations (unfortunately, these missing features are all essential to Contract Programming).
+] ]
+[ [__Maley99__] [C++] [
+This supports Contract Programming including subcontracting but with some limitations (e.g., programmers need to manually build an inheritance tree using artificial template parameters), it does not use macros so programmers are required to write by hand a significant amount of boiler-plate code.
+(The authors have found this work very inspiring when they started to develop this library.)
+] ]
+[ [__C2__] [C++] [
+This uses an external preprocessing tool (the authors could no longer find this project code-base to evaluate it).
+] ]
+[ [__iContract__] [Java] [
+This uses an external preprocessing tool.
+] ]
+[ [__Jcontract__] [Java] [
+This uses an external preprocessing tool.
+] ]
+[ [__CodeContracts__] [.NET] [
+Microsoft Contract Programming for .NET programming languages.
+] ]
+[ [__SpecSharp__] [C#] [
+This is a C# extension with Contract Programming language support.
+] ]
+[ [__Chrome02__] [Object Pascal] [
+This is the .NET version of Object Pascal and it has language support for Contract Programming.
+] ]
+[ [__SPARKAda__] [Ada] [
+This is an Ada-like programming language with Contract Programming support.
+] ]
+]
+
+Typically, preprocessing tools external to the language work by transforming specially formatted code comments into contract code that is then checked at run-time.
+One of this library primary goals was to support Contract Programming entirely within C++ and without using any tool external to the standard language (C++ macros were used instead of external preprocessing tools).
+
+To the authors' knowledge, this the only library that fully support Contract Programming for C++ (see the __Bibliography__ section for the complete list of Contract Programming references studied by the authors).
+
+[endsect]
+
+[endsect]
+
Added: sandbox/contract/doc/contractpp.qbk
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/contractpp.qbk 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,137 @@
+
+[/ Copyright (C) 2008-2012 Lorenzo Caminiti ]
+[/ Distributed under 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) ]
+[/ Home at http://sourceforge.net/projects/contractpp ]
+
+[library Contract++
+ [quickbook 1.5]
+ [version 0.4.1]
+ [authors [Caminiti <email>lorcaminiti_at_[hidden]</email>, Lorenzo]]
+ [copyright 2008-2012 Lorenzo Caminiti]
+ [license Distributed under 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])]
+ [/ purpose Contract Programming for C++]
+ [/ category Correctness and Testing]
+]
+
+[template file[dir name] '''<ulink url="../../'''[dir]'''/'''[name]'''">'''[^[name]]'''</ulink>''']
+
+[def __CXX03__ [@http://en.wikipedia.org/wiki/C%2B%2B C++03]]
+[def __CXX11__ [@http://en.wikipedia.org/wiki/C%2B%2B11 C++11]]
+[def __C99__ [@http://en.wikipedia.org/wiki/C99 C99]]
+[def __Java__ [@http://en.wikipedia.org/wiki/Java_(programming_language) Java]]
+[def __Ada__ [@http://en.wikipedia.org/wiki/Ada_(programming_language) Ada]]
+[def __Python__ [@http://www.python.org/ Python]]
+[def __Eiffel__ [@http://en.wikipedia.org/wiki/Eiffel_(programming_language) Eiffel]]
+[def __D__ [@http://dlang.org D]]
+[def __substitution_principle__ [@http://en.wikipedia.org/wiki/Liskov_substitution_principle substitution principle]]
+[def __Doxygen__ [@http://www.doxygen.org Doxygen]]
+[def __SFINAE__ [@http://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error SFINAE]]
+
+[def __Boost__ [@http://www.boost.org Boost]]
+[def __Boost_ConceptCheck__ [@http://www.boost.org/doc/libs/release/libs/concept_check Boost.ConceptCheck]]
+[def __Boost_Config__ [@http://www.boost.org/doc/libs/release/libs/config Boost.Config]]
+[def __Boost_Foreach__ [@http://www.boost.org/doc/libs/release/libs/foreach Boost.Foreach]]
+[def __Boost_Function__ [@http://www.boost.org/doc/libs/release/libs/function Boost.Function]]
+[def __Boost_Graph__ [@http://www.boost.org/doc/libs/release/libs/graph Boost.Graph]]
+[def __Boost_Jam__ [@http://www.boost.org/doc/libs/release/doc/html/jam.html Boost.Jam]]
+[def __Boost_LocalFunction__ [@http://www.boost.org/doc/libs/release/libs/local_function Boost.LocalFunction]]
+[def __Boost_MPL__ [@http://www.boost.org/doc/libs/release/libs/mpl Boost.MPL]]
+[def __Boost_Parameter__ [@http://www.boost.org/doc/libs/release/libs/parameter Boost.Parameter]]
+[def __Boost_Phoenix__ [@http://www.boost.org/doc/libs/release/libs/phoenix Boost.Phoenix]]
+[def __Boost_Preprocessor__ [@http://www.boost.org/doc/libs/release/libs/preprocessor Boost.Preprocessor]]
+[def __Boost_Python__ [@http://www.boost.org/doc/libs/release/libs/python Boost.Python]]
+[def __Boost_Typeof__ [@http://www.boost.org/doc/libs/release/libs/typeof Boost.Typeof]]
+[def __Boost_TypeTraits__ [@http://www.boost.org/doc/libs/release/libs/type_traits Boost.TypeTraits]]
+[def __Boost_Utility_IdentityType__ [@http://www.boost.org/doc/libs/release/libs/utility/identity_type Boost.Utility/IdentityType]]
+
+[def __Bright04__ [link Bright04_anchor \[Bright04\]]]
+[def __Bright04b__ [link Bright04b_anchor \[Bright04b\]]]
+[def __C2__ [link C2_anchor \[C2\]]]
+[def __Chrome02__ [link Chrome02_anchor \[Chrome02\]]]
+[def __Cline90__ [link Cline90_anchor \[Cline90\]]]
+[def __CodeContracts__ [link CodeContracts_anchor \[CodeContracts\]]]
+[def __iContract__ [link iContract_anchor \[iContract\]]]
+[def __Hoare73__ [link Hoare73_anchor \[Hoare73\]]]
+[def __Jcontract__ [link Jcontract_anchor \[Jcontract\]]]
+[def __Lindrud04__ [link Lindrud04_anchor \[Lindrud04\]]]
+[def __Maley99__ [link Maley99_anchor \[Maley99\]]]
+[def __Meyer97__ [link Meyer97_anchor \[Meyer97\]]]
+[def __Mitchell02__ [link Mitchell02_anchor \[Mitchell02\]]]
+[def __N1613__ [link N1613_anchor \[N1613\]]]
+[def __N1866__ [link N1866_anchor \[N1866\]]]
+[def __N1962__ [link N1962_anchor \[N1962\]]]
+[def __N2081__ [link N2081_anchor \[N2081\]]]
+[def __N2914__ [link N2914_anchor \[N2914\]]]
+[def __SPARKAda__ [link SPARKAda_anchor \[SPARKAda\]]]
+[def __SpecSharp__ [link SpecSharp_anchor \[SpecSharp\]]]
+[def __Stroustrup97__ [link Stroustrup97_anchor \[Stroustrup97\]]]
+[def __Stroustrup94__ [link Stroustrup94_anchor \[Stroustrup94\]]]
+[def __Tandin04__ [link Tandin04_anchor \[Tandin04\]]]
+
+[def __Introduction__ [link contract__.introduction Introduction]]
+[def __Full_Table_of_Contents__ [link contract__.full_table_of_contents Full Table of Contents]]
+[def __Getting_Started__ [link contract__.getting_started Getting Started]]
+[def __Contract_Programming_Overview__ [link contract__.contract_programming_overview Contract Programming Overview]]
+[def __Costs__ [link contract__.contract_programming_overview.costs Costs]]
+[def __Free_Function_Calls__ [link contract__.contract_programming_overview.free_function_calls Free Function Calls]]
+[def __Member_Function_Calls__ [link contract__.contract_programming_overview.member_function_calls Member Function Calls]]
+[def __Constructor_Calls__ [link contract__.contract_programming_overview.constructor_calls Constructor Calls]]
+[def __Destructor_Calls__ [link contract__.contract_programming_overview.destructor_calls Destructor Calls]]
+[def __Constant_Correctness__ [link contract__.contract_programming_overview.constant_correctness Constant-Correctness]]
+[def __Specification_vs__Implementation__ [link contract__.contract_programming_overview.specification_vs__implementation Specification vs. Implementation]]
+[def __Broken_Contracts__ [link contract__.contract_programming_overview.broken_contracts Broken Contracts]]
+[def __Features__ [link contract__.contract_programming_overview.features Features]]
+[def __Tutorial__ [link contract__.tutorial Tutorial]]
+[def __Forward_Declarations_and_Body_Definitions__ [link contract__.tutorial.forward_declarations_and_body_definitions Forward Declarations and Body Definitions]]
+[def __Advanced_Topics__ [link contract__.advanced_topics Advanced Topics]]
+[def __Assertion_Requirements__ [link contract__.advanced_topics.assertion_requirements Assertion Requirements]]
+[def __Contract_Broken_Handlers__ [link contract__.advanced_topics.contract_broken_handlers__throw_on_failure_ Contract Broken Handlers]]
+[def __Virtual_Specifiers__ [link contract__.virtual_specifiers Virtual Specifiers]]
+[def __Concepts__ [link contract__.concepts Concepts]]
+[def __Named_Parameters__ [link contract__.named_parameters Named Parameters]]
+[def __Parameter_Identifiers__ [link contract__.named_parameters.parameter_identifiers Parameter Identifiers]]
+[def __Examples__ [link contract__.examples Examples]]
+[def __Grammar__ [link contract__.grammar Grammar]]
+[def __Differences_with_CXX_Syntax__ [link contract__.grammar.differences_with_c___syntax Differences with C++ Syntax]]
+[def __No_Variadic_Macros__ [link contract__.no_variadic_macros No Variadic Macros]]
+[def __Reference__ [link contract__.reference Reference]]
+[def __Bibliography__ [link contract__.bibliography Bibliography]]
+[def __Release_Notes__ [link contract__.release_notes Release Notes]]
+[def __Acknowledgments__ [link contract__.acknowledgments Acknowledgments]]
+
+[def __logic_and__ [link logic_and_anchor logic-and]]
+[def __logic_or__ [link logic_or_anchor logic-or]]
+[def __Assignable__ [@http://www.boost.org/doc/libs/release/libs/utility/Assignable.html [^Assignable]]]
+[def __ConstantCopyConstructible__ [link contract__.advanced_topics.old_and_result_value_copies [^ConstantCopyConstructible]]]
+[def __CopyConstructible__ [@http://www.boost.org/doc/libs/release/libs/utility/CopyConstructible.html [^CopyConstructible]]]
+[def __DefaultConstructible__ [@http://www.sgi.com/tech/stl/DefaultConstructible.html [^DefaultConstructible]]]
+[def __EqualityComparable__ [@http://www.sgi.com/tech/stl/EqualityComparable.html [^EqualityComparable]]]
+[def __InputIterator__ [@http://www.sgi.com/tech/stl/InputIterator.html [^InputIterator]]]
+
+[:['["Our field needs more formality, but the profession has not realized it yet.]]]
+[:['-- Bertrand Meyer (see __Meyer97__ page 400)]]
+
+This library implements Contract Programming for the C++ programming language.
+In addition, the library implements virtual specifiers (`final`, `override`, and `new`, see __CXX11__), concept checking, and named parameters.
+
+Consult this documentation in [@index.html HTML] or [@contractpp.pdf PDF] format.
+
+[include introduction.qbk]
+[include full_table_of_contents.qbk]
+[include getting_started.qbk]
+[include contract_programming_overview.qbk]
+[include tutorial.qbk]
+[include advanced_topics.qbk]
+[include virtual_specifiers.qbk]
+[include concepts.qbk]
+[include named_parameters.qbk]
+[include examples.qbk]
+[include grammar.qbk]
+[include no_variadic_macros.qbk]
+[xinclude reference.xml]
+[include release_notes.qbk]
+[include bibliography.qbk]
+[include acknowledgments.qbk]
+
Added: sandbox/contract/doc/examples.qbk
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/examples.qbk 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,318 @@
+
+[/ Copyright (C) 2008-2012 Lorenzo Caminiti ]
+[/ Distributed under 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) ]
+[/ Home at http://sourceforge.net/projects/contractpp ]
+
+[section Examples]
+
+This section lists non-trivial examples programmed using this library.
+The listed examples are taken from the foloowing sources (which are referenced in the title of each example).
+
+[table
+[ [Sources] [Notes] ]
+[ [__N1962__] [
+Examples from the proposal to add Contract Programming to __CXX11__ submitted to the standard committee (unfortunately, this proposal was never accepted into the standard).
+] ]
+[ [__N2081__] [
+Examples from the proposal to add concepts to __CXX11__ submitted to the standard committee (unfortunately, this proposal was never accepted into the standard).
+These examples have been extended to specify both concepts and contracts.
+] ]
+[ [__Meyer97__ __Mitchell02__] [
+Examples using the __Eiffel__ programming language and reprogrammed using this library for C++.
+] ]
+[ [__Cline90__] [
+Examples from a very early proposal called Annotated C++ (A++) to add Contract Programming to C++ (A++ was never implemented or proposed for addition to the standard).
+] ]
+[ [__Stroustrup97__] [
+One example that shows the importance of class invariants and how to configure this library to throw exceptions instead of terminating the program when contracts are broken.
+] ]
+]
+
+The followings are among the most interesting examples:
+
+[table
+[ [Key Example] [Topic] ]
+[ [[link contract__.examples.__n1962___vector__comparison_with_c___proposed_syntax \[N1962\] Vector]] [
+A comparison between this library syntax and the syntax for contract and concept checking proposed by __N1962__ and __N2081__ respectively.
+] ]
+[ [[link contract__.examples.__n2081___add__generic_addition_algorithm \[N2081\] Add]] [
+Contracts and user-defined concepts.
+] ]
+[ [[link contract__.examples.__mitchell02___counter__subcontracting_and_virtual_specifiers__final__override__new__and_pure_virtual_ \[Mitchell02\] Counter]] [
+Subcontracting and __CXX11__-like virtual specifiers `final`, `override`, `new`, and pure virtual.
+] ]
+[ [[link contract__.examples.__meyer97___stack4__comparison_with_eiffel_syntax \[Meyer97\] Stack4]] [
+A comparison between this library and __Eiffel__ syntax for preconditions, postconditions, and class invariants.
+] ]
+[ [[link contract__.examples.__meyer97___gcd__loop_variants_and_invariants_plus_comparison_with_eiffel_syntax \[Meyer97\] GCD]] [
+A comparison between this library and __Eiffel__ syntax for loop variants and block invariants.
+] ]
+[ [[link contract__.examples.__cline90___vector__comparison_with_a___proposed_syntax \[Cline90\] Vector]] [
+A comparison between this library and A++ syntax.
+] ]
+]
+
+[section \[N1962\] Vector: Comparison with C++ proposed syntax]
+[import ../example/n1962/vector.hpp]
+[import ../example/n1962/vector.cpp]
+[import ../example/n1962/vector_npaper.hpp]
+[table
+ [ [This Library (C++03)] [\[N1962\] and \[N2081\] Proposals (not part of C++)] ]
+ [ [[n1962_vector]] [[n1962_vector_npaper]] ]
+ [ [[n1962_vector_main]] [] ]
+]
+[endsect]
+
+[section \[N1962\] Circle: Subcontracting]
+[import ../example/n1962/circle.cpp]
+[n1962_circle]
+[endsect]
+
+[section \[N1962\] Factorial: Recursion and assertion computational complexity]
+[import ../example/n1962/factorial.cpp]
+[n1962_factorial]
+[endsect]
+
+[section \[N1962\] Equal: Operators]
+[import ../example/n1962/equal.hpp]
+[n1962_equal_header]
+[import ../example/n1962/equal_not.hpp]
+[n1962_equal_not_header]
+[import ../example/n1962/equal_main.cpp]
+[n1962_equal_main]
+[endsect]
+
+[section \[N1962\] Sum: Separated body definitions]
+[import ../example/n1962/sum.hpp]
+[n1962_sum_header]
+[import ../example/n1962/sum.cpp]
+[n1962_sum]
+[import ../example/n1962/sum_main.cpp]
+[n1962_sum_main]
+[endsect]
+
+[section \[N1962\] Square Root: Default parameters and comparison with D syntax]
+[import ../example/n1962/sqrt.cpp]
+[import ../example/n1962/sqrt.d]
+[table
+ [ [This Library (C++03)] [The D Programming Language] ]
+ [ [[n1962_sqrt]] [[n1962_sqrt_d]] ]
+]
+[endsect]
+
+[section \[N1962\] Block: Block invariants]
+[import ../example/n1962/block_invariant.cpp]
+[n1962_block_invariant]
+[endsect]
+
+[section \[N2081\] Add: Generic addition algorithm]
+[import ../example/n2081/add.hpp]
+[n2081_add_header]
+[import ../example/n2081/add.cpp]
+[n2081_add]
+[import ../example/n2081/add_error.cpp]
+[n2081_add_error]
+[endsect]
+
+[section \[N2081\] Advance: Concept-based iterator overloading (emulated using tags)]
+[import ../example/n2081/advance.cpp]
+[n2081_advance]
+[endsect]
+
+[section \[N2081\] Find: Generic find algorithm]
+[import ../example/n2081/find.hpp]
+[n2081_find_header]
+[import ../example/n2081/find.cpp]
+[n2081_find]
+[import ../example/n2081/find_error.cpp]
+[n2081_find_error]
+[endsect]
+
+[section \[N2081\] Apply: Overloaded invocation of functors]
+[import ../example/n2081/apply.cpp]
+[n2081_apply]
+[endsect]
+
+[section \[N2081\] For Each: Generic for-each algorithm]
+[import ../example/n2081/for_each.cpp]
+[n2081_for_each]
+[endsect]
+
+[section \[N2081\] Transform: Generic binary transformation algorithm]
+[import ../example/n2081/transform.cpp]
+[n2081_transform]
+[endsect]
+
+[section \[N2081\] Count: Generic counting algorithm]
+[import ../example/n2081/count.cpp]
+[n2081_count]
+[endsect]
+
+[section \[N2081\] Convert: Conversion between two types]
+[import ../example/n2081/convert.hpp]
+[n2081_convert_header]
+[import ../example/n2081/convert.cpp]
+[n2081_convert]
+[import ../example/n2081/convert_error.cpp]
+[n2081_convert_error]
+[endsect]
+
+[section \[N2081\] Equal: Generic equality comparison]
+[import ../example/n2081/equal.hpp]
+[n2081_equal_header]
+[import ../example/n2081/equal.cpp]
+[n2081_equal]
+[import ../example/n2081/equal_error.cpp]
+[n2081_equal_error]
+[endsect]
+
+[section \[N2081\] Less Equal: Generic less-than or equal-to comparison]
+[import ../example/n2081/less_eq.cpp]
+[n2081_less_eq]
+[endsect]
+
+[section \[N2081\] De-Ref: Generic iterator dereferencing]
+[import ../example/n2081/deref.cpp]
+[n2081_deref]
+[endsect]
+
+[section \[N2081\] Min: Generic minimum algorithm]
+[import ../example/n2081/min.hpp]
+[n2081_min_header]
+[import ../example/n2081/min.cpp]
+[n2081_min]
+[import ../example/n2081/min_error.cpp]
+[n2081_min_error]
+[endsect]
+
+[section \[Meyer97\] Stack4: Comparison with Eiffel syntax]
+[import ../example/meyer97/stack4.hpp]
+[import ../example/meyer97/stack4_main.cpp]
+[import ../example/meyer97/stack4.e]
+[table
+ [ [This Library (C++03)] [The Eiffel Programming Language] ]
+ [ [[meyer97_stack4_header]] [[meyer97_stack4_e]] ]
+ [ [[meyer97_stack4_main]] [] ]
+]
+[endsect]
+
+[section \[Meyer97\] Stack3: Error codes instead of preconditions]
+[import ../example/meyer97/stack3.cpp]
+[meyer97_stack3]
+[endsect]
+
+[section \[Meyer97\] GCD: Loop variants and invariants plus comparison with Eiffel syntax]
+[import ../example/meyer97/gcd.cpp]
+[import ../example/meyer97/gcd.e]
+[table
+ [ [This Library (C++03)] [The Eiffel Programming Language] ]
+ [ [[meyer97_gcd]] [[teletype] [meyer97_gcd_e] [c++]] ]
+]
+[endsect]
+
+[section \[Meyer97\] Max-Array: Nested loop variants and invariants]
+[import ../example/meyer97/maxarray.cpp]
+[meyer97_maxarray]
+[endsect]
+
+[section \[Mitchell02\] Name List: Relaxed subcontracts]
+[import ../example/mitchell02/name_list.hpp]
+[mitchell02_name_list_header]
+[import ../example/mitchell02/name_list.cpp]
+[mitchell02_name_list]
+[import ../example/mitchell02/name_list_main.cpp]
+[mitchell02_name_list_main]
+[endsect]
+
+[section \[Mitchell02\] Dictionary: Simple key-value map]
+[import ../example/mitchell02/dictionary.cpp]
+[mitchell02_dictionary]
+[endsect]
+
+[section \[Mitchell02\] Courier: Subcontracting and static class invariants]
+[import ../example/mitchell02/courier.hpp]
+[mitchell02_courier_header]
+[import ../example/mitchell02/courier.cpp]
+[mitchell02_courier]
+[import ../example/mitchell02/courier_main.cpp]
+[mitchell02_courier_main]
+[endsect]
+
+[section \[Mitchell02\] Stack: Simple stack dispenser]
+[import ../example/mitchell02/stack.cpp]
+[mitchell02_stack]
+[endsect]
+
+[section \[Mitchell02\] Simple Queue: Simple queue dispenser]
+[import ../example/mitchell02/simple_queue.cpp]
+[mitchell02_simple_queue]
+[endsect]
+
+[section \[Mitchell02\] Customer Manager: Contracts instead of Defensive Programming]
+[import ../example/mitchell02/customer_manager.hpp]
+[mitchell02_customer_manager_header]
+[import ../example/mitchell02/customer_manager.cpp]
+[mitchell02_customer_manager]
+[import ../example/mitchell02/customer_manager_main.cpp]
+[mitchell02_customer_manager_main]
+[endsect]
+
+[section \[Mitchell02\] Observer: Contracts for pure virtual functions]
+[import ../example/mitchell02/observer/observer.hpp]
+[mitchell02_observer_header]
+[import ../example/mitchell02/observer/subject.hpp]
+[mitchell02_subject_header]
+[import ../example/mitchell02/observer_main.cpp]
+[mitchell02_observer_main]
+[endsect]
+
+[section \[Mitchell02\] Counter: Subcontracting and virtual specifiers (final, override, new, and pure virtual)]
+[import ../example/mitchell02/counter/push_button.hpp]
+[mitchell02_push_button_header]
+[import ../example/mitchell02/counter/decrement_button.hpp]
+[mitchell02_decrement_button_header]
+[import ../example/mitchell02/counter/counter.hpp]
+[mitchell02_counter_header]
+[import ../example/mitchell02/counter_main.cpp]
+[mitchell02_counter_main]
+[endsect]
+
+[section \[Stroustrup97\] String: Throw when contract is broken]
+[import ../example/stroustrup97/string.hpp]
+[stroustrup97_string_header]
+[import ../example/stroustrup97/string.cpp]
+[stroustrup97_string]
+[import ../example/stroustrup97/string_main.cpp]
+[stroustrup97_string_main]
+[endsect]
+
+[section \[Cline90\] Vector: Comparison with A++ proposed syntax]
+[import ../example/cline90/vector.hpp]
+[import ../example/cline90/vector_main.cpp]
+[import ../example/cline90/vector_app.hpp]
+[table
+ [ [This Library (C++03)] [A++ Proposal (not part of C++)] ]
+ [ [[cline90_vector_header]] [[cline90_vector_app_header]] ]
+ [ [[cline90_vector_main]] [] ]
+]
+[endsect]
+
+[section \[Cline90\] Stack: Function-Try blocks and exception specifications]
+[import ../example/cline90/stack.cpp]
+[cline90_stack]
+[endsect]
+
+[section \[Cline90\] Vector-Stack: Subcontracting from Abstract Data Type (ADT)]
+[import ../example/cline90/vstack.cpp]
+[cline90_vstack]
+[endsect]
+
+[section \[Cline90\] Calendar: A very simple calendar]
+[import ../example/cline90/calendar.cpp]
+[cline90_calendar]
+[endsect]
+
+[endsect]
+
Added: sandbox/contract/doc/full_table_of_contents.qbk
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/full_table_of_contents.qbk 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,248 @@
+
+[/ Copyright (C) 2008-2012 Lorenzo Caminiti ]
+[/ Distributed under 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) ]
+[/ Home at http://sourceforge.net/projects/contractpp ]
+
+[section Full Table of Contents]
+
+[link contract__.introduction Introduction]
+
+[link contract__.full_table_of_contents Full Table Of Contents]
+
+[link contract__.getting_started Getting Started]
+[:
+ [link contract__.getting_started.this_documentation This Documentation] [br]
+ [link contract__.getting_started.compilers_and_platforms Compilers and Platforms] [br]
+ [link contract__.getting_started.installation Installation] [br]
+ [link contract__.getting_started.disable_contract_compilation Disable Contract Compilation] [br]
+]
+
+[link contract__.contract_programming_overview Contract Programming Overview]
+[:
+ [link contract__.contract_programming_overview.assertions Assertions] [br]
+ [link contract__.contract_programming_overview.benefits Benefits] [br]
+ [link contract__.contract_programming_overview.costs Costs] [br]
+ [link contract__.contract_programming_overview.free_function_calls Free Function Calls] [br]
+ [link contract__.contract_programming_overview.member_function_calls Member Function Calls] [br]
+ [link contract__.contract_programming_overview.constructor_calls Constructor Calls] [br]
+ [link contract__.contract_programming_overview.destructor_calls Destructor Calls] [br]
+ [link contract__.contract_programming_overview.constant_correctness Constant-Correctness] [br]
+ [link contract__.contract_programming_overview.specification_vs__implementation Specification vs. Implementation] [br]
+ [link contract__.contract_programming_overview.broken_contracts Broken Contracts] [br]
+ [link contract__.contract_programming_overview.features Features] [br]
+]
+
+[link contract__.tutorial Tutorial]
+[:
+ [link contract__.tutorial.free_functions Free Functions] [br]
+ [link contract__.tutorial.preconditions Preconditions] [br]
+ [link contract__.tutorial.postconditions__result_and_old_values_ Postconditions (Result and Old Values)] [br]
+ [link contract__.tutorial.classes_and_class_invariants Classes and Class Invariants] [br]
+ [link contract__.tutorial.constructors Constructors] [br]
+ [link contract__.tutorial.destructors Destructors] [br]
+ [link contract__.tutorial.member_functions Member Functions] [br]
+ [link contract__.tutorial.inheritance_and_subcontracting Inheritance and Subcontracting] [br]
+ [link contract__.tutorial.class_templates Class Templates] [br]
+ [link contract__.tutorial.function_templates Function Templates] [br]
+ [link contract__.tutorial.forward_declarations_and_body_definitions Forward Declarations and Body Definitions] [br]
+]
+
+[link contract__.advanced_topics Advanced Topics]
+[:
+ [link contract__.advanced_topics.commas_and_leading_symbols_in_macros Commas and Leading Symbols in Macros] [br]
+ [link contract__.advanced_topics.static_assertions Static Assertions] [br]
+ [link contract__.advanced_topics.constant_assertions Constant Assertions] [br]
+ [link contract__.advanced_topics.select_assertions Select Assertions] [br]
+ [link contract__.advanced_topics.assertion_statements Assertion Statements] [br]
+ [link contract__.advanced_topics.assertion_requirements Assertion Requirements] [br]
+ [link contract__.advanced_topics.old_of_requirements Old-Of Requirements] [br]
+ [link contract__.advanced_topics.old_and_result_value_copies Old and Result Value Copies] [br]
+ [link contract__.advanced_topics.pure_virtual_functions Pure Virtual Functions] [br]
+ [link contract__.advanced_topics.subcontracting_preconditions Subcontracting Preconditions] [br]
+ [link contract__.advanced_topics.static_member_functions Static Member Functions] [br]
+ [link contract__.advanced_topics.volatile_member_functions Volatile Member Functions] [br]
+ [link contract__.advanced_topics.operators Operators] [br]
+ [link contract__.advanced_topics.nested_classes Nested Classes] [br]
+ [link contract__.advanced_topics.friends Friends] [br]
+ [link contract__.advanced_topics.template_specializations Template Specializations] [br]
+ [link contract__.advanced_topics.exception_specifications_and_function_try_blocks Exception Specifications and Function-Try Blocks] [br]
+ [link contract__.advanced_topics.specifying_types__no_boost_typeof_ Specifying Types (no Boost.Typeof)] [br]
+ [link contract__.advanced_topics.block_invariants_and_loop_variants Block Invariants and Loop Variants] [br]
+ [link contract__.advanced_topics.contract_broken_handlers__throw_on_failure_ Contract Broken Handlers (Throw on Failure)] [br]
+]
+
+[link contract__.virtual_specifiers Virtual Specifiers]
+[:
+ [link contract__.virtual_specifiers.final_classes Final Classes] [br]
+ [link contract__.virtual_specifiers.final_member_functions Final Member Functions] [br]
+ [link contract__.virtual_specifiers.overriding_member_functions Overriding Member Functions] [br]
+ [link contract__.virtual_specifiers.new_member_functions New Member Functions] [br]
+]
+
+[link contract__.concepts Concepts]
+[:
+ [link contract__.concepts.class_templates Class Templates] [br]
+ [link contract__.concepts.function_templates Function Templates] [br]
+ [link contract__.concepts.concept_definitions__not_implemented_ Concept Definitions (Not Implemented)] [br]
+]
+
+[link contract__.named_parameters Named Parameters]
+[:
+ [link contract__.named_parameters.overview Overview] [br]
+ [link contract__.named_parameters.named_function_parameters Named Function Parameters] [br]
+ [link contract__.named_parameters.deduced_function_parameters Deduced Function Parameters] [br]
+ [link contract__.named_parameters.member_function_parameters Member Function Parameters] [br]
+ [link contract__.named_parameters.constructor_parameters Constructor Parameters] [br]
+ [link contract__.named_parameters.class_template_parameters Class Template Parameters] [br]
+ [link contract__.named_parameters.concepts Concepts] [br]
+ [link contract__.named_parameters.parameter_identifiers Parameter Identifiers] [br]
+]
+
+[link contract__.examples Examples]
+[:
+ [link contract__.examples.__n1962___vector__comparison_with_c___proposed_syntax \[N1962\] Vector: Comparison with C++ proposed syntax] [br]
+ [link contract__.examples.__n1962___circle__subcontracting \[N1962\] Circle: Subcontracting] [br]
+ [link contract__.examples.__n1962___factorial__recursion_and_assertion_computational_complexity \[N1962\] Factorial: Recursion and assertion computational complexity] [br]
+ [link contract__.examples.__n1962___equal__operators \[N1962\] Equal: Operators] [br]
+ [link contract__.examples.__n1962___sum__separated_body_definitions \[N1962\] Sum: Separated body definitions] [br]
+ [link contract__.examples.__n1962___square_root__default_parameters_and_comparison_with_d_syntax \[N1962\] Square Root: Default parameters and comparison with D syntax] [br]
+ [link contract__.examples.__n1962___block__block_invariants \[N1962\] Block: Block invariants] [br]
+ [link contract__.examples.__n2081___add__generic_addition_algorithm \[N2081\] Add: Generic addition algorithm] [br]
+ [link contract__.examples.__n2081___advance__concept_based_iterator_overloading__emulated_using_tags_ \[N2081\] Advance: Concept-based iterator overloading (emulated using tags)] [br]
+ [link contract__.examples.__n2081___find__generic_find_algorithm \[N2081\] Find: Generic find algorithm] [br]
+ [link contract__.examples.__n2081___apply__overloaded_invocation_of_functors \[N2081\] Apply: Overloaded invocation of functors] [br]
+ [link contract__.examples.__n2081___for_each__generic_for_each_algorithm \[N2081\] For Each: Generic for-each algorithm] [br]
+ [link contract__.examples.__n2081___transform__generic_binary_transformation_algorithm \[N2081\] Transform: Generic binary transformation algorithm] [br]
+ [link contract__.examples.__n2081___count__generic_counting_algorithm \[N2081\] Count: Generic counting algorithm] [br]
+ [link contract__.examples.__n2081___convert__conversion_between_two_types \[N2081\] Convert: Conversion between two types] [br]
+ [link contract__.examples.__n2081___equal__generic_equality_comparison \[N2081\] Equal: Generic equality comparison] [br]
+ [link contract__.examples.__n2081___less_equal__generic_less_than_or_equal_to_comparison \[N2081\] Less Equal: Generic less-than or equal-to comparison] [br]
+ [link contract__.examples.__n2081___de_ref__generic_iterator_dereferencing \[N2081\] De-Ref: Generic iterator dereferencing] [br]
+ [link contract__.examples.__n2081___min__generic_minimum_algorithm \[N2081\] Min: Generic minimum algorithm] [br]
+ [link contract__.examples.__meyer97___stack4__comparison_with_eiffel_syntax \[Meyer97\] Stack4: Comparison with Eiffel Syntax] [br]
+ [link contract__.examples.__meyer97___stack3__error_codes_instead_of_preconditions \[Meyer97\] Stack3: Error codes instead of preconditions] [br]
+ [link contract__.examples.__meyer97___gcd__loop_variants_and_invariants_plus_comparison_with_eiffel_syntax \[Meyer97\] GCD: Loop variants and invariants plus comparison with Eiffel syntax] [br]
+ [link contract__.examples.__meyer97___max_array__nested_loop_variants_and_invariants \[Meyer97\] Max-Array: Nested loop variants and invariants] [br]
+ [link contract__.examples.__mitchell02___name_list__relaxed_subcontracts \[Mitchell02\] Name List: Relaxed subcontracts] [br]
+ [link contract__.examples.__mitchell02___dictionary__simple_key_value_map \[Mitchell02\] Dictionary: Simple key-value map] [br]
+ [link contract__.examples.__mitchell02___courier__subcontracting_and_static_class_invariants \[Mitchell02\] Courier: Subcontracting and static class invariants] [br]
+ [link contract__.examples.__mitchell02___stack__simple_stack_dispenser \[Mitchell02\] Stack: Simple stack dispenser] [br]
+ [link contract__.examples.__mitchell02___simple_queue__simple_queue_dispenser \[Mitchell02\] Simple Queue: Simple queue dispenser] [br]
+ [link contract__.examples.__mitchell02___customer_manager__contracts_instead_of_defensive_programming \[Mitchell02\] Customer Manager: Contracts instead of Defensive Programming] [br]
+ [link contract__.examples.__mitchell02___observer__contracts_for_pure_virtual_functions \[Mitchell02\] Observer: Contracts for pure virtual functions] [br]
+ [link contract__.examples.__mitchell02___counter__subcontracting_and_virtual_specifiers__final__override__new__and_pure_virtual_ \[Mitchell02\] Counter: Subcontracting and virtual specifiers (final, override, new, and pure virtual)] [br]
+ [link contract__.examples.__stroustrup97___string__throw_when_contract_is_broken \[Stroustrup97\] String: Throw when contract is broken] [br]
+ [link contract__.examples.__cline90___vector__comparison_with_a___proposed_syntax \[Cline90\] Vector: Comparison with A++ proposed syntax] [br]
+ [link contract__.examples.__cline90___stack__function_try_blocks_and_exception_specifications \[Cline90\] Stack: Function-Try blocks and exception specifications] [br]
+ [link contract__.examples.__cline90___vector_stack__subcontracting_from_abstract_data_type__adt_ \[Cline90\] Vector-Stack: Subcontracting from Abstract Data Type (ADT)] [br]
+ [link contract__.examples.__cline90___calendar__a_very_simple_calendar \[Cline90\] Calendar: A very simple calendar] [br]
+]
+
+[link contract__.grammar Grammar]
+[:
+ [link contract__.grammar.preprocessor_dsel Preprocessor DSEL] [br]
+ [link contract__.grammar.differences_with_c___syntax Differences with C++ Syntax] [br]
+ [link contract__.grammar.macro_interface Macro Interface] [br]
+ [link contract__.grammar.lexical_conventions Lexical Conventions] [br]
+ [link contract__.grammar.class_declarations Class Declarations] [br]
+ [link contract__.grammar.base_classes Base Classes] [br]
+ [link contract__.grammar.template_specializations Template Specializations] [br]
+ [link contract__.grammar.template_parameters Template Parameters] [br]
+ [link contract__.grammar.concepts Concepts] [br]
+ [link contract__.grammar.types Types] [br]
+ [link contract__.grammar.function_declarations Function Declarations] [br]
+ [link contract__.grammar.result_type Result Type] [br]
+ [link contract__.grammar.function_and_operator_names Function and Operator Names] [br]
+ [link contract__.grammar.exception_specifications Exception Specifications] [br]
+ [link contract__.grammar.member_initializers Member Initializers] [br]
+ [link contract__.grammar.function_parameters Function Parameters] [br]
+ [link contract__.grammar.result_and_old_values Result and Old Values] [br]
+ [link contract__.grammar.class_invariants Class Invariants] [br]
+ [link contract__.grammar.assertions Assertions] [br]
+ [link contract__.grammar.loop_variants Loop Variants] [br]
+ [link contract__.grammar.named_parameter_declarations Named Parameter Declarations] [br]
+ [link contract__.grammar.terminals Terminals] [br]
+ [link contract__.grammar.alternative_assertion_syntax__not_implemented_ Alternative Assertion Syntax (Not Implemented)] [br]
+]
+
+[link contract__.no_variadic_macros No Variadic Macros]
+[:
+ [link contract__.no_variadic_macros.sequence_syntax Sequence Syntax] [br]
+ [link contract__.no_variadic_macros.commas_and_leading_symbols_in_macros Commas and Leading Symbols in Macros] [br]
+]
+
+[link reference Reference]
+[:
+ [funcref contract::block_invariant_broken] [br]
+ [classref contract::broken] [br]
+ [classref contract::broken_contract_handler] [br]
+ [funcref contract::class_invariant_broken_on_entry] [br]
+ [funcref contract::class_invariant_broken_on_exit] [br]
+ [funcref contract::class_invariant_broken_on_throw] [br]
+ [classref contract::copy] [br]
+ [enumref contract::from] [br]
+ [classref contract::has_oldof] [br]
+ [funcref contract::loop_variant_broken] [br]
+ [funcref contract::postcondition_broken] [br]
+ [funcref contract::precondition_broken] [br]
+ [funcref contract::set_block_invariant_broken] [br]
+ [funcref contract::set_class_invariant_broken] [br]
+ [funcref contract::set_class_invariant_broken_on_entry] [br]
+ [funcref contract::set_class_invariant_broken_on_exit] [br]
+ [funcref contract::set_class_invariant_broken_on_throw] [br]
+ [funcref contract::set_loop_variant_broken] [br]
+ [funcref contract::set_postcondition_broken] [br]
+ [funcref contract::set_precondition_broken] [br]
+ [macroref CONTRACT_BLOCK_INVARIANT] [br]
+ [macroref CONTRACT_BLOCK_INVARIANT_TPL] [br]
+ [macroref CONTRACT_CLASS] [br]
+ [macroref CONTRACT_CLASS_INVARIANT] [br]
+ [macroref CONTRACT_CLASS_INVARIANT_TPL] [br]
+ [macroref CONTRACT_CLASS_TPL] [br]
+ [macroref CONTRACT_CONFIG_ARRAY_DIMENSION_MAX] [br]
+ [macroref CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS] [br]
+ [macroref CONTRACT_CONFIG_FUNCTION_ARITY_MAX] [br]
+ [macroref CONTRACT_CONFIG_INHERITANCE_MAX] [br]
+ [macroref CONTRACT_CONFIG_NO_BLOCK_INVARIANTS] [br]
+ [macroref CONTRACT_CONFIG_NO_CLASS_INVARIANTS] [br]
+ [macroref CONTRACT_CONFIG_NO_LOOP_VARIANTS] [br]
+ [macroref CONTRACT_CONFIG_NO_POSTCONDITIONS] [br]
+ [macroref CONTRACT_CONFIG_NO_PRECONDITIONS] [br]
+ [macroref CONTRACT_CONFIG_OLDOF_MAX] [br]
+ [macroref CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION] [br]
+ [macroref CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE] [br]
+ [macroref CONTRACT_CONFIG_THREAD_SAFE] [br]
+ [macroref CONTRACT_CONSTRUCTOR] [br]
+ [macroref CONTRACT_CONSTRUCTOR_ARG] [br]
+ [macroref CONTRACT_CONSTRUCTOR_BODY] [br]
+ [macroref CONTRACT_CONSTRUCTOR_TPL] [br]
+ [macroref CONTRACT_DESTRUCTOR] [br]
+ [macroref CONTRACT_DESTRUCTOR_BODY] [br]
+ [macroref CONTRACT_DESTRUCTOR_TPL] [br]
+ [macroref CONTRACT_FREE_BODY] [br]
+ [macroref CONTRACT_FUNCTION] [br]
+ [macroref CONTRACT_FUNCTION_TPL] [br]
+ [macroref CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES] [br]
+ [macroref CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS] [br]
+ [macroref CONTRACT_LIMIT_OLDOFS] [br]
+ [macroref CONTRACT_LOOP] [br]
+ [macroref CONTRACT_LOOP_VARIANT] [br]
+ [macroref CONTRACT_LOOP_VARIANT_TPL] [br]
+ [macroref CONTRACT_MEMBER_BODY] [br]
+ [macroref CONTRACT_OLDOF] [br]
+ [macroref CONTRACT_PARAMETER] [br]
+ [macroref CONTRACT_PARAMETER_BODY] [br]
+ [macroref CONTRACT_PARAMETER_TYPEOF] [br]
+ [macroref CONTRACT_TEMPLATE_PARAMETER] [br]
+]
+
+[link contract__.release_notes Release Notes]
+
+[link contract__.bibliography Bibliography]
+
+[link contract__.acknowledgments Acknowledgments]
+
+[endsect]
+
Added: sandbox/contract/doc/getting_started.qbk
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/getting_started.qbk 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,131 @@
+
+[/ Copyright (C) 2008-2012 Lorenzo Caminiti ]
+[/ Distributed under 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) ]
+[/ Home at http://sourceforge.net/projects/contractpp ]
+
+[section Getting Started]
+
+This section explains how to setup a system to use this library.
+
+[section This Documentation]
+
+Programmers should have enough knowledge to use this library after reading the __Introduction__, __Getting_Started__, and __Tutorial__ sections.
+The other sections can be consulted to gain a more in depth knowledge of the library.
+
+Some footnotes are marked by the word "*Rationale*". They explain reasons behind decisions made during the design and implementation of this library.
+
+In most of the examples presented in this documentation the Boost.Detail/LightweightTest macro `BOOST_TEST` is used to assert test conditions (see also =boost/detail/lightweight_test.hpp=).
+The `BOOST_TEST` macro is conceptually similar to C++ `assert` but a failure of the checked condition does not abort the program, instead it makes `boost::report_errors` return a non-zero program exit code.
+[footnote
+*Rationale.*
+Using Boost.Detail/LightweightTest allows to add the examples to the library regression tests so to make sure that they always compile and run correctly.
+]
+
+[endsect]
+
+[section Compilers and Platforms]
+
+The implementation of this library uses preprocessor and template meta-programming (as supported by __Boost_Preprocessor__ and __Boost_MPL__ respectively), templates with partial specializations and function pointers (similarly to __Boost_Function__), and local functions (as supported by __Boost_LocalFunction__).
+The authors originally developed and tested the library on:
+
+# GCC 4.5.3 on Cygwin (with and without __CXX11__ features enabled =-std=c++0x=).
+[footnote
+When using GCC to compile large projects that use this library, it might be necessary to appropriately set the `--param gcc-min-expand` option to avoid internal compiler errors due to excessive virtual memory usage.
+]
+
+# Microsoft Visual C++ (MSVC) 8.0 on Windows XP and Windows 7.
+
+At present, the library has not been tested on other compilers or platforms.
+
+[endsect]
+
+[section Installation]
+
+This library is composed of header files only.
+Therefore there is no pre-compiled object file which needs to be installed or linked.
+Programmers can simply instruct the C++ compiler where to find the library header files and they can start compiling code using this library.
+
+[important
+This library extensively uses __Boost__ libraries.
+__Boost__ version 1.50 must be properly installed in order for this library to compile.
+]
+
+Let ['=ROOT=] be the root directory of this library installation then the directory structure is as follow:
+
+[pre
+['ROOT]/
+ doc/
+ html/ # This documentation.
+ example/ # Examples using this library.
+ include/ # This library source files (headers only).
+]
+
+For example, the following commands can be used to compile code using this library:
+[footnote
+For convenience, a =Jamfile.v2= file is provided in the example directory that can be used to compile and test all the examples using __Boost_Jam__.
+However, it is not necessary to use __Boost_Jam__ to compile code that uses this library.
+]
+
+[pre
+$ g++ -I ['ROOT]/include ... # For GCC.
+> cl /I ['ROOT]\include ... # For MSVC.
+]
+
+All necessary library headers are included in the source code by the following instruction (it is not necessary to include single headers separately):
+
+ #include <contract.hpp> // Include this library headers.
+
+The following symbols are part of the library private interface, they are not documented, and they should not be directly used by programmers:
+[footnote
+*Rationale.*
+This library concatenates symbols specified by programmers (e.g., the function name) with other symbols (e.g., special prefixes and line numbers) to make internal symbols with unique names to avoid name clashes.
+These symbols are separated by the letter `X` when they are concatenated so they read more easily during debugging (unfortunately, the underscore character `_` could not be used instead of the letter `X` because if the original symbol already contained a leading or trailing underscore, the concatenation could result in a symbol with double underscores `__` which is reserved by the C++ standard).
+The ["aux] symbols are internal to the implementation of this library.
+The ["detail] symbols are not officially part of the library public interface and they are not documented however they constitute a separate set of standalone libraries that could be added to the library public interface in the future.
+]
+
+* Any symbol defined by files within the =contract/aux_/= or =contract/detail/= directories (these header files should not be directly included by programmers).
+* Any symbol within the `contract::aux` or `contract::detail` namespace.
+* Any symbol prefixed by `contract_aux_...` or `contract_detail_...` (regardless of its namespace).
+* Any symbol prefixed by `CONTRACT_AUX_...` or `CONTRACT_DETAIL_...` (regardless of its namespace).
+
+Symbols starting with `ERROR_...` are used to report compile-time errors via static assertions and programmers should not use these symbols to define macros or other constructs in the global namespace.
+
+[endsect]
+
+[section Disable Contract Compilation]
+
+Some of the library behaviour can be customized at compile-time by defining special /configuration macros/ (see [headerref contract/config.hpp]).
+In particular, the following configuration macros can be used to selectively turn on or off contract compilation and the related run-time checks:
+
+* Defining the [macroref CONTRACT_CONFIG_NO_PRECONDITIONS] macro turns off compilation and run-time checking of all preconditions.
+* Defining the [macroref CONTRACT_CONFIG_NO_POSTCONDITIONS] macro turns off compilation and run-time checking of all postconditions.
+* Defining the [macroref CONTRACT_CONFIG_NO_CLASS_INVARIANTS] macro turns off compilation and run-time checking of all class invariants.
+* Defining the [macroref CONTRACT_CONFIG_NO_BLOCK_INVARIANTS] macro turns off compilation and run-time checking of all block invariants.
+* Defining the [macroref CONTRACT_CONFIG_NO_LOOP_VARIANTS] macro turns off compilation and run-time checking of all loop variants.
+
+By default, all contracts are compiled and checked at run-time (i.e., all the macros above are not defined).
+
+[important
+In Contract Programming, it is usually important to selectively turn off contract compilation to reduce run-time, binary size, and compilation-time overhead associated with the contracts (see __Meyer97__).
+This library guarantees zero run-time and binary size overhead when all contracts are all turned off (however, even when contracts are all turned off there is a limited compile-time overhead associated with expanding the contract macros to generate the original class and function declarations).
+Note that when contracts are turned off their assertions are completely ignored by the compiler so the assertion code might not even be syntactically correct.
+]
+
+For example, the following commands compile and check preconditions and class invariants, but they do not compile and check postconditions, block invariants, and loop variants:
+
+[pre
+$ g++ -DCONTRACT_CONFIG_NO_POSTCONDITONS -DCONTRACT_CONFIG_NO_BLOCK_INVARIANTS -DCONTRACT_CONFIG_NO_LOOP_VARIANTS ... # For GCC.
+> cl /DCONTRACT_CONFIG_NO_POSTCONDITONS /DCONTRACT_CONFIG_NO_BLOCK_INVARIANTS /DCONTRACT_CONFIG_NO_LOOP_VARIANTS ... # For MSVC.
+]
+
+Other configuration macros are provided to customize other aspects of the library.
+For example, the [macroref CONTRACT_CONFIG_FUNCTION_ARITY_MAX] macro is used to specify the maximum number of function parameters and the [macroref CONTRACT_CONFIG_INHERITANCE_MAX] macro is used to specify the maxim number of base classes.
+All configuration macros have appropriate default values when they are left undefined by programmers.
+
+[endsect]
+
+[endsect]
+
Added: sandbox/contract/doc/grammar.qbk
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/grammar.qbk 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,888 @@
+
+[/ Copyright (C) 2008-2012 Lorenzo Caminiti ]
+[/ Distributed under 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) ]
+[/ Home at http://sourceforge.net/projects/contractpp ]
+
+[def __assertion__ [link assertion_anchor [^['assertion]]]]
+[def __assertion_condition__ [link assertion_condition_anchor [^['assertion-condition]]]]
+[def __assertion_expression__ [link assertion_expression_anchor [^['assertion-expression]]]]
+[def __assertions__ [link assertions_anchor [^['assertions]]]]
+[def __base_classes__ [link base_classes_anchor [^['base-classes]]]]
+[def __boolean_condition__ [link boolean_condition_anchor [^['boolean-condition]]]]
+[def __class_declaration__ [link class_declaration_anchor [^['class-declaration]]]]
+[def __class_invariant__ [link class_invariant_anchor [^['class-invariant]]]]
+[def __class_invariants__ [link class_invariants_anchor [^['class-invariants]]]]
+[def __concepts__ [link concepts_anchor [^['concepts]]]]
+[def __exception_specifications__ [link exception_specifications_anchor [^['exception-specifications]]]]
+[def __function_declaration__ [link function_declaration_anchor [^['function-declaration]]]]
+[def __function_name__ [link function_name_anchor [^['function-name]]]]
+[def __function_parameters__ [link function_parameters_anchor [^['function-parameters]]]]
+[def __fundamental_type__ [link fundamental_type_anchor [^['fundamental-type]]]]
+[def __inscope_variables__ [link inscope_variables_anchor [^['inscope-variables]]]]
+[def __loop_variant__ [link loop_variant_anchor [^['loop-variant]]]]
+[def __member_initializers__ [link member_initializers_anchor [^['member-initializers]]]]
+[def __named_function_parameter__ [link named_function_parameter_anchor [^['named-function-parameter]]]]
+[def __named_function_parameters__ [link named_function_parameters_anchor [^['named-function-parameters]]]]
+[def __named_parameter_declaration__ [link named_parameter_declaration_anchor [^['named-parameter-declaration]]]]
+[def __named_template_parameter__ [link named_template_parameter_anchor [^['named-template-parameter]]]]
+[def __named_template_parameters__ [link named_template_parameters_anchor [^['named-template-parameters]]]]
+[def __named_template_template_parameter__ [link named_template_template_parameter_anchor [^['named-template-template-parameter]]]]
+[def __named_type_template_parameter__ [link named_type_template_parameter_anchor [^['named-type-template-parameter]]]]
+[def __named_value_template_parameter__ [link named_value_template_parameter_anchor [^['named-value-template-parameter]]]]
+[def __oldof_declaration__ [link oldof_declaration_anchor [^['oldof-declaration]]]]
+[def __operator_name__ [link operator_name_anchor [^['operator-name]]]]
+[def __positional_function_parameter__ [link positional_function_parameter_anchor [^['positional-function-parameter]]]]
+[def __positional_function_parameters__ [link positional_function_parameters_anchor [^['positional-function-parameters]]]]
+[def __positional_template_parameter__ [link positional_template_parameter_anchor [^['positional-template-parameter]]]]
+[def __positional_template_parameters__ [link positional_template_parameters_anchor [^['positional-template-parameters]]]]
+[def __positional_template_template_parameter__ [link positional_template_template_parameter_anchor [^['positional-template-template-parameter]]]]
+[def __positional_type_template_parameter__ [link positional_type_template_parameter_anchor [^['positional-type-template-parameter]]]]
+[def __positional_value_template_parameter__ [link positional_value_template_parameter_anchor [^['positional-value-template-parameter]]]]
+[def __result_oldof_assertions__ [link result_oldof_assertions_anchor [^['result-oldof-assertions]]]]
+[def __result_type__ [link result_type_anchor [^['result-type]]]]
+[def __select_assertion__ [link select_assertion_anchor [^['select-assertion]]]]
+[def __template_parameters__ [link template_parameters_anchor [^['template-parameters]]]]
+[def __template_specializations__ [link template_specializations_anchor [^['template-specializations]]]]
+[def __type_keyword__ [link type_keyword_anchor [^['type-keyword]]]]
+[def __type_qualifier__ [link type_qualifier_anchor [^['type-qualifier]]]]
+[def __wrapped_type__ [link wrapped_type_anchor [^['wrapped-type]]]]
+
+[def __boolean_expression__ [link boolean_expression_anchor [^[*boolean-expression]]]]
+[def __boolean_expression_using_inscope_variables__ [link boolean_expression_using_inscope_variables_anchor [^[*boolean-expression-using-inscope-variables]]]]
+[def __boost_concept__ [link boost_concept_anchor [^[*boost-concept]]]]
+[def __catch_declaration__ [link catch_declaration_anchor [^[*catch-declaration]]]]
+[def __catch_instructions__ [link catch_instructions_anchor [^[*catch-instructions]]]]
+[def __class_name__ [link class_name_anchor [^[*class-name]]]]
+[def __class_type__ [link class_type_anchor [^[*class-type]]]]
+[def __constant_boolean_expression__ [link constant_boolean_expression_anchor [^[*constant-boolean-expression]]]]
+[def __constant_string_literal__ [link constant_string_literal_anchor [^[*constant-string-literal]]]]
+[def __exception_type__ [link exception_type_anchor [^[*exception-type]]]]
+[def __function_identifier__ [link function_identifier_anchor [^[*function-identifier]]]]
+[def __inscope_variable__ [link inscope_variable_anchor [^[*inscope-variable]]]]
+[def __loop_declaration__ [link loop_declaration_anchor [^[*loop-declaration]]]]
+[def __member_initializer__ [link member_initializer_anchor [^[*member-initializer]]]]
+[def __named_argument_identifier_name__ [link named_argument_identifier_anchor [^[*named-argument-identifier]]]]
+[def __named_parameter_identifier_namespace__ [link named_parameter_identifier_namespace_anchor [^[*named-parameter-identifier-namespace]]]]
+[def __namespace_alias__ [link namespace_alias_anchor [^[*namespace-alias]]]]
+[def __natural_expression__ [link natural_expression_anchor [^[*natural-expression]]]]
+[def __natural_expression_using_inscope_variables__ [link natural_expression_using_inscope_variables_anchor [^[*natural-expression-using-inscope-variables]]]]
+[def __new_type_name__ [link new_type_name_anchor [^[*new-type-name]]]]
+[def __oldof_expression__ [link oldof_expression_anchor [^[*oldof-expression]]]]
+[def __operator_identifier__ [link operator_identifier_anchor [^[*operator-identifier]]]]
+[def __operator_symbol__ [link operator_symbol_anchor [^[*operator-symbol]]]]
+[def __parameter_default__ [link parameter_default_anchor [^[*parameter-default]]]]
+[def __parameter_name__ [link parameter_name_anchor [^[*parameter-name]]]]
+[def __template_parameter__ [link template_parameter_anchor [^[*template-parameter]]]]
+[def __template_specialization__ [link template_specialization_anchor [^[*template-specialization]]]]
+[def __type__ [link type_anchor [^[*type]]]]
+[def __typedef_type__ [link typedef_type_anchor [^[*typedef-type]]]]
+[def __unary_boolean_metafunction__ [link unary_boolean_metafunction_anchor [^[*unary-boolean-metafunction]]]]
+[def __using_directive__ [link using_directive_anchor [^[*using-directive]]]]
+[def __variable_name__ [link variable_name_anchor [^[*variable-name]]]]
+
+[section Grammar]
+
+[:['["Almost every macro demonstrates a flaw in the programming language, in the program, or in the programmer.]]]
+[:['-- Bjarne Stroustrup (see __Stroustrup97__ page 160)]]
+
+This library uses macros to overcome a limitation of C++, namely the fact that the core language does not support preconditions, postconditions, class invariants, old values, and subcontracting.
+This section lists the complete grammar of the syntax used by this library macros.
+
+[#syntax_error_warning_anchor]
+[warning
+In general, an error in programming this library syntax will generate cryptic compiler errors (often exposing internal code from this library and from __Boost_Preprocessor__).
+[footnote
+Usually, the complexity of C++ definitions is greater than the complexity of C++ declaration and the fact that this library macros only affect declarations would help by preserving the usefulness of the compiler error messages for the definition code.
+However, this library aims to make declarations more complex by adding program specifications to them (preconditions, postconditions, etc).
+Therefore, it can no longer be argued that declarations are significantly simpler than definitions and it would be rather helpful to have sensible compiler error messages at least for the declarations with contracts.
+]
+
+There are intrinsic limitations on the amount of error checking that can be implemented by this library because it uses the preprocessor to parse its syntax (e.g., there is no way the preprocessor can gracefully detect and report unbalanced round parenthesis `( ... /* missing closing parenthesis here */` or an invalid concatenation symbol `BOOST_PP_CAT(xyz, ::std::vector)`).
+In addition, for a given macro all compiler error messages report the same line number (because macros always expand on a single line) so line numbers are not very useful in identifying syntactic errors.
+
+While the preprocessor imposes limits on the error checking that can be implemented, the current version of this library does not focus on providing the best possible syntax error messages (this will be the focus of future releases, see also [@https://sourceforge.net/apps/trac/contractpp/ticket/44 Ticket 44]).
+]
+
+The best way to resolve syntactic errors is for programmers to inspect the code ["by eye] instead of trying to make sense of the compiler errors.
+This section is very useful for programmers to make sure that they are using the syntax correctly.
+
+[section Preprocessor DSEL]
+
+The syntax used by this library macros effectively defies a new language within C++.
+More precisely, this library macros define a [@http://en.wikipedia.org/wiki/Domain-specific_language Domain-Specific Embedded Language (DSEL)] that replaces the usual C++ syntax for class and function declarations.
+This is the ['Language of Contract++] (or ['LC++] for short).
+
+In contrast with other DSEL hosted by C++ which are parsed using template meta-programming (e.g., __Boost_Phoenix__), this library DSEL is parsed ["one meta-programming level higher] using preprocessor meta-programming.
+Using both processor meta-programming and template meta-programming allows this library to implement rules like this:
+
+ ``/if a member function is not public then it does not check the class invariants/``
+
+This rule cannot be implemented using only template meta-programming because it is not possible to check if a function is public using template meta-programming introspection techniques.
+For example, it is not possible to implement a boolean meta-function like the following:
+[footnote
+Using __CXX11__, it /might/ be possible to implement the `is_public` template because __SFINAE__ was extended to support access level (but to the authors' knowledge such a meta-function has not been implemented yet so the authors cannot be sure that `is_public` can be properly implemented even using __CXX11__ __SFINAE__).
+Even if that were possible in __CXX11__, this library still needs declaration traits other than `public` in oder to properly implement Contract Programming (e.g., if a function is `virtual` or not in order to implement subcontracting, and there are examples like that).
+Therefore, the arguments made here for the need to use a preprocessor DSEL in oder to properly implement Contract Programming in C++ hold even if `is_public` could be implemented in __CXX11__.
+]
+
+ template< ... >
+ struct is_public { ... }; // Unfortunately, this cannot be implemented.
+
+Instead a macro can be programmed to parse the following function declarations and expand to `1` if and only if the function is public:
+
+ #define IS_PUBLIC(function_declaration) ... // This can be implemented.
+
+ IS_PUBLIC( public void (f) ( int x ) ) // Expand to 1.
+ IS_PUBLIC( private void (g) ( int y ) ) // Expand to 0.
+ IS_PUBLIC( void (h) ( int z ) ) // Expand to 0.
+
+There are more examples of class and function declaration traits (`virtual`, etc) that need to be known to correctly implement Contract Programming but that cannot be inspected using template meta-programming.
+This library macros can instead parse the specified class and function declarations extracting /any/ declaration trait (if a constructor is `explicit`, if a member function is `virtual`, if a base class is `protected`, if a parameter has a default value, etc).
+
+It should be noted that while the syntax of the DSEL defined by this library macros is rather extensive and complex, macros always define a DSEL that is intrinsically different from the core C++ language.
+For example, consider the following function-like macro:
+
+ #define F(x, y) (int(x) - int(y))
+
+ template< typename X, typename Y >
+ int f ( X const& x, Y const& y ) { return (int(x) - int(y)); }
+
+ int main ( void )
+ {
+ std::cout << F( , 2) << std::endl; // OK, no syntax error, it prints `-2`.
+ std::cout << f( , 2) << std::endl; // Compiler generates a syntax error.
+ return 0;
+ }
+
+Note how it is valid to invoke the macro with an empty parameter `F( , 2)` while it is syntactically invalid to invoke a function with an empty parameter `f( , 2)`.
+This very simple macro already shows fundamental differences between the syntax of macros and the syntax of the core language.
+
+[endsect]
+
+[section Differences with C++ Syntax]
+
+The following is a summary of all the differences between the syntax of this library macros and the usual C++ class and function declaration syntax.
+
+[table
+[ [Rule] [Syntactic Element] [Syntax Differences] ]
+[ [1] [Template Declarations] [
+Use round parenthesis `template( `[^['template-parameters]]` )` instead of angular parenthesis `template< `[^['template-parameters]]` >` to declare templates (note that template instantiations are not template declarations and they use angular parenthesis as usual).
+] ]
+[ [2] [Template Specializations] [
+Use round parenthesis `( `[^['template-specializations]]` )` instead of angular parenthesis `< `[^['template-specializations]]` >` after a class template name to specify template specialization arguments.
+] ]
+[ [3] [Class, Function, and Operator Names] [
+Wrap class and function declaration names within round parenthesis `(`[^['class-name]]`)` and `(`[^['function-name]]`)`.
+Use `operator(`[^['symbol]]`)(`[^['arbitrary-name]]`)` for operators (allowed but not required for `operator new`, `operator delete`, and implicit type conversion operators for fundamental types with no symbol).
+Always use `operator comma` for comma operator.
+Memory member operators must always be explicitly declared `static`.
+] ]
+[ [4] [Base Classes] [
+Use `extends( `[^['base-classes]]` )` instead of the column symbol `: `[^['base-classes]] to inherit from base classes.
+] ]
+[ [5] [Default Parameters] [
+Use `default `[^['parameter-default]] instead of the assignment symbol `= `[^['parameter-default]] to specify template and function parameter default values.
+] ]
+[ [6] [Member Access Levels] [
+Always specify the access level `public`, `protected`, or `private` (note no trailing comma `:`) for every constructor, destructor, member function, and nested class declaration.
+] ]
+[ [7] [Result and Parameter Types] [
+Wrap function result and parameter types within round parenthesis `(`[^['type]]`)`.
+The wrapping parenthesis are allowed but not required for fundamental types containing only alphanumeric tokens (e.g., both `(const unsigned int)` and `const unsigned int` are allowed, only `(int&)` and not `int&` is allowed because of the non-alphanumeric symbol `&`, only `(mytype)` is allowed because `mytype` is not a fundamental type).
+] ]
+[ [8] [Member Initializers] [
+Use `initialize( `[^['member-initializers]]` )` instead of the column symbol `: `[^['member-initializers]] to specify constructor member initializers.
+] ]
+[ [9] [Empty Lists] [
+Specify empty lists (parameters, exception specifications, template specializations, etc) using `( void )` instead of `( )` or `< >`.
+] ]
+[ [10] [Commas and Leading Symbols] [
+Syntactic elements containing commas and leading non-alphanumeric symbols must be wrapped within extra round parenthesis `(...)`.
+(Note that `'a'`, `"abc"`, `1.23`, etc are not alphanumeric so they need to be wrapped as `('a')`, `("abc")`, `(1.23)`, etc when specified as default parameters or similar.)
+] ]
+]
+
+[important
+In general, every token which is not a known keyword (`int` is a known keyword but the function name is not) or that contains a non-alphanumeric symbol (e.g., `int&`) must be wrapped within round parenthesis `(...)` unless it is the very last token of a syntactic element (e.g., the function parameter name).
+]
+
+Sometimes the C++ syntax allows to equivalently specify elements in different orders (e.g., `const volatile` and `volatile const` are both allowed for member functions and they have the same meaning).
+The syntax of this library requires instead to specify the elements exactly in the order listed by this grammar (e.g., only `const volatile` is allowed for member functions).
+[footnote
+*Rationale.*
+This library macros could be implemented to allow to specify syntactic elements in different orders but that would complicate the macro implementation and this grammar with no additional feature for the user.
+]
+
+[endsect]
+
+[section Macro Interface]
+
+This library uses the following macros.
+
+ ``[macroref CONTRACT_CLASS]``(__class_declaration__)
+ ``[macroref CONTRACT_CLASS_TPL]``(__class_declaration__)
+
+ ``[macroref CONTRACT_CLASS_INVARIANT]``(__class_invariants__)
+ ``[macroref CONTRACT_CLASS_INVARIANT_TPL]``(__class_invariants__)
+
+ ``[macroref CONTRACT_FUNCTION]``(__function_declaration__)
+ ``[macroref CONTRACT_FUNCTION_TPL]``(__function_declaration__)
+ ``[macroref CONTRACT_CONSTRUCTOR]``(__function_declaration__)
+ ``[macroref CONTRACT_CONSTRUCTOR_TPL]``(__function_declaration__)
+ ``[macroref CONTRACT_DESTRUCTOR]``(__function_declaration__)
+ ``[macroref CONTRACT_DESTRUCTOR_TPL]``(__function_declaration__)
+
+ ``[macroref CONTRACT_FREE_BODY]``(__function_name__)
+ ``[macroref CONTRACT_MEMBER_BODY]``(__function_name__)
+ ``[macroref CONTRACT_CONSTRUCTOR_BODY]``(__class_type__, __class_name__)
+ ``[macroref CONTRACT_DESTRUCTOR_BODY]``(__class_type__, ~__class_name__)
+
+ ``[macroref CONTRACT_BLOCK_INVARIANT]``(__assertions__)
+ ``[macroref CONTRACT_BLOCK_INVARIANT_TPL]``(__assertions__)
+
+ ``[macroref CONTRACT_LOOP]``(__loop_declaration__)
+ ``[macroref CONTRACT_LOOP_VARIANT]``(__loop_variant__)
+ ``[macroref CONTRACT_LOOP_VARIANT_TPL]``(__loop_variant__)
+
+ ``[macroref CONTRACT_CONSTRUCTOR_ARG]``(__parameter_name__)
+ ``[macroref CONTRACT_PARAMETER_TYPEOF]``(__parameter_name__)
+ ``[macroref CONTRACT_PARAMETER]``(__named_parameter_declaration__)
+ ``[macroref CONTRACT_TEMPLATE_PARAMETER]``(__named_parameter_declaration__)
+ ``[macroref CONTRACT_PARAMETER_BODY]``(__function_name__)
+
+The macros with the trailing `_TPL` must be used when the enclosing scope is type-dependent (e.g., within templates).
+
+[endsect]
+
+[section Lexical Conventions]
+
+The following conventions are used to express this grammar.
+
+[table
+[ [Lexical Expression] [Meaning] ]
+[ [[^['[]tokens['\]]]] [
+Either `tokens` or nothing (optional tokens).
+] ]
+[ [[^['{]expression['}]]] [
+The result of the enclosed expression `expression` (evaluation order).
+] ]
+[ [[^tokens1 ['|] tokens2]] [
+Either `tokens1` or `tokens2` (["or] operation).
+] ]
+[ [[^tokens['*]]] [
+`tokens` repeated zero or more times (repetition starting from zero).
+] ]
+[ [[^tokens['+]]] [
+`tokens` repeated one or more times (repetition starting from one).
+] ]
+[ [[^token, ...]] [
+A comma separated list of tokens that could also have one single element (i.e., `token` or `token1, token2` or `token1, token2, token3`).
+See the __No_Variadic_Macros__ section for compilers that do not support variadic macros.
+] ]
+[ [[^[*tokens]]] [
+Terminal symbols (in bold font).
+] ]
+[ [[^['tokens]]] [
+Non-terminal symbols (in italic font).
+] ]
+]
+
+[endsect]
+
+[section Class Declarations]
+
+ __class_declaration__``: [#class_declaration_anchor]``
+ ``/[/````/[/``export``/]/`` template( __template_parameters__ ) ``/[/``requires( __concepts__ )``/]/````/]/``
+ ``/[/``friend``/]/`` ``/{/``class ``/|/`` struct``/}/`` (__class_name__)``/[/``( __template_specializations__ )``/]/`` ``/[/``final``/]/``
+ ``/[/``extends( __base_classes__ )``/]/``
+
+[endsect]
+
+[section Base Classes]
+
+ __base_classes__``: [#base_classes_anchor]``
+ ``/[/``public ``/|/`` protected ``/|/`` private``/]/`` ``/[/``virtual``/]/`` __class_type__, ...
+
+Note that when specified, `virtual` must appear after the inheritance access level for a base class.
+
+[endsect]
+
+[section Template Specializations]
+
+ __template_specializations__``: [#template_specializations_anchor]``
+ __template_specialization__, ...
+
+[endsect]
+
+[section Template Parameters]
+
+ __template_parameters__``: [#template_parameters_anchor]``
+ void ``/|/``
+ __positional_template_parameters__ ``/|/``
+ __named_template_parameters__
+
+ __positional_template_parameters__``: [#positional_template_parameters_anchor]``
+ __positional_template_parameter__, ...
+ __positional_template_parameter__``: [#positional_template_parameter_anchor]``
+ __positional_type_template_parameter__ ``/|/``
+ __positional_value_template_parameter__ ``/|/``
+ __positional_template_template_parameter__
+ __positional_type_template_parameter__``: [#positional_type_template_parameter_anchor]``
+ ``/{/``class ``/|/`` typename``/}/`` __parameter_name__
+ ``/[/``, default __parameter_default__``/]/``
+ __positional_value_template_parameter__``: [#positional_value_template_parameter_anchor]``
+ __wrapped_type__ __parameter_name__
+ ``/[/``, default __parameter_default__``/]/``
+ __positional_template_template_parameter__``: [#positional_template_template_parameter_anchor]``
+ template( __template_parameter__, ... ) class __parameter_name__
+ ``/[/``, default __parameter_default__``/]/``
+
+ __named_template_parameters__``: [#named_template_parameters_anchor]``
+ ``/[/``using namespace __named_parameter_identifier_namespace__,``/]/``
+ __named_type_template_parameter__, ...
+ __named_type_template_parameter__``: [#named_type_template_parameter_anchor]``
+ ``/[/``deduce``/]/`` in ``/{/``class ``/|/`` typename``/}/``
+ ``/[/``requires(__unary_boolean_metafunction__)``/]/`` __parameter_name__
+ ``/[/``, default __parameter_default__``/]/``
+
+Note that if `typename` appears within __wrapped_type__ for a value template parameter then it will be wrapped within parenthesis `(typename ...)` so it is syntactically distinguishable from the `typename` leading a type template parameter.
+
+Unfortunately, named template parameters only support type template parameters.
+Named value template parameters and named template template parameters are not supported because they are not supported by __Boost_Parameter__ but if they were ever supported, they could follow this syntax:
+
+ __named_template_parameters__``:``
+ __named_template_parameter__, ...
+ __named_template_parameter__``: [#named_template_parameter_anchor]``
+ __named_type_template_parameter__ ``/|/``
+ __named_value_template_parameter__ ``/|/``
+ __named_template_template_parameter__
+ __named_value_template_parameter__``: [#named_value_template_parameter_anchor]``// Not supported.
+ ``/[/``deduce``/]/`` in
+ ``/{/``__wrapped_type__ ``/|/`` auto ``/|/`` requires(__unary_boolean_metafunction__)``/}/`` __parameter_name__
+ ``/[/``, default __parameter_default__``/]/``
+ __named_template_template_parameter__``: [#named_template_template_parameter_anchor]``// Not supported.
+ ``/[/``deduce``/]/`` in template( __positional_template_parameter__, ... ) class
+ ``/[/``requires(__unary_boolean_metafunction__)``/]/`` __parameter_name__
+ ``/[/``, default __parameter_default__``/]/``
+
+ template( // For example...
+ // Named type template parameter (supported).
+ in typename requires(is_const<_>) T, default int
+ // Named value template parameter (not supported).
+ , in requires(is_converible<_, T>) val, default 0
+ // Named template template parameter (not supported).
+ , in template(
+ typename A
+ , template(
+ typename X
+ , typename Y, default int
+ ) class B, default b
+ ) class requires(pred1< _<T> >) Tpl, default tpl
+ )
+
+[endsect]
+
+[section Concepts]
+
+ __concepts__``: [#concepts_anchor]``
+ __boost_concept__, ...
+
+[endsect]
+
+[section Types]
+
+ __wrapped_type__``: [#wrapped_type_anchor]``
+ __fundamental_type__ ``/|/`` (__fundamental_type__) ``/|/`` (__type__)
+
+ __fundamental_type__``: [#fundamental_type_anchor]``
+ __type_qualifier__``/*/`` __type_keyword__ __type_qualifier__``/*/``
+ __type_qualifier__``: [#type_qualifier_anchor]``
+ const ``/|/`` volatile ``/|/`` long ``/|/`` short ``/|/`` signed ``/|/`` unsigned
+ __type_keyword__``: [#type_keyword_anchor]``
+ void ``/|/`` bool ``/|/`` char ``/|/`` double ``/|/`` float ``/|/`` int ``/|/`` wchar_t ``/|/`` size_t ``/|/`` ptrdiff_t
+
+This is the syntax used to specify the function result type, the function parameter types, the types of value template parameters, etc.
+As indicated by the syntax, extra parenthesis around the specified type are always allowed but they are required only for user-defined types `(mytype)` and types containing non-alphanumeric symbols `(int&)` while the parenthesis are optional for fundamental types containing no symbol `unsigned long int const` (or equivalently `(unsigned long int const)`).
+
+[endsect]
+
+[section Function Declarations]
+
+ __function_declaration__``: [#function_declaration_anchor]``
+ ``/[/``public ``/|/`` protected ``/|/`` private``/]/``
+ ``/[/````/[/``export``/]/`` ``/[/``template( __template_parameters__ ) ``/[/``requires( __concepts__ )``/]/````/]/``
+ ``/[/``explicit``/]/`` ``/[/``inline``/]/`` ``/[/``extern``/]/`` ``/[/``static``/]/`` ``/[/``virtual``/]/`` ``/[/``friend``/]/``
+ ``/[/``__result_type__``/]/`` __function_name__ ( __function_parameters__ )
+ ``/[/``requires( __concepts__ )``/]/``
+ ``/[/``const``/]/`` ``/[/``volatile``/]/`` ``/[/``override ``/|/`` new``/]/`` ``/[/``final``/]/``
+ ``/[/``throw( __exception_specifications__ )``/]/``
+ ``/[/``precondition( __assertions__ )``/]/``
+ ``/[/``postcondition( __result_oldof_assertions__ )``/]/``
+ ``/[/``__member_initializers__``/]/``
+
+This is the syntax used to declare all functions: Free functions, member functions, constructors, destructors, and operators.
+The usual constraints of C++ function declarations apply: It is not possible to declare a static virtual member function, only constructors can use the class name as the function name, constructors and destructors have no result type, etc.
+The `static` specifier can only be used for member functions (because it was deprecated for free functions from C to __CXX03__).
+The `volatile` specifier must always appear after `const` when they are both specified.
+
+[endsect]
+
+[section Result Type]
+
+ __result_type__``: [#result_type_anchor]``
+ __wrapped_type__
+
+Note that fundamental types containing no symbol can be specified without extra parenthesis: `void`, `bool`, `int`, `unsigned long const`, etc.
+
+[endsect]
+
+[section Function and Operator Names]
+
+ __function_name__``: [#function_name_anchor]``
+ (__function_identifier__) ``/|/`` (__class_name__) ``/|/`` (~__class_name__) ``/|/`` __operator_name__
+
+ __operator_name__``: [#operator_name_anchor]``
+ operator(__operator_symbol__)(__operator_identifier__) ``/|/`` operator __fundamental_type__ ``/|/``
+ operator new ``/|/`` operator delete ``/|/`` operator comma
+
+Names for free functions, member functions, constructors, and destructors are specified as usual but wrapped within parenthesis.
+
+Operator names are specified wrapping within parenthesis the usual operator symbol followed by an arbitrary but alphanumeric identifier:
+
+ operator([])(at)
+ operator(+)(plus)
+ operator(())(call)
+ operator(new[])(new_array)
+ operator(delete[])(delete_array)
+
+Implicit type conversion operators use the same syntax:
+
+ operator(int*)(int_ptr)
+ operator(mytype const&)(mytype_const_ref)
+ operator(std::map<char, int>)(std_map)
+
+However, if the type is a fundamental type containing no symbol, the identifier is optional:
+
+ operator(const int)(const_int) // Allowed but...
+ operator const int // ... more readable.
+
+Similarly, the parenthesis and identifier are optional for the `new` and `delete` operators:
+
+ operator(new)(new_ptr) // Allowed but...
+ operator new // ... more readable.
+
+ operator(delete)(delete_ptr) // Allowed but...
+ operator delete // ... more readable.
+
+Finally, the comma symbol `,` cannot be used to specify the comma operator
+[footnote
+*Rationale.*
+Within macros a comma `,` has the special meaning of separating the macro parameters so it cannot be used to indicate the comma operator otherwise `operator(,)(mycomma)` and `operator(std::map<char, int>)(stdmap)` could not be distinguished from one another by the preprocessor.
+]
+so the specifier `comma` must always be used to name the comma operator:
+
+ operator comma // OK.
+ operator(,)(comma) // Error.
+
+C++ automatically promotes the memory member operators `operator new`, `operator delete`, `operator new[]`, and `operator delete[]` to be static members so the `static` specifier is allowed but optional for these member operators.
+This library cannot automatically perform such a promotion so the `static` specifier is always required by this library for the memory member operators.
+
+[endsect]
+
+[section Exception Specifications]
+
+ __exception_specifications__``: [#exception_specifications_anchor]``
+ void | __exception_type__, ...
+
+Note that the syntax `throw( void )` is used instead of `throw( )` for no-throw specifications.
+
+Exception specifications apply only to exceptions thrown by the function body and not to exceptions thrown by the contracts themselves (if any) and by the contract checking code generated by this library macros.
+
+[endsect]
+
+[section Member Initializers]
+
+ __member_initializers__``: [#member_initializers_anchor]``
+ ``/[/``try``/]/`` initialize( __member_initializer__, ... )
+ ``/{/``catch(__catch_declaration__) ( __catch_instructions__ )``/}*/``
+
+As indicated by this syntax, it is possible to specify function-try blocks for constructor member initializers:
+
+ struct vector_error { ... };
+
+ CONTRACT_CONSTRUCTOR( // Constructor with member initializers.
+ explicit (vector) ( int count )
+ precondition( count >= 0 )
+ postcondition( size() == count )
+
+ try initialize( ptr_(new T[count]) )
+ catch(std::bad_alloc& ex) (
+ std::cerr << "not enough memory for " << count << " elements vector: " << ex.what() << std::endl;
+ throw vector_error(1);
+ ) catch(std::exception& ex) (
+ std::cerr << "error for " << count << " elements vector: " << ex.what() << std::endl;
+ throw vector_error(2);
+ ) catch(...) (
+ std::cerr << "unknown error for " << count << " elements vector" << std::endl;
+ throw vector_error(3);
+ )
+ ) { // Above function-try block only applies to exceptions thrown by the body (and not by the contracts).
+ ...
+ }
+
+For functions other than constructors and for constructors without member initializers, function-try blocks are programmed outside the macros and around the body definition as usual.
+As specified by __N1962__, function-try blocks apply only to exceptions thrown by the function body and not to exceptions thrown by the contracts themselves (if any) and by the contract checking code generated by the library macros.
+
+Member initializers (and their function-try blocks) are part of the constructor definition and not of the constructor declaration.
+However, __CXX03__ lack of delegating constructors requires member initializers (and their function-try blocks) to be specified within this library macros and constructors must be defined together with their declarations when they use member initializers.
+
+[endsect]
+
+[section Function Parameters]
+
+ __function_parameters__``: [#function_parameters_anchor]``
+ void ``/|/``
+ __positional_function_parameters__ ``/|/``
+ __named_function_parameters__
+
+ __positional_function_parameters__``: [#positional_function_parameters_anchor]``
+ __positional_function_parameter__, ...
+ __positional_function_parameter__``: [#positional_function_parameter_anchor]``
+ ``/[/``auto ``/|/`` register``/]/`` __wrapped_type__ __parameter_name__
+ ``/[/``, default __parameter_default__``/]/``
+
+ __named_function_parameters__``: [#named_function_parameters_anchor]``
+ ``/[/``using namespace __named_parameter_identifier_namespace__,``/]/``
+ __named_function_parameter__, ...
+ __named_function_parameter__``: [#named_function_parameter_anchor]``
+ ``/[/``deduce``/]/`` ``/{/``in ``/|/`` out ``/|/`` in out``/}/``
+ ``/{/``__wrapped_type__ ``/|/`` auto ``/|/`` requires(__unary_boolean_metafunction__)``/}/`` __parameter_name__
+ ``/[/``, default __parameter_default__``/]/``
+
+Note that the positional parameter storage classifier `auto` is supported by this library because it is part of __CXX03__ (but the `auto` keyword changed meaning in __CXX11__ so use it with the usual care when writing code portable to __CXX11__).
+
+[endsect]
+
+[section Result and Old Values]
+
+ __result_oldof_assertions__``: [#result_oldof_assertions_anchor]``
+ ``/[/``auto __variable_name__ = return,``/]/``
+ ``/[/``__oldof_declaration__, ...``/]/``
+ __assertion__, ...
+
+ __oldof_declaration__``: [#oldof_declaration_anchor]``
+ ``/{/``auto ``/|/`` __wrapped_type__``/}/`` __variable_name__ = ``[macroref CONTRACT_OLDOF]`` __oldof_expression__
+
+If present, result and old-of declarations should appear at the very beginning of the postconditions because they will always be visible to all assertions plus these declarations cannot be nested (within select-assertions, etc).
+
+The result declaration type is always `auto` because the function result type is know and already specified by the function declaration (so no result type deduction is ever needed).
+The old-of declaration type is automatically deduced (using __Boost_Typeof__) when its type is specified `auto` instead of __wrapped_type__.
+The macro `CONTRACT_OLDOF` does not require but allows parenthesis around the value expression __oldof_expression__ (this is as specified for the `oldof` operator in __N1962__ and similar to the `sizeof` operator which requires parenthesis when applied to a type expression `sizeof(size_type)` but not when applied to a value expression `sizeof size()`).
+For example, all the followings are valid:
+
+ auto old_size = CONTRACT_OLDOF size()
+ auto old_size = CONTRACT_OLDOF(size()) // Extra parenthesis around expression (optional).
+ (size_type) old_size = CONTRACT_OLDOF size() // Do not use Boost.Typeof.
+ (size_type) old_size = CONTRACT_OLDOF(size()) // No Boost.Typeof and extra parenthesis.
+
+If an old-of copy is performed on a type that is not __ConstantCopyConstructible__, the old-of declaration itself will not fail compilation but it will produce an old variable that will cause a compiler-error as soon as it is used in an assertion (unless the assertion specifies a requirement using a properly specialized [classref contract::has_oldof] trait).
+
+[endsect]
+
+[section Class Invariants]
+
+ __class_invariants__``: [#class_invariants_anchor]``
+ void ``/|/`` __class_invariant__, ...
+
+ __class_invariant__``: [#class_invariant_anchor]``
+ __assertion__ ``/|/``
+ static class( void ``/|/`` __assertion__, ... ) ``/|/``
+ volatile class( void ``/|/`` __assertion__, ... )
+
+Volatile class invariants are assumed to have the same assertions as non-volatile class invariants unless they are explicitly specified.
+Static class invariants are assumed to assert nothing unless they are explicitly specified.
+
+[endsect]
+
+[section Assertions]
+
+ __assertions__``: [#assertions_anchor]``
+ __assertion__, ...
+ __assertion__``: [#assertion_anchor]``
+ using __using_directive__ ``/|/``
+ namespace __namespace_alias__ ``/|/``
+ typedef __typedef_type__ __new_type_name__ ``/|/``
+ __assertion_condition__
+
+ __assertion_condition__``: [#assertion_condition_anchor]``
+ __assertion_expression__ ``/|/``
+ __select_assertion__
+ __assertion_expression__``: [#assertion_expression_anchor]``
+ __boolean_condition__ ``/|/``
+ static_assert(__constant_boolean_expression__, __constant_string_literal__)
+ ``/[/``, requires __constant_boolean_expression__``/]/``
+ __select_assertion__``: [#select_assertion_anchor]``
+ if(__boolean_condition__) ( __assertion_condition__, ... )
+ ``/[/``else ( __assertion_condition__, ... )``/]/``
+
+ __boolean_condition__``: [#boolean_condition_anchor]``
+ __boolean_expression__ ``/|/``
+ const( __inscope_variables__ ) __boolean_expression_using_inscope_variables__
+ __inscope_variables__``: [#inscope_variables_anchor]``
+ ``/[/``__wrapped_type__``/]/`` __inscope_variable__, ...
+
+Some basic name manipulations are allowed at the local scope where the assertions are being declared in case they are ever needed to simplify the assertion expressions.
+Specifically, using-directives, namespace-aliases, and type-definitions are allowed (these will always affect all assertions within the given preconditions, postconditions, etc so it is recommended to always use these statement at the very beginning before the actual assertion conditions).
+Note that these name manipulations have no effect on the program run-time state and therefore they do not compromise the contract constant-correctness requirement.
+
+As indicated by the grammar above, it is not possible to specify assertion requirements (using `requires`) for the entire select assertion if-then-else expression.
+Eventual assertion requirements must be specified for the single assertions within the select assertion if-then-else statement and they will never disable compilation and checking of the select assertion if-condition.
+Programmers can use the ternary operator `?:` instead of a select assertion if they need to specify a guarded assertion with a condition that is also disabled by the assertion requirements:
+
+ ``/boolean-guard/`` ? __boolean_expression__ : true, requires __constant_boolean_expression__
+
+Constant expressions `const( ... ) `[^['expression]] can be used to assert conditions and to check the select assertion if-condition so to fully enforce the assertion constant-correctness requirement.
+However, function arguments, result value, old-of values, and the object `this` are automatically made constant by this library so constant expressions only need to be used to assert conditions on global variables, static variables, etc.
+The type of the in-scope variable __inscope_variable__ is optional and it is automatically deduced using __Boost_Typeof__ when it is not specified.
+
+[endsect]
+
+[section Loop Variants]
+
+ __loop_variant__``: [#loop_variant_anchor]``
+ __natural_expression__ ``/|/``
+ const( __inscope_variables__ ) __natural_expression_using_inscope_variables__
+
+A loop variant must specify a non-negative integral expression that monotonically decreases at each subsequent loop iteration (the library will automatically check these two conditions at each loop iteration and terminate the loop if they are not met by calling the loop variant broken handler).
+The loop variant can be specified using a constant-expression `const( ... ) `[^['expression]] so to fully enforce the contract constant-correctness requirement.
+
+[endsect]
+
+[section Named Parameter Declarations]
+
+ __named_parameter_declaration__``: [#named_parameter_declaration_anchor]``
+ ``/[/``namespace(__named_parameter_identifier_namespace__)``/]/``
+ ``/[/``(__named_argument_identifier_name__)``/]/`` __parameter_name__
+
+[endsect]
+
+[section Terminals]
+
+[table
+[
+[Terminal]
+[Description]
+[If terminal contains unwrapped commas or leading symbols]
+] [
+[__boolean_expression__[#boolean_expression_anchor]]
+[A boolean expression: `x == 1`.]
+[Wrap value within parenthesis: `(vey_sizeof<Key, T>::value)`.]
+] [
+[__boolean_expression_using_inscope_variables__[#boolean_expression_using_inscope_variables_anchor]]
+[A boolean expression that only uses in-scope variables captured as constants by a constant expression `const( ... ) `[^['expression]].]
+[Wrap value within parenthesis: `(key_sizeof<Key, T>::value + x)`.]
+] [
+[__boost_concept__[#boost_concept_anchor]]
+[A concept class defined using __Boost_ConceptCheck__: `boost::CopyConstructible`.]
+[Wrap type within parenthesis: `(boost::Convertible<T, int>)`.]
+] [
+[__catch_declaration__[#catch_declaration_anchor]]
+[The declaration of an exception for a `catch` statement: `std::runtime_error& error`.]
+[Wrap type using __Boost_Utility_IdentityType__: `BOOST_IDENTITY_TYPE((map<char, int>::exception&)) error`.]
+] [
+[__catch_instructions__[#catch_instructions_anchor]]
+[The instructions of a `catch` statement terminated by semicolons `;`: `std::cout << "error" << std::endl; exit(255);`.]
+[Wrap types using __Boost_Utility_IdentityType__ and values within parenthesis: `typedef BOOST_UTILITY_TYPE(std::map<char, int>) mtype; (mtype m, m['a'] = 1);`.]
+] [
+[__class_name__[#class_name_anchor]]
+[The class name: `myclass`. For class templates this must not include the template instantiation parameters: `vector`. (For non-template classes, the class type and name are the same.)]
+[Never the case.]
+] [
+[__class_type__[#class_type_anchor]]
+[The class type, for class templates this must include the template instantiation parameters: `vector<T>`.]
+[Wrap type within parenthesis: `(map<Key, T>)`.]
+] [
+[__constant_boolean_expression__[#constant_boolean_expression_anchor]]
+[A compile-time constant boolean expression: `sizeof(T) >= sizeof(int)`.]
+[Wrap value within parenthesis: `(boost::is_convertible<T, int>::value)`.]
+] [
+[__constant_string_literal__[#constant_string_literal_anchor]]
+[A compile-time constant string literal: `"abc"`.]
+[Do nothing: `"abc"`.]
+] [
+[__exception_type__[#exception_type_anchor]]
+[A type: `std::exception`, `int`, `mytype`.]
+[Wrap type within parenthesis: `(map<char, int>::exception)`.]
+] [
+[__function_identifier__[#function_identifier_anchor]]
+[A valid function name identifier (C++ requires it to be alphanumeric): `f`, `push_back`, `myfunc`.]
+[Never the case.]
+] [
+[__inscope_variable__[#inscope_variable_anchor]]
+[A variable in-scope.]
+[Never the case.]
+] [
+[__loop_declaration__[#loop_declaration_anchor]]
+[A loop declaration: `for(int i = 0; i < 10; ++i)`, `while(i < 10)`.]
+[Never the case.]
+] [
+[__member_initializer__[#member_initializer_anchor]]
+[A member initialization expression: `vector_(count)`.]
+[Wrap object initializations within parenthesis: `(base_map<char, int>())`.]
+] [
+[__named_argument_identifier_name__[#named_argument_identifier_anchor]]
+[The argument name to use at the calling site to pass named and deduced parameter values: `value_arg`, `NumberArg`.]
+[Never the case.]
+] [
+[__named_parameter_identifier_namespace__[#named_parameter_identifier_namespace_anchor]]
+[The internal namespace for named and deduced parameter identifiers: `params`.]
+[Never the case.]
+] [
+[__namespace_alias__[#namespace_alias_anchor]]
+[The argument to pass to namespace aliasing: `mpl = boost::mpl`.]
+[Never the case.]
+] [
+[__natural_expression__[#natural_expression_anchor]]
+[A natural (i.e., non-negative integral) expression: `2 - 1`.]
+[Wrap value within parenthesis: `(key_sizeof<Key, T>::value)`.]
+] [
+[__natural_expression_using_inscope_variables__[#natural_expression_using_inscope_variables_anchor]]
+[A natural (i.e., non-negative integral) expression that only uses in-scope variables captured as constant by a constant-expression: `x + 10`.]
+[Wrap value within parenthesis: `(key_sizeof<Key, T>::value + x)`.]
+] [
+[__new_type_name__[#new_type_name_anchor]]
+[A new type name for `typedef` statement: `myint`.]
+[Never the case.]
+] [
+[__oldof_expression__[#oldof_expression_anchor]]
+[A expression of type __ConstantCopyConstructible__ to pass to the [macroref CONTRACT_OLDOF] macro: `value`, `size()`.]
+[Wrap value within parenthesis: `(x, y)`.]
+] [
+[__operator_identifier__[#operator_identifier_anchor]]
+[An arbitrary but alphanumeric identifier: `equal`, `less`, `call`.]
+[Never the case.]
+] [
+[__operator_symbol__[#operator_symbol_anchor]]
+[The usual operator symbols: `==`, `<=`, `()`.]
+[Do nothing: `std::map<char, int>`.]
+] [
+[__parameter_default__[#parameter_default_anchor]]
+[A function or template parameter default value (either a value, a type, or a template depending on the kind of parameter): `123`.]
+[Wrap value within parenthesis: `("abc")`, `('a')`, `(-123)`, `(1.23)`.]
+] [
+[__parameter_name__[#parameter_name_anchor]]
+[A function or template parameter name: `value`, `T`.]
+[Never the case.]
+] [
+[__template_parameter__[#template_parameter_anchor]]
+[A usual C++ type template parameter, value template parameter, or template template parameter): `typename T`, `class U`, `int Number`, `T Value`, `template< typename X, class Y > class Template`.]
+[Do nothing: `std::map<Key, T> Default`, `template< typename X, class Y > class Template`.]
+] [
+[__template_specialization__[#template_specialization_anchor]]
+[A template specialization argument (type, value, etc) that follow the class name in the declaration to specialize a template: `void (int, T)`.]
+[Wrap types within parenthesis: `(std::map<char, int>)`.]
+] [
+[__type__[#type_anchor]]
+[A type: `int`, `int const&`, `mytype`.]
+[Do nothing: `std::map<char, int>`.]
+] [
+[__typedef_type__[#typedef_type_anchor]]
+[A type: `int`, `mytype`.]
+[Wrap type using __Boost_Utility_IdentityType__: `BOOST_IDENTITY_TYPE((std::map<char, int>))`.]
+] [
+[__unary_boolean_metafunction__[#unary_boolean_metafunction_anchor]]
+[A boolean meta-function that takes one parameter: `boost::is_class<boost::mpl::_>`.]
+[Do nothing: `boost:is_convertible<boost::mpl::_, int>`.]
+] [
+[__using_directive__[#using_directive_anchor]]
+[The argument to pass to a using directive: `namespace std`, `std::vector`.]
+[Never the case.]
+] [
+[__variable_name__[#variable_name_anchor]]
+[A valid name to use to declare a variable: `result`, `old_size`.]
+[Never the case.]
+]
+]
+
+If terminals contain commas not already wrapped by round parenthesis or if they start with a non-alphanumeric symbol (including tokens like `'a'`, `"abc"`, `-123`, and `1.23`),
+[footnote
+The C++ preprocessor cannot concatenate `1.23` because it contains the `.` symbol (even if that symbol is technically not the leading symbol).
+The precise preprocessor requirement is that the concatenated symbol must be a valid macro identifier and concatenating `1.23` with any token will never give a valid macro identifier because of the presence of the dot symbol `.` (e.g., `BOOST_PP_CAT(XYZ, 1.23)` gives `XYZ1.23` which is not a valid macro identifier).
+]
+they need to be wrapped by extra round parenthesis `(...)` or by the __Boost_Utility_IdentityType__ `BOOST_IDENTITY_TYPE((...))` macro.
+Value expressions can always be wrapped within extra around parenthesis in C++.
+Type expressions can always be wrapped using __Boost_Utility_IdentityType__ but that will make the syntax less readable (and it prevents C++ from automatically deducing function template parameters) so this syntax allows to wrap type expressions within extra round parenthesis `(...)` for most terminals, including types, as indicated by the table above.
+
+[endsect]
+
+[section Alternative Assertion Syntax (Not Implemented)]
+
+The following alternative syntax could have been implemented to program the contract assertions:
+
+[table
+[ [This Library Syntax] [Alternative Syntax (not implemented)] ]
+[ [``
+CONTRACT_CLASS(
+ template( typename T )
+ class (vector)
+) {
+ ...
+
+ CONTRACT_FUNCTION_TPL(
+ public (iterator) (erase) ( (iterator) where )
+ precondition(
+ not empty(),
+ where != end(),
+ static_assert(sizeof(T) >= sizeof(int), "large enough")
+ )
+ postcondition(
+ auto result = return,
+ auto old_size = CONTRACT_OLDOF size(),
+ size() == old_size - 1,
+ if(const( this ) this->empty()) (
+ result == end()
+ )
+ )
+ ) {
+ return vector_.erase(where);
+ }
+};
+`` ] [``
+CONTRACT_CLASS(
+ template( typename T )
+ class (vector)
+) {
+ ...
+
+ CONTRACT_FUNCTION_TPL(
+ public (iterator) (erase) ( (iterator) where )
+ precondition(
+ assert(not empty())
+ assert(where != end())
+ static_assert(sizeof(T) >= sizeof(int), "large enough")
+ )
+ postcondition(
+ decl(auto result = return)
+ decl(auto old_size = CONTRACT_OLDOF size())
+ assert(size() == old_size - 1)
+ if(const(this, this->empty())) (
+ assert(result == end())
+ )
+ )
+ ) {
+ return vector_.erase(where);
+ }
+};
+``] ]
+]
+
+An advantage of this alternative syntax is that it does not require commas at the end of each assertion.
+However, when compared with this library syntax, the alternative syntax is overall more verbose, it uses more parenthesis, it deviates more from __N1962__ and __Eiffel__ (even if it is more similar to __D__), and it looks less readable at least because of `decl(...)` (in many ways this alternative syntax is equivalent to the already supported sequencing syntax from the __No_Variadic_Macros__ section with the addition of ["decoration identifiers] like `assert` which might make the code more readable but are not needed syntactically).
+Therefore, the authors opted for implementing the syntax on the left hand side.
+
+[endsect]
+
+[endsect]
+
Added: sandbox/contract/doc/html/CONTRACT_BLOCK_INVARIANT.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_BLOCK_INVARIANT.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,68 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_BLOCK_INVARIANT</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.block_invariant_hpp" title="Header <contract/block_invariant.hpp>">
+<link rel="prev" href="reference.html" title="Reference">
+<link rel="next" href="CONTRACT_BLOCK_INVARIANT_TPL.html" title="Macro CONTRACT_BLOCK_INVARIANT_TPL">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="reference.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.block_invariant_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_BLOCK_INVARIANT_TPL.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_BLOCK_INVARIANT"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_BLOCK_INVARIANT</span></h2>
+<p>CONTRACT_BLOCK_INVARIANT — Macro used to specify block invariants. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.block_invariant_hpp" title="Header <contract/block_invariant.hpp>">contract/block_invariant.hpp</a>>
+
+</span>CONTRACT_BLOCK_INVARIANT(assertions)</pre></div>
+<div class="refsect1">
+<a name="id1095444"></a><h2>Description</h2>
+<p>This macro can appear at any point in a code block within a function definition and it is used to assert correctness condition of the implementation (similarly to C++ <code class="computeroutput">assert</code>).</p>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody><tr>
+<td><span class="bold"><strong><code class="computeroutput">assertions</code></strong></span></td>
+<td>The syntax for the assertions is explained in the <a class="link" href="contract__/grammar.html" title="Grammar"> Grammar</a> section. Static assertions, constant assertions, and select assertions can be used. </td>
+</tr></tbody>
+</table></div>
+<p>
+</p>
+<p>Within a type-dependent scope (e.g., within templates), <code class="computeroutput"><a class="link" href="CONTRACT_BLOCK_INVARIANT_TPL.html" title="Macro CONTRACT_BLOCK_INVARIANT_TPL">CONTRACT_BLOCK_INVARIANT_TPL</a></code> must be used instead of this macro.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/advanced_topics.html" title="Advanced Topics"> Advanced Topics</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="reference.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.block_invariant_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_BLOCK_INVARIANT_TPL.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_BLOCK_INVARIANT_TPL.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_BLOCK_INVARIANT_TPL.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,54 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_BLOCK_INVARIANT_TPL</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.block_invariant_hpp" title="Header <contract/block_invariant.hpp>">
+<link rel="prev" href="CONTRACT_BLOCK_INVARIANT.html" title="Macro CONTRACT_BLOCK_INVARIANT">
+<link rel="next" href="CONTRACT_FREE_BODY.html" title="Macro CONTRACT_FREE_BODY">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_BLOCK_INVARIANT.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.block_invariant_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_FREE_BODY.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_BLOCK_INVARIANT_TPL"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_BLOCK_INVARIANT_TPL</span></h2>
+<p>CONTRACT_BLOCK_INVARIANT_TPL — Macro used to specify block invariants within a type-dependent scope (e.g., within templates). </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.block_invariant_hpp" title="Header <contract/block_invariant.hpp>">contract/block_invariant.hpp</a>>
+
+</span>CONTRACT_BLOCK_INVARIANT_TPL(assertions)</pre></div>
+<div class="refsect1">
+<a name="id1095534"></a><h2>Description</h2>
+<p>This macro is the exact same as <code class="computeroutput"><a class="link" href="CONTRACT_BLOCK_INVARIANT.html" title="Macro CONTRACT_BLOCK_INVARIANT">CONTRACT_BLOCK_INVARIANT</a></code> but is must be used when specifying block invariants within a type-dependent scope.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/advanced_topics.html" title="Advanced Topics"> Advanced Topics</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_BLOCK_INVARIANT.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.block_invariant_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_FREE_BODY.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_CLASS.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_CLASS.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,69 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_CLASS</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.class_hpp" title="Header <contract/class.hpp>">
+<link rel="prev" href="contract/loop_variant_broken.html" title="Function loop_variant_broken">
+<link rel="next" href="CONTRACT_CLASS_TPL.html" title="Macro CONTRACT_CLASS_TPL">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="contract/loop_variant_broken.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.class_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CLASS_TPL.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_CLASS"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_CLASS</span></h2>
+<p>CONTRACT_CLASS — Macro used to declare classes with contracts. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.class_hpp" title="Header <contract/class.hpp>">contract/class.hpp</a>>
+
+</span>CONTRACT_CLASS(class_declaration)</pre></div>
+<div class="refsect1">
+<a name="id1098881"></a><h2>Description</h2>
+<p>This macro is used to declare a class with class invariants and member functions with preconditions and postconditions. A class declared with this macro must always specify (possibly empty) class invariants using the <code class="computeroutput"><a class="link" href="CONTRACT_CLASS_INVARIANT.html" title="Macro CONTRACT_CLASS_INVARIANT">CONTRACT_CLASS_INVARIANT</a></code> macro.</p>
+<p>Constructors, destructors, and member functions with contracts are declared using the <code class="computeroutput"><a class="link" href="CONTRACT_CONSTRUCTOR.html" title="Macro CONTRACT_CONSTRUCTOR">CONTRACT_CONSTRUCTOR</a></code>, <code class="computeroutput"><a class="link" href="CONTRACT_DESTRUCTOR.html" title="Macro CONTRACT_DESTRUCTOR">CONTRACT_DESTRUCTOR</a></code>, and <code class="computeroutput"><a class="link" href="CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code> macros respectively. The semantics of calls to constructors, destructors, and member functions with contracts are explained in the <a class="link" href="contract__/contract_programming_overview.html" title="Contract Programming Overview"> Contract Programming Overview</a> section.</p>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody><tr>
+<td><span class="bold"><strong><code class="computeroutput">class_declaration</code></strong></span></td>
+<td>The class declaration syntax is explained in the <a class="link" href="contract__/grammar.html" title="Grammar"> Grammar</a> section. If present, base classes must be specified using <code class="computeroutput">extends( ... )</code>. </td>
+</tr></tbody>
+</table></div>
+<p>
+</p>
+<p>Nested classes with contracts are also declared using this macro but they must always repeat their access level <code class="computeroutput">public</code>, <code class="computeroutput">protected</code>, or <code class="computeroutput">private</code>. Within a type-dependent scope, nested classes with contracts must be declared using the <code class="computeroutput"><a class="link" href="CONTRACT_CLASS_TPL.html" title="Macro CONTRACT_CLASS_TPL">CONTRACT_CLASS_TPL</a></code> macro.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/tutorial.html" title="Tutorial"> Tutorial</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="contract/loop_variant_broken.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.class_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CLASS_TPL.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_CLASS_INVARIANT.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_CLASS_INVARIANT.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,69 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_CLASS_INVARIANT</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.class_invariant_hpp" title="Header <contract/class_invariant.hpp>">
+<link rel="prev" href="CONTRACT_CLASS_TPL.html" title="Macro CONTRACT_CLASS_TPL">
+<link rel="next" href="CONTRACT_CLASS_INVARIANT_TPL.html" title="Macro CONTRACT_CLASS_INVARIANT_TPL">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CLASS_TPL.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.class_invariant_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CLASS_INVARIANT_TPL.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_CLASS_INVARIANT"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_CLASS_INVARIANT</span></h2>
+<p>CONTRACT_CLASS_INVARIANT — Macro used to specify class invariants. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.class_invariant_hpp" title="Header <contract/class_invariant.hpp>">contract/class_invariant.hpp</a>>
+
+</span>CONTRACT_CLASS_INVARIANT(class_invariants)</pre></div>
+<div class="refsect1">
+<a name="id1099103"></a><h2>Description</h2>
+<p>This macro must be used to specify class invariant at the very beginning of the definition of a class with contracts declared using the <code class="computeroutput"><a class="link" href="CONTRACT_CLASS.html" title="Macro CONTRACT_CLASS">CONTRACT_CLASS</a></code> macro (no other statement can appear before this macro in the class definition, not even a <code class="computeroutput">typedef</code> or a <code class="computeroutput">friend</code> declaration).</p>
+<p>Constructors, destructors, and member functions with contracts are declared using the <code class="computeroutput"><a class="link" href="CONTRACT_CONSTRUCTOR.html" title="Macro CONTRACT_CONSTRUCTOR">CONTRACT_CONSTRUCTOR</a></code>, <code class="computeroutput"><a class="link" href="CONTRACT_DESTRUCTOR.html" title="Macro CONTRACT_DESTRUCTOR">CONTRACT_DESTRUCTOR</a></code>, and <code class="computeroutput"><a class="link" href="CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code> macros respectively. The semantics of calls to constructors, destructors, and member functions of a class with contracts are explained in the <a class="link" href="contract__/contract_programming_overview.html" title="Contract Programming Overview"> Contract Programming Overview</a> section.</p>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody><tr>
+<td><span class="bold"><strong><code class="computeroutput">class_invariants</code></strong></span></td>
+<td>The syntax for class invariants is explained in the <a class="link" href="contract__/grammar.html" title="Grammar"> Grammar</a> section. Use <code class="computeroutput">void</code> to specify empty class invariant. </td>
+</tr></tbody>
+</table></div>
+<p>
+</p>
+<p>Within a type-dependent scope (e.g., within templates), the <code class="computeroutput"><a class="link" href="CONTRACT_CLASS_INVARIANT_TPL.html" title="Macro CONTRACT_CLASS_INVARIANT_TPL">CONTRACT_CLASS_INVARIANT_TPL</a></code> macro must be used instead of this macro.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/tutorial.html" title="Tutorial"> Tutorial</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CLASS_TPL.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.class_invariant_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CLASS_INVARIANT_TPL.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_CLASS_INVARIANT_TPL.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_CLASS_INVARIANT_TPL.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,54 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_CLASS_INVARIANT_TPL</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.class_invariant_hpp" title="Header <contract/class_invariant.hpp>">
+<link rel="prev" href="CONTRACT_CLASS_INVARIANT.html" title="Macro CONTRACT_CLASS_INVARIANT">
+<link rel="next" href="CONTRACT_CONFIG_NO_PRECONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_PRECONDITIONS">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CLASS_INVARIANT.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.class_invariant_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONFIG_NO_PRECONDITIONS.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_CLASS_INVARIANT_TPL"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_CLASS_INVARIANT_TPL</span></h2>
+<p>CONTRACT_CLASS_INVARIANT_TPL — Macro used to specify class invariants within a type-dependent scope (e.g., within templates). </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.class_invariant_hpp" title="Header <contract/class_invariant.hpp>">contract/class_invariant.hpp</a>>
+
+</span>CONTRACT_CLASS_INVARIANT_TPL(class_invariants)</pre></div>
+<div class="refsect1">
+<a name="id1099239"></a><h2>Description</h2>
+<p>This macro is the exact same as <code class="computeroutput"><a class="link" href="CONTRACT_CLASS_INVARIANT.html" title="Macro CONTRACT_CLASS_INVARIANT">CONTRACT_CLASS_INVARIANT</a></code> but it must be used when specifying class invariants within a type-dependent scope.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/tutorial.html" title="Tutorial"> Tutorial</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CLASS_INVARIANT.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.class_invariant_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONFIG_NO_PRECONDITIONS.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_CLASS_TPL.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_CLASS_TPL.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,54 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_CLASS_TPL</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.class_hpp" title="Header <contract/class.hpp>">
+<link rel="prev" href="CONTRACT_CLASS.html" title="Macro CONTRACT_CLASS">
+<link rel="next" href="CONTRACT_CLASS_INVARIANT.html" title="Macro CONTRACT_CLASS_INVARIANT">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CLASS.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.class_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CLASS_INVARIANT.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_CLASS_TPL"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_CLASS_TPL</span></h2>
+<p>CONTRACT_CLASS_TPL — Macro used to declare nested classes with contracts within a type-dependent scope (e.g., within templates). </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.class_hpp" title="Header <contract/class.hpp>">contract/class.hpp</a>>
+
+</span>CONTRACT_CLASS_TPL(class_declaration)</pre></div>
+<div class="refsect1">
+<a name="id1099022"></a><h2>Description</h2>
+<p>This macro is the exact same as <code class="computeroutput"><a class="link" href="CONTRACT_CLASS.html" title="Macro CONTRACT_CLASS">CONTRACT_CLASS</a></code> but it must be used when declaring nested classes with contracts within a type-dependent scope.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/tutorial.html" title="Tutorial"> Tutorial</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CLASS.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.class_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CLASS_INVARIANT.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_CONFIG_ARRAY_DIMENSION_MAX.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_CONFIG_ARRAY_DIMENSION_MAX.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,54 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_CONFIG_ARRAY_DIMENSION_MAX</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.config_hpp" title="Header <contract/config.hpp>">
+<link rel="prev" href="CONTRACT_CONFIG_OLDOF_MAX.html" title="Macro CONTRACT_CONFIG_OLDOF_MAX">
+<link rel="next" href="CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS.html" title="Macro CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONFIG_OLDOF_MAX.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.config_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_CONFIG_ARRAY_DIMENSION_MAX"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_CONFIG_ARRAY_DIMENSION_MAX</span></h2>
+<p>CONTRACT_CONFIG_ARRAY_DIMENSION_MAX — Specify the maximum supported array dimension for multi-dimensional arrays. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.config_hpp" title="Header <contract/config.hpp>">contract/config.hpp</a>>
+
+</span>CONTRACT_CONFIG_ARRAY_DIMENSION_MAX</pre></div>
+<div class="refsect1">
+<a name="id1099957"></a><h2>Description</h2>
+<p>This macro automatically defaults to <code class="computeroutput">3</code> if left undefined by programmers (therefore, by default up to 3-dimensional arrays <code class="computeroutput">x[]</code>, <code class="computeroutput">x[][]</code>, and <code class="computeroutput">x[][][]</code> can be passed to functions declared using this library, but always using an extra <code class="computeroutput">typedef</code> as specified by the <a class="link" href="contract__/tutorial.html" title="Tutorial"> Tutorial</a> section). This macro must be a non-negative integral number. Increasing the value specified by this macro might increase compilation time.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/tutorial.html" title="Tutorial"> Tutorial</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONFIG_OLDOF_MAX.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.config_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,55 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.config_hpp" title="Header <contract/config.hpp>">
+<link rel="prev" href="CONTRACT_CONFIG_ARRAY_DIMENSION_MAX.html" title="Macro CONTRACT_CONFIG_ARRAY_DIMENSION_MAX">
+<link rel="next" href="CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION.html" title="Macro CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONFIG_ARRAY_DIMENSION_MAX.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.config_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS</span></h2>
+<p>CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS — Do not allow overriding functions to specify preconditions. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.config_hpp" title="Header <contract/config.hpp>">contract/config.hpp</a>>
+
+</span>CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS</pre></div>
+<div class="refsect1">
+<a name="id1100031"></a><h2>Description</h2>
+<p>If programmers define this macro, the library will generate a compile-time error if overriding functions specify preconditions. Therefore, preconditions can only be specified by functions at the very root of the inheritance tree and they cannot be subcontracted (this is as specified by <a class="link" href="contract__/bibliography.html" title="Bibliography"> [N1962]</a>, however note that in case of multiple-inheritance the preconditions of all base functions will still be checked in logic-or with each other effectively still allowing a base class to weaken the preconditions from another base class).</p>
+<p>By default, this library allows to subcontract preconditions.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/advanced_topics.html" title="Advanced Topics"> Advanced Topics</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONFIG_ARRAY_DIMENSION_MAX.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.config_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_CONFIG_FUNCTION_ARITY_MAX.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_CONFIG_FUNCTION_ARITY_MAX.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,54 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_CONFIG_FUNCTION_ARITY_MAX</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.config_hpp" title="Header <contract/config.hpp>">
+<link rel="prev" href="CONTRACT_CONFIG_NO_LOOP_VARIANTS.html" title="Macro CONTRACT_CONFIG_NO_LOOP_VARIANTS">
+<link rel="next" href="CONTRACT_CONFIG_INHERITANCE_MAX.html" title="Macro CONTRACT_CONFIG_INHERITANCE_MAX">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONFIG_NO_LOOP_VARIANTS.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.config_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONFIG_INHERITANCE_MAX.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_CONFIG_FUNCTION_ARITY_MAX"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_CONFIG_FUNCTION_ARITY_MAX</span></h2>
+<p>CONTRACT_CONFIG_FUNCTION_ARITY_MAX — Specify the maximum number of supported function parameters. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.config_hpp" title="Header <contract/config.hpp>">contract/config.hpp</a>>
+
+</span>CONTRACT_CONFIG_FUNCTION_ARITY_MAX</pre></div>
+<div class="refsect1">
+<a name="id1099802"></a><h2>Description</h2>
+<p>This macro automatically defaults to <code class="computeroutput">5</code> if left undefined by programmers. This macro must be a non-negative integral number. Increasing the value specified by this macro might increase compilation time.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/tutorial.html" title="Tutorial"> Tutorial</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONFIG_NO_LOOP_VARIANTS.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.config_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONFIG_INHERITANCE_MAX.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_CONFIG_INHERITANCE_MAX.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_CONFIG_INHERITANCE_MAX.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,54 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_CONFIG_INHERITANCE_MAX</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.config_hpp" title="Header <contract/config.hpp>">
+<link rel="prev" href="CONTRACT_CONFIG_FUNCTION_ARITY_MAX.html" title="Macro CONTRACT_CONFIG_FUNCTION_ARITY_MAX">
+<link rel="next" href="CONTRACT_CONFIG_OLDOF_MAX.html" title="Macro CONTRACT_CONFIG_OLDOF_MAX">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONFIG_FUNCTION_ARITY_MAX.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.config_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONFIG_OLDOF_MAX.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_CONFIG_INHERITANCE_MAX"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_CONFIG_INHERITANCE_MAX</span></h2>
+<p>CONTRACT_CONFIG_INHERITANCE_MAX — Specify the maximum number of base classes supported for multiple-inheritance. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.config_hpp" title="Header <contract/config.hpp>">contract/config.hpp</a>>
+
+</span>CONTRACT_CONFIG_INHERITANCE_MAX</pre></div>
+<div class="refsect1">
+<a name="id1099851"></a><h2>Description</h2>
+<p>This macro automatically defaults to <code class="computeroutput">4</code> if left undefined by programmers. This macro must be a non-negative integral number. Increasing the value specified by this macro might increase compilation time.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/tutorial.html" title="Tutorial"> Tutorial</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONFIG_FUNCTION_ARITY_MAX.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.config_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONFIG_OLDOF_MAX.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_CONFIG_NO_BLOCK_INVARIANTS.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_CONFIG_NO_BLOCK_INVARIANTS.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,55 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_CONFIG_NO_BLOCK_INVARIANTS</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.config_hpp" title="Header <contract/config.hpp>">
+<link rel="prev" href="CONTRACT_CONFIG_NO_CLASS_INVARIANTS.html" title="Macro CONTRACT_CONFIG_NO_CLASS_INVARIANTS">
+<link rel="next" href="CONTRACT_CONFIG_NO_LOOP_VARIANTS.html" title="Macro CONTRACT_CONFIG_NO_LOOP_VARIANTS">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONFIG_NO_CLASS_INVARIANTS.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.config_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONFIG_NO_LOOP_VARIANTS.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_CONFIG_NO_BLOCK_INVARIANTS"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_CONFIG_NO_BLOCK_INVARIANTS</span></h2>
+<p>CONTRACT_CONFIG_NO_BLOCK_INVARIANTS — Disable compilation and run-time checking of all block invariants. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.config_hpp" title="Header <contract/config.hpp>">contract/config.hpp</a>>
+
+</span>CONTRACT_CONFIG_NO_BLOCK_INVARIANTS</pre></div>
+<div class="refsect1">
+<a name="id1099690"></a><h2>Description</h2>
+<p>Block invariants are not checked at run-time and not even compiled when programmers define this macro. This can be used to speed up execution and compilation of debug and release builds at different stages of development and testing as it is common practise in Contract Programming.</p>
+<p><span class="bold"><strong>Note:</strong></span> Assertion requirements can be used to selectively disable single assertions (see the <a class="link" href="contract__/advanced_topics.html" title="Advanced Topics"> Advanced Topics</a> section).</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/getting_started.html" title="Getting Started"> Getting Started</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONFIG_NO_CLASS_INVARIANTS.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.config_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONFIG_NO_LOOP_VARIANTS.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_CONFIG_NO_CLASS_INVARIANTS.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_CONFIG_NO_CLASS_INVARIANTS.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,55 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_CONFIG_NO_CLASS_INVARIANTS</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.config_hpp" title="Header <contract/config.hpp>">
+<link rel="prev" href="CONTRACT_CONFIG_NO_POSTCONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_POSTCONDITIONS">
+<link rel="next" href="CONTRACT_CONFIG_NO_BLOCK_INVARIANTS.html" title="Macro CONTRACT_CONFIG_NO_BLOCK_INVARIANTS">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONFIG_NO_POSTCONDITIONS.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.config_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONFIG_NO_BLOCK_INVARIANTS.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_CONFIG_NO_CLASS_INVARIANTS"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_CONFIG_NO_CLASS_INVARIANTS</span></h2>
+<p>CONTRACT_CONFIG_NO_CLASS_INVARIANTS — Disable compilation and run-time checking of all class invariants. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.config_hpp" title="Header <contract/config.hpp>">contract/config.hpp</a>>
+
+</span>CONTRACT_CONFIG_NO_CLASS_INVARIANTS</pre></div>
+<div class="refsect1">
+<a name="id1099635"></a><h2>Description</h2>
+<p>Class invariants are not checked at run-time and not even compiled when programmers define this macro. This can be used to speed up execution and compilation of debug and release builds at different stages of development and testing as it is common practise in Contract Programming.</p>
+<p><span class="bold"><strong>Note:</strong></span> Assertion requirements can be used to selectively disable single assertions (see the <a class="link" href="contract__/advanced_topics.html" title="Advanced Topics"> Advanced Topics</a> section).</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/getting_started.html" title="Getting Started"> Getting Started</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONFIG_NO_POSTCONDITIONS.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.config_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONFIG_NO_BLOCK_INVARIANTS.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_CONFIG_NO_LOOP_VARIANTS.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_CONFIG_NO_LOOP_VARIANTS.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,55 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_CONFIG_NO_LOOP_VARIANTS</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.config_hpp" title="Header <contract/config.hpp>">
+<link rel="prev" href="CONTRACT_CONFIG_NO_BLOCK_INVARIANTS.html" title="Macro CONTRACT_CONFIG_NO_BLOCK_INVARIANTS">
+<link rel="next" href="CONTRACT_CONFIG_FUNCTION_ARITY_MAX.html" title="Macro CONTRACT_CONFIG_FUNCTION_ARITY_MAX">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONFIG_NO_BLOCK_INVARIANTS.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.config_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONFIG_FUNCTION_ARITY_MAX.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_CONFIG_NO_LOOP_VARIANTS"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_CONFIG_NO_LOOP_VARIANTS</span></h2>
+<p>CONTRACT_CONFIG_NO_LOOP_VARIANTS — Disable compilation and run-time checking of all loop variants. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.config_hpp" title="Header <contract/config.hpp>">contract/config.hpp</a>>
+
+</span>CONTRACT_CONFIG_NO_LOOP_VARIANTS</pre></div>
+<div class="refsect1">
+<a name="id1099746"></a><h2>Description</h2>
+<p>Loop variants are not checked at run-time and not even compiled when programmers define this macro. This can be used to speed up execution and compilation of debug and release builds at different stages of development and testing as it is common practise in Contract Programming.</p>
+<p><span class="bold"><strong>Note:</strong></span> Assertion requirements can be used to selectively disable single assertions (see the <a class="link" href="contract__/advanced_topics.html" title="Advanced Topics"> Advanced Topics</a> section).</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/getting_started.html" title="Getting Started"> Getting Started</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONFIG_NO_BLOCK_INVARIANTS.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.config_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONFIG_FUNCTION_ARITY_MAX.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_CONFIG_NO_POSTCONDITIONS.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_CONFIG_NO_POSTCONDITIONS.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,55 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_CONFIG_NO_POSTCONDITIONS</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.config_hpp" title="Header <contract/config.hpp>">
+<link rel="prev" href="CONTRACT_CONFIG_NO_PRECONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_PRECONDITIONS">
+<link rel="next" href="CONTRACT_CONFIG_NO_CLASS_INVARIANTS.html" title="Macro CONTRACT_CONFIG_NO_CLASS_INVARIANTS">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONFIG_NO_PRECONDITIONS.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.config_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONFIG_NO_CLASS_INVARIANTS.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_CONFIG_NO_POSTCONDITIONS"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_CONFIG_NO_POSTCONDITIONS</span></h2>
+<p>CONTRACT_CONFIG_NO_POSTCONDITIONS — Disable compilation and run-time checking of all postconditions. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.config_hpp" title="Header <contract/config.hpp>">contract/config.hpp</a>>
+
+</span>CONTRACT_CONFIG_NO_POSTCONDITIONS</pre></div>
+<div class="refsect1">
+<a name="id1099580"></a><h2>Description</h2>
+<p>Postconditions are not checked at run-time and not even compiled when programmers define this macro. This can be used to speed up execution and compilation of debug and release builds at different stages of development and testing as it is common practise in Contract Programming.</p>
+<p><span class="bold"><strong>Note:</strong></span> Assertion requirements can be used to selectively disable single assertions (see the <a class="link" href="contract__/advanced_topics.html" title="Advanced Topics"> Advanced Topics</a> section).</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/getting_started.html" title="Getting Started"> Getting Started</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONFIG_NO_PRECONDITIONS.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.config_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONFIG_NO_CLASS_INVARIANTS.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_CONFIG_NO_PRECONDITIONS.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_CONFIG_NO_PRECONDITIONS.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,55 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_CONFIG_NO_PRECONDITIONS</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.config_hpp" title="Header <contract/config.hpp>">
+<link rel="prev" href="CONTRACT_CLASS_INVARIANT_TPL.html" title="Macro CONTRACT_CLASS_INVARIANT_TPL">
+<link rel="next" href="CONTRACT_CONFIG_NO_POSTCONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_POSTCONDITIONS">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CLASS_INVARIANT_TPL.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.config_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONFIG_NO_POSTCONDITIONS.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_CONFIG_NO_PRECONDITIONS"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_CONFIG_NO_PRECONDITIONS</span></h2>
+<p>CONTRACT_CONFIG_NO_PRECONDITIONS — Disable compilation and run-time checking of all preconditions. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.config_hpp" title="Header <contract/config.hpp>">contract/config.hpp</a>>
+
+</span>CONTRACT_CONFIG_NO_PRECONDITIONS</pre></div>
+<div class="refsect1">
+<a name="id1099418"></a><h2>Description</h2>
+<p>Preconditions are not checked at run-time and not even compiled when programmers define this macro. This can be used to speed up execution and compilation of debug and release builds at different stages of development and testing as it is common practise in Contract Programming.</p>
+<p><span class="bold"><strong>Note:</strong></span> Assertion requirements can be used to selectively disable single assertions (see the <a class="link" href="contract__/advanced_topics.html" title="Advanced Topics"> Advanced Topics</a> section).</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/getting_started.html" title="Getting Started"> Getting Started</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CLASS_INVARIANT_TPL.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.config_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONFIG_NO_POSTCONDITIONS.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_CONFIG_OLDOF_MAX.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_CONFIG_OLDOF_MAX.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,54 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_CONFIG_OLDOF_MAX</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.config_hpp" title="Header <contract/config.hpp>">
+<link rel="prev" href="CONTRACT_CONFIG_INHERITANCE_MAX.html" title="Macro CONTRACT_CONFIG_INHERITANCE_MAX">
+<link rel="next" href="CONTRACT_CONFIG_ARRAY_DIMENSION_MAX.html" title="Macro CONTRACT_CONFIG_ARRAY_DIMENSION_MAX">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONFIG_INHERITANCE_MAX.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.config_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONFIG_ARRAY_DIMENSION_MAX.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_CONFIG_OLDOF_MAX"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_CONFIG_OLDOF_MAX</span></h2>
+<p>CONTRACT_CONFIG_OLDOF_MAX — Specify the maximum number of supported old value declarations in postconditions. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.config_hpp" title="Header <contract/config.hpp>">contract/config.hpp</a>>
+
+</span>CONTRACT_CONFIG_OLDOF_MAX</pre></div>
+<div class="refsect1">
+<a name="id1099900"></a><h2>Description</h2>
+<p>This macro automatically defaults to <code class="computeroutput">5</code> if left undefined by programmers. This macro must be a non-negative integral number smaller or equal to <code class="computeroutput"><a class="link" href="CONTRACT_LIMIT_OLDOFS.html" title="Macro CONTRACT_LIMIT_OLDOFS">CONTRACT_LIMIT_OLDOFS</a></code>. Increasing the value specified by this macro might increase compilation time.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/tutorial.html" title="Tutorial"> Tutorial</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONFIG_INHERITANCE_MAX.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.config_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONFIG_ARRAY_DIMENSION_MAX.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,55 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.config_hpp" title="Header <contract/config.hpp>">
+<link rel="prev" href="CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS.html" title="Macro CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS">
+<link rel="next" href="CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE.html" title="Macro CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.config_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION</span></h2>
+<p>CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION — Specify that no assertion should be disabled while checking preconditions. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.config_hpp" title="Header <contract/config.hpp>">contract/config.hpp</a>>
+
+</span>CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION</pre></div>
+<div class="refsect1">
+<a name="id1100085"></a><h2>Description</h2>
+<p>Assertion checking is disabled within assertions in order to avoid infinite recursion and that is a standard requirement of Contract Programming. However, if programmers define this macro then no assertion checking is disabled within preconditions (this is as specified by <a class="link" href="contract__/bibliography.html" title="Bibliography"> [N1962]</a>). Assertion checking within assertion checking will still be disabled for postconditions, class invariants, etc.</p>
+<p>By default, this library disables assertion checking within assertions for all contracts, including preconditions.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/contract_programming_overview.html" title="Contract Programming Overview"> Contract Programming Overview</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.config_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,54 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.config_hpp" title="Header <contract/config.hpp>">
+<link rel="prev" href="CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION.html" title="Macro CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION">
+<link rel="next" href="CONTRACT_CONFIG_THREAD_SAFE.html" title="Macro CONTRACT_CONFIG_THREAD_SAFE">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.config_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONFIG_THREAD_SAFE.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE</span></h2>
+<p>CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE — Report precondition that failed in the overridden function (instead of the precondition failed in the overriding function). </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.config_hpp" title="Header <contract/config.hpp>">contract/config.hpp</a>>
+
+</span>CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE</pre></div>
+<div class="refsect1">
+<a name="id1100137"></a><h2>Description</h2>
+<p>Subcontracted preconditions fail only when the preconditions of the overriding function fail together with the overridden preconditions from all the base classes. By default the assertion that failed in the overriding function is reported. If programmes define this macro then the library will instead the report the assertion that failed in the overridden function from within one of the base classes.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/advanced_topics.html" title="Advanced Topics"> Advanced Topics</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.config_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONFIG_THREAD_SAFE.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_CONFIG_THREAD_SAFE.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_CONFIG_THREAD_SAFE.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,54 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_CONFIG_THREAD_SAFE</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.config_hpp" title="Header <contract/config.hpp>">
+<link rel="prev" href="CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE.html" title="Macro CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE">
+<link rel="next" href="CONTRACT_CONSTRUCTOR.html" title="Macro CONTRACT_CONSTRUCTOR">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.config_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONSTRUCTOR.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_CONFIG_THREAD_SAFE"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_CONFIG_THREAD_SAFE</span></h2>
+<p>CONTRACT_CONFIG_THREAD_SAFE — Make the implementation of this library thread-safe. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.config_hpp" title="Header <contract/config.hpp>">contract/config.hpp</a>>
+
+</span>CONTRACT_CONFIG_THREAD_SAFE</pre></div>
+<div class="refsect1">
+<a name="id1100181"></a><h2>Description</h2>
+<p>In order to globally disable assertion checking within assertions, this library internally has to use a global variable. If programmers defined this macro, such a variable will be automatically locked to avoid race conditions (this effectively introduces a global lock in the program).</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/contract_programming_overview.html" title="Contract Programming Overview"> Contract Programming Overview</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.config_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONSTRUCTOR.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_CONSTRUCTOR.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_CONSTRUCTOR.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,71 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_CONSTRUCTOR</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.constructor_hpp" title="Header <contract/constructor.hpp>">
+<link rel="prev" href="CONTRACT_CONFIG_THREAD_SAFE.html" title="Macro CONTRACT_CONFIG_THREAD_SAFE">
+<link rel="next" href="CONTRACT_CONSTRUCTOR_TPL.html" title="Macro CONTRACT_CONSTRUCTOR_TPL">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONFIG_THREAD_SAFE.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.constructor_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONSTRUCTOR_TPL.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_CONSTRUCTOR"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_CONSTRUCTOR</span></h2>
+<p>CONTRACT_CONSTRUCTOR — Macro used to declare constructors with contracts. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.constructor_hpp" title="Header <contract/constructor.hpp>">contract/constructor.hpp</a>>
+
+</span>CONTRACT_CONSTRUCTOR(function_declaration)</pre></div>
+<div class="refsect1">
+<a name="id1100256"></a><h2>Description</h2>
+<p>This macro is used to declare a constructor with possible preconditions and postconditions. At least all public constructors of a class with non-empty class invariants should be declared using this macro so to check the class invariants (even if the constructors have no precondition and no postcondition).</p>
+<p>The semantics of a call to a constructor with contracts are explained in the <a class="link" href="contract__/contract_programming_overview.html" title="Contract Programming Overview"> Contract Programming Overview</a> section. Destructors and member functions are declared using the <code class="computeroutput"><a class="link" href="CONTRACT_DESTRUCTOR.html" title="Macro CONTRACT_DESTRUCTOR">CONTRACT_DESTRUCTOR</a></code> and <code class="computeroutput"><a class="link" href="CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code> macros respectively.</p>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody><tr>
+<td><span class="bold"><strong><code class="computeroutput">function_declaration</code></strong></span></td>
+<td>The constructor declaration syntax is explained in the <a class="link" href="contract__/grammar.html" title="Grammar"> Grammar</a> section. Constructors must always repeat their access level <code class="computeroutput">public</code>, <code class="computeroutput">protected</code>, or <code class="computeroutput">private</code>. If present, member initializers must be specified using <code class="computeroutput">initialize( ... )</code> and within this macro (even if they are technically part of the constructor definition and not of its declaration). </td>
+</tr></tbody>
+</table></div>
+<p>
+</p>
+<p>The <code class="computeroutput"><a class="link" href="CONTRACT_CLASS.html" title="Macro CONTRACT_CLASS">CONTRACT_CLASS</a></code> macro must be used to declare the class enclosing a constructor declared using this macro.</p>
+<p>Within a type-dependent scope (e.g., within templates), the <code class="computeroutput"><a class="link" href="CONTRACT_CONSTRUCTOR_TPL.html" title="Macro CONTRACT_CONSTRUCTOR_TPL">CONTRACT_CONSTRUCTOR_TPL</a></code> macro must be used instead of this macro.</p>
+<p>The <code class="computeroutput"><a class="link" href="CONTRACT_CONSTRUCTOR_BODY.html" title="Macro CONTRACT_CONSTRUCTOR_BODY">CONTRACT_CONSTRUCTOR_BODY</a></code> macro must be used when separating the constructor body definition form the constructor declaration programmed using this macro. Unfortunately, it is not possible to use this macro so separate body definitions for constructors that have member initializers.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/tutorial.html" title="Tutorial"> Tutorial</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONFIG_THREAD_SAFE.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.constructor_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONSTRUCTOR_TPL.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_CONSTRUCTOR_ARG.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_CONSTRUCTOR_ARG.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,67 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_CONSTRUCTOR_ARG</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.parameter_hpp" title="Header <contract/parameter.hpp>">
+<link rel="prev" href="CONTRACT_OLDOF.html" title="Macro CONTRACT_OLDOF">
+<link rel="next" href="CONTRACT_PARAMETER_TYPEOF.html" title="Macro CONTRACT_PARAMETER_TYPEOF">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_OLDOF.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.parameter_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_PARAMETER_TYPEOF.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_CONSTRUCTOR_ARG"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_CONSTRUCTOR_ARG</span></h2>
+<p>CONTRACT_CONSTRUCTOR_ARG — Macro used to access constructor named or deduced arguments within member initializers. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.parameter_hpp" title="Header <contract/parameter.hpp>">contract/parameter.hpp</a>>
+
+</span>CONTRACT_CONSTRUCTOR_ARG(parameter_name)</pre></div>
+<div class="refsect1">
+<a name="id1103426"></a><h2>Description</h2>
+<p>This macro must be used to access the constructor arguments within the member initializers. Outside of the member initializers, the parameter names are used directly as usual and without using this macro.</p>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody><tr>
+<td><span class="bold"><strong><code class="computeroutput">parameter_name</code></strong></span></td>
+<td>The name of a constructor named or deduced parameter previously declared using the <code class="computeroutput"><a class="link" href="CONTRACT_PARAMETER.html" title="Macro CONTRACT_PARAMETER">CONTRACT_PARAMETER</a></code> macro. </td>
+</tr></tbody>
+</table></div>
+<p>
+</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/named_parameters.html" title="Named Parameters"> Named Parameters</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_OLDOF.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.parameter_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_PARAMETER_TYPEOF.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_CONSTRUCTOR_BODY.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_CONSTRUCTOR_BODY.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,74 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_CONSTRUCTOR_BODY</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.body_hpp" title="Header <contract/body.hpp>">
+<link rel="prev" href="CONTRACT_MEMBER_BODY.html" title="Macro CONTRACT_MEMBER_BODY">
+<link rel="next" href="CONTRACT_DESTRUCTOR_BODY.html" title="Macro CONTRACT_DESTRUCTOR_BODY">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_MEMBER_BODY.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.body_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_DESTRUCTOR_BODY.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_CONSTRUCTOR_BODY"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_CONSTRUCTOR_BODY</span></h2>
+<p>CONTRACT_CONSTRUCTOR_BODY — Macro used to name the body of constructors. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.body_hpp" title="Header <contract/body.hpp>">contract/body.hpp</a>>
+
+</span>CONTRACT_CONSTRUCTOR_BODY(class_type, constructor_name)</pre></div>
+<div class="refsect1">
+<a name="id1095799"></a><h2>Description</h2>
+<p>This macro is used to name the body of constructors when the body is defined separately from the contract declaration. Constructors with contracts are declared using the <code class="computeroutput"><a class="link" href="CONTRACT_CONSTRUCTOR.html" title="Macro CONTRACT_CONSTRUCTOR">CONTRACT_CONSTRUCTOR</a></code> macro.</p>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><span class="bold"><strong><code class="computeroutput">class_type</code></strong></span></td>
+<td>The syntax for the class type is explained in the <a class="link" href="contract__/grammar.html" title="Grammar"> Grammar</a> section (for class templates, this type is qualified with the template parameters). </td>
+</tr>
+<tr>
+<td><span class="bold"><strong><code class="computeroutput">constructor_name</code></strong></span></td>
+<td>This is the class name and its syntax is explained in the <a class="link" href="contract__/grammar.html" title="Grammar"> Grammar</a> section (for class templates, this name is <span class="emphasis"><em>not</em></span> qualified with the template parameters). </td>
+</tr>
+</tbody>
+</table></div>
+<p>
+</p>
+<p><span class="bold"><strong>Warning:</strong></span> The body of constructors with member initializers should always be defined together with the constructor declaration and its contract.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/tutorial.html" title="Tutorial"> Tutorial</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_MEMBER_BODY.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.body_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_DESTRUCTOR_BODY.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_CONSTRUCTOR_TPL.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_CONSTRUCTOR_TPL.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,54 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_CONSTRUCTOR_TPL</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.constructor_hpp" title="Header <contract/constructor.hpp>">
+<link rel="prev" href="CONTRACT_CONSTRUCTOR.html" title="Macro CONTRACT_CONSTRUCTOR">
+<link rel="next" href="contract/copy.html" title="Class template copy">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONSTRUCTOR.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.constructor_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="contract/copy.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_CONSTRUCTOR_TPL"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_CONSTRUCTOR_TPL</span></h2>
+<p>CONTRACT_CONSTRUCTOR_TPL — Macro used to declare constructors with contracts within a type-dependent scope (e.g., within templates). </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.constructor_hpp" title="Header <contract/constructor.hpp>">contract/constructor.hpp</a>>
+
+</span>CONTRACT_CONSTRUCTOR_TPL(function_declaration)</pre></div>
+<div class="refsect1">
+<a name="id1100404"></a><h2>Description</h2>
+<p>This macro is the exact same as <code class="computeroutput"><a class="link" href="CONTRACT_CONSTRUCTOR.html" title="Macro CONTRACT_CONSTRUCTOR">CONTRACT_CONSTRUCTOR</a></code> but it must be used when declaring constructors with contracts within a type-dependent scope.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/tutorial.html" title="Tutorial"> Tutorial</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONSTRUCTOR.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.constructor_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="contract/copy.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_DESTRUCTOR.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_DESTRUCTOR.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,71 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_DESTRUCTOR</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.destructor_hpp" title="Header <contract/destructor.hpp>">
+<link rel="prev" href="contract/copy.html" title="Class template copy">
+<link rel="next" href="CONTRACT_DESTRUCTOR_TPL.html" title="Macro CONTRACT_DESTRUCTOR_TPL">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="contract/copy.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.destructor_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_DESTRUCTOR_TPL.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_DESTRUCTOR"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_DESTRUCTOR</span></h2>
+<p>CONTRACT_DESTRUCTOR — Macro used to declare destructors with contracts. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.destructor_hpp" title="Header <contract/destructor.hpp>">contract/destructor.hpp</a>>
+
+</span>CONTRACT_DESTRUCTOR(function_declaration)</pre></div>
+<div class="refsect1">
+<a name="id1101008"></a><h2>Description</h2>
+<p>This macro is used to declare a destructor. At least the public destructor of a class with non-empty class invariants should be declared using this macro in order to check the class invariants (even if destructors never have preconditions or postconditions).</p>
+<p>The semantics of a call to a destructor with contracts are explained in the <a class="link" href="contract__/contract_programming_overview.html" title="Contract Programming Overview"> Contract Programming Overview</a> section. Constructor and member functions are declared using the <code class="computeroutput"><a class="link" href="CONTRACT_CONSTRUCTOR.html" title="Macro CONTRACT_CONSTRUCTOR">CONTRACT_CONSTRUCTOR</a></code> and <code class="computeroutput"><a class="link" href="CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code> macros respectively.</p>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody><tr>
+<td><span class="bold"><strong><code class="computeroutput">function_declaration</code></strong></span></td>
+<td>The destructor declaration syntax is explained in the <a class="link" href="contract__/grammar.html" title="Grammar"> Grammar</a> section. Destructors must always repeat their access level <code class="computeroutput">public</code>, <code class="computeroutput">protected</code>, or <code class="computeroutput">private</code>. The keyword <code class="computeroutput">void</code> must be used to indicate that the destructor has an empty parameter list. </td>
+</tr></tbody>
+</table></div>
+<p>
+</p>
+<p>The <code class="computeroutput"><a class="link" href="CONTRACT_CLASS.html" title="Macro CONTRACT_CLASS">CONTRACT_CLASS</a></code> macro must be used to declare the class enclosing a destructor declared using this macro.</p>
+<p>Within a type-dependent scope (e.g., within templates), the <code class="computeroutput"><a class="link" href="CONTRACT_DESTRUCTOR_TPL.html" title="Macro CONTRACT_DESTRUCTOR_TPL">CONTRACT_DESTRUCTOR_TPL</a></code> macro must be used instead of this macro.</p>
+<p>The <code class="computeroutput"><a class="link" href="CONTRACT_DESTRUCTOR_BODY.html" title="Macro CONTRACT_DESTRUCTOR_BODY">CONTRACT_DESTRUCTOR_BODY</a></code> macro must be used when separating the destructor body definition from the destruction declaration programmed using this macro.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/tutorial.html" title="Tutorial"> Tutorial</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="contract/copy.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.destructor_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_DESTRUCTOR_TPL.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_DESTRUCTOR_BODY.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_DESTRUCTOR_BODY.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,73 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_DESTRUCTOR_BODY</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.body_hpp" title="Header <contract/body.hpp>">
+<link rel="prev" href="CONTRACT_CONSTRUCTOR_BODY.html" title="Macro CONTRACT_CONSTRUCTOR_BODY">
+<link rel="next" href="contract/broken.html" title="Class broken">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONSTRUCTOR_BODY.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.body_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="contract/broken.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_DESTRUCTOR_BODY"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_DESTRUCTOR_BODY</span></h2>
+<p>CONTRACT_DESTRUCTOR_BODY — Macro used to name the body of destructors. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.body_hpp" title="Header <contract/body.hpp>">contract/body.hpp</a>>
+
+</span>CONTRACT_DESTRUCTOR_BODY(class_type, destructor_name)</pre></div>
+<div class="refsect1">
+<a name="id1095910"></a><h2>Description</h2>
+<p>This macro is used to name the body of destructors when the body is defined separately from the contract declaration. Destructors with contracts are declared using the <code class="computeroutput"><a class="link" href="CONTRACT_DESTRUCTOR.html" title="Macro CONTRACT_DESTRUCTOR">CONTRACT_DESTRUCTOR</a></code> macro.</p>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody>
+<tr>
+<td><span class="bold"><strong><code class="computeroutput">class_type</code></strong></span></td>
+<td>The syntax for the class type is explained in the <a class="link" href="contract__/grammar.html" title="Grammar"> Grammar</a> section (for class templates, this type is qualified with the template parameters). </td>
+</tr>
+<tr>
+<td><span class="bold"><strong><code class="computeroutput">destructor_name</code></strong></span></td>
+<td>This is the class name prefixed by the tilde symbol <code class="computeroutput">~</code> and its syntax is explained in the <a class="link" href="contract__/grammar.html" title="Grammar"> Grammar</a> section (for class templates, this name is <span class="emphasis"><em>not</em></span> qualified with the template parameters). </td>
+</tr>
+</tbody>
+</table></div>
+<p>
+</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/tutorial.html" title="Tutorial"> Tutorial</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONSTRUCTOR_BODY.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.body_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="contract/broken.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_DESTRUCTOR_TPL.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_DESTRUCTOR_TPL.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,54 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_DESTRUCTOR_TPL</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.destructor_hpp" title="Header <contract/destructor.hpp>">
+<link rel="prev" href="CONTRACT_DESTRUCTOR.html" title="Macro CONTRACT_DESTRUCTOR">
+<link rel="next" href="CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_DESTRUCTOR.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.destructor_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_FUNCTION.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_DESTRUCTOR_TPL"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_DESTRUCTOR_TPL</span></h2>
+<p>CONTRACT_DESTRUCTOR_TPL — Macro used to declare destructors with contracts within a type-dependent scope (e.g., within templates). </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.destructor_hpp" title="Header <contract/destructor.hpp>">contract/destructor.hpp</a>>
+
+</span>CONTRACT_DESTRUCTOR_TPL(function_declaration)</pre></div>
+<div class="refsect1">
+<a name="id1101154"></a><h2>Description</h2>
+<p>This macro is the exact same as <code class="computeroutput"><a class="link" href="CONTRACT_DESTRUCTOR.html" title="Macro CONTRACT_DESTRUCTOR">CONTRACT_DESTRUCTOR</a></code> but it must be used when declaring destructors with contracts within a type-dependent scope.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/tutorial.html" title="Tutorial"> Tutorial</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_DESTRUCTOR.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.destructor_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_FUNCTION.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_FREE_BODY.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_FREE_BODY.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,67 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_FREE_BODY</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.body_hpp" title="Header <contract/body.hpp>">
+<link rel="prev" href="CONTRACT_BLOCK_INVARIANT_TPL.html" title="Macro CONTRACT_BLOCK_INVARIANT_TPL">
+<link rel="next" href="CONTRACT_MEMBER_BODY.html" title="Macro CONTRACT_MEMBER_BODY">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_BLOCK_INVARIANT_TPL.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.body_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_MEMBER_BODY.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_FREE_BODY"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_FREE_BODY</span></h2>
+<p>CONTRACT_FREE_BODY — Macro used to name the body of free functions and free function operators. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.body_hpp" title="Header <contract/body.hpp>">contract/body.hpp</a>>
+
+</span>CONTRACT_FREE_BODY(function_name)</pre></div>
+<div class="refsect1">
+<a name="id1095625"></a><h2>Description</h2>
+<p>This macro is used to name the body of free functions and free function operators when the body is defined separately from the contract declaration. Free functions and free function operators with contracts are declared using the <code class="computeroutput"><a class="link" href="CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code> macro.</p>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody><tr>
+<td><span class="bold"><strong><code class="computeroutput">function_name</code></strong></span></td>
+<td>The syntax for free function and free function operator names is explained in the <a class="link" href="contract__/grammar.html" title="Grammar"> Grammar</a> section. </td>
+</tr></tbody>
+</table></div>
+<p>
+</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/tutorial.html" title="Tutorial"> Tutorial</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_BLOCK_INVARIANT_TPL.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.body_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_MEMBER_BODY.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_FUNCTION.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_FUNCTION.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,71 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_FUNCTION</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.function_hpp" title="Header <contract/function.hpp>">
+<link rel="prev" href="CONTRACT_DESTRUCTOR_TPL.html" title="Macro CONTRACT_DESTRUCTOR_TPL">
+<link rel="next" href="CONTRACT_FUNCTION_TPL.html" title="Macro CONTRACT_FUNCTION_TPL">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_DESTRUCTOR_TPL.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.function_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_FUNCTION_TPL.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_FUNCTION"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_FUNCTION</span></h2>
+<p>CONTRACT_FUNCTION — Macro used to declare free functions, free function operators, member functions, and member function operators with contracts. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.function_hpp" title="Header <contract/function.hpp>">contract/function.hpp</a>>
+
+</span>CONTRACT_FUNCTION(function_declaration)</pre></div>
+<div class="refsect1">
+<a name="id1101236"></a><h2>Description</h2>
+<p>This macro is used to declare a function with possible preconditions and postconditions. At least all public member functions and public member function operators of a class with non-empty class invariants should be declared using this macro in order to check the class invariants (even if the functions and operators have no precondition and no postcondition).</p>
+<p>The semantics of a call to a function with contracts are explained in the <a class="link" href="contract__/contract_programming_overview.html" title="Contract Programming Overview"> Contract Programming Overview</a> section. Constructors and destructors are declared using the <code class="computeroutput"><a class="link" href="CONTRACT_CONSTRUCTOR.html" title="Macro CONTRACT_CONSTRUCTOR">CONTRACT_CONSTRUCTOR</a></code> and <code class="computeroutput"><a class="link" href="CONTRACT_DESTRUCTOR.html" title="Macro CONTRACT_DESTRUCTOR">CONTRACT_DESTRUCTOR</a></code> macros respectively.</p>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody><tr>
+<td><span class="bold"><strong><code class="computeroutput">function_declaration</code></strong></span></td>
+<td>The function declaration syntax is explained in the <a class="link" href="contract__/grammar.html" title="Grammar"> Grammar</a> section. Member functions must always repeat their access level <code class="computeroutput">public</code>, <code class="computeroutput">protected</code>, or <code class="computeroutput">private</code>. Operators use a special syntax to specify their symbols and names. </td>
+</tr></tbody>
+</table></div>
+<p>
+</p>
+<p>The <code class="computeroutput"><a class="link" href="CONTRACT_CLASS.html" title="Macro CONTRACT_CLASS">CONTRACT_CLASS</a></code> macro must be used to declare classes enclosing member functions and member function operators declared using this macro.</p>
+<p>Within a type-dependent scope (e.g., within templates), the <code class="computeroutput"><a class="link" href="CONTRACT_FUNCTION_TPL.html" title="Macro CONTRACT_FUNCTION_TPL">CONTRACT_FUNCTION_TPL</a></code> macro must be used instead of this macro.</p>
+<p>The <code class="computeroutput"><a class="link" href="CONTRACT_FREE_BODY.html" title="Macro CONTRACT_FREE_BODY">CONTRACT_FREE_BODY</a></code> and <code class="computeroutput"><a class="link" href="CONTRACT_MEMBER_BODY.html" title="Macro CONTRACT_MEMBER_BODY">CONTRACT_MEMBER_BODY</a></code> macros must be used when separating free and member function body definitions from the function declarations programmed using this macro.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/tutorial.html" title="Tutorial"> Tutorial</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_DESTRUCTOR_TPL.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.function_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_FUNCTION_TPL.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_FUNCTION_TPL.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_FUNCTION_TPL.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,54 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_FUNCTION_TPL</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.function_hpp" title="Header <contract/function.hpp>">
+<link rel="prev" href="CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">
+<link rel="next" href="CONTRACT_LIMIT_OLDOFS.html" title="Macro CONTRACT_LIMIT_OLDOFS">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_FUNCTION.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.function_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_LIMIT_OLDOFS.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_FUNCTION_TPL"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_FUNCTION_TPL</span></h2>
+<p>CONTRACT_FUNCTION_TPL — Macro used to declared free functions, free function operators, member functions, and member function operators with contracts within a type-dependent scope (e.g., within templates). </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.function_hpp" title="Header <contract/function.hpp>">contract/function.hpp</a>>
+
+</span>CONTRACT_FUNCTION_TPL(function_declaration)</pre></div>
+<div class="refsect1">
+<a name="id1101385"></a><h2>Description</h2>
+<p>This macro is the exact same as <code class="computeroutput"><a class="link" href="CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code> but it must be used when declaring functions with contracts within a type-dependent scope.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/tutorial.html" title="Tutorial"> Tutorial</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_FUNCTION.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.function_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_LIMIT_OLDOFS.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,55 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.limits_hpp" title="Header <contract/limits.hpp>">
+<link rel="prev" href="CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS.html" title="Macro CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS">
+<link rel="next" href="CONTRACT_LOOP.html" title="Macro CONTRACT_LOOP">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.limits_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_LOOP.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES</span></h2>
+<p>CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES — Maximum number of catch statements for a constructor-try block with member initializers. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.limits_hpp" title="Header <contract/limits.hpp>">contract/limits.hpp</a>>
+
+</span>CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES</pre></div>
+<div class="refsect1">
+<a name="id1101602"></a><h2>Description</h2>
+<p>The maximum number of catch statements for a constructor-try block with member initializers is <code class="computeroutput">10</code>. (Constructor-try blocks are specified outside the <code class="computeroutput"><a class="link" href="CONTRACT_CONSTRUCTOR.html" title="Macro CONTRACT_CONSTRUCTOR">CONTRACT_CONSTRUCTOR</a></code> macro when the is no member initializers so this limit does not apply to that case.)</p>
+<p><span class="bold"><strong>Note:</strong></span> This is not a configuration macro. The value of this macro is fixed and programmers cannot change it.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/advanced_topics.html" title="Advanced Topics"> Advanced Topics</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.limits_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_LOOP.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,55 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.limits_hpp" title="Header <contract/limits.hpp>">
+<link rel="prev" href="CONTRACT_LIMIT_OLDOFS.html" title="Macro CONTRACT_LIMIT_OLDOFS">
+<link rel="next" href="CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES.html" title="Macro CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_LIMIT_OLDOFS.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.limits_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS</span></h2>
+<p>CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS — Maximum number of select assertions that can be nested into one another. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.limits_hpp" title="Header <contract/limits.hpp>">contract/limits.hpp</a>>
+
+</span>CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS</pre></div>
+<div class="refsect1">
+<a name="id1101547"></a><h2>Description</h2>
+<p>The maximum number of select assertions that can be nested into one another is <code class="computeroutput">5</code>.</p>
+<p><span class="bold"><strong>Note:</strong></span> This is not a configuration macro. The value of this macro is fixed and programmers cannot change it.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/advanced_topics.html" title="Advanced Topics"> Advanced Topics</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_LIMIT_OLDOFS.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.limits_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_LIMIT_OLDOFS.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_LIMIT_OLDOFS.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,56 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_LIMIT_OLDOFS</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.limits_hpp" title="Header <contract/limits.hpp>">
+<link rel="prev" href="CONTRACT_FUNCTION_TPL.html" title="Macro CONTRACT_FUNCTION_TPL">
+<link rel="next" href="CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS.html" title="Macro CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_FUNCTION_TPL.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.limits_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_LIMIT_OLDOFS"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_LIMIT_OLDOFS</span></h2>
+<p>CONTRACT_LIMIT_OLDOFS — Upper bound on possible maximum number of postcondition old variables. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.limits_hpp" title="Header <contract/limits.hpp>">contract/limits.hpp</a>>
+
+</span>CONTRACT_LIMIT_OLDOFS</pre></div>
+<div class="refsect1">
+<a name="id1101476"></a><h2>Description</h2>
+<p>The maximum possible number of postcondition old variables is <code class="computeroutput">15</code> (the actual maximum value is controlled by <code class="computeroutput"><a class="link" href="CONTRACT_CONFIG_OLDOF_MAX.html" title="Macro CONTRACT_CONFIG_OLDOF_MAX">CONTRACT_CONFIG_OLDOF_MAX</a></code>).</p>
+<p>For compilers that do not support variadic macros, this is the maximum possible total number of postcondition statements (total of old variable declarations, plus return value declaration, plus assertions, etc).</p>
+<p><span class="bold"><strong>Note:</strong></span> This is not a configuration macro. The value of this macro is fixed and programmers cannot change it.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/tutorial.html" title="Tutorial"> Tutorial</a> section, <a class="link" href="contract__/no_variadic_macros.html" title="No Variadic Macros"> No Variadic Macros</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_FUNCTION_TPL.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.limits_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_LOOP.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_LOOP.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,67 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_LOOP</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.loop_variant_hpp" title="Header <contract/loop_variant.hpp>">
+<link rel="prev" href="CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES.html" title="Macro CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES">
+<link rel="next" href="CONTRACT_LOOP_VARIANT.html" title="Macro CONTRACT_LOOP_VARIANT">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.loop_variant_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_LOOP_VARIANT.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_LOOP"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_LOOP</span></h2>
+<p>CONTRACT_LOOP — Macro used to declare a loop that will specify a loop variant. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.loop_variant_hpp" title="Header <contract/loop_variant.hpp>">contract/loop_variant.hpp</a>>
+
+</span>CONTRACT_LOOP(loop_declaration)</pre></div>
+<div class="refsect1">
+<a name="id1101700"></a><h2>Description</h2>
+<p>This macro must be used to declare a loop that will later specify a loop variant using the <code class="computeroutput"><a class="link" href="CONTRACT_LOOP_VARIANT.html" title="Macro CONTRACT_LOOP_VARIANT">CONTRACT_LOOP_VARIANT</a></code> macro.</p>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody><tr>
+<td><span class="bold"><strong><code class="computeroutput">loop_declaration</code></strong></span></td>
+<td>This is a loop declaration (<code class="computeroutput">for</code>, <code class="computeroutput">while</code>, etc) that follows the usual C++ syntax (see also the <a class="link" href="contract__/grammar.html" title="Grammar"> Grammar</a> section). </td>
+</tr></tbody>
+</table></div>
+<p>
+</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/advanced_topics.html" title="Advanced Topics"> Advanced Topics</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.loop_variant_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_LOOP_VARIANT.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_LOOP_VARIANT.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_LOOP_VARIANT.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,68 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_LOOP_VARIANT</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.loop_variant_hpp" title="Header <contract/loop_variant.hpp>">
+<link rel="prev" href="CONTRACT_LOOP.html" title="Macro CONTRACT_LOOP">
+<link rel="next" href="CONTRACT_LOOP_VARIANT_TPL.html" title="Macro CONTRACT_LOOP_VARIANT_TPL">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_LOOP.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.loop_variant_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_LOOP_VARIANT_TPL.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_LOOP_VARIANT"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_LOOP_VARIANT</span></h2>
+<p>CONTRACT_LOOP_VARIANT — Macro used to specify a loop variant. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.loop_variant_hpp" title="Header <contract/loop_variant.hpp>">contract/loop_variant.hpp</a>>
+
+</span>CONTRACT_LOOP_VARIANT(loop_variant)</pre></div>
+<div class="refsect1">
+<a name="id1102914"></a><h2>Description</h2>
+<p>This macro is used to specify loop variants which ensure that loops terminate. This macro must be used within the body <code class="computeroutput">{ ... }</code> of a loop declared using the <code class="computeroutput"><a class="link" href="CONTRACT_LOOP.html" title="Macro CONTRACT_LOOP">CONTRACT_LOOP</a></code> macro. Each loop can have at most one loop variant.</p>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody><tr>
+<td><span class="bold"><strong><code class="computeroutput">loop_variant</code></strong></span></td>
+<td>The loop variant must be a non-negative integral expression that monotonically decreases when calculated at each subsequent loop iteration (constant-expressions can also be used, see the <a class="link" href="contract__/grammar.html" title="Grammar"> Grammar</a> section). </td>
+</tr></tbody>
+</table></div>
+<p>
+</p>
+<p>Within type-dependent scope (e.g., within templates), the <code class="computeroutput"><a class="link" href="CONTRACT_LOOP_VARIANT_TPL.html" title="Macro CONTRACT_LOOP_VARIANT_TPL">CONTRACT_LOOP_VARIANT_TPL</a></code> macro must be used instead of this macro.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/advanced_topics.html" title="Advanced Topics"> Advanced Topics</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_LOOP.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.loop_variant_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_LOOP_VARIANT_TPL.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_LOOP_VARIANT_TPL.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_LOOP_VARIANT_TPL.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,54 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_LOOP_VARIANT_TPL</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.loop_variant_hpp" title="Header <contract/loop_variant.hpp>">
+<link rel="prev" href="CONTRACT_LOOP_VARIANT.html" title="Macro CONTRACT_LOOP_VARIANT">
+<link rel="next" href="contract/has_oldof.html" title="Struct template has_oldof">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_LOOP_VARIANT.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.loop_variant_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="contract/has_oldof.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_LOOP_VARIANT_TPL"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_LOOP_VARIANT_TPL</span></h2>
+<p>CONTRACT_LOOP_VARIANT_TPL — Macro used to specify a loop variant within a type-dependent scope (e.g., within templates). </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.loop_variant_hpp" title="Header <contract/loop_variant.hpp>">contract/loop_variant.hpp</a>>
+
+</span>CONTRACT_LOOP_VARIANT_TPL(loop_variant)</pre></div>
+<div class="refsect1">
+<a name="id1103011"></a><h2>Description</h2>
+<p>This macro is the exact same as <code class="computeroutput"><a class="link" href="CONTRACT_LOOP_VARIANT.html" title="Macro CONTRACT_LOOP_VARIANT">CONTRACT_LOOP_VARIANT</a></code> but it must be used when specifying loop variants within a type-dependent scope.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/advanced_topics.html" title="Advanced Topics"> Advanced Topics</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_LOOP_VARIANT.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.loop_variant_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="contract/has_oldof.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_MEMBER_BODY.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_MEMBER_BODY.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,68 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_MEMBER_BODY</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.body_hpp" title="Header <contract/body.hpp>">
+<link rel="prev" href="CONTRACT_FREE_BODY.html" title="Macro CONTRACT_FREE_BODY">
+<link rel="next" href="CONTRACT_CONSTRUCTOR_BODY.html" title="Macro CONTRACT_CONSTRUCTOR_BODY">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_FREE_BODY.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.body_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONSTRUCTOR_BODY.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_MEMBER_BODY"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_MEMBER_BODY</span></h2>
+<p>CONTRACT_MEMBER_BODY — Macro used to name the body of member functions and member function operators. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.body_hpp" title="Header <contract/body.hpp>">contract/body.hpp</a>>
+
+</span>CONTRACT_MEMBER_BODY(function_name)</pre></div>
+<div class="refsect1">
+<a name="id1095707"></a><h2>Description</h2>
+<p>This macro is used to name the body of member functions and member function operators when the body is defined separately from the contract declaration. Member functions and member function operators with contracts are declared using the <code class="computeroutput"><a class="link" href="CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code> macro.</p>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody><tr>
+<td><span class="bold"><strong><code class="computeroutput">function_name</code></strong></span></td>
+<td>The syntax for function and operator names is explained in the <a class="link" href="contract__/grammar.html" title="Grammar"> Grammar</a> section. </td>
+</tr></tbody>
+</table></div>
+<p>
+</p>
+<p><span class="bold"><strong>Warning:</strong></span> This macro must also be used when a virtual function invokes the overridden function from one of its base classes (see the <a class="link" href="contract__/tutorial.html" title="Tutorial"> Tutorial</a> section).</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/tutorial.html" title="Tutorial"> Tutorial</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_FREE_BODY.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.body_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONSTRUCTOR_BODY.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_OLDOF.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_OLDOF.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_OLDOF</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.oldof_hpp" title="Header <contract/oldof.hpp>">
+<link rel="prev" href="contract/has_oldof.html" title="Struct template has_oldof">
+<link rel="next" href="CONTRACT_CONSTRUCTOR_ARG.html" title="Macro CONTRACT_CONSTRUCTOR_ARG">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="contract/has_oldof.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.oldof_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONSTRUCTOR_ARG.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_OLDOF"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_OLDOF</span></h2>
+<p>CONTRACT_OLDOF — Macro used to refer to the old value of an expression. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.oldof_hpp" title="Header <contract/oldof.hpp>">contract/oldof.hpp</a>>
+
+</span>CONTRACT_OLDOF</pre></div>
+<div class="refsect1">
+<a name="id1103291"></a><h2>Description</h2>
+<p>This macro refers the old value of the expression that follows the macro (i.e., the value the expression had after function entry but before body execution). This macro must be used to initialize old value declarations within postconditions (see also the <a class="link" href="contract__/grammar.html" title="Grammar"> Grammar</a> section):</p>
+<pre class="programlisting"><span class="keyword">auto</span> <span class="identifier">old_variable</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">odlof_expression</span>
+</pre>
+<p>The specified expression that follows the macro might or not be wrapped within parenthesis.</p>
+<p>The old-of expression type can be explicitly specified instead of <code class="computeroutput">auto</code> but it must be wrapped within parenthesis unless it is a fundamental type containing no symbol. If not explicitly specified, the library will automatically deduce the type using Boost.Typeof (as always, types must be properly registered with Boost.Typeof for type-of emulation mode on compilers that do not support native type-of).</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/tutorial.html" title="Tutorial"> Tutorial</a> section, <a class="link" href="contract__/advanced_topics.html" title="Advanced Topics"> Advanced Topics</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="contract/has_oldof.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.oldof_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_CONSTRUCTOR_ARG.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_PARAMETER.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_PARAMETER.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,68 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_PARAMETER</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.parameter_hpp" title="Header <contract/parameter.hpp>">
+<link rel="prev" href="CONTRACT_PARAMETER_TYPEOF.html" title="Macro CONTRACT_PARAMETER_TYPEOF">
+<link rel="next" href="CONTRACT_TEMPLATE_PARAMETER.html" title="Macro CONTRACT_TEMPLATE_PARAMETER">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_PARAMETER_TYPEOF.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.parameter_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_TEMPLATE_PARAMETER.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_PARAMETER"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_PARAMETER</span></h2>
+<p>CONTRACT_PARAMETER — Macro used to declare a named or deduced function parameter. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.parameter_hpp" title="Header <contract/parameter.hpp>">contract/parameter.hpp</a>>
+
+</span>CONTRACT_PARAMETER(named_parameter_declaration)</pre></div>
+<div class="refsect1">
+<a name="id1103583"></a><h2>Description</h2>
+<p>This macro is used to declare a named or deduced parameter that will later be used within a function declared using the <code class="computeroutput"><a class="link" href="CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code> or the <code class="computeroutput"><a class="link" href="CONTRACT_CONSTRUCTOR.html" title="Macro CONTRACT_CONSTRUCTOR">CONTRACT_CONSTRUCTOR</a></code> macros. This macro should be used at namespace scope.</p>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody><tr>
+<td><span class="bold"><strong><code class="computeroutput">named_parameter_declaration</code></strong></span></td>
+<td>The syntax of named and deduced parameter declarations is explained in the <a class="link" href="contract__/grammar.html" title="Grammar"> Grammar</a> section. At lest the parameter name must be specified. </td>
+</tr></tbody>
+</table></div>
+<p>
+</p>
+<p>It is recommended to always use this macro within an enclosing namespace different from the global namespace so to control and avoid clashing declarations of named and deduced parameters that have the same name.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/named_parameters.html" title="Named Parameters"> Named Parameters</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_PARAMETER_TYPEOF.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.parameter_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_TEMPLATE_PARAMETER.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_PARAMETER_BODY.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_PARAMETER_BODY.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,71 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_PARAMETER_BODY</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.parameter_hpp" title="Header <contract/parameter.hpp>">
+<link rel="prev" href="CONTRACT_TEMPLATE_PARAMETER.html" title="Macro CONTRACT_TEMPLATE_PARAMETER">
+<link rel="next" href="contract__/release_notes.html" title="Release Notes">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_TEMPLATE_PARAMETER.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.parameter_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="contract__/release_notes.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_PARAMETER_BODY"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_PARAMETER_BODY</span></h2>
+<p>CONTRACT_PARAMETER_BODY — Macro used to name the body of free and member functions with named parameters. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.parameter_hpp" title="Header <contract/parameter.hpp>">contract/parameter.hpp</a>>
+
+</span>CONTRACT_PARAMETER_BODY(function_name)</pre></div>
+<div class="refsect1">
+<a name="id1103762"></a><h2>Description</h2>
+<p>This macro is used to name the body of a function with named parameters when the body is defined separately from the function declaration.</p>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody><tr>
+<td><span class="bold"><strong><code class="computeroutput">function_name</code></strong></span></td>
+<td>The name of the function with named parameters. </td>
+</tr></tbody>
+</table></div>
+<p>
+</p>
+<p>For member functions, the class type must precede this macro (this allows to use this same macro for both free and member functions): </p>
+<pre class="programlisting"><span class="identifier">class_type</span><span class="special">::</span><span class="identifier">CONTRACT_PARAMETER_BODY</span><span class="special">(</span><span class="identifier">function_name</span><span class="special">)</span>
+</pre>
+<p><span class="bold"><strong>Note:</strong></span> Named parameters are currently not supported for operators so this function name cannot be the name of an operator (because of a Boost.Parameter bug). Constructors with named parameters cannot defer the definition of their body (because of lack of delegating constructors in C++03). Finally, destructors have no parameter so named parameters do not apply to destructors. Therefore, this macro is never used for operators, constructors, and destructors.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/named_parameters.html" title="Named Parameters"> Named Parameters</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_TEMPLATE_PARAMETER.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.parameter_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="contract__/release_notes.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_PARAMETER_TYPEOF.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_PARAMETER_TYPEOF.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,68 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_PARAMETER_TYPEOF</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.parameter_hpp" title="Header <contract/parameter.hpp>">
+<link rel="prev" href="CONTRACT_CONSTRUCTOR_ARG.html" title="Macro CONTRACT_CONSTRUCTOR_ARG">
+<link rel="next" href="CONTRACT_PARAMETER.html" title="Macro CONTRACT_PARAMETER">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONSTRUCTOR_ARG.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.parameter_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_PARAMETER.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_PARAMETER_TYPEOF"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_PARAMETER_TYPEOF</span></h2>
+<p>CONTRACT_PARAMETER_TYPEOF — Macro used to access the actual type of a named or deduced parameter. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.parameter_hpp" title="Header <contract/parameter.hpp>">contract/parameter.hpp</a>>
+
+</span>CONTRACT_PARAMETER_TYPEOF(parameter_name)</pre></div>
+<div class="refsect1">
+<a name="id1103503"></a><h2>Description</h2>
+<p>Named and deduced parameters can have generic types (possibly matching predicate type requirements) so the actual parameter types are known at compile-time but only after the function call has been resolved. This macro is used to refer to the actual parameter type as it was determined by the function call resolution.</p>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody><tr>
+<td><span class="bold"><strong><code class="computeroutput">parameter_name</code></strong></span></td>
+<td>The name of a named or deduced parameter previously declared using the <code class="computeroutput"><a class="link" href="CONTRACT_PARAMETER.html" title="Macro CONTRACT_PARAMETER">CONTRACT_PARAMETER</a></code> macro. </td>
+</tr></tbody>
+</table></div>
+<p>
+</p>
+<p>This macro can be used within both the function declaration and the body definition.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/named_parameters.html" title="Named Parameters"> Named Parameters</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_CONSTRUCTOR_ARG.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.parameter_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_PARAMETER.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/CONTRACT_TEMPLATE_PARAMETER.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/CONTRACT_TEMPLATE_PARAMETER.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,68 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Macro CONTRACT_TEMPLATE_PARAMETER</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="reference.html#header.contract.parameter_hpp" title="Header <contract/parameter.hpp>">
+<link rel="prev" href="CONTRACT_PARAMETER.html" title="Macro CONTRACT_PARAMETER">
+<link rel="next" href="CONTRACT_PARAMETER_BODY.html" title="Macro CONTRACT_PARAMETER_BODY">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_PARAMETER.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.parameter_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_PARAMETER_BODY.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="CONTRACT_TEMPLATE_PARAMETER"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Macro CONTRACT_TEMPLATE_PARAMETER</span></h2>
+<p>CONTRACT_TEMPLATE_PARAMETER — Macro used to declare a named or deduced template parameter. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="reference.html#header.contract.parameter_hpp" title="Header <contract/parameter.hpp>">contract/parameter.hpp</a>>
+
+</span>CONTRACT_TEMPLATE_PARAMETER(named_parameter_declaration)</pre></div>
+<div class="refsect1">
+<a name="id1103678"></a><h2>Description</h2>
+<p>This macro is used to declare a named or deduced parameter that will later be used within a class template declared using the <code class="computeroutput"><a class="link" href="CONTRACT_CLASS.html" title="Macro CONTRACT_CLASS">CONTRACT_CLASS</a></code> macro. This macro should be used at namespace scope.</p>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody><tr>
+<td><span class="bold"><strong><code class="computeroutput">named_parameter_declaration</code></strong></span></td>
+<td>The syntax of named and deduced parameter declarations is explained in the <a class="link" href="contract__/grammar.html" title="Grammar"> Grammar</a> section. At lest the template parameter name must be specified. </td>
+</tr></tbody>
+</table></div>
+<p>
+</p>
+<p>It is recommended to always use this macro within an enclosing namespace different from the global namespace so to control and avoid clashing declarations of named and deduced parameters that have the same name.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/named_parameters.html" title="Named Parameters"> Named Parameters</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="CONTRACT_PARAMETER.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="reference.html#header.contract.parameter_hpp"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_PARAMETER_BODY.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/contract/block_invariant_broken.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/contract/block_invariant_broken.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,69 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Function block_invariant_broken</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="../reference.html#header.contract.broken_hpp" title="Header <contract/broken.hpp>">
+<link rel="prev" href="class_invariant_b_id552735.html" title="Function class_invariant_broken_on_throw">
+<link rel="next" href="loop_variant_broken.html" title="Function loop_variant_broken">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="class_invariant_b_id552735.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html#header.contract.broken_hpp"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="loop_variant_broken.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="contract.block_invariant_broken"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Function block_invariant_broken</span></h2>
+<p>contract::block_invariant_broken — Broken handler called when a block invariant assertion fails. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="../reference.html#header.contract.broken_hpp" title="Header <contract/broken.hpp>">contract/broken.hpp</a>>
+
+</span>
+<span class="keyword">void</span> <span class="identifier">block_invariant_broken</span><span class="special">(</span><span class="identifier">from</span> <span class="keyword">const</span> <span class="special">&</span> context<span class="special">)</span><span class="special">;</span></pre></div>
+<div class="refsect1">
+<a name="id1098634"></a><h2>Description</h2>
+<p>By default, it prints information about the failed assertion to <code class="computeroutput">std::cerr</code> and it calls <code class="computeroutput">std::terminate</code>. However, it can be customized using <code class="computeroutput"><code class="computeroutput"><a class="link" href="../reference.html#contract.set_block_invariant_broken">contract::set_block_invariant_broken</a></code></code> (even to throw exceptions, but programmers should be careful to never throw from destructors).</p>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody><tr>
+<td><span class="bold"><strong><code class="computeroutput">context</code></strong></span></td>
+<td>Context from which the block invariants assertion failed (i.e., the body). </td>
+</tr></tbody>
+</table></div>
+<p>
+</p>
+<p>This handler is automatically called by the library in case of a block invariant assertion failure (an assertion fails if it is not evaluated to be true, so if it is evaluated to be false but also if it cannot be evaluated because an exception is thrown by the asserted condition).</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="../contract__/advanced_topics.html" title="Advanced Topics"> Advanced Topics</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="class_invariant_b_id552735.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html#header.contract.broken_hpp"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="loop_variant_broken.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/contract/broken.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/contract/broken.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,109 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Class broken</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="../reference.html#header.contract.broken_hpp" title="Header <contract/broken.hpp>">
+<link rel="prev" href="../CONTRACT_DESTRUCTOR_BODY.html" title="Macro CONTRACT_DESTRUCTOR_BODY">
+<link rel="next" href="from.html" title="Type from">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../CONTRACT_DESTRUCTOR_BODY.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html#header.contract.broken_hpp"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="from.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="contract.broken"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Class broken</span></h2>
+<p>contract::broken — Exception automatically thrown by the library to signal a contract assertion failure. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="../reference.html#header.contract.broken_hpp" title="Header <contract/broken.hpp>">contract/broken.hpp</a>>
+
+</span>
+<span class="keyword">class</span> <a class="link" href="broken.html" title="Class broken">broken</a> <span class="special">{</span>
+<span class="keyword">public</span><span class="special">:</span>
+ <span class="comment">// <a class="link" href="broken.html#contract.brokenconstruct-copy-destruct">construct/copy/destruct</a></span>
+ <span class="keyword">explicit</span> <a class="link" href="broken.html#id552245-bb"><span class="identifier">broken</span></a><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span> <span class="special">*</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="keyword">const</span> <span class="special">&</span><span class="special">,</span> <span class="keyword">char</span> <span class="keyword">const</span> <span class="special">*</span><span class="special">,</span>
+ <span class="keyword">unsigned</span> <span class="keyword">int</span> <span class="keyword">const</span> <span class="special">&</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span><span class="special">;</span>
+ <a class="link" href="broken.html#id552275-bb"><span class="identifier">broken</span></a><span class="special">(</span><a class="link" href="broken.html" title="Class broken">broken</a> <span class="keyword">const</span> <span class="special">&</span><span class="special">)</span><span class="special">;</span>
+ broken& <a class="link" href="broken.html#id552286-bb"><span class="keyword">operator</span><span class="special">=</span></a><span class="special">(</span><a class="link" href="broken.html" title="Class broken">broken</a> <span class="keyword">const</span> <span class="special">&</span><span class="special">)</span><span class="special">;</span>
+ <a class="link" href="broken.html#id552297-bb"><span class="special">~</span><span class="identifier">broken</span></a><span class="special">(</span><span class="keyword">void</span><span class="special">)</span><span class="special">;</span>
+
+ <span class="comment">// <a class="link" href="broken.html#id552168-bb">public member functions</a></span>
+ <span class="keyword">char</span> <span class="keyword">const</span> <span class="special">*</span> <a class="link" href="broken.html#id552171-bb"><span class="identifier">what</span></a><span class="special">(</span><span class="keyword">void</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
+ <span class="keyword">char</span> <span class="keyword">const</span> <span class="special">*</span> <a class="link" href="broken.html#id552185-bb"><span class="identifier">file_name</span></a><span class="special">(</span><span class="keyword">void</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
+ <span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="keyword">const</span> <a class="link" href="broken.html#id552198-bb"><span class="identifier">line_number</span></a><span class="special">(</span><span class="keyword">void</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
+ <span class="keyword">char</span> <span class="keyword">const</span> <span class="special">*</span> <a class="link" href="broken.html#id552212-bb"><span class="identifier">assertion_code</span></a><span class="special">(</span><span class="keyword">void</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
+ <span class="keyword">unsigned</span> <span class="keyword">int</span> <span class="keyword">const</span> <a class="link" href="broken.html#id552226-bb"><span class="identifier">assertion_number</span></a><span class="special">(</span><span class="keyword">void</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
+<span class="special">}</span><span class="special">;</span></pre></div>
+<div class="refsect1">
+<a name="id1097064"></a><h2>Description</h2>
+<p>This exception contains detailed information about the failed contract assertion (file name, line number, etc).</p>
+<p>A contract assertion is considered failed if it cannot be evaluated to be true (so if it is evaluated to be false but also if an exception is thrown by the code that evaluates the assertion condition). In case a contract assertion fails, the library automatically calls the appropriate contract broken handler with this exception as the active exception (the fact that assertion failures are signaled by this library by throwing this exception does not necessarily mean that the exception will be ultimately thrown by the broken contract, that is entirely up to the implementation of the contract broken handlers). By default, contract broken handlers print an error message to <code class="computeroutput">std::cerr</code> and terminate the program calling <code class="computeroutput">std::terminate</code>, but programmers can redefine this behaviour by customizing the contract broken handlers (for example to have the handlers throw exceptions instead of terminating the program). Within customized contract broken
handlers, programmers can re-throw and catch this exception to obtained information about the failed asserted condition (file name, line number, etc).</p>
+<p><span class="bold"><strong>Note:</strong></span> This exception is guaranteed to publicly inherit from <code class="computeroutput">std::logic_error</code> (because <code class="computeroutput">std::logic_error</code> models programming errors and those are the type of errors that contract assertions detect).</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="../contract__/advanced_topics.html" title="Advanced Topics"> Advanced Topics</a> section. </p>
+<div class="refsect2">
+<a name="id1097109"></a><h3>
+<a name="contract.brokenconstruct-copy-destruct"></a><code class="computeroutput">broken</code>
+ public
+ construct/copy/destruct</h3>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+<pre class="literallayout"><span class="keyword">explicit</span> <a name="id552245-bb"></a><span class="identifier">broken</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span> <span class="special">*</span> file_name<span class="special">,</span> <span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="keyword">const</span> <span class="special">&</span> line_number<span class="special">,</span>
+ <span class="keyword">char</span> <span class="keyword">const</span> <span class="special">*</span> assertion_code<span class="special">,</span>
+ <span class="keyword">unsigned</span> <span class="keyword">int</span> <span class="keyword">const</span> <span class="special">&</span> assertion_number <span class="special">=</span> <span class="number">0</span><span class="special">)</span><span class="special">;</span></pre>Construct this exception specifying the failed assertion file name, line number, assertion code, and assertion number (no-throw). <p>The assertion number is optional and it defaults to zero (an assertion number equal to zero is ignored and not shown in the error description). </p>
+</li>
+<li class="listitem">
+<pre class="literallayout"><a name="id552275-bb"></a><span class="identifier">broken</span><span class="special">(</span><a class="link" href="broken.html" title="Class broken">broken</a> <span class="keyword">const</span> <span class="special">&</span> source<span class="special">)</span><span class="special">;</span></pre>Copy constructor (no-throw). </li>
+<li class="listitem">
+<pre class="literallayout">broken& <a name="id552286-bb"></a><span class="keyword">operator</span><span class="special">=</span><span class="special">(</span><a class="link" href="broken.html" title="Class broken">broken</a> <span class="keyword">const</span> <span class="special">&</span> source<span class="special">)</span><span class="special">;</span></pre>Copy operator (no-throw). </li>
+<li class="listitem">
+<pre class="literallayout"><a name="id552297-bb"></a><span class="special">~</span><span class="identifier">broken</span><span class="special">(</span><span class="keyword">void</span><span class="special">)</span><span class="special">;</span></pre>Virtual destructor (no-throw). </li>
+</ol></div>
+</div>
+<div class="refsect2">
+<a name="id1097374"></a><h3>
+<a name="id552168-bb"></a><code class="computeroutput">broken</code> public member functions</h3>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+<pre class="literallayout"><span class="keyword">char</span> <span class="keyword">const</span> <span class="special">*</span> <a name="id552171-bb"></a><span class="identifier">what</span><span class="special">(</span><span class="keyword">void</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span></pre>Return a description of the assertion failure (no-throw). </li>
+<li class="listitem">
+<pre class="literallayout"><span class="keyword">char</span> <span class="keyword">const</span> <span class="special">*</span> <a name="id552185-bb"></a><span class="identifier">file_name</span><span class="special">(</span><span class="keyword">void</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span></pre>Return the name of the file containing the failed assertion (no-throw). </li>
+<li class="listitem">
+<pre class="literallayout"><span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="keyword">const</span> <a name="id552198-bb"></a><span class="identifier">line_number</span><span class="special">(</span><span class="keyword">void</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span></pre>Return the number of the line containing the failed assertion (no-throw). </li>
+<li class="listitem">
+<pre class="literallayout"><span class="keyword">char</span> <span class="keyword">const</span> <span class="special">*</span> <a name="id552212-bb"></a><span class="identifier">assertion_code</span><span class="special">(</span><span class="keyword">void</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span></pre>Return the text of the asserted code that failed (no-throw). </li>
+<li class="listitem">
+<pre class="literallayout"><span class="keyword">unsigned</span> <span class="keyword">int</span> <span class="keyword">const</span> <a name="id552226-bb"></a><span class="identifier">assertion_number</span><span class="special">(</span><span class="keyword">void</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span></pre>Return the number of the failed assertion (no-throw). <p>The assertion number is useful only within the context of a specific contract broken handler that can differentiates between broken preconditions, postconditions, etc because different preconditions, postconditions, etc will in general have the same assertion number (the first precondition is assertion number 1, the first postcondition is also assertion number 1, etc).</p>
+<p>If this number is zero then no sensible assertion number was specified and it should be ignored (e.g., loop variant assertions have no assertion number because there can only be one single variant for a loop). </p>
+</li>
+</ol></div>
+</div>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../CONTRACT_DESTRUCTOR_BODY.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html#header.contract.broken_hpp"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="from.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/contract/broken_contract_handler.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/contract/broken_contract_handler.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Type definition broken_contract_handler</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="../reference.html#header.contract.broken_hpp" title="Header <contract/broken.hpp>">
+<link rel="prev" href="from.html" title="Type from">
+<link rel="next" href="precondition_broken.html" title="Function precondition_broken">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="from.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html#header.contract.broken_hpp"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="precondition_broken.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="contract.broken_contract_handler"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Type definition broken_contract_handler</span></h2>
+<p>broken_contract_handler — Contract broken handler function pointer. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="../reference.html#header.contract.broken_hpp" title="Header <contract/broken.hpp>">contract/broken.hpp</a>>
+
+</span>
+<span class="keyword">typedef</span> <span class="identifier">handler_function_pointer</span> <span class="identifier">broken_contract_handler</span><span class="special">;</span></pre></div>
+<div class="refsect1">
+<a name="id1097848"></a><h2>Description</h2>
+<p>A contract broken handler is a function returning <code class="computeroutput">void</code> and taking only one parameter of type <code class="computeroutput"><a class="link" href="from.html" title="Type from">from</a></code> indicating the context from which the contract assertion failed:</p>
+<pre class="programlisting"><span class="keyword">typedef</span> <span class="keyword">void</span> <span class="special">(</span><span class="special">*</span><span class="identifier">handler_function_pointer</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">from</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">context</span> <span class="special">)</span> <span class="special">;</span>
+</pre>
+<p><span class="bold"><strong>Note:</strong></span> This function prototype is not non-throw to allow programmers to customize the contract broken handlers to throw exceptions if they wish to do so.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="../contract__/advanced_topics.html" title="Advanced Topics"> Advanced Topics</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="from.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html#header.contract.broken_hpp"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="precondition_broken.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/contract/class_invariant_b_id488563.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/contract/class_invariant_b_id488563.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,69 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Function class_invariant_broken_on_entry</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="../reference.html#header.contract.broken_hpp" title="Header <contract/broken.hpp>">
+<link rel="prev" href="postcondition_broken.html" title="Function postcondition_broken">
+<link rel="next" href="class_invariant_b_id488641.html" title="Function class_invariant_broken_on_exit">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="postcondition_broken.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html#header.contract.broken_hpp"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="class_invariant_b_id488641.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="contract.class_invariant_b_id488563"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Function class_invariant_broken_on_entry</span></h2>
+<p>contract::class_invariant_broken_on_entry — Broken handler called when a class invariant assertion fails on function entry. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="../reference.html#header.contract.broken_hpp" title="Header <contract/broken.hpp>">contract/broken.hpp</a>>
+
+</span>
+<span class="keyword">void</span> <span class="identifier">class_invariant_broken_on_entry</span><span class="special">(</span><span class="identifier">from</span> <span class="keyword">const</span> <span class="special">&</span> context<span class="special">)</span><span class="special">;</span></pre></div>
+<div class="refsect1">
+<a name="id1044476"></a><h2>Description</h2>
+<p>By default, it prints information about the failed assertion to <code class="computeroutput">std::cerr</code> and it calls <code class="computeroutput">std::terminate</code>. However, it can be customized using <code class="computeroutput"><code class="computeroutput"><a class="link" href="../reference.html#contract.set_class_invaria_id488551">contract::set_class_invariant_broken_on_entry</a></code></code> (even to throw exceptions, but programmers should be careful to never throw from destructors).</p>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody><tr>
+<td><span class="bold"><strong><code class="computeroutput">context</code></strong></span></td>
+<td>Context from which the class invariants assertion failed (destructors, etc). </td>
+</tr></tbody>
+</table></div>
+<p>
+</p>
+<p>This handler is automatically called by the library in case of a class invariant assertion failure (an assertion fails if it is not evaluated to be true, so if it is evaluated to be false but also if it cannot be evaluated because an exception is thrown by the asserted condition).</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="../contract__/advanced_topics.html" title="Advanced Topics"> Advanced Topics</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="postcondition_broken.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html#header.contract.broken_hpp"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="class_invariant_b_id488641.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/contract/class_invariant_b_id488641.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/contract/class_invariant_b_id488641.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,69 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Function class_invariant_broken_on_exit</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="../reference.html#header.contract.broken_hpp" title="Header <contract/broken.hpp>">
+<link rel="prev" href="class_invariant_b_id488563.html" title="Function class_invariant_broken_on_entry">
+<link rel="next" href="class_invariant_b_id488719.html" title="Function class_invariant_broken_on_throw">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="class_invariant_b_id488563.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html#header.contract.broken_hpp"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="class_invariant_b_id488719.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="contract.class_invariant_b_id488641"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Function class_invariant_broken_on_exit</span></h2>
+<p>contract::class_invariant_broken_on_exit — Broken handler called when a class invariant assertion fails on function exit. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="../reference.html#header.contract.broken_hpp" title="Header <contract/broken.hpp>">contract/broken.hpp</a>>
+
+</span>
+<span class="keyword">void</span> <span class="identifier">class_invariant_broken_on_exit</span><span class="special">(</span><span class="identifier">from</span> <span class="keyword">const</span> <span class="special">&</span> context<span class="special">)</span><span class="special">;</span></pre></div>
+<div class="refsect1">
+<a name="id1044600"></a><h2>Description</h2>
+<p>By default, it prints information about the failed assertion to <code class="computeroutput">std::cerr</code> and it calls <code class="computeroutput">std::terminate</code>. However, it can be customized using <code class="computeroutput"><code class="computeroutput"><a class="link" href="../reference.html#contract.set_class_invaria_id488629">contract::set_class_invariant_broken_on_exit</a></code></code> (even to throw exceptions, but programmers should be careful to never throw from destructors).</p>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody><tr>
+<td><span class="bold"><strong><code class="computeroutput">context</code></strong></span></td>
+<td>Context from which the class invariants assertion failed (destructors, etc). </td>
+</tr></tbody>
+</table></div>
+<p>
+</p>
+<p>This handler is automatically called by the library in case of a class invariant assertion failure (an assertion fails if it is not evaluated to be true, so if it is evaluated to be false but also if it cannot be evaluated because an exception is thrown by the asserted condition).</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="../contract__/advanced_topics.html" title="Advanced Topics"> Advanced Topics</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="class_invariant_b_id488563.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html#header.contract.broken_hpp"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="class_invariant_b_id488719.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/contract/class_invariant_b_id488719.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/contract/class_invariant_b_id488719.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,69 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Function class_invariant_broken_on_throw</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="../reference.html#header.contract.broken_hpp" title="Header <contract/broken.hpp>">
+<link rel="prev" href="class_invariant_b_id488641.html" title="Function class_invariant_broken_on_exit">
+<link rel="next" href="block_invariant_broken.html" title="Function block_invariant_broken">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="class_invariant_b_id488641.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html#header.contract.broken_hpp"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="block_invariant_broken.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="contract.class_invariant_b_id488719"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Function class_invariant_broken_on_throw</span></h2>
+<p>contract::class_invariant_broken_on_throw — Broken handler called when a class invariant assertion fails on function exit after the function body threw an exception. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="../reference.html#header.contract.broken_hpp" title="Header <contract/broken.hpp>">contract/broken.hpp</a>>
+
+</span>
+<span class="keyword">void</span> <span class="identifier">class_invariant_broken_on_throw</span><span class="special">(</span><span class="identifier">from</span> <span class="keyword">const</span> <span class="special">&</span> context<span class="special">)</span><span class="special">;</span></pre></div>
+<div class="refsect1">
+<a name="id1044725"></a><h2>Description</h2>
+<p>By default, it prints information about the failed assertion to <code class="computeroutput">std::cerr</code> and it calls <code class="computeroutput">std::terminate</code>. However, it can be customized using <code class="computeroutput"><code class="computeroutput"><a class="link" href="../reference.html#contract.set_class_invaria_id488707">contract::set_class_invariant_broken_on_throw</a></code></code> (even to throw exceptions, but programmers should be careful to never throw from destructors).</p>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody><tr>
+<td><span class="bold"><strong><code class="computeroutput">context</code></strong></span></td>
+<td>Context from which the class invariants assertion failed (destructors, etc). </td>
+</tr></tbody>
+</table></div>
+<p>
+</p>
+<p>This handler is automatically called by the library in case of a class invariant assertion failure (an assertion fails if it is not evaluated to be true, so if it is evaluated to be false but also if it cannot be evaluated because an exception is thrown by the asserted condition).</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="../contract__/advanced_topics.html" title="Advanced Topics"> Advanced Topics</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="class_invariant_b_id488641.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html#header.contract.broken_hpp"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="block_invariant_broken.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/contract/copy.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/contract/copy.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,96 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Class template copy</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="../reference.html#header.contract.copy_hpp" title="Header <contract/copy.hpp>">
+<link rel="prev" href="../CONTRACT_CONSTRUCTOR_TPL.html" title="Macro CONTRACT_CONSTRUCTOR_TPL">
+<link rel="next" href="../CONTRACT_DESTRUCTOR.html" title="Macro CONTRACT_DESTRUCTOR">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../CONTRACT_CONSTRUCTOR_TPL.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html#header.contract.copy_hpp"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../CONTRACT_DESTRUCTOR.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="contract.copy"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Class template copy</span></h2>
+<p>contract::copy — Copy result value and old values for postconditions. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="../reference.html#header.contract.copy_hpp" title="Header <contract/copy.hpp>">contract/copy.hpp</a>>
+
+</span><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> T<span class="special">></span>
+<span class="keyword">class</span> <a class="link" href="copy.html" title="Class template copy">copy</a> <span class="special">{</span>
+<span class="keyword">public</span><span class="special">:</span>
+ <span class="comment">// types</span>
+ <span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">add_reference</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">add_const</span><span class="special"><</span> <span class="identifier">T</span> <span class="special">></span><span class="special">::</span><span class="identifier">type</span> <span class="special">></span><span class="special">::</span><span class="identifier">type</span> <a name="contract.copy.const_reference_type"></a><span class="identifier">const_reference_type</span><span class="special">;</span>
+
+ <span class="comment">// <a class="link" href="copy.html#contract.copyconstruct-copy-destruct">construct/copy/destruct</a></span>
+ <span class="keyword">explicit</span> <a class="link" href="copy.html#id553927-bb"><span class="identifier">copy</span></a><span class="special">(</span><span class="identifier">const_reference_type</span><span class="special">)</span><span class="special">;</span>
+
+ <span class="comment">// <a class="link" href="copy.html#id553911-bb">public member functions</a></span>
+ <span class="identifier">const_reference_type</span> <a class="link" href="copy.html#id553914-bb"><span class="identifier">value</span></a><span class="special">(</span><span class="keyword">void</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span>
+<span class="special">}</span><span class="special">;</span></pre></div>
+<div class="refsect1">
+<a name="id1100728"></a><h2>Description</h2>
+<p>The default implementation of his class template can copy values of any type that is <code class="computeroutput">ConstantCopyConstructible</code> which is of any type <code class="computeroutput">T</code> that has a constant-correct copy constructor of the form:</p>
+<pre class="programlisting"> <span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span><span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">source</span> <span class="special">)</span> <span class="special">;</span>
+</pre>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody><tr>
+<td><span class="bold"><strong><code class="computeroutput">T</code></strong></span></td>
+<td>The type of the value to copy (it is either the result type of the type of an old-of expression). </td>
+</tr></tbody>
+</table></div>
+<p>
+</p>
+<p>Programmers can specialize this class template to copy a specific type differently (and even for types that are not <code class="computeroutput">ConstantCopyConstructible</code>, or not <code class="computeroutput">CopyConstructible</code> at all).</p>
+<p><span class="bold"><strong>Warning:</strong></span> When specializing this class template, programmers must make sure that their code is constant-correct otherwise the contracts will no longer be constant-correct.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="../contract__/advanced_topics.html" title="Advanced Topics"> Advanced Topics</a> section. </p>
+<div class="refsect2">
+<a name="id1100847"></a><h3>
+<a name="contract.copyconstruct-copy-destruct"></a><code class="computeroutput">copy</code>
+ public
+ construct/copy/destruct</h3>
+<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">
+<pre class="literallayout"><span class="keyword">explicit</span> <a name="id553927-bb"></a><span class="identifier">copy</span><span class="special">(</span><span class="identifier">const_reference_type</span> value<span class="special">)</span><span class="special">;</span></pre>Construct this object copying the specified value assuming <code class="computeroutput">T</code> has a constant-correct copy constructor. </li></ol></div>
+</div>
+<div class="refsect2">
+<a name="id1100900"></a><h3>
+<a name="id553911-bb"></a><code class="computeroutput">copy</code> public member functions</h3>
+<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">
+<pre class="literallayout"><span class="identifier">const_reference_type</span> <a name="id553914-bb"></a><span class="identifier">value</span><span class="special">(</span><span class="keyword">void</span><span class="special">)</span> <span class="keyword">const</span><span class="special">;</span></pre>Return a constant reference to the copied value. </li></ol></div>
+</div>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../CONTRACT_CONSTRUCTOR_TPL.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html#header.contract.copy_hpp"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../CONTRACT_DESTRUCTOR.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/contract/from.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/contract/from.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,72 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Type from</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="../reference.html#header.contract.broken_hpp" title="Header <contract/broken.hpp>">
+<link rel="prev" href="broken.html" title="Class broken">
+<link rel="next" href="broken_contract_handler.html" title="Type definition broken_contract_handler">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="broken.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html#header.contract.broken_hpp"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="broken_contract_handler.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="contract.from"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Type from</span></h2>
+<p>contract::from — Specify the context from which the contract assertion failed. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="../reference.html#header.contract.broken_hpp" title="Header <contract/broken.hpp>">contract/broken.hpp</a>>
+
+</span>
+
+<span class="keyword">enum</span> <span class="identifier">from</span> <span class="special">{</span> <a class="link" href="from.html#contract.from.FROM_CONSTRUCTOR">FROM_CONSTRUCTOR</a>, <a class="link" href="from.html#contract.from.FROM_DESTRUCTOR">FROM_DESTRUCTOR</a>, <a class="link" href="from.html#contract.from.FROM_NONSTATIC_MEMBER_FUNCTION">FROM_NONSTATIC_MEMBER_FUNCTION</a>,
+ <a class="link" href="from.html#contract.from.FROM_STATIC_MEMBER_FUNCTION">FROM_STATIC_MEMBER_FUNCTION</a>, <a class="link" href="from.html#contract.from.FROM_FREE_FUNCTION">FROM_FREE_FUNCTION</a>, <a class="link" href="from.html#contract.from.FROM_BODY">FROM_BODY</a> <span class="special">}</span><span class="special">;</span></pre></div>
+<div class="refsect1">
+<a name="id1097708"></a><h2>Description</h2>
+<p>This information is important because in order to comply with STL exception safety requirements, destructors shall never throw an exception. Therefore, even if programmers customize the contract broken handlers to throw an exception instead of terminating the program, it is still important to know at least if the assertion failed from a destructor's contract so programmers can avoid throwing an exception from the broken handlers in such a case.</p>
+<p><span class="bold"><strong>Note:</strong></span> All the different contexts identified by this enumeration have different contract checking semantics (see also <a class="link" href="../contract__/contract_programming_overview.html" title="Contract Programming Overview"> Contract Programming Overview</a>) so it might be relevant to differentiate between them in the contract broken handlers.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="../contract__/advanced_topics.html" title="Advanced Topics"> Advanced Topics</a> section. </p>
+<div class="variablelist"><dl>
+<dt><span class="term"><code class="computeroutput">FROM_CONSTRUCTOR</code><a name="contract.from.FROM_CONSTRUCTOR"></a></span></dt>
+<dd>Assertion failed from within constructor contracts. </dd>
+<dt><span class="term"><code class="computeroutput">FROM_DESTRUCTOR</code><a name="contract.from.FROM_DESTRUCTOR"></a></span></dt>
+<dd>Assertion failed from within destructor contracts. </dd>
+<dt><span class="term"><code class="computeroutput">FROM_NONSTATIC_MEMBER_FUNCTION</code><a name="contract.from.FROM_NONSTATIC_MEMBER_FUNCTION"></a></span></dt>
+<dd>Assertion failed from within non-static member function contracts. </dd>
+<dt><span class="term"><code class="computeroutput">FROM_STATIC_MEMBER_FUNCTION</code><a name="contract.from.FROM_STATIC_MEMBER_FUNCTION"></a></span></dt>
+<dd>Assertion failed from within static member function contracts. </dd>
+<dt><span class="term"><code class="computeroutput">FROM_FREE_FUNCTION</code><a name="contract.from.FROM_FREE_FUNCTION"></a></span></dt>
+<dd>Assertion failed from within free function contracts. </dd>
+<dt><span class="term"><code class="computeroutput">FROM_BODY</code><a name="contract.from.FROM_BODY"></a></span></dt>
+<dd>Assertion failed from within body contracts (for both block invariants and loop variants). </dd>
+</dl></div>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="broken.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html#header.contract.broken_hpp"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="broken_contract_handler.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/contract/has_oldof.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/contract/has_oldof.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,71 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Struct template has_oldof</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="../reference.html#header.contract.oldof_hpp" title="Header <contract/oldof.hpp>">
+<link rel="prev" href="../CONTRACT_LOOP_VARIANT_TPL.html" title="Macro CONTRACT_LOOP_VARIANT_TPL">
+<link rel="next" href="../CONTRACT_OLDOF.html" title="Macro CONTRACT_OLDOF">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../CONTRACT_LOOP_VARIANT_TPL.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html#header.contract.oldof_hpp"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../CONTRACT_OLDOF.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="contract.has_oldof"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Struct template has_oldof</span></h2>
+<p>contract::has_oldof — Trait used to determine if a type can be copied for an old value or not. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="../reference.html#header.contract.oldof_hpp" title="Header <contract/oldof.hpp>">contract/oldof.hpp</a>>
+
+</span><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> OldofExpressionType<span class="special">></span>
+<span class="keyword">struct</span> <a class="link" href="has_oldof.html" title="Struct template has_oldof">has_oldof</a> <span class="special">{</span>
+<span class="special">}</span><span class="special">;</span></pre></div>
+<div class="refsect1">
+<a name="id1103174"></a><h2>Description</h2>
+<p>A type can be used for a postcondition old value if and only if it can be copied using the <code class="computeroutput"><a class="link" href="copy.html" title="Class template copy">contract::copy</a></code> template. By default, all types that have a constant-correct copy constructor (i.e., that are <code class="computeroutput">ConstantCopyConstructible</code>) can be copied by <code class="computeroutput"><a class="link" href="copy.html" title="Class template copy">contract::copy</a></code>.</p>
+<p>If a type cannot be copied, an old value declaration using such a type will not fail but it will generate an old value that will cause a compile-time error as soon as it is used in a contract assertion. Therefore, this trait can be used to program assertion requirements for those assertions that use old values on generic types that are not always known to be copyable. This way, the assertions will be disabled by the requirement instead of generating a compile-time error when the old values they use cannot be copied.</p>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody><tr>
+<td><span class="bold"><strong><code class="computeroutput">OldofExpressionType</code></strong></span></td>
+<td>The type of the expression specified to the <code class="computeroutput"><a class="link" href="../CONTRACT_OLDOF.html" title="Macro CONTRACT_OLDOF">CONTRACT_OLDOF</a></code> macro for a given postcondition old value declaration. </td>
+</tr></tbody>
+</table></div>
+<p>
+</p>
+<p>Unfortunately, in C++ it is not possible to portably implement a template meta-function that checks if a generic type has a constant-correct copy constructor (or even just a copy constructor). Therefore, the default implementation of this trait is <code class="computeroutput">boost::mpl::true_</code> for any type <code class="computeroutput">OdlofExpressionType</code>. This will cause compile-time errors for old value types that cannot be copied in which case users can specialize this unary boolean meta-function to inherit from <code class="computeroutput">boost::mpl::false_</code> for such types.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="../contract__/advanced_topics.html" title="Advanced Topics"> Advanced Topics</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../CONTRACT_LOOP_VARIANT_TPL.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html#header.contract.oldof_hpp"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../CONTRACT_OLDOF.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/contract/loop_variant_broken.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/contract/loop_variant_broken.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,69 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Function loop_variant_broken</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="../reference.html#header.contract.broken_hpp" title="Header <contract/broken.hpp>">
+<link rel="prev" href="block_invariant_broken.html" title="Function block_invariant_broken">
+<link rel="next" href="../CONTRACT_CLASS.html" title="Macro CONTRACT_CLASS">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="block_invariant_broken.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html#header.contract.broken_hpp"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../CONTRACT_CLASS.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="contract.loop_variant_broken"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Function loop_variant_broken</span></h2>
+<p>contract::loop_variant_broken — Broken handler called when a loop variant assertion fails. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="../reference.html#header.contract.broken_hpp" title="Header <contract/broken.hpp>">contract/broken.hpp</a>>
+
+</span>
+<span class="keyword">void</span> <span class="identifier">loop_variant_broken</span><span class="special">(</span><span class="identifier">from</span> <span class="keyword">const</span> <span class="special">&</span> context<span class="special">)</span><span class="special">;</span></pre></div>
+<div class="refsect1">
+<a name="id1098760"></a><h2>Description</h2>
+<p>By default, it prints information about the failed assertion to <code class="computeroutput">std::cerr</code> and it calls <code class="computeroutput">std::terminate</code>. However, it can be customized using <code class="computeroutput"><code class="computeroutput"><a class="link" href="../reference.html#contract.set_loop_variant_broken">contract::set_loop_variant_broken</a></code></code> (even to throw exceptions, but programmers should be careful to never throw from destructors).</p>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody><tr>
+<td><span class="bold"><strong><code class="computeroutput">context</code></strong></span></td>
+<td>Context from which the loop variants assertion failed (i.e., the body). </td>
+</tr></tbody>
+</table></div>
+<p>
+</p>
+<p>This handler is automatically called by the library in case of a loop invariant assertion failure (an assertion fails if it is not evaluated to be true, so if it is evaluated to be false but also if it cannot be evaluated because an exception is thrown by the asserted condition).</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="../contract__/advanced_topics.html" title="Advanced Topics"> Advanced Topics</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="block_invariant_broken.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html#header.contract.broken_hpp"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../CONTRACT_CLASS.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/contract/postcondition_broken.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/contract/postcondition_broken.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,69 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Function postcondition_broken</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="../reference.html#header.contract.broken_hpp" title="Header <contract/broken.hpp>">
+<link rel="prev" href="precondition_broken.html" title="Function precondition_broken">
+<link rel="next" href="class_invariant_b_id552579.html" title="Function class_invariant_broken_on_entry">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="precondition_broken.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html#header.contract.broken_hpp"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="class_invariant_b_id552579.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="contract.postcondition_broken"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Function postcondition_broken</span></h2>
+<p>contract::postcondition_broken — Broken handler called when a postcondition assertion fails. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="../reference.html#header.contract.broken_hpp" title="Header <contract/broken.hpp>">contract/broken.hpp</a>>
+
+</span>
+<span class="keyword">void</span> <span class="identifier">postcondition_broken</span><span class="special">(</span><span class="identifier">from</span> <span class="keyword">const</span> <span class="special">&</span> context<span class="special">)</span><span class="special">;</span></pre></div>
+<div class="refsect1">
+<a name="id1098132"></a><h2>Description</h2>
+<p>By default, it prints information about the failed assertion to <code class="computeroutput">std::cerr</code> and it calls <code class="computeroutput">std::terminate</code>. However, it can be customized using <code class="computeroutput"><code class="computeroutput"><a class="link" href="../reference.html#contract.set_postcondition_broken">contract::set_postcondition_broken</a></code></code> (even to throw exceptions).</p>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody><tr>
+<td><span class="bold"><strong><code class="computeroutput">context</code></strong></span></td>
+<td>Context from which the postcondition assertion failed. </td>
+</tr></tbody>
+</table></div>
+<p>
+</p>
+<p>This handler is automatically called by the library in case of a postcondition assertion failure (an assertion fails if it is not evaluated to be true, so if it is evaluated to be false but also if it cannot be evaluated because an exception is thrown by the asserted condition).</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="../contract__/advanced_topics.html" title="Advanced Topics"> Advanced Topics</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="precondition_broken.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html#header.contract.broken_hpp"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="class_invariant_b_id552579.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/contract/precondition_broken.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/contract/precondition_broken.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,69 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Function precondition_broken</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="../reference.html#header.contract.broken_hpp" title="Header <contract/broken.hpp>">
+<link rel="prev" href="broken_contract_handler.html" title="Type definition broken_contract_handler">
+<link rel="next" href="postcondition_broken.html" title="Function postcondition_broken">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="broken_contract_handler.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html#header.contract.broken_hpp"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="postcondition_broken.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="refentry">
+<a name="contract.precondition_broken"></a><div class="titlepage"></div>
+<div class="refnamediv">
+<h2><span class="refentrytitle">Function precondition_broken</span></h2>
+<p>contract::precondition_broken — Broken handler called when a precondition assertion fails. </p>
+</div>
+<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
+<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: <<a class="link" href="../reference.html#header.contract.broken_hpp" title="Header <contract/broken.hpp>">contract/broken.hpp</a>>
+
+</span>
+<span class="keyword">void</span> <span class="identifier">precondition_broken</span><span class="special">(</span><span class="identifier">from</span> <span class="keyword">const</span> <span class="special">&</span> context<span class="special">)</span><span class="special">;</span></pre></div>
+<div class="refsect1">
+<a name="id1098006"></a><h2>Description</h2>
+<p>By default, it prints information about the failed assertion to <code class="computeroutput">std::cerr</code> and it calls <code class="computeroutput">std::terminate</code>. However, it can be customized using <code class="computeroutput"><code class="computeroutput"><a class="link" href="../reference.html#contract.set_precondition_broken">contract::set_precondition_broken</a></code></code> (even to throw exceptions).</p>
+<p><span class="bold"><strong>Parameters:</strong></span> </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<tbody><tr>
+<td><span class="bold"><strong><code class="computeroutput">context</code></strong></span></td>
+<td>Context from which the precondition assertion failed. </td>
+</tr></tbody>
+</table></div>
+<p>
+</p>
+<p>This handler is automatically called by the library in case of a precondition assertion failure (an assertion fails if it is not evaluated to be true, so if it is evaluated to be false but also if it cannot be evaluated because an exception is thrown by the asserted condition).</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="../contract__/advanced_topics.html" title="Advanced Topics"> Advanced Topics</a> section. </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="broken_contract_handler.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html#header.contract.broken_hpp"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="postcondition_broken.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/contract__/acknowledgments.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/contract__/acknowledgments.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,93 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Acknowledgments</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="prev" href="bibliography.html" title="Bibliography">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="bibliography.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="contract__.acknowledgments"></a><a class="link" href="acknowledgments.html" title="Acknowledgments">Acknowledgments</a>
+</h2></div></div></div>
+<p>
+ This section aims to recognize the contributions of <span class="emphasis"><em>all</em></span>
+ the different people that participated directly or indirectly to the design
+ and development of this library.
+ </p>
+<p>
+ Sincere thanks to my parents for their support with my education and my studies
+ in computer science.
+ </p>
+<p>
+ Sincere thanks to Marina for her kindness and continuous support.
+ </p>
+<p>
+ Many thanks to Bertrand Meyer for his pioneering and thorough work on Contract
+ Programming in <a class="link" href="bibliography.html#Meyer97_anchor">[Meyer97]</a>.
+ </p>
+<p>
+ Many thanks to Thorsten Ottosen for his work with <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a>
+ (and previous revisions) and for clarifying the <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a>
+ requirements directly with the library authors when needed.
+ </p>
+<p>
+ Many thanks to Andrzej Krzemienski for reviewing earlier versions of this library
+ providing valuable insights, for exchanging ideas on implementing assertion
+ requirements, and for suggesting to support named parameters.
+ </p>
+<p>
+ Many thanks to Vicente J. Botet Escriba for reviewing earlier versions of this
+ library providing valuable insights and for suggesting to use <code class="computeroutput"><span class="identifier">contract</span><span class="special">::</span><span class="identifier">copy</span></code>.
+ </p>
+<p>
+ Thanks to Steven Watanabe for providing valuable insights on C++ and for hinting
+ to use template meta-programming introspection to detect if a base class has
+ a given member function (technique which turned out to be essential to fully
+ automate subcontracting).
+ </p>
+<p>
+ Thanks to Dave Abrahams for providing valuable comments on the library syntax
+ and especially on the syntax to support named parameters.
+ </p>
+<p>
+ Thanks to David Maley for having shared source code form his inspiring work
+ in <a class="link" href="bibliography.html#Maley99_anchor">[Maley99]</a> on emulating Contract Programming
+ in C++.
+ </p>
+<p>
+ Finally, many thanks to the entire Boost
+ community and mailing list for
+ providing valuable comments about this library and great insights on the C++
+ programming language.
+ </p>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="bibliography.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/contract__/advanced_topics.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/contract__/advanced_topics.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,2674 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Advanced Topics</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="prev" href="tutorial.html" title="Tutorial">
+<link rel="next" href="virtual_specifiers.html" title="Virtual Specifiers">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="tutorial.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="virtual_specifiers.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="contract__.advanced_topics"></a><a class="link" href="advanced_topics.html" title="Advanced Topics">Advanced Topics</a>
+</h2></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="advanced_topics.html#contract__.advanced_topics.commas_and_leading_symbols_in_macros">Commas
+ and Leading Symbols in Macros</a></span></dt>
+<dt><span class="section"><a href="advanced_topics.html#contract__.advanced_topics.static_assertions">Static
+ Assertions</a></span></dt>
+<dt><span class="section"><a href="advanced_topics.html#contract__.advanced_topics.constant_assertions">Constant
+ Assertions</a></span></dt>
+<dt><span class="section"><a href="advanced_topics.html#contract__.advanced_topics.select_assertions">Select
+ Assertions</a></span></dt>
+<dt><span class="section"><a href="advanced_topics.html#contract__.advanced_topics.assertion_statements">Assertion
+ Statements</a></span></dt>
+<dt><span class="section"><a href="advanced_topics.html#contract__.advanced_topics.assertion_requirements">Assertion
+ Requirements</a></span></dt>
+<dt><span class="section"><a href="advanced_topics.html#contract__.advanced_topics.old_of_requirements">Old-Of
+ Requirements</a></span></dt>
+<dt><span class="section"><a href="advanced_topics.html#contract__.advanced_topics.old_and_result_value_copies">Old
+ and Result Value Copies</a></span></dt>
+<dt><span class="section"><a href="advanced_topics.html#contract__.advanced_topics.pure_virtual_functions">Pure
+ Virtual Functions</a></span></dt>
+<dt><span class="section"><a href="advanced_topics.html#contract__.advanced_topics.subcontracting_preconditions">Subcontracting
+ Preconditions</a></span></dt>
+<dt><span class="section"><a href="advanced_topics.html#contract__.advanced_topics.static_member_functions">Static
+ Member Functions</a></span></dt>
+<dt><span class="section"><a href="advanced_topics.html#contract__.advanced_topics.volatile_member_functions">Volatile
+ Member Functions</a></span></dt>
+<dt><span class="section">Operators</span></dt>
+<dt><span class="section">Nested Classes</span></dt>
+<dt><span class="section">Friends</span></dt>
+<dt><span class="section"><a href="advanced_topics.html#contract__.advanced_topics.template_specializations">Template
+ Specializations</a></span></dt>
+<dt><span class="section"><a href="advanced_topics.html#contract__.advanced_topics.exception_specifications_and_function_try_blocks">Exception
+ Specifications and Function-Try Blocks</a></span></dt>
+<dt><span class="section"><a href="advanced_topics.html#contract__.advanced_topics.specifying_types__no_boost_typeof_">Specifying
+ Types (no Boost.Typeof)</a></span></dt>
+<dt><span class="section"><a href="advanced_topics.html#contract__.advanced_topics.block_invariants_and_loop_variants">Block
+ Invariants and Loop Variants</a></span></dt>
+<dt><span class="section"><a href="advanced_topics.html#contract__.advanced_topics.contract_broken_handlers__throw_on_failure_">Contract
+ Broken Handlers (Throw on Failure)</a></span></dt>
+</dl></div>
+<p>
+ This section explains advanced usages of this library in programming contracts.
+ See the <a class="link" href="grammar.html" title="Grammar">Grammar</a> section for a complete
+ guide on this library syntax.
+ </p>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.advanced_topics.commas_and_leading_symbols_in_macros"></a><a class="link" href="advanced_topics.html#contract__.advanced_topics.commas_and_leading_symbols_in_macros" title="Commas and Leading Symbols in Macros">Commas
+ and Leading Symbols in Macros</a>
+</h3></div></div></div>
+<p>
+ C++ macros cannot correctly parse a macro parameter if it contains a comma
+ <code class="computeroutput"><span class="special">,</span></code> that is not wrapped within
+ round parenthesis <code class="computeroutput"><span class="special">()</span></code> (because
+ the preprocessor interprets such a comma as separation between two distinct
+ macro parameters instead that as part of one single macro parameter, see
+ also Boost.Utility/IdentityType).
+ Furthermore, syntactic elements specified to this library macros cannot start
+ with a non-alphanumeric symbol (<code class="computeroutput"><span class="special">-</span><span class="number">1</span></code>, <code class="computeroutput"><span class="number">1.23</span></code>,
+ <code class="computeroutput"><span class="string">"abc"</span></code>, <code class="computeroutput"><span class="special">::</span></code>, etc). <sup>[<a name="contract__.advanced_topics.commas_and_leading_symbols_in_macros.f0" href="#ftn.contract__.advanced_topics.commas_and_leading_symbols_in_macros.f0" class="footnote">35</a>]</sup> For example, the parameter type <code class="computeroutput"><span class="special">::</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="identifier">OtherKey</span><span class="special">,</span> <span class="identifier">OtherT</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span></code> cannot be passed to this library for
+ two reasons: It starts with the non-alphanumeric symbol <code class="computeroutput"><span class="special">::</span></code>
+ and it contains the comma <code class="computeroutput"><span class="identifier">OtherKey</span><span class="special">,</span> <span class="identifier">OtherT</span></code>
+ which is not wrapped by round parenthesis.
+ </p>
+<p>
+ The Boost.Utility/IdentityType
+ macro <code class="computeroutput"><span class="identifier">BOOST_IDENTITY_TYPE</span></code>
+ can be used as usual to overcome this issue. However, using the <code class="computeroutput"><span class="identifier">BOOST_IDENTITY_TYPE</span></code> macro presents two
+ limitations: It makes the syntax of this library macros more cumbersome and,
+ more importantly, it does not allow C++ to automatically deduce function
+ template parameters (see Boost.Utility/IdentityType
+ for more information). Therefore, the syntax of this library provides an
+ alternative to <code class="computeroutput"><span class="identifier">BOOST_IDENTITY_TYPE</span></code>
+ to handle commas and leading symbols within macro parameters:
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ Commas and leading symbols can be used freely within elements of the
+ syntax that already require wrapping parenthesis (e.g., non-fundamental
+ parameter types <code class="computeroutput"><span class="special">(::</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="identifier">OtherKey</span><span class="special">,</span> <span class="identifier">OtherT</span><span class="special">></span> <span class="keyword">const</span><span class="special">&)</span></code>).
+ </li>
+<li class="listitem">
+ Extra parenthesis can always be used to wrap elements of the syntax that
+ might contain commas and leading symbols (e.g, the base class type <code class="computeroutput"><span class="keyword">public</span> <span class="special">(::</span><span class="identifier">sizeable</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>)</span></code>).
+ </li>
+<li class="listitem">
+ Extra parenthesis can always be used to wrap value expressions so they
+ can contain commas and leading symbols (e.g., a class invariants assertion
+ <code class="computeroutput"><span class="special">(::</span><span class="identifier">sizeable</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>::</span><span class="identifier">max_size</span>
+ <span class="special">>=</span> <span class="identifier">size</span><span class="special">())</span></code>).
+ </li>
+</ol></div>
+<p>
+ For example (see also macro_commas_symbols_integral_map.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span>
+ <span class="keyword">typename</span> <span class="identifier">Key</span><span class="special">,</span>
+ <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="comment">// Commas in following template params.</span>
+ <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">,</span>
+ <span class="keyword">default</span> <span class="special">(::</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="identifier">Key</span> <span class="keyword">const</span><span class="special">,</span> <span class="identifier">T</span><span class="special">></span> <span class="special">>),</span>
+ <span class="special">(</span><span class="keyword">typename</span> <span class="special">::</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>::</span><span class="identifier">key_type</span><span class="special">)</span> <span class="identifier">default_key</span><span class="special">,</span>
+ <span class="keyword">default</span> <span class="special">(-</span><span class="number">1</span><span class="special">)</span>
+ <span class="special">)</span> <span class="keyword">requires</span><span class="special">(</span> <span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">Convertible</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span> <span class="keyword">int</span><span class="special">>)</span> <span class="special">)</span> <span class="comment">// Commas in concepts.</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">integral_map</span><span class="special">)</span>
+ <span class="keyword">extends</span><span class="special">(</span> <span class="keyword">public</span> <span class="special">(::</span><span class="identifier">sizeable</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>)</span> <span class="special">)</span> <span class="comment">// Commas in bases.</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span> <span class="comment">// Commas in class invariants.</span>
+ <span class="special">(::</span><span class="identifier">sizeable</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>::</span><span class="identifier">max_size</span><span class="special">)</span> <span class="special">>=</span> <span class="identifier">size</span><span class="special">()</span>
+ <span class="special">)</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">less</span><span class="special"><</span><span class="identifier">Key</span><span class="special">>,</span> <span class="identifier">Allocator</span><span class="special">>::</span>
+ <span class="identifier">iterator</span> <span class="identifier">iterator</span><span class="special">;</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">OtherKey</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">OtherT</span> <span class="special">)</span>
+ <span class="keyword">requires</span><span class="special">(</span>
+ <span class="special">(::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">Convertible</span><span class="special"><</span><span class="identifier">OtherKey</span><span class="special">,</span> <span class="identifier">Key</span><span class="special">>),</span>
+ <span class="special">(::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">Convertible</span><span class="special"><</span><span class="identifier">OtherT</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>)</span>
+ <span class="special">)</span>
+ <span class="special">(::</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="identifier">iterator</span><span class="special">,</span> <span class="keyword">bool</span><span class="special">>)</span> <span class="special">(</span><span class="identifier">insert</span><span class="special">)</span> <span class="special">(</span> <span class="comment">// Commas in result and params.</span>
+ <span class="special">(::</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="identifier">OtherKey</span><span class="special">,</span> <span class="identifier">OtherT</span><span class="special">></span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">other_value</span><span class="special">,</span>
+ <span class="keyword">default</span> <span class="special">(::</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>(</span><span class="identifier">default_key</span><span class="special">,</span> <span class="identifier">T</span><span class="special">()))</span>
+ <span class="special">)</span> <span class="keyword">throw</span><span class="special">(</span> <span class="special">(::</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>)</span> <span class="special">)</span> <span class="comment">// Commas in exception specs.</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="comment">// Leading symbols in preconditions (same for commas).</span>
+ <span class="special">((!</span><span class="identifier">full</span><span class="special">()))</span> <span class="comment">// LIMITATION: Two sets `((...))` (otherwise seq.).</span>
+ <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="comment">// Commas in postconditions.</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="special">(</span><span class="keyword">typename</span> <span class="identifier">sizeable</span><span class="special"><</span><span class="identifier">OtherKey</span><span class="special">,</span> <span class="identifier">OtherT</span><span class="special">>::</span><span class="identifier">size_type</span><span class="special">)</span>
+ <span class="identifier">old_other_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span>
+ <span class="special">(</span><span class="identifier">size</span><span class="special"><</span><span class="identifier">OtherKey</span><span class="special">,</span> <span class="identifier">OtherT</span><span class="special">>()),</span>
+ <span class="special">(::</span><span class="identifier">sizeable</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>::</span><span class="identifier">max_size</span><span class="special">)</span> <span class="special">>=</span> <span class="identifier">size</span><span class="special">(),</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_other_size</span> <span class="special">+</span> <span class="special">(</span><span class="identifier">result</span><span class="special">.</span><span class="identifier">second</span> <span class="special">?</span> <span class="number">1</span> <span class="special">:</span> <span class="number">0</span><span class="special">)</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// ...</span>
+</pre>
+<p>
+ </p>
+<p>
+ (Concepts and other advanced constructs used in this example are explained
+ in the rest of this section and in later sections of this documentation.)
+ </p>
+<p>
+ All these extra wrapping parenthesis are optional when there is no unwrapped
+ comma and no leading symbol. Programmers could chose to always program the
+ extra parenthesis for consistency but it is the authors' opinion that the
+ syntax is harder to read with the extra parenthesis so it is recommended
+ to use them only when strictly necessary.
+ </p>
+<p>
+ It is also recommended to avoid using commas and leading symbols whenever
+ possible so to limit the cases when it is necessary to use the extra wrapping
+ parenthesis. For example, in many cases the leading symbol <code class="computeroutput"><span class="special">::</span></code> might not be necessary and leading symbols
+ like <code class="computeroutput"><span class="special">!</span></code> can be replaced by the
+ alternative keywords like <code class="computeroutput"><span class="keyword">not</span></code>.
+ Furthermore, in some cases <code class="computeroutput"><span class="keyword">typedef</span></code>
+ can be programmed just before class and function declarations to avoid passing
+ types within multiple template parameters separated by commas. Declarations
+ of class templates and function templates are the most common cases were
+ commas cannot be avoided and extra wrapping parenthesis are necessarily used.
+ </p>
+<div class="warning"><table border="0" summary="Warning">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
+<th align="left">Warning</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ Preconditions, postconditions, and class invariants composed of one single
+ assertion that needs to be wrapped within extra parenthesis need to use
+ double parenthesis (this should be a relatively rare case). <sup>[<a name="contract__.advanced_topics.commas_and_leading_symbols_in_macros.f1" href="#ftn.contract__.advanced_topics.commas_and_leading_symbols_in_macros.f1" class="footnote">36</a>]</sup> This is the case in the above example for <code class="computeroutput"><span class="keyword">precondition</span><span class="special">(</span> <span class="special">((!</span><span class="identifier">full</span><span class="special">()))</span> <span class="special">)</span></code> (but
+ note that these extra parenthesis could have been avoided all together
+ simply using <code class="computeroutput"><span class="keyword">not</span></code> instead of
+ <code class="computeroutput"><span class="special">!</span></code> as in the more readable
+ <code class="computeroutput"><span class="keyword">precondition</span><span class="special">(</span>
+ <span class="keyword">not</span> <span class="identifier">full</span><span class="special">()</span> <span class="special">)</span></code>).
+ </p></td></tr>
+</table></div>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.advanced_topics.static_assertions"></a><a class="link" href="advanced_topics.html#contract__.advanced_topics.static_assertions" title="Static Assertions">Static
+ Assertions</a>
+</h3></div></div></div>
+<p>
+ This library allows to use <a href="http://en.wikipedia.org/wiki/C%2B%2B11#Static_assertions" target="_top"><span class="emphasis"><em>static
+ assertions</em></span></a> to program preconditions, postconditions, class
+ invariants, and block invariants so that they are checked at compile-time
+ instead of at run-time. The C++11
+ syntax is used (but Boost.MPL
+ <code class="computeroutput"><span class="identifier">BOOST_MPL_ASSERT_MSG</span></code> is used
+ to implement static assertions so no C++11
+ feature is required):
+ </p>
+<pre class="programlisting"><span class="keyword">static_assert</span><span class="special">(</span><span class="emphasis"><em>constant-boolean-condition</em></span><span class="special">,</span> <span class="emphasis"><em>constant-string-literal</em></span><span class="special">)</span>
+</pre>
+<p>
+ For example (see also static_assertion_memcopy.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">To</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">From</span> <span class="special">)</span>
+ <span class="special">(</span><span class="identifier">To</span><span class="special">*)</span> <span class="special">(</span><span class="identifier">memcopy</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">To</span><span class="special">*)</span> <span class="identifier">to</span><span class="special">,</span> <span class="special">(</span><span class="identifier">From</span><span class="special">*)</span> <span class="identifier">from</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="comment">// Static assertions.</span>
+ <span class="keyword">static_assert</span><span class="special">(</span><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">To</span><span class="special">)</span> <span class="special">>=</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">From</span><span class="special">),</span> <span class="string">"destination too small"</span><span class="special">),</span>
+ <span class="comment">// Wrapping parenthesis for asserted condition with commas.</span>
+ <span class="keyword">static_assert</span><span class="special">((</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_convertible</span><span class="special"><</span><span class="identifier">From</span><span class="special">,</span> <span class="identifier">To</span><span class="special">>::</span><span class="identifier">value</span><span class="special">),</span>
+ <span class="string">"incompatible types"</span><span class="special">),</span>
+ <span class="identifier">to</span><span class="special">,</span> <span class="comment">// pointer not null</span>
+ <span class="identifier">from</span> <span class="comment">// pointer not null</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">;</span>
+</pre>
+<p>
+ </p>
+<p>
+ Static assertions are always checked at compile-time (regardless of them
+ appearing in preconditions, postconditions, etc). However, static assertions
+ can be selectively disabled depending on where they are specified using
+ <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_PRECONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_PRECONDITIONS">CONTRACT_CONFIG_NO_PRECONDITIONS</a></code>,
+ <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_POSTCONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_POSTCONDITIONS">CONTRACT_CONFIG_NO_POSTCONDITIONS</a></code>,
+ etc so it is still important to logically associate them with preconditions,
+ postconditions, etc.
+ </p>
+<p>
+ The string message passed as the second parameter of <code class="computeroutput"><span class="keyword">static_assert</span></code>
+ is ignored by the current implementation of this library (but it could be
+ used by future revisions of this library that take advantage of C++11
+ features). It is recommended to always specify meaningful messages for static
+ assertions to increase the readability and documentation of contracts. Similarly,
+ it might be useful to put a short code comment following each assertions
+ (<code class="computeroutput"><span class="comment">// pointer not null</span></code>, etc) to
+ increase contract readability and documentation. <sup>[<a name="contract__.advanced_topics.static_assertions.f0" href="#ftn.contract__.advanced_topics.static_assertions.f0" class="footnote">37</a>]</sup>
+ </p>
+<p>
+ In case of a static assertion failure, this library will generated a compile-time
+ error containing text similar to the following:
+ </p>
+<pre class="programlisting">static_assertion_memcopy.cpp:18 ... ERROR_statically_checked_precondition_number_1_failed_at_line_18 ...
+</pre>
+<p>
+ This message is similar to the run-time assertion errors generated by this
+ library, note how it contains all the information to uniquely identify the
+ assertion that failed.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.advanced_topics.constant_assertions"></a><a class="link" href="advanced_topics.html#contract__.advanced_topics.constant_assertions" title="Constant Assertions">Constant
+ Assertions</a>
+</h3></div></div></div>
+<p>
+ As explained in the <a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.constant_correctness" title="Constant-Correctness">Constant-Correctness</a>
+ section, contract assertions shall not change the state of the program because
+ contracts are only supposed to check (and not to alter) the state of the
+ program. This library automatically makes member functions, function parameters,
+ function result, and old values constant so the compiler will correctly generate
+ an error if assertions mistakenly try to change the object, the function
+ parameters, the function result, or the old values (this should be sufficient
+ in most cases when programming contracts).
+ </p>
+<div class="important"><table border="0" summary="Important">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../doc/src/images/important.png"></td>
+<th align="left">Important</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ This library cannot automatically make constant other variables that might
+ be accessible by the contract assertions (e.g., global and static variables).
+ <sup>[<a name="contract__.advanced_topics.constant_assertions.f0" href="#ftn.contract__.advanced_topics.constant_assertions.f0" class="footnote">38</a>]</sup>
+ </p></td></tr>
+</table></div>
+<p>
+ This library provides <span class="emphasis"><em>constant assertions</em></span> that can be
+ used by programmers to explicitly make constant the variables used by the
+ asserted boolean expression:
+ </p>
+<pre class="programlisting"><span class="keyword">const</span><span class="special">(</span> <span class="emphasis"><em>variable1</em></span><span class="special">,</span> <span class="emphasis"><em>variable2</em></span><span class="special">,</span> <span class="special">...)</span> <span class="emphasis"><em>boolean-expression-using-variable1-variable2-...</em></span>
+</pre>
+<p>
+ The following example calculates the next even and odd numbers that are stored
+ (for some reason) in a global variable and static data member respectively
+ (see also const_assertion_number.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="keyword">unsigned</span> <span class="identifier">even</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">number</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">static</span> <span class="keyword">unsigned</span> <span class="identifier">odd</span><span class="special">;</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">next</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_even</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">even</span><span class="special">,</span>
+ <span class="keyword">auto</span> <span class="identifier">old_odd</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">odd</span><span class="special">,</span>
+ <span class="comment">// `[old_]even` and `[old_]odd` all `const&` within assertions.</span>
+ <span class="keyword">const</span><span class="special">(</span> <span class="identifier">even</span><span class="special">,</span> <span class="identifier">old_even</span> <span class="special">)</span> <span class="identifier">even</span> <span class="special">==</span> <span class="identifier">old_even</span> <span class="special">+</span> <span class="number">2</span><span class="special">,</span>
+ <span class="keyword">const</span><span class="special">(</span> <span class="identifier">odd</span><span class="special">,</span> <span class="identifier">old_odd</span> <span class="special">)</span> <span class="identifier">odd</span> <span class="special">==</span> <span class="identifier">old_odd</span> <span class="special">+</span> <span class="number">2</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">even</span> <span class="special">+=</span> <span class="number">2</span><span class="special">;</span>
+ <span class="identifier">odd</span> <span class="special">+=</span> <span class="number">2</span><span class="special">;</span>
+ <span class="special">}</span>
+<span class="special">};</span>
+
+<span class="keyword">unsigned</span> <span class="identifier">number</span><span class="special">::</span><span class="identifier">odd</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span>
+</pre>
+<p>
+ </p>
+<p>
+ Note know the postconditions use constant assertions to force the <code class="computeroutput"><span class="identifier">even</span></code> and <code class="computeroutput"><span class="identifier">odd</span></code>
+ variables to be constant within each boolean expression that evaluates the
+ assertion. If for example the assignment operator <code class="computeroutput"><span class="special">=</span></code>
+ were mistakenly used instead of the equality operator <code class="computeroutput"><span class="special">==</span></code>
+ in the above postconditions, the compiler would correctly generate an error.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.advanced_topics.select_assertions"></a><a class="link" href="advanced_topics.html#contract__.advanced_topics.select_assertions" title="Select Assertions">Select
+ Assertions</a>
+</h3></div></div></div>
+<p>
+ In the <a class="link" href="tutorial.html" title="Tutorial">Tutorial</a> section we have
+ used the ternary operator <code class="computeroutput"><span class="special">:?</span></code>
+ to program assertions that are guarded by a boolean condition:
+ </p>
+<pre class="programlisting"><span class="identifier">old_found</span> <span class="special">?</span> <span class="keyword">true</span> <span class="special">:</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">id</span><span class="special">)</span> <span class="special">!=</span> <span class="identifier">end</span><span class="special">(),</span>
+<span class="identifier">old_found</span> <span class="special">?</span> <span class="keyword">true</span> <span class="special">:</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_size</span> <span class="special">+</span> <span class="number">1</span>
+</pre>
+<p>
+ However, in cases like this one when the same boolean condition guards multiple
+ assertions, it might be more efficient to evaluate the guard condition only
+ once using one <span class="emphasis"><em>select assertion</em></span> instead of multiple
+ ternary operators <code class="computeroutput"><span class="special">:?</span></code>. In addition,
+ some programmers might find the select assertion syntax more readable than
+ the ternary operator <code class="computeroutput"><span class="special">:?</span></code>. For
+ example, the above guarded assertions could have been programmed using select
+ assertions as:
+ </p>
+<pre class="programlisting"><span class="keyword">if</span><span class="special">(</span><span class="keyword">not</span> <span class="identifier">old_found</span><span class="special">)</span> <span class="special">(</span> <span class="comment">// Guard condition evaluated only once.</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">id</span><span class="special">)</span> <span class="special">!=</span> <span class="identifier">end</span><span class="special">(),</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_size</span> <span class="special">+</span> <span class="number">1</span>
+<span class="special">)</span>
+</pre>
+<p>
+ Select assertion allow to specify an optional else-block:
+ </p>
+<pre class="programlisting"><span class="keyword">if</span><span class="special">(</span><span class="emphasis"><em>boolean-condition</em></span><span class="special">)</span> <span class="special">(</span> <span class="comment">// Round parenthesis `()`.</span>
+ <span class="special">...</span> <span class="comment">// Comma-separated assertions.</span>
+<span class="special">)</span> <span class="keyword">else</span> <span class="special">(</span> <span class="comment">// Else optional as usual.</span>
+ <span class="special">...</span> <span class="comment">// Comma-separated assertions.</span>
+<span class="special">)</span>
+</pre>
+<p>
+ Note that round parenthesis <code class="computeroutput"><span class="special">(</span> <span class="special">...</span> <span class="special">)</span></code> are
+ used to program the then-block and else-block instead of the usual C++ curly
+ parenthesis <code class="computeroutput"><span class="special">{</span> <span class="special">...</span>
+ <span class="special">}</span></code>: Select assertions can be nested
+ into one another (the <code class="computeroutput"><a class="link" href="../CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS.html" title="Macro CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS">CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS</a></code>
+ macro specifies the maximum nesting level for select assertions).
+ </p>
+<p>
+ For example, consider the postconditions of the following function which
+ calculates the factorial of a natural number (see also select_assertion_factorial.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">int</span> <span class="special">(</span><span class="identifier">factorial</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">n</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">n</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">>=</span> <span class="number">1</span><span class="special">,</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">n</span> <span class="special">==</span> <span class="number">0</span> <span class="keyword">or</span> <span class="identifier">n</span> <span class="special">==</span> <span class="number">1</span><span class="special">)</span> <span class="special">(</span> <span class="comment">// Select assertion, if-then statement.</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="number">1</span>
+ <span class="special">)</span> <span class="keyword">else</span> <span class="special">(</span> <span class="comment">// Select assertion, else statement (optional).</span>
+ <span class="comment">// Assertions disabled within assertion so recursion OK.</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">n</span> <span class="special">*</span> <span class="identifier">factorial</span><span class="special">(</span><span class="identifier">n</span> <span class="special">-</span> <span class="number">1</span><span class="special">)</span>
+ <span class="special">)</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">n</span> <span class="special">==</span> <span class="number">0</span> <span class="keyword">or</span> <span class="identifier">n</span> <span class="special">==</span> <span class="number">1</span><span class="special">)</span> <span class="keyword">return</span> <span class="number">1</span><span class="special">;</span>
+ <span class="keyword">else</span> <span class="keyword">return</span> <span class="identifier">n</span> <span class="special">*</span> <span class="identifier">factorial</span><span class="special">(</span><span class="identifier">n</span> <span class="special">-</span> <span class="number">1</span><span class="special">);</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+ Using the same syntax used for constant assertions, it is possible to force
+ all variables (global, static, etc) used to evaluate the if-condition of
+ the select assertion to be constant (see also const_select_assertion_factorial.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">n</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">int</span> <span class="special">(</span><span class="identifier">factorial</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="keyword">const</span><span class="special">(</span> <span class="identifier">n</span> <span class="special">)</span> <span class="identifier">n</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="keyword">const</span><span class="special">(</span> <span class="identifier">n</span> <span class="special">)</span> <span class="identifier">n</span> <span class="special">==</span> <span class="special">-</span><span class="number">1</span> <span class="keyword">or</span> <span class="identifier">n</span> <span class="special">==</span> <span class="number">0</span><span class="special">)</span> <span class="special">(</span> <span class="comment">// Constant-correct if-condition.</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="number">1</span>
+ <span class="special">)</span> <span class="keyword">else</span> <span class="special">(</span>
+ <span class="identifier">result</span> <span class="special">>=</span> <span class="number">1</span>
+ <span class="special">)</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">int</span> <span class="identifier">m</span> <span class="special">=</span> <span class="identifier">n</span><span class="special">;</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">m</span> <span class="special">==</span> <span class="number">0</span> <span class="keyword">or</span> <span class="identifier">m</span> <span class="special">==</span> <span class="number">1</span><span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="number">1</span><span class="special">;</span>
+ <span class="special">}</span> <span class="keyword">else</span> <span class="special">{</span>
+ <span class="special">--</span><span class="identifier">n</span><span class="special">;</span>
+ <span class="keyword">return</span> <span class="identifier">m</span> <span class="special">*</span> <span class="identifier">factorial</span><span class="special">();</span>
+ <span class="special">}</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.advanced_topics.assertion_statements"></a><a class="link" href="advanced_topics.html#contract__.advanced_topics.assertion_statements" title="Assertion Statements">Assertion
+ Statements</a>
+</h3></div></div></div>
+<p>
+ Only assertions can be programmed within the contracts while normal C++ statements
+ are not allowed. This is keeps contracts simple making programming errors
+ within the contracts less likely and therefore increasing the probably that
+ error-free contracts can properly check the correctness of the implementation.
+ </p>
+<p>
+ However, <code class="computeroutput"><span class="keyword">using</span></code> directives,
+ <code class="computeroutput"><span class="keyword">namespace</span></code> aliases, and <code class="computeroutput"><span class="keyword">typedef</span></code> statements are allowed within the
+ contracts because they only affect compilation (not altering the state of
+ the program at run-time) and they can be used to write more readable contracts
+ (for example, shortening namespaces within contract assertions). When used,
+ these statements have effect only locally within the preconditions, postconditions,
+ class invariants, etc where they appear. <sup>[<a name="contract__.advanced_topics.assertion_statements.f0" href="#ftn.contract__.advanced_topics.assertion_statements.f0" class="footnote">39</a>]</sup>
+ </p>
+<p>
+ For example (see also assertion_statement_ialloc.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="special">(</span><span class="identifier">T</span><span class="special">*)</span> <span class="special">(</span><span class="identifier">ialloc</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span>
+ <span class="keyword">namespace</span> <span class="identifier">mpl</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">,</span> <span class="comment">// Namespace aliasing.</span>
+ <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">,</span> <span class="comment">// Using directive.</span>
+ <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">allocator</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">pointer</span> <span class="identifier">ptr</span><span class="special">,</span> <span class="comment">// Type definition.</span>
+ <span class="keyword">static_assert</span><span class="special">(</span>
+ <span class="special">(</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">or_</span><span class="special"><</span>
+ <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">bool_</span><span class="special"><</span><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="special"><=</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="keyword">int</span><span class="special">)></span>
+ <span class="special">,</span> <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">bool_</span><span class="special"><</span><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">ptr</span><span class="special">)</span> <span class="special"><=</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="keyword">int</span><span class="special">*)></span>
+ <span class="special">>::</span><span class="identifier">value</span><span class="special">)</span>
+ <span class="special">,</span> <span class="string">"within max size"</span>
+ <span class="special">)</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="identifier">T</span><span class="special">*>(</span><span class="identifier">malloc</span><span class="special">(</span><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">T</span><span class="special">)));</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+ These statements follow their usual C++ syntax but they are terminated with
+ a comma <code class="computeroutput"><span class="special">,</span></code> instead of a semicolon
+ <code class="computeroutput"><span class="special">;</span></code>. (The <code class="computeroutput"><span class="identifier">BOOST_IDENTITY_TYPE</span></code>
+ macro can be used to wrap eventual commas within the <code class="computeroutput"><span class="keyword">typedef</span></code>
+ statement.)
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.advanced_topics.assertion_requirements"></a><a class="link" href="advanced_topics.html#contract__.advanced_topics.assertion_requirements" title="Assertion Requirements">Assertion
+ Requirements</a>
+</h3></div></div></div>
+<p>
+ In general, programming contract assertions can introduce a new set of requirements
+ on the types used by the program. Some of these type requirements might be
+ necessary only to program the assertions and they might not be required by
+ the implementation itself. In such cases, if the code is compiled with contracts
+ disabled (<code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_PRECONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_PRECONDITIONS">CONTRACT_CONFIG_NO_PRECONDITIONS</a></code>,
+ etc), the program might compile but it might no longer compile when contracts
+ are enabled because some of the types do not provide all the operations necessary
+ to check the contract assertions.
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ More in general, in some cases it might be acceptable or even desirable
+ to cause a compile-time error when a program uses types that do not provide
+ all the operations needed to check the contracts (because it is not possible
+ to fully check the correctness of the program). In these cases, programmers
+ specify contract assertions as we have seen so far (and maybe even use
+ concepts to explicitly specify the contract type requirements, see the
+ <a class="link" href="concepts.html" title="Concepts">Concepts</a> section).
+ </li>
+<li class="listitem">
+ However, in other cases it might be desirable that adding contracts to
+ a program does not change its type requirements and that assertions are
+ simply not checked when the types do not provide all the operations necessary
+ to evaluate the asserted conditions. In these cases, programmers can
+ use <span class="emphasis"><em>assertion requirements</em></span> to disable compilation
+ and run-time checking of specific assertions: <sup>[<a name="contract__.advanced_topics.assertion_requirements.f0" href="#ftn.contract__.advanced_topics.assertion_requirements.f0" class="footnote">40</a>]</sup>
+ </li>
+</ol></div>
+<pre class="programlisting"><span class="emphasis"><em>assertion</em></span><span class="special">,</span> <span class="keyword">requires</span> <span class="emphasis"><em>constant-boolean-expression</em></span>
+</pre>
+<p>
+ (The constant boolean expression of an assertion requirement can be wrapped
+ within round parenthesis <code class="computeroutput"><span class="special">()</span></code>
+ if it contains unwrapped commas.)
+ </p>
+<p>
+ Let's consider the STL <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code>
+ class template. This template normally does not require the value type <code class="computeroutput"><span class="identifier">T</span></code> to be EqualityComparable
+ (i.e., to have an equality operator <code class="computeroutput"><span class="special">==</span></code>),
+ it only requires <code class="computeroutput"><span class="identifier">T</span></code> to be
+ CopyConstructible
+ (i.e., to have a copy constructor). However, in order to check the following
+ <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">push_back</span></code> postcondition the type <code class="computeroutput"><span class="identifier">T</span></code> must to be EqualityComparable
:
+ </p>
+<pre class="programlisting"><span class="identifier">back</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">value</span> <span class="comment">// Compiler error if not `EqualityComparable<T>`.</span>
+</pre>
+<p>
+ Therefore, the EqualityComparable
+ requirement on <code class="computeroutput"><span class="identifier">T</span></code> is introduced
+ only by the contract assertions and it is not required by the <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code>
+ implementation.
+ </p>
+<p>
+ In some cases, programmers might want compilation to fail when <code class="computeroutput"><span class="identifier">T</span></code> is not EqualityComparable
+ because in these cases it is not possible to fully check the <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code>
+ contracts and therefore its correctness (in these cases programmers do not
+ specify assertion requirements and let the compilation fail, or even better
+ programmers can explicitly specify the assertion type requirements using
+ concepts which will also fail compilation but hopefully with more informative
+ error messages, see the <a class="link" href="concepts.html" title="Concepts">Concepts</a>
+ section).
+ </p>
+<p>
+ However, in other cases programmers might want to use the contracted version
+ of <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code> exactly
+ as they use the non-contracted version of the template and therefore without
+ failing compilation if <code class="computeroutput"><span class="identifier">T</span></code>
+ is not EqualityComparable
.
+ This can be achieved specifying assertion requirements for the <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">push_back</span></code> postcondition:
+ </p>
+<pre class="programlisting"><span class="identifier">back</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">value</span><span class="special">,</span> <span class="keyword">requires</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span> <span class="comment">// No error if not `EqualityComparable<T>`.</span>
+</pre>
+<p>
+ This postcondition will be checked only when <code class="computeroutput"><span class="identifier">T</span></code>
+ is EqualityComparable
,
+ otherwise the postcondition will be ignored causing no compilation error.
+ </p>
+<p>
+ For example (see also assertion_requirements_push_back.cpp
):
+ <sup>[<a name="contract__.advanced_topics.assertion_requirements.f1" href="#ftn.contract__.advanced_topics.assertion_requirements.f1" class="footnote">41</a>]</sup>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">/</span><span class="identifier">has_equal_to</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">vector</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special"><=</span> <span class="identifier">capacity</span><span class="special">(),</span>
+ <span class="identifier">capacity</span><span class="special">()</span> <span class="special"><=</span> <span class="identifier">max_size</span><span class="special">()</span>
+ <span class="comment">// ...</span>
+ <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">push_back</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">size</span><span class="special">()</span> <span class="special"><</span> <span class="identifier">max_size</span><span class="special">()</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">size</span><span class="special">(),</span>
+ <span class="keyword">auto</span> <span class="identifier">old_capacity</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">capacity</span><span class="special">(),</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_size</span> <span class="special">+</span> <span class="number">1</span><span class="special">,</span>
+ <span class="identifier">capacity</span><span class="special">()</span> <span class="special">>=</span> <span class="identifier">old_capacity</span><span class="special">,</span>
+ <span class="comment">// Requirements disable assertion if `T` has no `operator==`.</span>
+ <span class="identifier">back</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">value</span><span class="special">,</span> <span class="keyword">requires</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">value</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="comment">// ...</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">num</span> <span class="comment">// Not equality comparable.</span>
+<span class="special">{</span>
+ <span class="keyword">int</span> <span class="identifier">value</span><span class="special">;</span>
+ <span class="keyword">explicit</span> <span class="identifier">num</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">a_value</span> <span class="special">)</span> <span class="special">:</span> <span class="identifier">value</span><span class="special">(</span><span class="identifier">a_value</span><span class="special">)</span> <span class="special">{}</span>
+<span class="special">};</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">i</span><span class="special">;</span>
+ <span class="identifier">i</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="number">123</span><span class="special">);</span>
+
+ <span class="identifier">vector</span><span class="special"><</span><span class="identifier">num</span><span class="special">></span> <span class="identifier">n</span><span class="special">;</span>
+ <span class="identifier">n</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">num</span><span class="special">(</span><span class="number">123</span><span class="special">));</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="keyword">not</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">num</span><span class="special">>::</span><span class="identifier">value</span><span class="special">);</span>
+
+ <span class="comment">// ...</span>
+</pre>
+<p>
+ </p>
+<p>
+ The <code class="computeroutput"><span class="identifier">i</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="number">123</span><span class="special">)</span></code> call will
+ check the postcondition <code class="computeroutput"><span class="identifier">back</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">value</span></code>
+ because <code class="computeroutput"><span class="keyword">int</span></code> is EqualityComparable
+ and the assertion requirement <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="keyword">int</span><span class="special">>::</span><span class="identifier">value</span></code> is true. However, the <code class="computeroutput"><span class="identifier">n</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">num</span><span class="special">(</span><span class="number">123</span><span class="special">))</span></code> call
+ will not check, and in fact not even compile, the postconditions <code class="computeroutput"><span class="identifier">back</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">value</span></code>
+ because <code class="computeroutput"><span class="identifier">num</span></code> is not EqualityComparable
+ and the assertion requirement <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">num</span><span class="special">>::</span><span class="identifier">value</span></code>
+ is false. <sup>[<a name="contract__.advanced_topics.assertion_requirements.f2" href="#ftn.contract__.advanced_topics.assertion_requirements.f2" class="footnote">42</a>]</sup>
+ </p>
+<p>
+ The Boost.TypeTraits
+ library provides a set of meta-functions that are very useful to program
+ assertion requirements. <sup>[<a name="contract__.advanced_topics.assertion_requirements.f3" href="#ftn.contract__.advanced_topics.assertion_requirements.f3" class="footnote">43</a>]</sup> However, C++ does not allow to inspect every trait of a type
+ so there might be some assertion requirements that unfortunately cannot be
+ programmed within the language.
+ </p>
+<p>
+ Another interesting use of assertion requirements is to model assertion computational
+ complexity. In some cases, checking assertions can be as computationally
+ expensive as executing the function body or even more. While preconditions,
+ postconditions, etc can be disabled in groups at compile-time to improve
+ performance (using <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_PRECONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_PRECONDITIONS">CONTRACT_CONFIG_NO_PRECONDITIONS</a></code>,
+ <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_POSTCONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_POSTCONDITIONS">CONTRACT_CONFIG_NO_POSTCONDITIONS</a></code>,
+ etc), it is also useful to be able to disable only specific assertions that
+ are very computationally expensive while keeping all other preconditions,
+ postconditions, etc enabled. For example (see also assertion_complexity_factorial.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// Assertion requirements used to model assertion computational complexity.</span>
+<span class="preprocessor">#define</span> <span class="identifier">O_1</span> <span class="number">0</span> <span class="comment">// O(1) constant (default).</span>
+<span class="preprocessor">#define</span> <span class="identifier">O_N</span> <span class="number">1</span> <span class="comment">// O(n) linear.</span>
+<span class="preprocessor">#define</span> <span class="identifier">O_NN</span> <span class="number">2</span> <span class="comment">// O(n * n) quadratic.</span>
+<span class="preprocessor">#define</span> <span class="identifier">O_NX</span> <span class="number">3</span> <span class="comment">// O(n^x) polynomial.</span>
+<span class="preprocessor">#define</span> <span class="identifier">O_FACTN</span> <span class="number">4</span> <span class="comment">// O(n!) factorial.</span>
+<span class="preprocessor">#define</span> <span class="identifier">O_EXPN</span> <span class="number">5</span> <span class="comment">// O(e^n) exponential.</span>
+<span class="preprocessor">#define</span> <span class="identifier">O_ALL</span> <span class="number">10</span>
+<span class="preprocessor">#define</span> <span class="identifier">COMPLEXITY_MAX</span> <span class="identifier">O_ALL</span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">int</span> <span class="special">(</span><span class="identifier">factorial</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">n</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">n</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">>=</span> <span class="number">1</span><span class="special">,</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">n</span> <span class="special"><</span> <span class="number">2</span><span class="special">)</span> <span class="special">(</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="number">1</span>
+ <span class="special">)</span> <span class="keyword">else</span> <span class="special">(</span>
+ <span class="comment">// Assertion compiled and checked only if within complexity.</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">n</span> <span class="special">*</span> <span class="identifier">factorial</span><span class="special">(</span><span class="identifier">n</span> <span class="special">-</span> <span class="number">1</span><span class="special">),</span>
+ <span class="keyword">requires</span> <span class="identifier">O_FACTN</span> <span class="special"><=</span> <span class="identifier">COMPLEXITY_MAX</span>
+ <span class="special">)</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">n</span> <span class="special"><</span> <span class="number">2</span><span class="special">)</span> <span class="keyword">return</span> <span class="number">1</span><span class="special">;</span>
+ <span class="keyword">else</span> <span class="keyword">return</span> <span class="identifier">n</span> <span class="special">*</span> <span class="identifier">factorial</span><span class="special">(</span><span class="identifier">n</span> <span class="special">-</span> <span class="number">1</span><span class="special">);</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+ In this case the postcondition <code class="computeroutput"><span class="identifier">result</span>
+ <span class="special">=</span> <span class="identifier">n</span> <span class="special">*</span> <span class="identifier">factorial</span><span class="special">(</span><span class="identifier">n</span> <span class="special">-</span>
+ <span class="number">1</span><span class="special">)</span></code>
+ has factorial computational complexity and it is compiled and checked at
+ run-time only if the macro <code class="computeroutput"><span class="identifier">COMPLEXITY_MAX</span></code>
+ is defined to be <code class="computeroutput"><span class="identifier">O_FACTN</span></code>
+ or greater. Similarly, macros like <code class="computeroutput"><span class="identifier">O_SMALLER_BODY</span></code>,
+ <code class="computeroutput"><span class="identifier">O_BODY</span></code>, and <code class="computeroutput"><span class="identifier">O_GREATER_BODY</span></code> could have been defined
+ to express computational complexity in relative terms with respect to the
+ body computational complexity (see the <a class="link" href="examples.html" title="Examples">Examples</a>
+ section). <sup>[<a name="contract__.advanced_topics.assertion_requirements.f4" href="#ftn.contract__.advanced_topics.assertion_requirements.f4" class="footnote">44</a>]</sup>
+ </p>
+<p>
+ Assertion requirements can be used with assertions, constant assertions,
+ and static assertions but they cannot be used with assertion statements and
+ with the if-condition of select assertions (however, if select assertions
+ are programmed using the ternary operator <code class="computeroutput"><span class="special">:?</span></code>
+ then assertion requirements will disable the entire ternary operator <code class="computeroutput"><span class="special">:?</span></code> expression including its if-condition).
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.advanced_topics.old_of_requirements"></a><a class="link" href="advanced_topics.html#contract__.advanced_topics.old_of_requirements" title="Old-Of Requirements">Old-Of
+ Requirements</a>
+</h3></div></div></div>
+<p>
+ Assertion requirements can be specified also for postconditions that use
+ old values. However, old values have the additional requirement that the
+ type of the expression passed to the <code class="computeroutput"><a class="link" href="../CONTRACT_OLDOF.html" title="Macro CONTRACT_OLDOF">CONTRACT_OLDOF</a></code>
+ macro must be <a class="link" href="advanced_topics.html#contract__.advanced_topics.old_and_result_value_copies" title="Old and Result Value Copies"><code class="literal">ConstantCopyConstructible</code></a>.
+ If such a requirement is not met:
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ Either, programmers want the compiler to error because the postconditions
+ using the old value cannot be evaluated (in which case programmers will
+ not specify assertion requirements and they might explicitly specify
+ type requirements using concepts so to get more informative error messages,
+ see the <a class="link" href="concepts.html" title="Concepts">Concepts</a> section).
+ </li>
+<li class="listitem">
+ Or, programmers want the old value declaration that uses the <code class="computeroutput"><a class="link" href="../CONTRACT_OLDOF.html" title="Macro CONTRACT_OLDOF">CONTRACT_OLDOF</a></code> macro to have no effect
+ (because the old value cannot be copied) and the postconditions using
+ such an old value to not be evaluated.
+ </li>
+</ol></div>
+<p>
+ Unfortunately, C++ cannot automatically detect if a type has a copy constructor
+ therefore a special trait <code class="computeroutput"><a class="link" href="../contract/has_oldof.html" title="Struct template has_oldof">contract::has_oldof</a></code>
+ has to be introduced to support this second case. The <code class="computeroutput"><span class="identifier">contract</span><span class="special">::</span><span class="identifier">has_oldof</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code>
+ trait is a unary boolean meta-function which is <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">true_</span></code> by default for any type <code class="computeroutput"><span class="identifier">T</span></code> and it must be specialized by programmers
+ for types which old values cannot be copied.
+ </p>
+<p>
+ For example, consider the following increment function (see also has_oldof_inc.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="special">(</span><span class="identifier">T</span><span class="special">&)</span> <span class="special">(</span><span class="identifier">inc</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">T</span><span class="special">&)</span> <span class="identifier">value</span><span class="special">,</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">offset</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_value</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">value</span><span class="special">,</span> <span class="comment">// Skip if no old-of.</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span> <span class="comment">// Never skipped.</span>
+ <span class="identifier">value</span> <span class="special">==</span> <span class="identifier">old_value</span> <span class="special">+</span> <span class="identifier">offset</span><span class="special">,</span> <span class="keyword">requires</span>
+ <span class="identifier">contract</span><span class="special">::</span><span class="identifier">has_oldof</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span> <span class="keyword">and</span> <span class="comment">// Requires old-of.</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_plus</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span> <span class="keyword">and</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">value</span><span class="special">,</span> <span class="keyword">requires</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">value</span> <span class="special">+=</span> <span class="identifier">offset</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="keyword">class</span> <span class="identifier">num</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">noncopyable</span> <span class="comment">// Non-copyable (for some reason...).</span>
+<span class="special">{</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">explicit</span> <span class="identifier">num</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">value</span> <span class="special">)</span> <span class="special">:</span> <span class="identifier">ptr_</span><span class="special">(</span><span class="keyword">new</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">value</span><span class="special">))</span> <span class="special">{}</span>
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">num</span> <span class="special">(</span> <span class="identifier">num</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">other</span> <span class="special">)</span> <span class="special">:</span> <span class="identifier">ptr_</span><span class="special">(</span><span class="identifier">other</span><span class="special">.</span><span class="identifier">ptr_</span><span class="special">)</span> <span class="special">{}</span> <span class="comment">// Private copy.</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="special">~</span><span class="identifier">num</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="special">{</span> <span class="keyword">delete</span> <span class="identifier">ptr_</span><span class="special">;</span> <span class="special">}</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">num</span> <span class="keyword">operator</span><span class="special">+</span> <span class="special">(</span> <span class="identifier">num</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">right</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">num</span><span class="special">(*</span><span class="identifier">ptr_</span> <span class="special">+</span> <span class="special">*</span><span class="identifier">right</span><span class="special">.</span><span class="identifier">ptr_</span><span class="special">);</span> <span class="special">}</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">num</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">+=</span> <span class="special">(</span> <span class="identifier">num</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">right</span> <span class="special">)</span>
+ <span class="special">{</span> <span class="special">*</span><span class="identifier">ptr_</span> <span class="special">+=</span> <span class="special">*</span><span class="identifier">right</span><span class="special">.</span><span class="identifier">ptr_</span><span class="special">;</span> <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> <span class="special">}</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==</span> <span class="special">(</span> <span class="identifier">num</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">right</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">{</span> <span class="keyword">return</span> <span class="special">*</span><span class="identifier">ptr_</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">right</span><span class="special">.</span><span class="identifier">ptr_</span><span class="special">;</span> <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="keyword">int</span><span class="special">*</span> <span class="identifier">ptr_</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="comment">// Specialization disables old-of for non-copyable `num` (no C++ type trait can</span>
+<span class="comment">// automatically detect copy constructors).</span>
+<span class="keyword">namespace</span> <span class="identifier">contract</span>
+<span class="special">{</span>
+ <span class="keyword">template</span><span class="special"><</span> <span class="special">></span> <span class="keyword">struct</span> <span class="identifier">has_oldof</span> <span class="special"><</span> <span class="identifier">num</span> <span class="special">></span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">false_</span> <span class="special">{};</span>
+<span class="special">}</span> <span class="comment">// namespace</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">1</span><span class="special">,</span> <span class="identifier">j</span> <span class="special">=</span> <span class="number">2</span><span class="special">;</span>
+<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">inc</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">j</span><span class="special">)</span> <span class="special">==</span> <span class="number">3</span><span class="special">);</span>
+
+<span class="identifier">num</span> <span class="identifier">n</span><span class="special">(</span><span class="number">1</span><span class="special">),</span> <span class="identifier">m</span><span class="special">(</span><span class="number">2</span><span class="special">);</span>
+<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">inc</span><span class="special">(</span><span class="identifier">n</span><span class="special">,</span> <span class="identifier">m</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">num</span><span class="special">(</span><span class="number">3</span><span class="special">));</span>
+</pre>
+<p>
+ </p>
+<p>
+ In this example, the <code class="computeroutput"><span class="identifier">num</span></code>
+ type is non-copyable so the <code class="computeroutput"><span class="identifier">contract</span><span class="special">::</span><span class="identifier">has_oldof</span><span class="special"><</span><span class="identifier">num</span><span class="special">></span></code> specialization inherits from <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">false_</span></code>.
+ As a consequence, the call <code class="computeroutput"><span class="identifier">inc</span><span class="special">(</span><span class="identifier">n</span><span class="special">,</span>
+ <span class="identifier">m</span><span class="special">)</span></code>
+ will automatically skip the old value declaration:
+ </p>
+<pre class="programlisting"><span class="keyword">auto</span> <span class="identifier">old_value</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">value</span>
+</pre>
+<p>
+ The following postcondition will also be skipped because its assertion requirement
+ lists <code class="computeroutput"><span class="identifier">contract</span><span class="special">::</span><span class="identifier">has_oldof</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code> (where
+ <code class="computeroutput"><span class="identifier">T</span></code> is indeed the type of
+ <code class="computeroutput"><span class="identifier">value</span></code> passed to the <code class="computeroutput"><a class="link" href="../CONTRACT_OLDOF.html" title="Macro CONTRACT_OLDOF">CONTRACT_OLDOF</a></code> macro):
+ </p>
+<pre class="programlisting"><span class="identifier">value</span> <span class="special">==</span> <span class="identifier">old_value</span> <span class="special">+</span> <span class="identifier">offset</span><span class="special">,</span> <span class="keyword">requires</span> <span class="identifier">contract</span><span class="special">::</span><span class="identifier">has_oldof</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span> <span class="keyword">and</span> <span class="special">...</span>
+</pre>
+<p>
+ Note how this postcondition actually requires the type <code class="computeroutput"><span class="identifier">T</span></code>
+ to have an old value, a plus operator <code class="computeroutput"><span class="special">+</span></code>,
+ and an equality operator <code class="computeroutput"><span class="special">==</span></code>
+ thus all of these requirements are programmed in the assertion requirements.
+ </p>
+<p>
+ Finally, return value declarations are never skipped so there is no <code class="computeroutput"><span class="identifier">has_result</span></code> trait. <sup>[<a name="contract__.advanced_topics.old_of_requirements.f0" href="#ftn.contract__.advanced_topics.old_of_requirements.f0" class="footnote">45</a>]</sup>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.advanced_topics.old_and_result_value_copies"></a><a class="link" href="advanced_topics.html#contract__.advanced_topics.old_and_result_value_copies" title="Old and Result Value Copies">Old
+ and Result Value Copies</a>
+</h3></div></div></div>
+<p>
+ This library uses the class template <code class="computeroutput"><a class="link" href="../contract/copy.html" title="Class template copy">contract::copy</a></code>
+ to copy old values and the result value for postconditions.
+ </p>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">contract</span>
+<span class="special">{</span>
+ <span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">></span>
+ <span class="keyword">class</span> <span class="identifier">copy</span>
+ <span class="special">{</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">copy</span> <span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">object</span> <span class="special">)</span> <span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">value</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span> <span class="special">;</span>
+ <span class="special">};</span>
+<span class="special">}</span> <span class="comment">// namespace</span>
+</pre>
+<p>
+ The default implementation of the <code class="computeroutput"><a class="link" href="../contract/copy.html" title="Class template copy">contract::copy</a></code>
+ class template requires that the type of the old value expression passed
+ to the <code class="computeroutput"><a class="link" href="../CONTRACT_OLDOF.html" title="Macro CONTRACT_OLDOF">CONTRACT_OLDOF</a></code> macro and
+ the result type are <a class="link" href="advanced_topics.html#contract__.advanced_topics.old_and_result_value_copies" title="Old and Result Value Copies"><code class="literal">ConstantCopyConstructible</code></a>
+ (i.e., these types provide a copy constructor that copies the object from
+ a constant reference, the reference has to be constant so to ensure the constant-correctness
+ of the copy operations that are executed within the contracts, see also the
+ <a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.constant_correctness" title="Constant-Correctness">Constant-Correctness</a>
+ section):
+ </p>
+<pre class="programlisting"><span class="comment">// `ConstantCopyConstructible<T>` (which implies `CopyConstructible<T>`):</span>
+<span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span> <span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">source</span> <span class="special">)</span> <span class="special">;</span> <span class="comment">// OK: constant-correct copy constructor.</span>
+
+<span class="comment">// `CopyConstructible<T>` (but not `ConstantCopyConstructible<T>`):</span>
+<span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">source</span> <span class="special">)</span> <span class="special">;</span> <span class="comment">// Error, copy constructor is not constant-correct.</span>
+</pre>
+<p>
+ Programmers can specialize the <code class="computeroutput"><a class="link" href="../contract/copy.html" title="Class template copy">contract::copy</a></code>
+ class template to allow old value and result value copies even for types
+ that are not <a class="link" href="advanced_topics.html#contract__.advanced_topics.old_and_result_value_copies" title="Old and Result Value Copies"><code class="literal">ConstantCopyConstructible</code></a>
+ (in this case it is the programmers' responsibility to make sure that the
+ copy operations that they define are constant-correct, otherwise the contracts
+ will no longer be constant-correct). <sup>[<a name="contract__.advanced_topics.old_and_result_value_copies.f0" href="#ftn.contract__.advanced_topics.old_and_result_value_copies.f0" class="footnote">46</a>]</sup>
+ </p>
+<p>
+ In the following example the old and result value declarations use the specialization
+ <code class="computeroutput"><span class="identifier">contract</span><span class="special">::</span><span class="identifier">copy</span><span class="special"><</span><span class="identifier">num</span><span class="special">></span></code>
+ so it is possible to access the old and result value of variables of type
+ <code class="computeroutput"><span class="identifier">num</span></code> even if <code class="computeroutput"><span class="identifier">num</span></code> is non-copyable (see also copy_inc.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="special">(</span><span class="identifier">T</span><span class="special">&)</span> <span class="special">(</span><span class="identifier">inc</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">T</span><span class="special">&)</span> <span class="identifier">value</span><span class="special">,</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">offset</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_value</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">value</span><span class="special">,</span> <span class="comment">// Use `copy`.</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span> <span class="comment">// Would use `copy` but reference so no copy.</span>
+ <span class="identifier">value</span> <span class="special">==</span> <span class="identifier">old_value</span> <span class="special">+</span> <span class="identifier">offset</span><span class="special">,</span> <span class="keyword">requires</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_plus</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span> <span class="keyword">and</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">value</span><span class="special">,</span> <span class="keyword">requires</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">value</span> <span class="special">+=</span> <span class="identifier">offset</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="keyword">class</span> <span class="identifier">num</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">noncopyable</span> <span class="comment">// Non-copyable (for some reason...).</span>
+<span class="special">{</span>
+ <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">contract</span><span class="special">::</span><span class="identifier">copy</span><span class="special"><</span><span class="identifier">num</span><span class="special">>;</span> <span class="comment">// Contract copy is friend.</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">explicit</span> <span class="identifier">num</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">value</span> <span class="special">)</span> <span class="special">:</span> <span class="identifier">ptr_</span><span class="special">(</span><span class="keyword">new</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">value</span><span class="special">))</span> <span class="special">{}</span>
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">num</span> <span class="special">(</span> <span class="identifier">num</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">other</span> <span class="special">)</span> <span class="special">:</span> <span class="identifier">ptr_</span><span class="special">(</span><span class="identifier">other</span><span class="special">.</span><span class="identifier">ptr_</span><span class="special">)</span> <span class="special">{}</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="special">~</span><span class="identifier">num</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="special">{</span> <span class="keyword">delete</span> <span class="identifier">ptr_</span><span class="special">;</span> <span class="special">}</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">num</span> <span class="keyword">operator</span><span class="special">+</span> <span class="special">(</span> <span class="identifier">num</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">right</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">num</span><span class="special">(*</span><span class="identifier">ptr_</span> <span class="special">+</span> <span class="special">*</span><span class="identifier">right</span><span class="special">.</span><span class="identifier">ptr_</span><span class="special">);</span> <span class="special">}</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">num</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">+=</span> <span class="special">(</span> <span class="identifier">num</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">right</span> <span class="special">)</span>
+ <span class="special">{</span> <span class="special">*</span><span class="identifier">ptr_</span> <span class="special">+=</span> <span class="special">*</span><span class="identifier">right</span><span class="special">.</span><span class="identifier">ptr_</span><span class="special">;</span> <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> <span class="special">}</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==</span> <span class="special">(</span> <span class="identifier">num</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">right</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">{</span> <span class="keyword">return</span> <span class="special">*</span><span class="identifier">ptr_</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">right</span><span class="special">.</span><span class="identifier">ptr_</span><span class="special">;</span> <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="keyword">int</span><span class="special">*</span> <span class="identifier">ptr_</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="comment">// Specialization disables old-of for non-copyable `num` (no C++ type trait can</span>
+<span class="comment">// automatically detect copy constructors).</span>
+<span class="keyword">namespace</span> <span class="identifier">contract</span>
+<span class="special">{</span>
+ <span class="keyword">template</span><span class="special"><</span> <span class="special">></span>
+ <span class="keyword">class</span> <span class="identifier">copy</span> <span class="special"><</span> <span class="identifier">num</span> <span class="special">></span>
+ <span class="special">{</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">explicit</span> <span class="identifier">copy</span> <span class="special">(</span> <span class="identifier">num</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">n</span> <span class="special">)</span> <span class="special">:</span> <span class="identifier">num_</span><span class="special">(*</span><span class="identifier">n</span><span class="special">.</span><span class="identifier">ptr_</span><span class="special">)</span> <span class="special">{}</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">num</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">value</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">num_</span><span class="special">;</span> <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">num</span> <span class="identifier">num_</span><span class="special">;</span>
+ <span class="special">};</span>
+<span class="special">}</span> <span class="comment">// namespace</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">1</span><span class="special">,</span> <span class="identifier">j</span> <span class="special">=</span> <span class="number">2</span><span class="special">;</span>
+<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">inc</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">j</span><span class="special">)</span> <span class="special">==</span> <span class="number">3</span><span class="special">);</span>
+
+<span class="identifier">num</span> <span class="identifier">n</span><span class="special">(</span><span class="number">1</span><span class="special">),</span> <span class="identifier">m</span><span class="special">(</span><span class="number">2</span><span class="special">);</span>
+<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">inc</span><span class="special">(</span><span class="identifier">n</span><span class="special">,</span> <span class="identifier">m</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">num</span><span class="special">(</span><span class="number">3</span><span class="special">));</span>
+</pre>
+<p>
+ </p>
+<p>
+ Both calls <code class="computeroutput"><span class="identifier">inc</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">j</span><span class="special">)</span></code> and <code class="computeroutput"><span class="identifier">inc</span><span class="special">(</span><span class="identifier">n</span><span class="special">,</span>
+ <span class="identifier">m</span><span class="special">)</span></code>
+ check all postconditions. The first call copies the old and result values
+ using <code class="computeroutput"><span class="keyword">int</span></code>'s default copy constructor,
+ the second call copies the old and result values using the copy operation
+ implemented by the <code class="computeroutput"><span class="identifier">contract</span><span class="special">::</span><span class="identifier">copy</span><span class="special"><</span><span class="identifier">num</span><span class="special">></span></code> specialization.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.advanced_topics.pure_virtual_functions"></a><a class="link" href="advanced_topics.html#contract__.advanced_topics.pure_virtual_functions" title="Pure Virtual Functions">Pure
+ Virtual Functions</a>
+</h3></div></div></div>
+<p>
+ It is possible to program contracts for pure virtual functions. Pure virtual
+ functions are specified with the usual <code class="computeroutput"><span class="special">=</span>
+ <span class="number">0</span><span class="special">;</span></code>
+ symbol replacing the function definition just after the contract macros,
+ for example (see also pushable.hpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">pushable</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// Subcontracting: In `and` with derived class invariants.</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">const_reference</span> <span class="identifier">const_reference</span><span class="special">;</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">push_back</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">value</span> <span class="special">)</span> <span class="keyword">new</span>
+ <span class="comment">// Subcontracting: In `or` with overriding function preconditions.</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="keyword">false</span> <span class="special">)</span> <span class="comment">// Force check to overriding preconditions.</span>
+ <span class="comment">// Subcontracting: In `and` with overriding function postconditions.</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="identifier">back</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">value</span><span class="special">,</span> <span class="keyword">requires</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="comment">// Contract for pure virtual function.</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">virtual</span> <span class="identifier">const_reference</span> <span class="identifier">back</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
+<span class="special">};</span>
+</pre>
+<p>
+ </p>
+<p>
+ Furthermore, using the <code class="computeroutput"><a class="link" href="../CONTRACT_MEMBER_BODY.html" title="Macro CONTRACT_MEMBER_BODY">CONTRACT_MEMBER_BODY</a></code>
+ macro, a derived class can be programmed without using the <code class="computeroutput"><a class="link" href="../CONTRACT_CLASS.html" title="Macro CONTRACT_CLASS">CONTRACT_CLASS</a></code>
+ and <code class="computeroutput"><a class="link" href="../CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code> macros
+ even when the base class has pure virtual functions (see also default_subcontracting_base.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">base</span><span class="special">)</span> <span class="comment">// Declared with contract macros.</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">clog</span> <span class="special"><<</span> <span class="string">"base::inv"</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span> <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">f</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">clog</span> <span class="special"><<</span> <span class="string">"base::f::pre"</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">clog</span> <span class="special"><<</span> <span class="string">"base::f::post"</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="keyword">class</span> <span class="identifier">deriv</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">base</span> <span class="comment">// Declared without contract macros...</span>
+<span class="special">{</span>
+ <span class="comment">// ...but using `BODY` instead of `CLASS` and `FUNCTION` macros, overriding</span>
+ <span class="comment">// functions have exact same contracts as base (not real subcontracting).</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">f</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">{</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">clog</span> <span class="special"><<</span> <span class="string">"deriv::f::body"</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
+ <span class="special">}</span>
+<span class="special">};</span>
+</pre>
+<p>
+ </p>
+<p>
+ This use of the <code class="computeroutput"><a class="link" href="../CONTRACT_MEMBER_BODY.html" title="Macro CONTRACT_MEMBER_BODY">CONTRACT_MEMBER_BODY</a></code>
+ macro does not force programmers of derived classes to use the library macros
+ <code class="computeroutput"><a class="link" href="../CONTRACT_CLASS.html" title="Macro CONTRACT_CLASS">CONTRACT_CLASS</a></code> and <code class="computeroutput"><a class="link" href="../CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code> which would otherwise
+ introduce the unusual library syntax in the derived class declaration. However,
+ in this case the derived class is forced to inherit the base class invariants,
+ preconditions, and postconditions exactly as they are without the possibility
+ to truly subcontract the base class (which is instead possible when the
+ <code class="computeroutput"><a class="link" href="../CONTRACT_CLASS.html" title="Macro CONTRACT_CLASS">CONTRACT_CLASS</a></code> and <code class="computeroutput"><a class="link" href="../CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code> macros are used in
+ declaring the derived class). <sup>[<a name="contract__.advanced_topics.pure_virtual_functions.f0" href="#ftn.contract__.advanced_topics.pure_virtual_functions.f0" class="footnote">47</a>]</sup> Correctly, the derived class can never avoid checking the base
+ class contracts neither when declared using the <code class="computeroutput"><a class="link" href="../CONTRACT_CLASS.html" title="Macro CONTRACT_CLASS">CONTRACT_CLASS</a></code>
+ and <code class="computeroutput"><a class="link" href="../CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code> macros,
+ nor when declared using the <code class="computeroutput"><a class="link" href="../CONTRACT_MEMBER_BODY.html" title="Macro CONTRACT_MEMBER_BODY">CONTRACT_MEMBER_BODY</a></code>
+ macro.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.advanced_topics.subcontracting_preconditions"></a><a class="link" href="advanced_topics.html#contract__.advanced_topics.subcontracting_preconditions" title="Subcontracting Preconditions">Subcontracting
+ Preconditions</a>
+</h3></div></div></div>
+<p>
+ While subcontracting is theoretically sound and justified by the <a href="http://en.wikipedia.org/wiki/Liskov_substitution_principle" target="_top">substitution
+ principle</a>, in practise subcontracted preconditions might be confusing
+ for programmers because of the implications of evaluating overriding preconditions
+ in <a class="link" href="contract_programming_overview.html#logic_or_anchor">logic-or</a> with overridden preconditions
+ (this is not the case for subcontracted postconditions and class invariants
+ which usually behave as programmers expect because they are evaluated in
+ <a class="link" href="contract_programming_overview.html#logic_and_anchor">logic-and</a>).
+ </p>
+<p>
+ For example, consider the following base class <code class="computeroutput"><span class="identifier">integer</span></code>
+ which holds an integral value and its derived class <code class="computeroutput"><span class="identifier">natural</span></code>
+ which holds a natural (i.e., non-negative integer) value (see also subcontract_pre_natural_failure.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">integer</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">set</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="comment">// No preconditions so this and all overrides can always be called.</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">get</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">value_</span> <span class="special">=</span> <span class="identifier">value</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keyword">int</span> <span class="special">(</span><span class="identifier">get</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">value_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="keyword">int</span> <span class="identifier">value_</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">natural</span><span class="special">)</span> <span class="keyword">extends</span><span class="special">(</span> <span class="keyword">public</span> <span class="identifier">integer</span> <span class="special">)</span> <span class="comment">// Subcontract.</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="identifier">get</span><span class="special">()</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">set</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">value</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span> <span class="comment">// NOTE: Will not fail because of base.</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">integer</span><span class="special">::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">set</span><span class="special">)(</span><span class="identifier">value</span><span class="special">);</span>
+ <span class="special">}</span>
+<span class="special">};</span>
+</pre>
+<p>
+ </p>
+<p>
+ From reading the contracts we conclude that:
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem">
+ <code class="computeroutput"><span class="identifier">integer</span><span class="special">::</span><span class="identifier">get</span></code> returns the latest value set (as
+ specified by <code class="computeroutput"><span class="identifier">integer</span><span class="special">::</span><span class="identifier">set</span></code>
+ postconditions).
+ </li>
+<li class="listitem">
+ There is no constraint on the integer value that is passed to <code class="computeroutput"><span class="identifier">integer</span><span class="special">::</span><span class="identifier">set</span></code> (because <code class="computeroutput"><span class="identifier">integer</span><span class="special">::</span><span class="identifier">set</span></code>
+ has no precondition).
+ </li>
+<li class="listitem">
+ <code class="computeroutput"><span class="identifier">natural</span><span class="special">::</span><span class="identifier">get</span></code> always returns a non-negative value
+ (as specified by the <code class="computeroutput"><span class="identifier">natural</span></code>
+ class invariants).
+ </li>
+<li class="listitem">
+ Only non-negative values can be passed to <code class="computeroutput"><span class="identifier">natural</span><span class="special">::</span><span class="identifier">set</span></code>
+ (as specified by <code class="computeroutput"><span class="identifier">natural</span><span class="special">::</span><span class="identifier">set</span></code>
+ preconditions).
+ </li>
+</ul></div>
+<p>
+ This last conclusion is incorrect! Negative values can be passed to <code class="computeroutput"><span class="identifier">natural</span><span class="special">::</span><span class="identifier">set</span></code> because they can be passed to its base
+ virtual function <code class="computeroutput"><span class="identifier">integral</span><span class="special">::</span><span class="identifier">set</span></code> (preconditions
+ cannot only be weakened). The complete set of <code class="computeroutput"><span class="identifier">natural</span><span class="special">::</span><span class="identifier">set</span></code> preconditions
+ is given by its base virtual function <code class="computeroutput"><span class="identifier">integer</span><span class="special">::</span><span class="identifier">set</span></code> preconditions
+ (which are always <code class="computeroutput"><span class="keyword">true</span></code> because
+ they are not specified) evaluated in <a class="link" href="contract_programming_overview.html#logic_or_anchor">logic-or</a>
+ with the preconditions explicitly specified by <code class="computeroutput"><span class="identifier">natural</span><span class="special">::</span><span class="identifier">set</span></code> (i.e.,
+ <code class="computeroutput"><span class="identifier">value</span> <span class="special">>=</span>
+ <span class="number">0</span></code>):
+ </p>
+<pre class="programlisting"><span class="special">(</span><span class="keyword">true</span><span class="special">)</span> <span class="keyword">or</span> <span class="special">(</span><span class="identifier">value</span> <span class="special">>=</span> <span class="number">0</span><span class="special">)</span>
+</pre>
+<p>
+ Obviously, this always evaluates to <code class="computeroutput"><span class="keyword">true</span></code>
+ regardless of <code class="computeroutput"><span class="identifier">value</span></code> being
+ non-negative. This is correct in accordance with the <a href="http://en.wikipedia.org/wiki/Liskov_substitution_principle" target="_top">substitution
+ principle</a> for which <code class="computeroutput"><span class="identifier">natural</span><span class="special">::</span><span class="identifier">set</span></code> can
+ be called in any context where <code class="computeroutput"><span class="identifier">integer</span><span class="special">::</span><span class="identifier">set</span></code> is
+ called because <code class="computeroutput"><span class="identifier">natural</span></code> inherits
+ from <code class="computeroutput"><span class="identifier">integer</span></code>. Given that
+ <code class="computeroutput"><span class="identifier">integer</span><span class="special">::</span><span class="identifier">set</span></code> can be called regardless of <code class="computeroutput"><span class="identifier">value</span></code> being non-negative (because it has
+ no precondition) there is no precondition that we can later specify for
+ <code class="computeroutput"><span class="identifier">natural</span><span class="special">::</span><span class="identifier">set</span></code> that will change that and in fact
+ <code class="computeroutput"><span class="identifier">natural</span><span class="special">::</span><span class="identifier">set</span></code> can also be called with negative values
+ without failing its subcontracted preconditions. For example, the call:
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">natural</span> <span class="identifier">n</span><span class="special">;</span>
+<span class="identifier">n</span><span class="special">.</span><span class="identifier">set</span><span class="special">(-</span><span class="number">123</span><span class="special">);</span> <span class="comment">// Error: Fails call invariants instead of preconditions.</span>
+</pre>
+<p>
+ </p>
+<p>
+ Fails the class invariants checked while exiting <code class="computeroutput"><span class="identifier">natural</span><span class="special">::</span><span class="identifier">set</span></code>:
+ </p>
+<pre class="programlisting">class invariant (on exit) number 1 "get() >= 0" failed: file "natural_subcontractpre.cpp", line 30
+</pre>
+<p>
+ Ideally, this call would have failed much earlier at <code class="computeroutput"><span class="identifier">natural</span><span class="special">::</span><span class="identifier">set</span></code> preconditions
+ (in fact, the <code class="computeroutput"><span class="identifier">natural</span><span class="special">::</span><span class="identifier">set</span></code> body is executed with the logically
+ invalid negative value <code class="computeroutput"><span class="special">-</span><span class="number">123</span></code>
+ which could in general lead to catastrophic errors and mysterious bugs).
+ </p>
+<p>
+ The issue here is in the design. A natural number is not an integer number
+ because while it is valid to use an integer number in a context where it
+ is assigned to a negative number, it is not valid to use a natural number
+ in such a context so a natural number should not inherit from an integer
+ number. Inheritance models the is-a
+ relationship which should not be used in this case as the contracts and the
+ <a href="http://en.wikipedia.org/wiki/Liskov_substitution_principle" target="_top">substitution
+ principle</a> are telling us.
+ </p>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ Note that if a virtual member function has no preconditions, it means that
+ it is always valid to call it, and (in accordance with the <a href="http://en.wikipedia.org/wiki/Liskov_substitution_principle" target="_top">substitution
+ principle</a>) this semantic cannot be changed by the contracts of
+ any overriding function no matter what preconditions we specify for it.
+ Similarly, if an overriding member function has no preconditions, it means
+ that is is always valid to call it regardless of possible preconditions
+ specified by any function that it overrides.
+ </p></td></tr>
+</table></div>
+<p>
+ An overriding function can specify <code class="computeroutput"><span class="keyword">precondition</span><span class="special">(</span> <span class="keyword">false</span> <span class="special">)</span></code>
+ if it wants to keep the same preconditions of the functions that is overriding.
+ A pure virtual function can specify <code class="computeroutput"><span class="keyword">precondition</span><span class="special">(</span> <span class="keyword">false</span> <span class="special">)</span></code>
+ to indicate that overriding functions will specify preconditions (this only
+ makes sense for pure virtual functions because a function with <code class="computeroutput"><span class="keyword">precondition</span><span class="special">(</span> <span class="keyword">false</span> <span class="special">)</span></code> can
+ never be called successfully unless it is overridden and its preconditions
+ are weakened, that might be acceptable for pure virtual because they must
+ always be overridden).
+ </p>
+<p>
+ If programmers find subcontracted preconditions confusing, this library allows
+ to forbid them by defining the configuration macro <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS.html" title="Macro CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS">CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS</a></code>.
+ When this macro is defined, the library will generate a compile-time error
+ if a derived class tries to override preconditions of member functions of
+ any of its base classes (this is also the subcontracting behaviour specified
+ by <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a>). However, note that in case
+ of multiple-inheritance preconditions from the overridden function from all
+ bases classes will always be checked in <a class="link" href="contract_programming_overview.html#logic_or_anchor">logic-or</a>
+ with each other so preconditions from a base class could still be weaken
+ by the preconditions of another base class even when the <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS.html" title="Macro CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS">CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS</a></code>
+ macro is defined. By default the <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS.html" title="Macro CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS">CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS</a></code>
+ macro is not defined and this library allows to override preconditions (as
+ specified by for Eiffel
+ by <a class="link" href="bibliography.html#Meyer97_anchor">[Meyer97]</a> and in accordance with
+ the <a href="http://en.wikipedia.org/wiki/Liskov_substitution_principle" target="_top">substitution
+ principle</a>).
+ </p>
+<p>
+ Another difference between subcontracted preconditions and subcontracted
+ postconditions or class invariants is that subcontracted preconditions will
+ always report a failure of the overridden preconditions. For example, consider
+ a set of base classes <code class="literal">b<span class="emphasis"><em>N</em></span></code> and a derived
+ class <code class="computeroutput"><span class="identifier">d</span></code>:
+ </p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">struct</span> <span class="special">(</span><span class="identifier">a</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="special">...</span> <span class="comment">// No member function `f`.</span>
+<span class="special">};</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">struct</span> <span class="special">(</span><span class="identifier">b</span><span class="emphasis"><em>N</em></span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="special">...</span> <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">f</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="comment">// Overridden function.</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="special">...</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="special">...</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="special">...</span>
+<span class="special">};</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">struct</span> <span class="special">(</span><span class="identifier">c</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="special">...</span> <span class="comment">// No member function `f`.</span>
+<span class="special">};</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">struct</span> <span class="special">(</span><span class="identifier">d</span><span class="special">)</span> <span class="keyword">extends</span><span class="special">(</span> <span class="identifier">b1</span><span class="special">,</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">b2</span><span class="special">,</span> <span class="identifier">c</span><span class="special">,</span> <span class="identifier">b3</span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="special">...</span> <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">f</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="comment">// Overriding function.</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="special">...</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="special">...</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="special">...</span>
+<span class="special">};</span>
+</pre>
+<p>
+ When <code class="computeroutput"><span class="identifier">d</span><span class="special">::</span><span class="identifier">f</span></code> is called, its subcontracted class invariants,
+ postconditions, and preconditions are evaluated using the following expressions
+ (the base classes <code class="computeroutput"><span class="identifier">a</span></code> and
+ <code class="computeroutput"><span class="identifier">c</span></code> do not declare a virtual
+ function <code class="computeroutput"><span class="identifier">f</span></code> so they are automatically
+ excluded from <code class="computeroutput"><span class="identifier">d</span><span class="special">::</span><span class="identifier">f</span></code> subcontracting):
+ </p>
+<pre class="programlisting"><span class="identifier">b1</span><span class="special">::</span><span class="emphasis"><em>class-invariants</em></span> <span class="keyword">and</span> <span class="identifier">b2</span><span class="special">::</span><span class="emphasis"><em>class-invariants</em></span> <span class="keyword">and</span> <span class="identifier">b3</span><span class="special">::</span><span class="emphasis"><em>class-invariants</em></span> <span class="keyword">and</span> <span class="identifier">d</span><span class="special">::</span><span class="emphasis"><em>class-invariants</em></span> <span class="comment">// `d::f` subcontracted class invariants.</span>
+<span class="identifier">b1</span><span class="special">::</span><span class="identifier">f</span><span class="special">::</span><span class="emphasis"><em>postconditions</em></span> <span class="keyword">and</span> <span class="identifier">b2</span><span class="special">::</span><span class="identifier">f</span><span class="special">::</span><span class="emphasis"><em>postconditions</em></span> <span class="keyword">and</span> <span class="identifier">b3</span><span class="special">::</span><span class="identifier">f</span><span class="special">::</span><span class="emphasis"><em>postconditions</em></span> <span class="keyword">and</span> <span class="identifier">d</span><span class="special">::</span><span class="identifier">f</span><span class="special">::</span><span class="emphasis"><em>postconditions</em></span> <span class="comment">// `d::f` subcontracted postconditions.</span>
+<span class="identifier">b1</span><span class="special">::</span><span class="identifier">f</span><span class="special">::</span><span class="emphasis"><em>preconditions</em></span> <span class="keyword">or</span> <span class="identifier">b2</span><span class="special">::</span><span class="identifier">f</span><span class="special">::</span><span class="emphasis"><em>preconditions</em></span> <span class="keyword">or</span> <span class="identifier">b3</span><span class="special">::</span><span class="identifier">f</span><span class="special">::</span><span class="emphasis"><em>preconditions</em></span> <span class="keyword">or</span> <span class="identifier">d</span><span class="special">::</span><span class="identifier">f</span><span class="special">::</span><span class="emphasis"><em>preconditions</em></span> <span class="comment">// `d::f` subcontracted preconditions.</span>
+</pre>
+<p>
+ When subcontracted class invariants or subcontracted postconditions fail,
+ this library reports the first failed condition which can in general be in
+ the base class contracts because they are checked first in the <a class="link" href="contract_programming_overview.html#logic_and_anchor">logic-and</a>
+ chain (this can report a failure from any subcontracted class invariants
+ <code class="literal">b<span class="emphasis"><em>N</em></span>::<span class="emphasis"><em>class-invariants</em></span></code>
+ or <code class="literal">d::<span class="emphasis"><em>class-invariants</em></span></code>, and subcontracted
+ postconditions <code class="literal">b<span class="emphasis"><em>N</em></span>::f::<span class="emphasis"><em>postconditions</em></span></code>
+ or <code class="literal">d::f::<span class="emphasis"><em>postconditions</em></span></code>). However,
+ when subcontracted preconditions fail it means that all overridden preconditions
+ as well as the overriding preconditions have failed (because subcontracted
+ preconditions are evaluated in <a class="link" href="contract_programming_overview.html#logic_or_anchor">logic-or</a>).
+ In this case, this library will report the last evaluated failure which will
+ always be in the overriding preconditions (always report a failure from
+ <code class="literal">d::f::<span class="emphasis"><em>preconditions</em></span></code>). If programmers
+ want instead the library to report the failure from the first overridden
+ precondition that failed, they can define the configuration macro <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE.html" title="Macro CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE">CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE</a></code>
+ (always report a failure from <code class="literal">b1::f::<span class="emphasis"><em>preconditions</em></span></code>).
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.advanced_topics.static_member_functions"></a><a class="link" href="advanced_topics.html#contract__.advanced_topics.static_member_functions" title="Static Member Functions">Static
+ Member Functions</a>
+</h3></div></div></div>
+<p>
+ It is possible to program contracts for static member functions. Static member
+ functions cannot access the object therefore their preconditions and postconditions
+ also cannot access the object and they can only access other static members.
+ This library allows to specify a subset of class invariants called <span class="emphasis"><em>static
+ class invariants</em></span> which do not access the object and that are checked
+ at entry and exit of every constructor, destructor, and member functions
+ even if static. (Non-static class invariants are instead not checked at constructor
+ entry, at destructor exit, and at entry and exit of static member functions
+ because they require accessing the object, see also the <a class="link" href="contract_programming_overview.html" title="Contract Programming Overview">Contract
+ Programming Overview</a> section.)
+ </p>
+<p>
+ Static class invariants are empty (<code class="computeroutput"><span class="keyword">void</span></code>)
+ by default unless they are explicitly specified within the <code class="computeroutput"><a class="link" href="../CONTRACT_CLASS_INVARIANT.html" title="Macro CONTRACT_CLASS_INVARIANT">CONTRACT_CLASS_INVARIANT</a></code>
+ macro using the following syntax: <sup>[<a name="contract__.advanced_topics.static_member_functions.f0" href="#ftn.contract__.advanced_topics.static_member_functions.f0" class="footnote">48</a>]</sup>
+ </p>
+<pre class="programlisting"><span class="keyword">static</span> <span class="keyword">class</span><span class="special">(</span> <span class="emphasis"><em>assertion1</em></span><span class="special">,</span> <span class="emphasis"><em>assertion2</em></span><span class="special">,</span> <span class="special">...</span> <span class="special">)</span>
+</pre>
+<p>
+ For example (see also static_contract_instance_counter.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">instance_counter</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span>
+ <span class="identifier">object</span><span class="special">(),</span> <span class="comment">// Non-static class invariants.</span>
+ <span class="keyword">static</span> <span class="keyword">class</span><span class="special">(</span> <span class="comment">// Static class invariants.</span>
+ <span class="identifier">count</span><span class="special">()</span> <span class="special">>=</span> <span class="number">0</span>
+ <span class="comment">// ...</span>
+ <span class="special">)</span>
+ <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">explicit</span> <span class="special">(</span><span class="identifier">instance_counter</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">T</span><span class="special">*)</span> <span class="identifier">the_object</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">the_object</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_count</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">count</span><span class="special">(),</span>
+ <span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_count</span> <span class="special">+</span> <span class="number">1</span><span class="special">,</span>
+ <span class="identifier">object</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">the_object</span>
+ <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">object_</span><span class="special">(</span><span class="identifier">the_object</span><span class="special">)</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">count_</span><span class="special">++;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">instance_counter</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="comment">// FUTURE: Destructors could have static postconditions.</span>
+ <span class="comment">// postcondition: count() = oldof count() - 1</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">delete</span> <span class="identifier">object_</span><span class="special">;</span>
+ <span class="identifier">count_</span><span class="special">--;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">*</span> <span class="keyword">const</span><span class="special">)</span> <span class="special">(</span><span class="identifier">object</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">object_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Contract static member function.</span>
+ <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">int</span> <span class="special">(</span><span class="identifier">count</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="comment">// No preconditions nor postconditions for this example but when</span>
+ <span class="comment">// present no object can be accessed by assertions (i.e., `static`).</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">count_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="keyword">static</span> <span class="keyword">int</span> <span class="identifier">count_</span><span class="special">;</span>
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">T</span><span class="special">*</span> <span class="identifier">object_</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">></span>
+<span class="keyword">int</span> <span class="identifier">instance_counter</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">count_</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
+</pre>
+<p>
+ </p>
+<p>
+ In this example there is only one static class invariant assertion <code class="computeroutput"><span class="identifier">count</span><span class="special">()</span> <span class="special">>=</span> <span class="number">0</span></code> and
+ it is checked at entry and exit of every constructor, destructor, and member
+ function including the static member function <code class="computeroutput"><span class="identifier">count</span></code>.
+ If the static member function <code class="computeroutput"><span class="identifier">count</span></code>
+ had preconditions or postconditions, they would not be able to access the
+ object (i.e., preconditions and postconditions will also be executed in static
+ context).
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.advanced_topics.volatile_member_functions"></a><a class="link" href="advanced_topics.html#contract__.advanced_topics.volatile_member_functions" title="Volatile Member Functions">Volatile
+ Member Functions</a>
+</h3></div></div></div>
+<p>
+ It is possible to program contracts for volatile member functions. Volatile
+ member functions access the object as volatile therefore their preconditions
+ and postconditions also access the object as volatile and can only access
+ other volatile members. This library allows to specify a different set of
+ class invariants called <span class="emphasis"><em>volatile class invariants</em></span> which
+ can only access the object as volatile and that are checked at entry and
+ exit of every volatile member function. (Constructors and destructors never
+ access the object as volatile so volatile class invariants are not checked
+ by constructors and destructors, see also the <a class="link" href="contract_programming_overview.html" title="Contract Programming Overview">Contract
+ Programming Overview</a> section.)
+ </p>
+<p>
+ Volatile class invariants are assumed to be the same as non-volatile class
+ invariants unless they are explicitly specified within the <code class="computeroutput"><a class="link" href="../CONTRACT_CLASS_INVARIANT.html" title="Macro CONTRACT_CLASS_INVARIANT">CONTRACT_CLASS_INVARIANT</a></code>
+ macro using the following syntax: <sup>[<a name="contract__.advanced_topics.volatile_member_functions.f0" href="#ftn.contract__.advanced_topics.volatile_member_functions.f0" class="footnote">49</a>]</sup>
+ </p>
+<pre class="programlisting"><span class="keyword">volatile</span> <span class="keyword">class</span><span class="special">(</span> <span class="emphasis"><em>assertion1</em></span><span class="special">,</span> <span class="emphasis"><em>assertion2</em></span><span class="special">,</span> <span class="special">...</span> <span class="special">)</span>
+</pre>
+<p>
+ In most cases, it will be necessary to explicitly specify volatile class
+ invariants when using volatile member functions (unless volatile overloads
+ are provided for every member function that is used by the non-volatile class
+ invariants).
+ </p>
+<p>
+ For example (see also volatile_contract_shared_instance.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">shared_instance</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span>
+ <span class="identifier">queries</span><span class="special">()</span> <span class="special">>=</span> <span class="number">0</span><span class="special">,</span> <span class="comment">// Non-volatile class invariants.</span>
+ <span class="keyword">volatile</span> <span class="keyword">class</span><span class="special">(</span> <span class="comment">// Volatile class invariants.</span>
+ <span class="identifier">object</span><span class="special">()</span>
+ <span class="comment">// ...</span>
+ <span class="special">)</span>
+ <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">explicit</span> <span class="special">(</span><span class="identifier">shared_instance</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">T</span><span class="special">*)</span> <span class="identifier">the_object</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">the_object</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">object</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">the_object</span> <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">object_</span><span class="special">(</span><span class="identifier">the_object</span><span class="special">),</span> <span class="identifier">queries_</span><span class="special">(</span><span class="number">0</span><span class="special">)</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">shared_instance</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">delete</span> <span class="identifier">object_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Contracts for volatile member function.</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span> <span class="keyword">volatile</span><span class="special">*</span> <span class="keyword">const</span><span class="special">)</span> <span class="special">(</span><span class="identifier">object</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span> <span class="keyword">volatile</span>
+ <span class="comment">// No preconditions nor postconditions for this example but when</span>
+ <span class="comment">// present object is `const volatile` within assertions.</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">queries_</span><span class="special">++;</span>
+ <span class="keyword">return</span> <span class="identifier">object_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">int</span> <span class="special">(</span><span class="identifier">queries</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">queries_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">T</span> <span class="keyword">volatile</span><span class="special">*</span> <span class="identifier">object_</span><span class="special">;</span>
+ <span class="keyword">private</span><span class="special">:</span> <span class="keyword">mutable</span> <span class="keyword">int</span> <span class="identifier">queries_</span><span class="special">;</span>
+<span class="special">};</span>
+</pre>
+<p>
+ </p>
+<p>
+ As usual, contracts are checked in constant-correct context therefore only
+ <code class="computeroutput"><span class="keyword">const</span> <span class="keyword">volatile</span></code>
+ members can be accessed from volatile class invariants, preconditions, and
+ postconditions.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.advanced_topics.operators"></a><a class="link" href="advanced_topics.html#contract__.advanced_topics.operators" title="Operators">Operators</a>
+</h3></div></div></div>
+<p>
+ It is possible to program contracts for operators (both member function operators
+ and free function operators). The operator name must be specified using the
+ following syntax when passed to the <code class="computeroutput"><a class="link" href="../CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code>,
+ <code class="computeroutput"><a class="link" href="../CONTRACT_FREE_BODY.html" title="Macro CONTRACT_FREE_BODY">CONTRACT_FREE_BODY</a></code>, and
+ <code class="computeroutput"><a class="link" href="../CONTRACT_MEMBER_BODY.html" title="Macro CONTRACT_MEMBER_BODY">CONTRACT_MEMBER_BODY</a></code> macros:
+ </p>
+<pre class="programlisting"><span class="keyword">operator</span><span class="special">(</span><span class="emphasis"><em>symbol</em></span><span class="special">)(</span><span class="emphasis"><em>arbitrary-alphanumeric-name</em></span><span class="special">)</span>
+</pre>
+<p>
+ The first parameter is the usual operator symbol (<code class="computeroutput"><span class="special">==</span></code>,
+ <code class="computeroutput"><span class="special">+</span></code>, etc) the second parameter
+ is an arbitrary but alphanumeric name (<code class="computeroutput"><span class="identifier">equal</span></code>,
+ <code class="computeroutput"><span class="identifier">plus</span></code>, etc). The operator
+ <code class="computeroutput"><span class="keyword">new</span></code>, the operator <code class="computeroutput"><span class="keyword">delete</span></code>, and implicit type conversion operators
+ for fundamental types containing no symbol can also be specified simply as:
+ </p>
+<pre class="programlisting"><span class="keyword">operator</span> <span class="keyword">new</span>
+<span class="keyword">operator</span> <span class="keyword">delete</span>
+<span class="keyword">operator</span> <span class="emphasis"><em>fundamental-type-without-symbols</em></span>
+</pre>
+<p>
+ The comma operator must be specified as: <sup>[<a name="contract__.advanced_topics.operators.f0" href="#ftn.contract__.advanced_topics.operators.f0" class="footnote">50</a>]</sup>
+ </p>
+<pre class="programlisting"><span class="keyword">operator</span> <span class="keyword">comma</span>
+</pre>
+<p>
+ For example (see also member_operator_string.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">string</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span>
+ <span class="keyword">static</span> <span class="keyword">class</span><span class="special">(</span> <span class="identifier">pointers</span> <span class="special">>=</span> <span class="number">0</span><span class="special">,</span> <span class="identifier">arrays</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span>
+ <span class="special">)</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">static</span> <span class="keyword">int</span> <span class="identifier">pointers</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">static</span> <span class="keyword">int</span> <span class="identifier">arrays</span><span class="special">;</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">explicit</span> <span class="special">(</span><span class="identifier">string</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*)</span> <span class="identifier">c_str</span><span class="special">,</span> <span class="keyword">default</span><span class="special">(</span><span class="string">""</span><span class="special">)</span> <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">string_</span><span class="special">(</span><span class="identifier">c_str</span><span class="special">)</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(~</span><span class="identifier">string</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Symbolic operators: `(==)(equal)`, `(())(call)`, etc.</span>
+ <span class="keyword">public</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">(==)(</span><span class="identifier">equal</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">right</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">string_</span> <span class="special">==</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">string_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Implicit type conversion operator (keyword type).</span>
+ <span class="keyword">public</span> <span class="keyword">operator</span> <span class="keyword">char</span> <span class="keyword">const</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">string_</span><span class="special">[</span><span class="number">0</span><span class="special">];</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Implicit type conversion operator (symbolic type).</span>
+ <span class="keyword">public</span> <span class="keyword">operator</span><span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*)(</span><span class="identifier">char_const_ptr</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">string_</span><span class="special">.</span><span class="identifier">c_str</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Implicit type conversion operator (type with commas).</span>
+ <span class="keyword">public</span> <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span> <span class="special">)</span>
+ <span class="keyword">operator</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">>)(</span><span class="identifier">std_vector</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">></span> <span class="identifier">v</span><span class="special">(</span><span class="identifier">string_</span><span class="special">.</span><span class="identifier">size</span><span class="special">());</span>
+ <span class="keyword">for</span><span class="special">(</span><span class="keyword">size_t</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">string_</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="identifier">v</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">string_</span><span class="special">[</span><span class="identifier">i</span><span class="special">];</span>
+ <span class="keyword">return</span> <span class="identifier">v</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Comma operator (use `comma` to diff. from above).</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">string</span><span class="special">&)</span> <span class="keyword">operator</span> <span class="keyword">comma</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">right</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">string_</span> <span class="special">+=</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">string_</span><span class="special">;</span>
+ <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="comment">// All memory operators (new, delete, new[], and delete[]) must be</span>
+ <span class="comment">// explicitly `static` (because pp can't inspect new[] and delete[] that</span>
+ <span class="comment">// could be any symbolic operator like ==, +, etc).</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">static</span> <span class="special">(</span><span class="keyword">void</span><span class="special">*)</span> <span class="keyword">operator</span> <span class="keyword">new</span> <span class="special">(</span> <span class="keyword">size_t</span> <span class="identifier">size</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">void</span><span class="special">*</span> <span class="identifier">p</span> <span class="special">=</span> <span class="identifier">malloc</span><span class="special">(</span><span class="identifier">size</span><span class="special">);</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">p</span> <span class="special">==</span> <span class="number">0</span><span class="special">)</span> <span class="keyword">throw</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span><span class="special">();</span>
+ <span class="identifier">pointers</span><span class="special">++;</span>
+ <span class="keyword">return</span> <span class="identifier">p</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="keyword">operator</span> <span class="keyword">delete</span> <span class="special">(</span> <span class="special">(</span><span class="keyword">void</span><span class="special">*)</span> <span class="identifier">pointer</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">pointer</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">free</span><span class="special">(</span><span class="identifier">pointer</span><span class="special">);</span>
+ <span class="identifier">pointers</span><span class="special">--;</span>
+ <span class="special">}</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">static</span> <span class="special">(</span><span class="keyword">void</span><span class="special">*)</span> <span class="keyword">operator</span><span class="special">(</span><span class="keyword">new</span><span class="special">[])(</span><span class="identifier">new_array</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">size_t</span> <span class="identifier">size</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">void</span><span class="special">*</span> <span class="identifier">a</span> <span class="special">=</span> <span class="identifier">malloc</span><span class="special">(</span><span class="identifier">size</span><span class="special">);</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">a</span> <span class="special">==</span> <span class="number">0</span><span class="special">)</span> <span class="keyword">throw</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span><span class="special">();</span>
+ <span class="identifier">arrays</span><span class="special">++;</span>
+ <span class="keyword">return</span> <span class="identifier">a</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">(</span><span class="keyword">delete</span><span class="special">[])(</span><span class="identifier">delete_array</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="keyword">void</span><span class="special">*)</span> <span class="identifier">array</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">array</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">free</span><span class="special">(</span><span class="identifier">array</span><span class="special">);</span>
+ <span class="identifier">arrays</span><span class="special">--;</span>
+ <span class="special">}</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">string_</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="keyword">int</span> <span class="identifier">string</span><span class="special">::</span><span class="identifier">pointers</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
+<span class="keyword">int</span> <span class="identifier">string</span><span class="special">::</span><span class="identifier">arrays</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
+</pre>
+<p>
+ </p>
+<p>
+ The memory operators <code class="computeroutput"><span class="keyword">new</span></code>, <code class="computeroutput"><span class="keyword">delete</span></code>, <code class="computeroutput"><span class="keyword">new</span><span class="special">[]</span></code>, and <code class="computeroutput"><span class="keyword">delete</span><span class="special">[]</span></code> must always be specified <code class="computeroutput"><span class="keyword">static</span></code> when they are programmed as member
+ function operators. <sup>[<a name="contract__.advanced_topics.operators.f1" href="#ftn.contract__.advanced_topics.operators.f1" class="footnote">51</a>]</sup>
+ </p>
+<p>
+ Free function operators are programmed using the same syntax for the operator
+ names.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.advanced_topics.nested_classes"></a><a class="link" href="advanced_topics.html#contract__.advanced_topics.nested_classes" title="Nested Classes">Nested Classes</a>
+</h3></div></div></div>
+<p>
+ It is possible to program contracts for nested classes noting that:
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ The access level <code class="computeroutput"><span class="keyword">public</span></code>,
+ <code class="computeroutput"><span class="keyword">protected</span></code>, or <code class="computeroutput"><span class="keyword">private</span></code> must be specified for contracted
+ members and therefore also for nested classes.
+ </li>
+<li class="listitem">
+ The <code class="computeroutput"><span class="identifier">_TPL</span></code> macros must
+ be used within templates so the <code class="computeroutput"><a class="link" href="../CONTRACT_CLASS_TPL.html" title="Macro CONTRACT_CLASS_TPL">CONTRACT_CLASS_TPL</a></code>
+ macro needs to be used when programming a class nested within a class
+ template.
+ </li>
+</ol></div>
+<p>
+ For example (see also nested_class_bitset.cpp
and
+ the <a class="link" href="concepts.html" title="Concepts">Concepts</a> section):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// Enclosing class.</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">size_t</span> <span class="identifier">N</span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">bitset</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span>
+ <span class="keyword">static</span> <span class="keyword">class</span><span class="special">(</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">N</span> <span class="special">)</span>
+ <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_CLASS_TPL</span><span class="special">(</span> <span class="comment">// Nested class.</span>
+ <span class="keyword">public</span> <span class="keyword">class</span> <span class="special">(</span><span class="identifier">reference</span><span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span> <span class="identifier">bitptr_</span> <span class="special">)</span>
+
+ <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">bitset</span><span class="special">;</span>
+
+ <span class="identifier">CONTRACT_CLASS_TPL</span><span class="special">(</span> <span class="comment">// Nested (twice) class template with concepts.</span>
+ <span class="keyword">private</span> <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">requires</span><span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">DefaultConstructible</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">bit</span><span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">bit</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">value_</span><span class="special">()</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">from_bool</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">bool</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">to_bool</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">value_</span> <span class="special">=</span> <span class="identifier">value</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">to_bool</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">value_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">T</span> <span class="identifier">value_</span><span class="special">;</span>
+ <span class="special">};</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">private</span> <span class="special">(</span><span class="identifier">reference</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">bitptr_</span><span class="special">-></span><span class="identifier">to_bool</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">()</span> <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span>
+ <span class="identifier">bitptr_</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_ptr</span><span class="special"><</span><span class="identifier">bit</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="special">>(</span><span class="keyword">new</span> <span class="identifier">bit</span><span class="special"><</span><span class="keyword">int</span><span class="special">>()))</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(~</span><span class="identifier">reference</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">operator</span> <span class="keyword">bool</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">bitptr_</span><span class="special">-></span><span class="identifier">to_bool</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">reference</span><span class="special">&)</span> <span class="keyword">operator</span><span class="special">(=)(</span><span class="identifier">assign</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">bool</span> <span class="keyword">const</span> <span class="identifier">bit_value</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span> <span class="identifier">result</span> <span class="special">==</span> <span class="special">*</span><span class="keyword">this</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">bitptr_</span><span class="special">-></span><span class="identifier">from_bool</span><span class="special">(</span><span class="identifier">bit_value</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_ptr</span><span class="special"><</span><span class="identifier">bit</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="special">></span> <span class="identifier">bitptr_</span><span class="special">;</span>
+ <span class="special">};</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">reference</span><span class="special">)</span> <span class="keyword">operator</span><span class="special">([])(</span><span class="identifier">at</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">size_t</span> <span class="identifier">index</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">index</span> <span class="special"><</span> <span class="identifier">N</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">bitset_</span><span class="special">[</span><span class="identifier">index</span><span class="special">];</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">size_t</span> <span class="special">(</span><span class="identifier">size</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">N</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">reference</span> <span class="identifier">bitset_</span><span class="special">[</span><span class="identifier">N</span><span class="special">];</span>
+<span class="special">};</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.advanced_topics.friends"></a><a class="link" href="advanced_topics.html#contract__.advanced_topics.friends" title="Friends">Friends</a>
+</h3></div></div></div>
+<p>
+ It is possible to program contracts for friend classes and friend functions.
+ Classes can be declared friends and later contracted using the <code class="computeroutput"><a class="link" href="../CONTRACT_CLASS.html" title="Macro CONTRACT_CLASS">CONTRACT_CLASS</a></code> macro as usual:
+ </p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// Not even necessary to contract this class.</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">x</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+
+ <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">y</span> <span class="special">;</span>
+
+ <span class="comment">// ...</span>
+<span class="special">};</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">y</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+
+ <span class="comment">// ...</span>
+<span class="special">};</span>
+</pre>
+<p>
+ Friend functions that are declared and defined within the enclosing class
+ use the <code class="computeroutput"><span class="keyword">friend</span></code> keyword within
+ the <code class="computeroutput"><a class="link" href="../CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code> macro
+ (note that the access level <code class="computeroutput"><span class="keyword">public</span></code>,
+ <code class="computeroutput"><span class="keyword">protected</span></code>, or <code class="computeroutput"><span class="keyword">private</span></code> is optional in this case because these
+ friend functions are not member functions). Friend functions that are either
+ forward declared friends or that are defined friends within the enclosing
+ class, must use the <code class="computeroutput"><a class="link" href="../CONTRACT_FREE_BODY.html" title="Macro CONTRACT_FREE_BODY">CONTRACT_FREE_BODY</a></code>
+ macro. For example (see also friend_counter.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// Not even necessary to contract this class.</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span> <span class="keyword">requires</span><span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">CopyConstructible</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">counter</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span> <span class="identifier">value</span><span class="special">()</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">);</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Friend (contracted declaration and definition).</span>
+ <span class="keyword">public</span> <span class="keyword">friend</span> <span class="special">(</span><span class="identifier">counter</span><span class="special">)</span> <span class="keyword">operator</span><span class="special">(/)(</span><span class="identifier">div</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">counter</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">left</span><span class="special">,</span>
+ <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">right</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">right</span> <span class="special">></span> <span class="number">0</span> <span class="special">)</span> <span class="comment">// Strictly positive, cannot be zero.</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span><span class="special">.</span><span class="identifier">value</span><span class="special">()</span> <span class="special">*</span> <span class="identifier">right</span> <span class="special">==</span> <span class="identifier">left</span><span class="special">.</span><span class="identifier">value</span><span class="special">()</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">counter</span><span class="special">(</span><span class="identifier">left</span><span class="special">.</span><span class="identifier">value</span><span class="special">()</span> <span class="special">/</span> <span class="identifier">right</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="comment">// Friend forward declaration (contracted declaration and definition below).</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">U</span> <span class="special">></span>
+ <span class="keyword">friend</span> <span class="keyword">bool</span> <span class="identifier">CONTRACT_FREE_BODY</span><span class="special">(</span><span class="keyword">operator</span><span class="special">(==)(</span><span class="identifier">equal</span><span class="special">))</span> <span class="special">(</span> <span class="comment">// Use BODY.</span>
+ <span class="identifier">counter</span><span class="special"><</span><span class="identifier">U</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">left</span><span class="special">,</span> <span class="identifier">U</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">right</span> <span class="special">)</span> <span class="special">;</span>
+
+<span class="comment">// NOTE: Forward friend template instantiations give internal MSVC error.</span>
+<span class="preprocessor">#if</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_MSVC</span><span class="special">)</span> <span class="special">&&</span> <span class="special">!</span><span class="identifier">defined</span><span class="special">(</span><span class="identifier">CONTRACT_CONFIG_NO_POSTCONDITIONS</span><span class="special">)</span>
+ <span class="comment">// Friend definition (contracted declaration below).</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">friend</span> <span class="identifier">counter</span> <span class="identifier">CONTRACT_FREE_BODY</span><span class="special">(</span><span class="keyword">operator</span><span class="special">(*)(</span><span class="identifier">mult</span><span class="special">))</span> <span class="special">(</span> <span class="comment">// Use BODY.</span>
+ <span class="identifier">counter</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">left</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">right</span> <span class="special">)</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">counter</span><span class="special">(</span><span class="identifier">left</span><span class="special">.</span><span class="identifier">value</span><span class="special">()</span> <span class="special">*</span> <span class="identifier">right</span><span class="special">);</span> <span class="comment">// Contract checked `right >=0` .</span>
+ <span class="special">}</span>
+<span class="preprocessor">#endif</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span> <span class="comment">// Public constructor gets next counter value.</span>
+ <span class="keyword">public</span> <span class="keyword">explicit</span> <span class="special">(</span><span class="identifier">counter</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">value_</span><span class="special">(</span><span class="identifier">next_value_</span><span class="special">++)</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span> <span class="comment">// Private constructor.</span>
+ <span class="keyword">private</span> <span class="keyword">explicit</span> <span class="special">(</span><span class="identifier">counter</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">a_value</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">a_value</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">value</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">a_value</span> <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">value_</span><span class="special">(</span><span class="identifier">a_value</span><span class="special">)</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="special">(</span><span class="identifier">value</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span> <span class="identifier">result</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">value_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">T</span> <span class="identifier">value_</span><span class="special">;</span>
+ <span class="keyword">private</span><span class="special">:</span> <span class="keyword">static</span> <span class="identifier">T</span> <span class="identifier">next_value_</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
+<span class="identifier">T</span> <span class="identifier">counter</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">next_value_</span> <span class="special">=</span> <span class="identifier">T</span><span class="special">();</span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">U</span> <span class="special">)</span>
+ <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">(==)(</span><span class="identifier">equal</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">counter</span><span class="special"><</span><span class="identifier">U</span><span class="special">></span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">left</span><span class="special">,</span> <span class="special">(</span><span class="identifier">U</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">right</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">right</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">left</span><span class="special">.</span><span class="identifier">value</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">right</span><span class="special">)</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">left</span><span class="special">.</span><span class="identifier">value</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">right</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="preprocessor">#if</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_MSVC</span><span class="special">)</span> <span class="special">&&</span> <span class="special">!</span><span class="identifier">defined</span><span class="special">(</span><span class="identifier">CONTRACT_CONFIG_NO_POSTCONDITIONS</span><span class="special">)</span>
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="special">(</span><span class="identifier">counter</span><span class="special"><</span><span class="keyword">int</span><span class="special">>)</span> <span class="keyword">operator</span><span class="special">(*)(</span><span class="identifier">mult</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">counter</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">left</span><span class="special">,</span>
+ <span class="special">(</span><span class="keyword">int</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">right</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">right</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span><span class="special">.</span><span class="identifier">value</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">left</span><span class="special">.</span><span class="identifier">value</span><span class="special">()</span> <span class="special">*</span> <span class="identifier">right</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">;</span>
+<span class="preprocessor">#endif</span>
+</pre>
+<p>
+ </p>
+<p>
+ The class enclosing the friend declarations might or might not be contracted.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.advanced_topics.template_specializations"></a><a class="link" href="advanced_topics.html#contract__.advanced_topics.template_specializations" title="Template Specializations">Template
+ Specializations</a>
+</h3></div></div></div>
+<p>
+ It is possible to program contracts for class template specializations. The
+ generic class template might or might not be contracted (see also template_specializations_vector.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// Not even necessary to contract this template.</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">,</span> <span class="keyword">default</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">vector</span><span class="special">)</span> <span class="keyword">extends</span><span class="special">(</span> <span class="keyword">public</span> <span class="identifier">pushable</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// ...</span>
+</pre>
+<p>
+ </p>
+<p>
+ The template specialization types follow the class name as usual but they
+ are wrapped within round parenthesis <code class="computeroutput"><span class="special">(</span>
+ <span class="keyword">bool</span><span class="special">,</span> <span class="identifier">Allocator</span> <span class="special">)</span></code>
+ instead than angular parenthesis <code class="computeroutput"><span class="special"><</span>
+ <span class="keyword">bool</span><span class="special">,</span> <span class="identifier">Allocator</span> <span class="special">></span></code>
+ as in the following partial specialization:
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// Template specialization (one template parameter).</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">class</span> <span class="identifier">Allocator</span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">vector</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">bool</span><span class="special">,</span> <span class="identifier">Allocator</span> <span class="special">)</span> <span class="keyword">extends</span><span class="special">(</span> <span class="keyword">public</span> <span class="identifier">pushable</span><span class="special"><</span><span class="keyword">bool</span><span class="special">></span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// ...</span>
+</pre>
+<p>
+ </p>
+<p>
+ The syntax <code class="computeroutput"><span class="keyword">template</span><span class="special">(</span>
+ <span class="keyword">void</span> <span class="special">)</span></code>
+ must be used instead of <code class="computeroutput"><span class="keyword">template</span><span class="special"><</span> <span class="special">></span></code>
+ to indicate explicit specializations:
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// Template specialization (no template parameter).</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">vector</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">bool</span> <span class="special">)</span> <span class="keyword">extends</span><span class="special">(</span> <span class="keyword">public</span> <span class="identifier">pushable</span><span class="special"><</span><span class="keyword">bool</span><span class="special">></span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// ...</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.advanced_topics.exception_specifications_and_function_try_blocks"></a><a class="link" href="advanced_topics.html#contract__.advanced_topics.exception_specifications_and_function_try_blocks" title="Exception Specifications and Function-Try Blocks">Exception
+ Specifications and Function-Try Blocks</a>
+</h3></div></div></div>
+<p>
+ It is possible to program exception specifications and function-try blocks
+ for constructors, destructors, member functions, and free functions with
+ contracts. Exception specifications are part of the function declarations
+ therefore they are programmed within the contract macros but the special
+ syntax <code class="computeroutput"><span class="keyword">throw</span><span class="special">(</span>
+ <span class="keyword">void</span> <span class="special">)</span></code>
+ must be used instead of <code class="computeroutput"><span class="keyword">throw</span><span class="special">(</span> <span class="special">)</span></code> to specify
+ that no exception is thrown:
+ </p>
+<pre class="programlisting"><span class="keyword">throw</span><span class="special">(</span> <span class="emphasis"><em>exception-type1</em></span><span class="special">,</span> <span class="emphasis"><em>exception-type2</em></span><span class="special">,</span> <span class="special">...</span> <span class="special">)</span> <span class="comment">// As usual.</span>
+<span class="keyword">throw</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="comment">// Instead of `throw( )`.</span>
+</pre>
+<p>
+ Function-try blocks are part of the function definition so they are normally
+ programmed outside the contract macros. However, for constructors with member
+ initializers, the member initializers must be programmed within the <code class="computeroutput"><a class="link" href="../CONTRACT_CONSTRUCTOR.html" title="Macro CONTRACT_CONSTRUCTOR">CONTRACT_CONSTRUCTOR</a></code> macro and therefore
+ also the function-try blocks must be programmed within the macro using the
+ following syntax:
+ </p>
+<pre class="programlisting"><span class="keyword">try</span> <span class="keyword">initialize</span><span class="special">(</span> <span class="emphasis"><em>initializer1</em></span><span class="special">,</span> <span class="emphasis"><em>initializer2</em></span><span class="special">,</span> <span class="special">...</span> <span class="special">)</span>
+<span class="keyword">catch</span><span class="special">(</span><span class="emphasis"><em>exception-declaration1</em></span><span class="special">)</span> <span class="special">(</span> <span class="emphasis"><em>instruction1</em></span><span class="special">;</span> <span class="emphasis"><em>instruction2</em></span><span class="special">;</span> <span class="special">...</span> <span class="special">)</span>
+<span class="keyword">catch</span><span class="special">(</span><span class="emphasis"><em>exception-declaration2</em></span><span class="special">)</span> <span class="special">(</span> <span class="emphasis"><em>instruction1</em></span><span class="special">;</span> <span class="emphasis"><em>instruction2</em></span><span class="special">;</span> <span class="special">...</span> <span class="special">)</span>
+<span class="keyword">catch</span><span class="special">(...)</span> <span class="special">(</span> <span class="emphasis"><em>instruction1</em></span><span class="special">;</span> <span class="emphasis"><em>instruction2</em></span><span class="special">;</span> <span class="special">...</span> <span class="special">)</span>
+</pre>
+<p>
+ As usual, only one catch statement must be specified and the other catch
+ statements are optional plus <code class="computeroutput"><span class="keyword">catch</span><span class="special">(...)</span></code> can be used to catch all exceptions.
+ Note however that round parenthesis <code class="computeroutput"><span class="special">(</span>
+ <span class="special">...</span> <span class="special">)</span></code>
+ are used instead of curly parenthesis <code class="computeroutput"><span class="special">{</span>
+ <span class="special">...</span> <span class="special">}</span></code>
+ to wrap the catch statement instructions (then the catch instructions are
+ programmed with the usual syntax and separated by semicolons <code class="computeroutput"><span class="special">;</span></code>). (The maximum number of catch statements
+ that can be programmed for constructor-try blocks is specified by the <code class="computeroutput"><a class="link" href="../CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES.html" title="Macro CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES">CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES</a></code>
+ macro.)
+ </p>
+<p>
+ In the following example the constructor uses a function-try block to throw
+ only <code class="computeroutput"><span class="identifier">out_of_memory</span></code> and <code class="computeroutput"><span class="identifier">error</span></code> exceptions while the destructor uses
+ exception specifications to throw no exception (see also exception_array.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">array</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">struct</span> <span class="identifier">out_of_memory</span> <span class="special">{};</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">struct</span> <span class="identifier">error</span> <span class="special">{};</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">explicit</span> <span class="special">(</span><span class="identifier">array</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">size_t</span> <span class="identifier">count</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">count</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span> <span class="special">)</span>
+ <span class="comment">// Function try-blocks are programmed within the macros only for</span>
+ <span class="comment">// constructors with member initializers otherwise they are</span>
+ <span class="comment">// programmed with the body definitions and outside the macros.</span>
+ <span class="keyword">try</span> <span class="keyword">initialize</span><span class="special">(</span> <span class="comment">// Try block for constructor initializers and body.</span>
+ <span class="identifier">data_</span><span class="special">(</span><span class="keyword">new</span> <span class="identifier">T</span><span class="special">[</span><span class="identifier">count</span><span class="special">]),</span>
+ <span class="identifier">size_</span><span class="special">(</span><span class="identifier">count</span><span class="special">)</span>
+ <span class="comment">// Use `BOOST_IDENTITY_TYPE` if the exception type has unwrapped</span>
+ <span class="comment">// commas or leading symbols.</span>
+ <span class="special">)</span> <span class="keyword">catch</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span><span class="special">&)</span> <span class="special">(</span>
+ <span class="keyword">throw</span> <span class="identifier">out_of_memory</span><span class="special">();</span>
+ <span class="special">)</span> <span class="keyword">catch</span><span class="special">(...)</span> <span class="special">(</span>
+ <span class="keyword">throw</span> <span class="identifier">error</span><span class="special">();</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">array</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">throw</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="comment">// Throw nothing.</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">delete</span><span class="special">[]</span> <span class="identifier">data_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="comment">// ...</span>
+</pre>
+<p>
+ </p>
+<p>
+ (The <code class="computeroutput"><span class="identifier">BOOST_IDENTITY_TYPE</span></code>
+ macro can be used to wrap the catch statement exception declaration types
+ if they contain unwrapped commas.)
+ </p>
+<p>
+ Exception specifications and function-try blocks apply only to exceptions
+ thrown by the function body and not to exceptions thrown by the contracts
+ themselves (if any) and by the contract checking code generated by this library
+ macros. <sup>[<a name="contract__.advanced_topics.exception_specifications_and_function_try_blocks.f0" href="#ftn.contract__.advanced_topics.exception_specifications_and_function_try_blocks.f0" class="footnote">52</a>]</sup>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.advanced_topics.specifying_types__no_boost_typeof_"></a><a class="link" href="advanced_topics.html#contract__.advanced_topics.specifying_types__no_boost_typeof_" title="Specifying Types (no Boost.Typeof)">Specifying
+ Types (no Boost.Typeof)</a>
+</h3></div></div></div>
+<p>
+ This library uses Boost.Typeof
+ to automatically deduces postcondition old value types and constant assertion
+ variable types. If programmers do not want the library to use Boost.Typeof
+ they can explicitly specify these types.
+ </p>
+<p>
+ The types of postcondition old values are specified instead of using <code class="computeroutput"><span class="keyword">auto</span></code> and they must be wrapped within round
+ parenthesis unless they are fundamental types containing no symbol (these
+ must match the type of the specified old-of expressions):
+ </p>
+<pre class="programlisting"><span class="special">(</span><span class="emphasis"><em>type</em></span><span class="special">)</span> <span class="emphasis"><em>variable</em></span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="emphasis"><em>oldof-expression</em></span>
+</pre>
+<p>
+ The types of constant assertion variables are specified just before each
+ variable name and they also must be wrapped within round parenthesis unless
+ they are fundamental types containing no symbol:
+ </p>
+<pre class="programlisting"><span class="keyword">const</span><span class="special">(</span> <span class="special">(</span><span class="emphasis"><em>type1</em></span><span class="special">)</span> <span class="emphasis"><em>variable1</em></span><span class="special">,</span> <span class="special">(</span><span class="emphasis"><em>type2</em></span><span class="special">)</span> <span class="emphasis"><em>variable2</em></span><span class="special">,</span> <span class="special">...</span> <span class="special">)</span> <span class="emphasis"><em>boolean-expression</em></span>
+</pre>
+<p>
+ For example (see also typed_counter.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">counter</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">static</span> <span class="keyword">unsigned</span> <span class="identifier">value</span><span class="special">;</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">int</span> <span class="special">(</span><span class="identifier">next</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="comment">// Explicit types so no Boost.Typeof.</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="keyword">unsigned</span> <span class="keyword">const</span> <span class="identifier">old_value</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">value</span><span class="special">,</span>
+ <span class="keyword">const</span><span class="special">(</span> <span class="keyword">unsigned</span> <span class="identifier">value</span><span class="special">,</span> <span class="keyword">unsigned</span> <span class="keyword">const</span> <span class="identifier">old_value</span> <span class="special">)</span>
+ <span class="identifier">value</span> <span class="special">==</span> <span class="identifier">old_value</span> <span class="special">+</span> <span class="number">1</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">value</span><span class="special">)</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="special">++</span><span class="identifier">value</span><span class="special">;</span>
+ <span class="special">}</span>
+<span class="special">};</span>
+
+<span class="keyword">unsigned</span> <span class="identifier">counter</span><span class="special">::</span><span class="identifier">value</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
+</pre>
+<p>
+ </p>
+<p>
+ Note that postcondition result values are always specified using <code class="computeroutput"><span class="keyword">auto</span></code>:
+ </p>
+<pre class="programlisting"><span class="keyword">auto</span> <span class="emphasis"><em>result-variable</em></span> <span class="special">=</span> <span class="keyword">return</span>
+</pre>
+<p>
+ This is because the function return type is know by the library as specified
+ in the function declaration within the <code class="computeroutput"><a class="link" href="../CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code>
+ macro. Therefore, the postcondition result value type is never explicitly
+ specified by programmers (but Boost.Typeof
+ is never used to deduce it).
+ </p>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ It is recommended to not specify these types explicitly and let the library
+ internally use Boost.Typeof
+ to deduce them because the library syntax is more readable without the
+ explicit types. However, all types must be properly registered with Boost.Typeof
+ as usual in order to use type-of emulation mode on C++03
+ compilers that do not support native type-of (see Boost.Typeof
+ for more information).
+ </p></td></tr>
+</table></div>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.advanced_topics.block_invariants_and_loop_variants"></a><a class="link" href="advanced_topics.html#contract__.advanced_topics.block_invariants_and_loop_variants" title="Block Invariants and Loop Variants">Block
+ Invariants and Loop Variants</a>
+</h3></div></div></div>
+<p>
+ <span class="emphasis"><em>Block invariants</em></span> can be used anywhere within the function
+ body and they are used to assert correctness conditions of the implementation
+ (very much like <code class="computeroutput"><span class="identifier">assert</span></code>).
+ They are programmed specifying a list of assertions to the <code class="computeroutput"><a class="link" href="../CONTRACT_BLOCK_INVARIANT.html" title="Macro CONTRACT_BLOCK_INVARIANT">CONTRACT_BLOCK_INVARIANT</a></code>
+ macro (including static, constant, and select assertions):
+ </p>
+<pre class="programlisting"><span class="identifier">CONTRACT_BLOCK_INVARIANT</span><span class="special">(</span> <span class="emphasis"><em>assertion1</em></span><span class="special">,</span> <span class="emphasis"><em>assertion2</em></span><span class="special">,</span> <span class="special">...</span> <span class="special">)</span>
+</pre>
+<p>
+ When block invariants are used within a loop, they are also called <span class="emphasis"><em>loop
+ invariants</em></span> (e.g., Eiffel
+ uses this terminology).
+ </p>
+<p>
+ Furthermore, this library allows to specify <a href="http://en.wikipedia.org/wiki/Loop_variant" target="_top"><span class="emphasis"><em>loop
+ variants</em></span></a>. A loop variant is a non-negative monotonically
+ decreasing number that is updated at each iteration of the loop. The specified
+ loop variant expression is calculated by this library at each iteration of
+ the loop and it is automatically asserted to be non-negative (<code class="computeroutput"><span class="special">>=</span> <span class="number">0</span></code>) and
+ to decrease monotonically from the previous loop iteration. Because the loop
+ variant monotonically decreases and it cannot be smaller than zero, either
+ the loop terminates or one of the two library assertions will eventually
+ fail in which case the library will call the <code class="computeroutput"><a class="link" href="../contract/loop_variant_broken.html" title="Function loop_variant_broken">contract::loop_variant_broken</a></code>
+ handler therefore detecting and stopping infinite loops. Each given loop
+ can only have one variant which is specified using the <code class="computeroutput"><a class="link" href="../CONTRACT_LOOP_VARIANT.html" title="Macro CONTRACT_LOOP_VARIANT">CONTRACT_LOOP_VARIANT</a></code>
+ macro. The enclosing loop (<code class="computeroutput"><span class="keyword">while</span></code>,
+ <code class="computeroutput"><span class="keyword">for</span></code>, <code class="computeroutput"><span class="keyword">do</span></code>,
+ etc) must be declared using the <code class="computeroutput"><a class="link" href="../CONTRACT_LOOP.html" title="Macro CONTRACT_LOOP">CONTRACT_LOOP</a></code>
+ macro:
+ </p>
+<pre class="programlisting"><span class="identifier">CONTRACT_LOOP</span><span class="special">(</span> <span class="emphasis"><em>loop-declaration</em></span> <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_LOOP_VARIANT</span><span class="special">(</span> <span class="emphasis"><em>non-negative-monotonically-decreasing-expression</em></span> <span class="special">)</span>
+ <span class="special">...</span>
+<span class="special">}</span>
+</pre>
+<p>
+ Note that the library cannot automatically make constant any of the variables
+ within the function body therefore constant block invariant assertions and
+ constant loop variant expressions should be used by programmers if they want
+ to enforce constant-correctness for block invariants and loop variants.
+ </p>
+<p>
+ The following example uses a loop to calculate the <a href="http://en.wikipedia.org/wiki/Greatest_common_divisor" target="_top">Greatest
+ Common Divisor (GCD)</a> of two integral numbers (see also blockinv_loopvar_gcd.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="special">(</span><span class="identifier">gcd</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">a</span><span class="special">,</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">b</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span>
+ <span class="keyword">static_assert</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_integral</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span><span class="special">,</span> <span class="string">"integral type"</span><span class="special">),</span>
+ <span class="identifier">a</span> <span class="special">!=</span> <span class="number">0</span><span class="special">,</span>
+ <span class="identifier">b</span> <span class="special">!=</span> <span class="number">0</span>
+ <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special"><=</span> <span class="identifier">a</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special"><=</span> <span class="identifier">b</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">T</span> <span class="identifier">x</span> <span class="special">=</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">y</span> <span class="special">=</span> <span class="identifier">b</span><span class="special">;</span>
+ <span class="comment">// Block invariant assert conditions within body,</span>
+ <span class="identifier">CONTRACT_BLOCK_INVARIANT_TPL</span><span class="special">(</span> <span class="keyword">const</span><span class="special">(</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">a</span> <span class="special">)</span> <span class="identifier">x</span> <span class="special">==</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span><span class="special">(</span> <span class="identifier">y</span><span class="special">,</span> <span class="identifier">b</span> <span class="special">)</span> <span class="identifier">y</span> <span class="special">==</span> <span class="identifier">b</span> <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_LOOP</span><span class="special">(</span> <span class="keyword">while</span><span class="special">(</span><span class="identifier">x</span> <span class="special">!=</span> <span class="identifier">y</span><span class="special">)</span> <span class="special">)</span> <span class="special">{</span> <span class="comment">// Define a loop with variants (below).</span>
+ <span class="comment">// Block invariant for loops (i.e., loop invariants).</span>
+ <span class="identifier">CONTRACT_BLOCK_INVARIANT_TPL</span><span class="special">(</span> <span class="keyword">const</span><span class="special">(</span> <span class="identifier">x</span> <span class="special">)</span> <span class="identifier">x</span> <span class="special">></span> <span class="number">0</span><span class="special">,</span> <span class="keyword">const</span><span class="special">(</span> <span class="identifier">y</span> <span class="special">)</span> <span class="identifier">y</span> <span class="special">></span> <span class="number">0</span> <span class="special">)</span>
+ <span class="comment">// Loop variant checked to be non-negative and monotonically decreasing.</span>
+ <span class="identifier">CONTRACT_LOOP_VARIANT_TPL</span><span class="special">(</span> <span class="keyword">const</span><span class="special">(</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">y</span> <span class="special">)</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">max</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span> <span class="identifier">y</span><span class="special">)</span> <span class="special">)</span>
+
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">x</span> <span class="special">></span> <span class="identifier">y</span><span class="special">)</span> <span class="identifier">x</span> <span class="special">=</span> <span class="identifier">x</span> <span class="special">-</span> <span class="identifier">y</span><span class="special">;</span>
+ <span class="keyword">else</span> <span class="identifier">y</span> <span class="special">=</span> <span class="identifier">y</span> <span class="special">-</span> <span class="identifier">x</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="keyword">return</span> <span class="identifier">x</span><span class="special">;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+ Eiffel
+ supports loop variants but <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a> does
+ not. Loop variants might not be very useful especially if Boost.Foreach
+ or similar constructs are used to ensure loop termination.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.advanced_topics.contract_broken_handlers__throw_on_failure_"></a><a class="link" href="advanced_topics.html#contract__.advanced_topics.contract_broken_handlers__throw_on_failure_" title="Contract Broken Handlers (Throw on Failure)">Contract
+ Broken Handlers (Throw on Failure)</a>
+</h3></div></div></div>
+<p>
+ When a contract assertion fails, this library prints a message on the standard
+ error <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span></code> and it terminates the program calling
+ <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span></code>. Programmers can change this
+ behavior customizing the actions that the library takes on contract assertion
+ failure by setting the contract broken handler functions. By default the
+ library terminates the program because a contract failure indicates that
+ the program is in an invalid state that programmers specified it should never
+ happen (so the only sensible assumption is that the program execution should
+ not continue). However, in some cases programmers might need to handle even
+ such catastrophic failures by executing some fail-safe code instead of terminating
+ the program and that can be done customizing the contract broken handlers.
+ </p>
+<p>
+ The library functions <code class="computeroutput"><a class="link" href="../reference.html#contract.set_precondition_broken">contract::set_precondition_broken</a></code>,
+ <code class="computeroutput"><a class="link" href="../reference.html#contract.set_postcondition_broken">contract::set_postcondition_broken</a></code>,
+ <code class="computeroutput"><a class="link" href="../reference.html#contract.set_class_invariant_broken">contract::set_class_invariant_broken</a></code>,
+ <code class="computeroutput"><a class="link" href="../reference.html#contract.set_block_invariant_broken">contract::set_block_invariant_broken</a></code>,
+ and <code class="computeroutput"><a class="link" href="../reference.html#contract.set_loop_variant_broken">contract::set_loop_variant_broken</a></code>
+ can be used to customize the action to taken in case of precondition, postcondition,
+ class invariant, block invariant, and loop variant failure respectively.
+ Furthermore, class invariants are checked at entry, at normal exit, and at
+ exit but when exceptions are thrown so more granular handlers can be set
+ for each of these cases using <code class="computeroutput"><a class="link" href="../reference.html#contract.set_class_invaria_id552567">contract::set_class_invariant_broken_on_entry</a></code>,
+ <code class="computeroutput"><a class="link" href="../reference.html#contract.set_class_invaria_id552645">contract::set_class_invariant_broken_on_exit</a></code>,
+ and <code class="computeroutput"><a class="link" href="../reference.html#contract.set_class_invaria_id552723">contract::set_class_invariant_broken_on_throw</a></code>
+ (using <code class="computeroutput"><a class="link" href="../reference.html#contract.set_class_invariant_broken">contract::set_class_invariant_broken</a></code>
+ is equivalent to setting all these class invariant broken handles to the
+ same handler). <sup>[<a name="contract__.advanced_topics.contract_broken_handlers__throw_on_failure_.f0" href="#ftn.contract__.advanced_topics.contract_broken_handlers__throw_on_failure_.f0" class="footnote">53</a>]</sup>
+ </p>
+<p>
+ This library passes a parameter of type <code class="computeroutput"><a class="link" href="../contract/from.html" title="Type from">contract::from</a></code>
+ to the contract broken handler functions indicating the context that failed
+ the contract assertion (e.g., this parameter will be set to <code class="computeroutput"><span class="identifier">contract</span><span class="special">::</span><span class="identifier">FROM_DESTRUCTOR</span></code> if the contract assertion
+ failed from a destructor): <sup>[<a name="contract__.advanced_topics.contract_broken_handlers__throw_on_failure_.f1" href="#ftn.contract__.advanced_topics.contract_broken_handlers__throw_on_failure_.f1" class="footnote">54</a>]</sup>
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="emphasis"><em>contract-broken-handler</em></span> <span class="special">(</span> <span class="identifier">contract</span><span class="special">::</span><span class="identifier">from</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">context</span> <span class="special">)</span>
+</pre>
+<div class="important"><table border="0" summary="Important">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../doc/src/images/important.png"></td>
+<th align="left">Important</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ In order to comply with the STL exception safety requirements, destructors
+ should never throw. Therefore, even if programmers customize the contract
+ broken handlers to throw exceptions instead of terminating, the handlers
+ should never throw when contract assertions fail from a destructor (and
+ the <code class="computeroutput"><a class="link" href="../contract/from.html" title="Type from">contract::from</a></code> parameter
+ can be used to discriminate this case).
+ </p></td></tr>
+</table></div>
+<p>
+ The contract broken handlers are always invoked with an active exception
+ that refers to the exception that failed the contract: <sup>[<a name="contract__.advanced_topics.contract_broken_handlers__throw_on_failure_.f2" href="#ftn.contract__.advanced_topics.contract_broken_handlers__throw_on_failure_.f2" class="footnote">55</a>]</sup>
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ Either an exception that was explicitly thrown by the user from the contract
+ (e.g. <code class="computeroutput"><span class="identifier">not_a_number</span></code> in
+ the example blow).
+ </li>
+<li class="listitem">
+ Or, an exception that was thrown <span class="quote">“<span class="quote">behind the scene</span>”</span> while
+ evaluating a contract assertion (e.g., the assertion calls an STL algorithm
+ and that throws <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span></code>).
+ </li>
+<li class="listitem">
+ Or, an exception automatically thrown by this library in case a contract
+ assertion is evaluated to be false (these exceptions are always <code class="computeroutput"><a class="link" href="../contract/broken.html" title="Class broken">contract::broken</a></code> objects and they
+ contained detailed information about the contract assertion that was
+ evaluated to be false: file name, line number, assertion number, and
+ assertion code). <sup>[<a name="contract__.advanced_topics.contract_broken_handlers__throw_on_failure_.f3" href="#ftn.contract__.advanced_topics.contract_broken_handlers__throw_on_failure_.f3" class="footnote">56</a>]</sup>
+ </li>
+</ol></div>
+<p>
+ In all these cases the contract assertion is considered failed because it
+ was not evaluated to be true (and that is the case not only for assertions
+ that are evaluated to be false but also for assertions that throw exceptions
+ while being evaluated). <sup>[<a name="contract__.advanced_topics.contract_broken_handlers__throw_on_failure_.f4" href="#ftn.contract__.advanced_topics.contract_broken_handlers__throw_on_failure_.f4" class="footnote">57</a>]</sup> The customized contract broken handlers can re-throw the active
+ exception and catch it so to inspect it for logging or for any other customized
+ behaviour that might need to be implemented by the programmers.
+ </p>
+<p>
+ The following example customizes the contract broken handlers to throw exceptions
+ (both user-defined exceptions like <code class="computeroutput"><span class="identifier">not_a_number</span></code>
+ and the <code class="computeroutput"><a class="link" href="../contract/broken.html" title="Class broken">contract::broken</a></code> exception
+ that the library automatically throws in case of a contract assertion failure).
+ However, the customized handlers never throw from within a destructor to
+ comply with STL exception safety requirements (see also broken_handler_sqrt.cpp
):
+ <sup>[<a name="contract__.advanced_topics.contract_broken_handlers__throw_on_failure_.f5" href="#ftn.contract__.advanced_topics.contract_broken_handlers__throw_on_failure_.f5" class="footnote">58</a>]</sup>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">not_a_number</span> <span class="special">{};</span> <span class="comment">// User defined exception.</span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">double</span> <span class="special">(</span><span class="identifier">sqrt</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">double</span> <span class="identifier">x</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span>
+ <span class="identifier">x</span> <span class="special">>=</span> <span class="number">0.0</span> <span class="special">?</span> <span class="keyword">true</span> <span class="special">:</span> <span class="keyword">throw</span> <span class="identifier">not_a_number</span><span class="special">()</span> <span class="comment">// Throw user exception.</span>
+ <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">root</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">root</span> <span class="special">*</span> <span class="identifier">root</span> <span class="special">==</span> <span class="identifier">x</span> <span class="comment">// Failure throws `contract::broken` exception.</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="number">0.0</span><span class="special">;</span> <span class="comment">// Intentionally incorrect to fail postcondition.</span>
+<span class="special">}</span>
+
+<span class="keyword">void</span> <span class="identifier">throwing_handler</span> <span class="special">(</span> <span class="identifier">contract</span><span class="special">::</span><span class="identifier">from</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">context</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="comment">// Failure handlers always called with active exception that failed the</span>
+ <span class="comment">// contract, so re-throw it to catch it below for logging.</span>
+ <span class="keyword">try</span> <span class="special">{</span>
+ <span class="keyword">throw</span><span class="special">;</span>
+ <span class="special">}</span> <span class="keyword">catch</span><span class="special">(</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">broken</span><span class="special">&</span> <span class="identifier">failure</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span> <span class="special"><<</span> <span class="identifier">failure</span><span class="special">.</span><span class="identifier">file_name</span><span class="special">()</span> <span class="special"><<</span> <span class="string">"("</span> <span class="special"><<</span> <span class="identifier">failure</span><span class="special">.</span><span class="identifier">line_number</span><span class="special">()</span> <span class="special"><<</span>
+ <span class="string">"): contract assertion \""</span> <span class="special"><<</span> <span class="identifier">failure</span><span class="special">.</span><span class="identifier">assertion_code</span><span class="special">()</span> <span class="special"><<</span>
+ <span class="string">"\" failed "</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
+ <span class="special">}</span> <span class="keyword">catch</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">exception</span><span class="special">&</span> <span class="identifier">failure</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span> <span class="special"><<</span> <span class="string">"contract failed: "</span> <span class="special"><<</span> <span class="identifier">failure</span><span class="special">.</span><span class="identifier">what</span><span class="special">()</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
+ <span class="special">}</span> <span class="keyword">catch</span><span class="special">(...)</span> <span class="special">{</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span> <span class="special"><<</span> <span class="string">"contract failed with unknown error"</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="comment">// Cannot throw from destructors to comply with STL exception safety,</span>
+ <span class="comment">// otherwise re-throw active exception that failed the contract.</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">context</span> <span class="special">==</span> <span class="identifier">contract</span><span class="special">::</span><span class="identifier">FROM_DESTRUCTOR</span><span class="special">)</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span> <span class="special"><<</span> <span class="string">"Ignoring destructor contract failure (probably "</span>
+ <span class="special"><<</span> <span class="string">"something bad has happened)"</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
+ <span class="keyword">else</span> <span class="keyword">throw</span><span class="special">;</span> <span class="comment">// Never terminates.</span>
+<span class="special">}</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="comment">// Customize contract broken handlers to throw exceptions instead of</span>
+ <span class="comment">// terminating the program (default).</span>
+ <span class="identifier">contract</span><span class="special">::</span><span class="identifier">set_precondition_broken</span><span class="special">(&</span><span class="identifier">throwing_handler</span><span class="special">);</span>
+ <span class="identifier">contract</span><span class="special">::</span><span class="identifier">set_postcondition_broken</span><span class="special">(&</span><span class="identifier">throwing_handler</span><span class="special">);</span>
+
+<span class="preprocessor">#ifndef</span> <span class="identifier">CONTRACT_CONFIG_NO_PRECONDITIONS</span>
+ <span class="keyword">bool</span> <span class="identifier">pre</span> <span class="special">=</span> <span class="keyword">false</span><span class="special">;</span>
+ <span class="keyword">try</span> <span class="special">{</span>
+ <span class="identifier">sqrt</span><span class="special">(-</span><span class="number">1.0</span><span class="special">);</span> <span class="comment">// Fails precondition.</span>
+ <span class="special">}</span> <span class="keyword">catch</span><span class="special">(</span><span class="identifier">not_a_number</span><span class="special">&)</span> <span class="special">{</span>
+ <span class="identifier">pre</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">;</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">clog</span> <span class="special"><<</span> <span class="string">"Ignoring not-a-number exception"</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
+ <span class="special">}</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">pre</span><span class="special">);</span>
+<span class="preprocessor">#endif</span>
+
+<span class="preprocessor">#ifndef</span> <span class="identifier">CONTRACT_CONFIG_NO_POSTCONDITIONS</span>
+ <span class="keyword">bool</span> <span class="identifier">post</span> <span class="special">=</span> <span class="keyword">false</span><span class="special">;</span>
+ <span class="keyword">try</span> <span class="special">{</span>
+ <span class="identifier">sqrt</span><span class="special">(</span><span class="number">4.0</span><span class="special">);</span> <span class="comment">// Fails postcondition.</span>
+ <span class="special">}</span> <span class="keyword">catch</span><span class="special">(...)</span> <span class="special">{</span>
+ <span class="identifier">post</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">;</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">clog</span> <span class="special"><<</span> <span class="string">"Unable to calculate square root"</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
+ <span class="special">}</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">post</span><span class="special">);</span>
+<span class="preprocessor">#endif</span>
+
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+ Note how the ternary operator <code class="computeroutput"><span class="special">:?</span></code>
+ can be used to program assertions that throw exceptions on failure:
+ </p>
+<pre class="programlisting"><span class="identifier">x</span> <span class="special">>=</span> <span class="number">0.0</span> <span class="special">?</span> <span class="keyword">true</span> <span class="special">:</span> <span class="keyword">throw</span> <span class="identifier">not_a_number</span>
+</pre>
+<p>
+ Then the contract broken handlers are customized to propagate the exceptions
+ instead of handling them by calling <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span></code>
+ (default behaviour).
+ </p>
+<p>
+ See also contract_failure.cpp
for
+ a more complex example that redefines the contract broken handlers to throw
+ exceptions in order to automatically check that the correct contract broken
+ handlers are called when assertions fail in accordance with the call semantics
+ explained in the <a class="link" href="contract_programming_overview.html" title="Contract Programming Overview">Contract
+ Programming Overview</a> section.
+ </p>
+</div>
+<div class="footnotes">
+<br><hr width="100" align="left">
+<div class="footnote"><p><sup>[<a id="ftn.contract__.advanced_topics.commas_and_leading_symbols_in_macros.f0" href="#contract__.advanced_topics.commas_and_leading_symbols_in_macros.f0" class="para">35</a>] </sup>
+ Note that for the preprocessor a number with decimal period <code class="computeroutput"><span class="number">1.23</span></code>, <code class="computeroutput"><span class="number">0.12</span></code>,
+ <code class="computeroutput"><span class="special">.</span><span class="number">34</span></code>
+ is considered a symbol (because its concatenation will not result in a
+ valid macro identifier).
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.advanced_topics.commas_and_leading_symbols_in_macros.f1" href="#contract__.advanced_topics.commas_and_leading_symbols_in_macros.f1" class="para">36</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> This limitation is introduced
+ by the need to support also the sequence syntax for preprocessor without
+ variadic macros (see the <a class="link" href="no_variadic_macros.html" title="No Variadic Macros">No
+ Variadic Macros</a> section).
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.advanced_topics.static_assertions.f0" href="#contract__.advanced_topics.static_assertions.f0" class="para">37</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> Eiffel
+ supports <span class="emphasis"><em>assertion labeling</em></span> to further document assertions.
+ However, when designing this library for C++, the authors judged that it
+ is sufficient to add a short code comment after each assertion to achieve
+ a similar effect.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.advanced_topics.constant_assertions.f0" href="#contract__.advanced_topics.constant_assertions.f0" class="para">38</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> The library needs to know
+ at least the variable name in order to make it constant. There is no
+ way for this library to know the name of a global variable that is implicitly
+ accessible from the contract assertion scope so such a variable cannot
+ be automatically made constant. Non-static data members are automatically
+ made constant by making constant the member function that checks the
+ contract, but that does not apply to static data members. Not even C++11 lambda implicit
+ captures could be used in this context because they make variables constant
+ only when captured by value and that introduces a CopyConstructible
+ requirement of the captured variable types.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.advanced_topics.assertion_statements.f0" href="#contract__.advanced_topics.assertion_statements.f0" class="para">39</a>] </sup>
+ Assertion statements might be especially useful because contracts appear
+ with the class and function declarations usually in header files where
+ <code class="computeroutput"><span class="keyword">using</span></code> directives and <code class="computeroutput"><span class="keyword">namespace</span></code> aliases should only be used with
+ extreme care and, for example, at local scope as assertion statements allow
+ to do.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.advanced_topics.assertion_requirements.f0" href="#contract__.advanced_topics.assertion_requirements.f0" class="para">40</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> The assertion requirement
+ syntax takes a constant boolean expression instead of a nullary boolean
+ meta-function because the authors have found no reason to use a meta-function
+ in this context. Furthermore, constant boolean expressions can be manipulated
+ via the usual operators <code class="computeroutput"><span class="keyword">not</span></code>,
+ <code class="computeroutput"><span class="keyword">and</span></code>, etc, therefore more
+ naturally than boolean meta-functions which need to use <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">not_</span></code>, <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">and_</span></code>,
+ etc instead.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.advanced_topics.assertion_requirements.f1" href="#contract__.advanced_topics.assertion_requirements.f1" class="para">41</a>] </sup>
+ Future revisions of this library might provide wrappers that program contracts
+ for the STL in appropriate header files <code class="literal">contract/std/vector.hpp</code>,
+ <code class="literal">contract/std/algorithm.hpp</code>, etc (see also <a href="http://www.sgi.com/tech/stl/" target="_top">SGI
+ STL</a> and <a href="http://sourceforge.net/apps/trac/contractpp/ticket/47" target="_top">Ticket
+ 47</a>). However, given that STL implementations are usually considered
+ to be <span class="quote">“<span class="quote">correct</span>”</span>, it is not clear if STL class invariants and
+ postconditions would add any value, maybe programmers would only find STL
+ preconditions useful.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.advanced_topics.assertion_requirements.f2" href="#contract__.advanced_topics.assertion_requirements.f2" class="para">42</a>] </sup>
+ Assertion requirements where first introduced by this library and they
+ are not supported by <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a>, D, or Eiffel
+ (even if they all allow to write contracts for templates). Based on the
+ authors' experience, assertion requirements are necessary for a language
+ that make extensive use of templates like C++. Furthermore, C++ does not
+ automatically define equality operators <code class="computeroutput"><span class="special">==</span></code>
+ while it automatically defines copy constructors and that makes the use
+ of the assertion requirements for EqualityComparable
+ a rather common practise (in Eiffel
+ instead types can be both copied and compared for equality by default).
+ It has been argued that it is not possible to check a program for correctness
+ if types that are copyable cannot also be compared for equality and the
+ authors experience with programming contracts confirms such an argument.
+ </p></div>
+<div class="footnote">
+<p><sup>[<a id="ftn.contract__.advanced_topics.assertion_requirements.f3" href="#contract__.advanced_topics.assertion_requirements.f3" class="para">43</a>] </sup>
+ As of Boost 1.50, <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span></code> and similar traits always
+ return true for an STL container even if the value type of the container
+ does not have an operator <code class="computeroutput"><span class="special">==</span></code>.
+ This is arguably a defect of the STL that always defines an operator <code class="computeroutput"><span class="special">==</span></code> for its containers even when a container
+ template is instantiated with a value type that has no operator <code class="computeroutput"><span class="special">==</span></code>, in which case the container operator
+ <code class="computeroutput"><span class="special">==</span></code> will produce a compiler
+ error (the STL should instead use SFINAE
+ to disable the declaration of the container operator <code class="computeroutput"><span class="special">==</span></code>
+ when the value type has no operator <code class="computeroutput"><span class="special">==</span></code>).
+ Future versions of Boost.TypeTraits
+ will probably specialize <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span></code>
+ and similar traits to work around this behaviour of the STL. In the meanwhile,
+ programmers can specialize these traits themselves if needed:
+</p>
+<pre class="programlisting"><span class="comment">// Header: std_has_equal_to.hpp</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">/</span><span class="identifier">has_equal_to</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">/</span><span class="identifier">is_convertible</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="keyword">and</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">vector</span><span class="special">></span>
+
+<span class="comment">// STL defines `operator==` only between two identical containers (same value</span>
+<span class="comment">// type, allocator, etc) and returning a type convertible to `bool`.</span>
+
+<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
+
+<span class="comment">// Specializations for `std::vector`.</span>
+
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span> <span class="special">></span>
+<span class="keyword">struct</span> <span class="identifier">has_equal_to</span> <span class="special"><</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Alloc</span><span class="special">>,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Alloc</span><span class="special">></span> <span class="special">></span> <span class="special">:</span>
+ <span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">bool</span><span class="special">></span>
+<span class="special">{};</span>
+
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Alloc</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Ret</span> <span class="special">></span>
+<span class="keyword">struct</span> <span class="identifier">has_equal_to</span> <span class="special"><</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Alloc</span><span class="special">>,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Alloc</span><span class="special">>,</span> <span class="identifier">Ret</span> <span class="special">></span> <span class="special">:</span>
+ <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">and_</span><span class="special"><</span>
+ <span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">bool</span><span class="special">></span>
+ <span class="special">,</span> <span class="identifier">is_convertible</span><span class="special"><</span><span class="identifier">Ret</span><span class="special">,</span> <span class="keyword">bool</span><span class="special">></span>
+ <span class="special">></span>
+<span class="special">{};</span>
+
+<span class="comment">// ... specialize `has_equal_to` for more STL containers.</span>
+
+<span class="special">}</span> <span class="comment">// namespace</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.advanced_topics.assertion_requirements.f4" href="#contract__.advanced_topics.assertion_requirements.f4" class="para">44</a>] </sup>
+ <a class="link" href="bibliography.html#N1866_anchor">[N1866]</a>, an earlier version of <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a>, introduced the notion of <span class="emphasis"><em>importance
+ ordering</em></span> that could be used to selectively disable assertions
+ that where too expensive computationally. Importance ordering was then
+ dropped by <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a>. Among other things,
+ assertion requirements can be used to achieve the importance ordering functionality.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.advanced_topics.old_of_requirements.f0" href="#contract__.advanced_topics.old_of_requirements.f0" class="para">45</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> The result type needs to be
+ copyable in order for the function itself to return a value so this library
+ can always evaluate return value declarations.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.advanced_topics.old_and_result_value_copies.f0" href="#contract__.advanced_topics.old_and_result_value_copies.f0" class="para">46</a>] </sup>
+ Currently, it is not possible to force constant-correctness of the expression
+ passed to the <code class="computeroutput"><a class="link" href="../CONTRACT_OLDOF.html" title="Macro CONTRACT_OLDOF">CONTRACT_OLDOF</a></code>
+ macro. Future revisions of this library will support <code class="computeroutput"><span class="identifier">CONTRACT_OLDOF</span>
+ <span class="keyword">const</span><span class="special">(</span>
+ <span class="special">...</span> <span class="special">)</span>
+ <span class="special">...</span></code> to allow to make constant all
+ variables (including global, static, etc) used by old value expressions
+ (see also <a href="http://sourceforge.net/apps/trac/contractpp/ticket/52" target="_top">Ticket
+ 52</a>).
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.advanced_topics.pure_virtual_functions.f0" href="#contract__.advanced_topics.pure_virtual_functions.f0" class="para">47</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> Older revisions of this library
+ defined the macro <code class="computeroutput"><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">class_type</span><span class="special">,</span> <span class="identifier">function_name</span><span class="special">)</span></code> taking two parameters so this macro could
+ not be used in declaring derived classes and the <code class="computeroutput"><a class="link" href="../CONTRACT_CLASS.html" title="Macro CONTRACT_CLASS">CONTRACT_CLASS</a></code>
+ and <code class="computeroutput"><a class="link" href="../CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code> macros
+ where required when programming a class inheriting from a base class with
+ contracts. However, the authors prefer to leave the choice of programming
+ full contracts for derived classes to the derived class programmers because
+ of the unusual declaration syntax introduced by this library might not
+ be necessary when derived classes do not need to alter the base's class
+ contract.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.advanced_topics.static_member_functions.f0" href="#contract__.advanced_topics.static_member_functions.f0" class="para">48</a>] </sup>
+ Static class invariants are not part of <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a>
+ and they were first introduced by this library.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.advanced_topics.volatile_member_functions.f0" href="#contract__.advanced_topics.volatile_member_functions.f0" class="para">49</a>] </sup>
+ Volatile class invariants are not part of <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a>
+ and they were first introduced by this library. It is not clear if there
+ are real applications for volatile class invariants mainly because real
+ applications of <code class="computeroutput"><span class="keyword">volatile</span></code> itself
+ are not clear in C++. One very interesting use of <code class="computeroutput"><span class="keyword">volatile</span></code>
+ has been to <a href="http://www.drdobbs.com/cpp/184403766" target="_top">avoid race
+ conditions</a> in concurrent programming (but contracts are not useful
+ for such an application of <code class="computeroutput"><span class="keyword">volatile</span></code>).
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.advanced_topics.operators.f0" href="#contract__.advanced_topics.operators.f0" class="para">50</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> The comma operator cannot be
+ specified using the comma symbol as in <code class="computeroutput"><span class="keyword">operator</span><span class="special">(,)(</span><span class="identifier">my_comma_operator</span><span class="special">)</span></code> because the preprocessor uses commas to
+ separate macro parameters so it is not possible to distinguish that from
+ an implicit type conversion operator like <code class="computeroutput"><span class="keyword">operator</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">>)(</span><span class="identifier">std_vector</span><span class="special">)</span></code> (note that the operator name is arbitrary
+ so it also cannot be used to distinguish these two cases).
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.advanced_topics.operators.f1" href="#contract__.advanced_topics.operators.f1" class="para">51</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> C++ automatically promotes
+ memory member operators to static members so the <code class="computeroutput"><span class="keyword">static</span></code>
+ keyword is optional for these member operators. However, this library cannot
+ inspect the operator symbol using the preprocessor to check if the operator
+ is a memory member operator or not because the symbol contains non-alphanumeric
+ tokens (which cannot be concatenated by the preprocessor). Therefore, this
+ library always requires memory member operators to be explicitly declared
+ as static member functions.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.advanced_topics.exception_specifications_and_function_try_blocks.f0" href="#contract__.advanced_topics.exception_specifications_and_function_try_blocks.f0" class="para">52</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a>
+ specifies that function-try blocks should only apply to the body code and
+ not to the contract code. No explicit requirement is stated in <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a>
+ for exception specifications but the authors have decided to adopt the
+ same requirement that applies to function-try blocks (because it seemed
+ of little use for the contract to throw an exception just so it is handled
+ by the exception specification).
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.advanced_topics.contract_broken_handlers__throw_on_failure_.f0" href="#contract__.advanced_topics.contract_broken_handlers__throw_on_failure_.f0" class="para">53</a>] </sup>
+ <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a> does not allow to configure
+ class invariant broken handlers differently for entry, exit, and throw.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.advanced_topics.contract_broken_handlers__throw_on_failure_.f1" href="#contract__.advanced_topics.contract_broken_handlers__throw_on_failure_.f1" class="para">54</a>] </sup>
+ The <code class="computeroutput"><span class="identifier">contract</span><span class="special">::</span><span class="identifier">from</span></code> parameter was not part of <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a> contract broken handlers but the
+ proposal hinted that it might be needed (need that was confirmed by the
+ implementation of this library).
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.advanced_topics.contract_broken_handlers__throw_on_failure_.f2" href="#contract__.advanced_topics.contract_broken_handlers__throw_on_failure_.f2" class="para">55</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> Exceptions are used to signal
+ a contract assertion failure because it is not possible to directly call
+ the contract broken handler (<code class="computeroutput"><a class="link" href="../contract/precondition_broken.html" title="Function precondition_broken">contract::precondition_broken</a></code>,
+ etc) instead of throwing the exception in oder to properly implement subcontracting.
+ For example, if an overriding precondition fails but the overridden precondition
+ is true then the library will not call the broken handler even if the overriding
+ precondition threw an exception (as required by subcontracting). Contract
+ assertion failures are critical error conditions so it is actually natural
+ that the library uses exceptions to signal them (note that the library
+ will always handle the exceptions by calling the contract broken handlers
+ which terminate the program by default so the fact that the library signals
+ contract assertion failures using exceptions does not imply that an exception
+ will be thrown if a contract assertion fails, that is entirely decided
+ by the implementation of the broken handlers).
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.advanced_topics.contract_broken_handlers__throw_on_failure_.f3" href="#contract__.advanced_topics.contract_broken_handlers__throw_on_failure_.f3" class="para">56</a>] </sup>
+ The assertion number is meaningful only within a specific handler.
+ For example, if assertion number <code class="computeroutput"><span class="number">2</span></code>
+ failed within the class invariant broken handler that mean that the
+ class invariant number <code class="computeroutput"><span class="number">2</span></code>
+ failed. Therefore, the assertion number is not useful if a single handler
+ is programmed for all types of contracts because such an handler can
+ no longer distinguish between class invariants, preconditions, postconditions,
+ etc.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.advanced_topics.contract_broken_handlers__throw_on_failure_.f4" href="#contract__.advanced_topics.contract_broken_handlers__throw_on_failure_.f4" class="para">57</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> Threating an exception thrown
+ while evaluating an assertion as a failure of the contract assertion is
+ a clear policy established by this library under the principle that a contract
+ assertion fails unless it is evaluated to be true. <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a>
+ does not completely clarify this point.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.advanced_topics.contract_broken_handlers__throw_on_failure_.f5" href="#contract__.advanced_topics.contract_broken_handlers__throw_on_failure_.f5" class="para">58</a>] </sup>
+ In this example, contract failures from destructors are logged and then
+ simply ignored. That might be acceptable in this simple example but it
+ is probably a very bad idea in general.
+ </p></div>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="tutorial.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="virtual_specifiers.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/contract__/bibliography.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/contract__/bibliography.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,196 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Bibliography</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="prev" href="release_notes.html" title="Release Notes">
+<link rel="next" href="acknowledgments.html" title="Acknowledgments">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="release_notes.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="acknowledgments.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="contract__.bibliography"></a><a class="link" href="bibliography.html" title="Bibliography">Bibliography</a>
+</h2></div></div></div>
+<p>
+ <a name="Bright04_anchor"></a>[Bright04] W. Bright. <a href="http://www.digitalmars.com/d/2.0/dbc.html" target="_top"><span class="emphasis"><em>Contract
+ Programming for the D Programming Language</em></span></a>. 2004.
+ </p>
+<p>
+ <a name="Bright04b_anchor"></a>[Bright04b] W. Bright. <a href="http://www.digitalmars.com/ctg/contract.html" target="_top"><span class="emphasis"><em>Contract
+ Programming for the Digital Mars C++ Compiler</em></span></a>. 2004.
+ </p>
+<p>
+ <a name="C2_anchor"></a>[C2] Aechmea. <a href="http://www.programmersheaven.com/app/news/DisplayNews.aspx?NewsID=3843" target="_top"><span class="emphasis"><em>C^2
+ Contract Programming add-on for C++</em></span></a>. 2005.
+ </p>
+<p>
+ <a name="Chrome02_anchor"></a>[Chrome02] RemObjects. <a href="http://blogs.remobjects.com/blogs/mh/2008/05/01/p216" target="_top"><span class="emphasis"><em>Chrome:
+ Contract Programming for Object Pascal in .NET</em></span></a>. 2002.
+ </p>
+<p>
+ <a name="Clarke06_anchor"></a>[Clarke06] L. A. Clarke and D. S. Rosenblum.
+ <a href="http://discovery.ucl.ac.uk/4991/1/4991.pdf" target="_top"><span class="emphasis"><em>A Historical
+ Perspective on Runtime Assertion Checking in Software Development</em></span></a>.
+ Newsletter ACM SIGSOFT Software Engineering Notes, 2006.
+ </p>
+<p>
+ <a name="Cline90_anchor"></a>[Cline90] M. Cline and D. Lea. <span class="emphasis"><em>The Behaviour
+ of C++ Classes</em></span> and <a href="http://surface.syr.edu/cgi/viewcontent.cgi?article=1116&context=eecs" target="_top"><span class="emphasis"><em>Using
+ Annotated C++</em></span></a>. Proc. of the Symposium on Object Oriented
+ Programming Emphasizing Practical Applications, Maris College, 1990.
+ </p>
+<p>
+ <a name="Ellis90_anchor"></a>[Ellis90] M. A. Ellis and B. Stroustrup. <span class="emphasis"><em>The
+ Annotated C++ Reference Manual</em></span>. ANSI Base Document, Addison Wesley,
+ 1990.
+ </p>
+<p>
+ <a name="Gautron92_anchor"></a>[Gautron92] P. Gautron. <span class="emphasis"><em>An Assertion
+ Mechanism Based on Exceptions</em></span>. Fourth C++ Technical Conference,
+ 1992.
+ </p>
+<p>
+ <a name="Hoare73_anchor"></a>[Hoare73] C. A. R. Hoare. <span class="emphasis"><em>Hints on Programming
+ Language Design</em></span>. Stanford University Artificial Intelligence memo
+ AIM-224/STAN-CS-73-403, pages 193-216, 1973.
+ </p>
+<p>
+ <a name="CodeContracts_anchor"></a>[CodeContracts] Microsoft Research. <a href="http://research.microsoft.com/en-us/projects/contracts/" target="_top"><span class="emphasis"><em>Code
+ Contracts: Design-By-Contract Programming for All .NET Programming Languages</em></span></a>.
+ 2012.
+ </p>
+<p>
+ <a name="iContract_anchor"></a>[iContract] O. Enseling. <a href="http://www.javaworld.com/javaworld/jw-02-2001/jw-0216-cooltools.html" target="_top"><span class="emphasis"><em>iContract:
+ Contract Programming for Java</em></span></a>. 2001.
+ </p>
+<p>
+ <a name="Jcontract_anchor"></a>[Jcontract] Parasoft. <a href="http://www.parasoft.com/jsp/products/article.jsp?label=product_info_Jcontract" target="_top"><span class="emphasis"><em>Jcontract:
+ Contract Programming for Java</em></span></a>.
+ </p>
+<p>
+ <a name="Lindrud04_anchor"></a>[Lindrud04] J. Lindrud. <a href="http://www.codeproject.com/Articles/8293/Design-by-Contract-in-C" target="_top"><span class="emphasis"><em>Design
+ by Contract in C++</em></span></a>. 2004.
+ </p>
+<p>
+ <a name="Maley99_anchor"></a>[Maley99] D. Maley and I. Spence. <a href="http://www.computer.org/portal/web/csdl/doi/10.1109/TOOLS.1999.779000" target="_top"><span class="emphasis"><em>Emulating
+ Design by Contract in C++</em></span></a>. Proceedings of TOOLS, IEEE Computer
+ Society, 1999.
+ </p>
+<p>
+ <a name="Meyer97_anchor"></a>[Meyer97] B. Meyer. <span class="emphasis"><em>Object Oriented
+ Software Construction</em></span>. Prentice-Hall, 2nd edition, 1997.
+ </p>
+<p>
+ <a name="Mitchell02_anchor"></a>[Mitchell02] R. Mitchell and J. McKim. <span class="emphasis"><em>Design
+ by Contract, by Example</em></span>. Addison-Wesley, 2002.
+ </p>
+<p>
+ <a name="N1613_anchor"></a>[N1613] T. Ottosen. <a href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2004/n1613.pdf" target="_top"><span class="emphasis"><em>Proposal
+ to add Design by Contract to C++</em></span></a>. The C++ Standards Committee,
+ N1613, 2004.
+ </p>
+<p>
+ <a name="N1653_anchor"></a>[N1653] C. Nelson. <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1653.htm" target="_top"><span class="emphasis"><em>Working
+ draft changes for C99 preprocessor synchronization</em></span></a>. C++
+ Standards Committee, N1653, 2004.
+ </p>
+<p>
+ <a name="N1669_anchor"></a>[N1669] T. Ottosen. <a href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2004/n1669.html" target="_top"><span class="emphasis"><em>Proposal
+ to add Contract Programming to C++ (revision 1)</em></span></a>. The C++
+ Standards Committee, N1669, 2004.
+ </p>
+<p>
+ <a name="N1773_anchor"></a>[N1773] D. Abrahams, L. Crowl, T. Ottosen, and J.
+ Widman. <a href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1773.html" target="_top"><span class="emphasis"><em>Proposal
+ to add Contract Programming to C++ (revision 2)</em></span></a>. The C++
+ Standards Committee, N1773, 2005.
+ </p>
+<p>
+ <a name="N1866_anchor"></a>[N1866] L. Crowl and T. Ottosen. <a href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1866.html" target="_top"><span class="emphasis"><em>Proposal
+ to add Contract Programming to C++ (revision 3)</em></span></a>. The C++
+ Standards Committee, N1866, 2005.
+ </p>
+<p>
+ <a name="N1895_anchor"></a>[N1895] H. Sutter and F. Glassborow. <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1895.pdf" target="_top"><span class="emphasis"><em>Delegating
+ Constructors (revision 2)</em></span></a>. C++ Standards Committee, N1895,
+ 2005.
+ </p>
+<p>
+ <a name="N1962_anchor"></a>[N1962] L. Crowl and T. Ottosen. <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1962.html" target="_top"><span class="emphasis"><em>Proposal
+ to add Contract Programming to C++ (revision 4)</em></span></a>. The C++
+ Standards Committee, N1962, 2006.
+ </p>
+<p>
+ <a name="N2081_anchor"></a>[N2081] D. Gregor, B. Stroustrup. <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2081.pdf" target="_top"><span class="emphasis"><em>Concepts
+ (revision 1)</em></span></a>. The C++ Standards Committee, N2081, 2006.
+ </p>
+<p>
+ <a name="N2914_anchor"></a>[N2914] P. Becker. <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2914.pdf" target="_top"><span class="emphasis"><em>Working
+ Draft, Standard for Programming Language C++</em></span></a>. The C++ Standards
+ Committee, N2914, 2009.
+ </p>
+<p>
+ <a name="N2906_anchor"></a>[N2906] B. Stroustrup. <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2906.pdf" target="_top"><span class="emphasis"><em>Simplifying
+ the sue of concepts</em></span></a>. The C++ Standards Committee, N2906,
+ 2009.
+ </p>
+<p>
+ <a name="Rosenblum95_anchor"></a>[Rosenblum95] D. S. Rosenblum. <a href="http://www.cs.toronto.edu/~chechik/courses06/csc410/rosenblum_assert95.pdf" target="_top"><span class="emphasis"><em>A
+ practical Approach to Programming With Assertions</em></span></a>. IEEE
+ Transactions on Software Engineering, 1995.
+ </p>
+<p>
+ <a name="SPARKAda_anchor"></a>[SPARKAda] Praxis. <a href="http://www.praxis-his.com/sparkada/language.asp" target="_top"><span class="emphasis"><em>SPARKAda
+ (Ada-like Language with Contract Programming)</em></span></a>.
+ </p>
+<p>
+ <a name="SpecSharp_anchor"></a>[SpecSharp] Microsoft. <a href="http:://research.microsoft.com/en-us/projects/specsharp/" target="_top"><span class="emphasis"><em>Spec#
+ (C# Extension)</em></span></a>.
+ </p>
+<p>
+ <a name="Stroustrup94_anchor"></a>[Stroustrup94] B. Stroustrup. <span class="emphasis"><em>The
+ Design and Evolution of C++</em></span>. Addison Wesley, 1994.
+ </p>
+<p>
+ <a name="Stroustrup97_anchor"></a>[Stroustrup97] B. Stroustrup. <span class="emphasis"><em>The
+ C++ Programming Language</em></span>. Prentice-Hall, 2nd Edition, 1997.
+ </p>
+<p>
+ <a name="Tandin04_anchor"></a>[Tandin04] A. Tandin. <a href="http://www.codeproject.com/KB/macros/DbC_and_Doxygen.aspx" target="_top"><span class="emphasis"><em>Design
+ by Contract macros for C++ and link to Doxygen</em></span></a>. 2004.
+ </p>
+<p>
+ <a name="Wilson06_anchor"></a>[Wilson06] M. Wilson. <a href="http://www.artima.com/cppsource/deepspace.html" target="_top"><span class="emphasis"><em>Contract
+ Programming 101 - The Nuclear Reactor and the Deep Space Probe</em></span></a>.
+ The C++ Source, 2006.
+ </p>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="release_notes.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="acknowledgments.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/contract__/concepts.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/contract__/concepts.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,814 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Concepts</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="prev" href="virtual_specifiers.html" title="Virtual Specifiers">
+<link rel="next" href="named_parameters.html" title="Named Parameters">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="virtual_specifiers.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="named_parameters.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="contract__.concepts"></a><a class="link" href="concepts.html" title="Concepts">Concepts</a>
+</h2></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section">Class Templates</span></dt>
+<dt><span class="section">Function Templates</span></dt>
+<dt><span class="section"><a href="concepts.html#contract__.concepts.concept_definitions__not_implemented_">Concept
+ Definitions (Not Implemented)</a></span></dt>
+</dl></div>
+<p>
+ This section explains how to use this library to check concepts. Concepts are
+ part of the program specifications because they enforce requirements on generic
+ types at compile-time and therefore they are within the scope of this library.
+ </p>
+<p>
+ Concepts were proposed for addition to C++11
+ but they were unfortunately never adopted (see <a class="link" href="bibliography.html#N2081_anchor">[N2081]</a>).
+ The concepts that are checked using this library need to be defined using the
+ Boost.ConceptCheck
+ library. This library does not add any extra functionality with respect to
+ the concept checking features already provided by Boost.ConceptCheck
+ but it allows to specify both concepts and contracts together within a unified
+ syntax.
+ </p>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.concepts.class_templates"></a><a class="link" href="concepts.html#contract__.concepts.class_templates" title="Class Templates">Class Templates</a>
+</h3></div></div></div>
+<p>
+ It is possible to list the concepts to check for class templates using <code class="computeroutput"><span class="keyword">requires</span></code> within the <code class="computeroutput"><a class="link" href="../CONTRACT_CLASS.html" title="Macro CONTRACT_CLASS">CONTRACT_CLASS</a></code>
+ macro, after the template parameter declarations (see also the <a class="link" href="grammar.html" title="Grammar">Grammar</a>
+ section):
+ </p>
+<pre class="programlisting"><span class="keyword">template</span><span class="special">(</span> <span class="emphasis"><em>template-parameter1</em></span><span class="special">,</span> <span class="emphasis"><em>template-parameter2</em></span><span class="special">,</span> <span class="special">...</span> <span class="special">)</span> <span class="keyword">requires</span><span class="special">(</span> <span class="emphasis"><em>concept1</em></span><span class="special">,</span> <span class="emphasis"><em>concept2</em></span><span class="special">,</span> <span class="special">...</span> <span class="special">)</span>
+</pre>
+<p>
+ The following example requires that the generic type <code class="computeroutput"><span class="identifier">T</span></code>
+ specified for the class template <code class="computeroutput"><span class="identifier">vector</span></code>
+ is always CopyConstructible
+ and it uses the <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">CopyConstructible</span></code> concept defined by Boost.ConceptCheck
+ (see also class_member_concept_vector.hpp
,
+ class_member_concept_vector_error.cpp
,
+ and class_member_concept_vector.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">concept_check</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// Boost.ConceptCheck predefined concepts.</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">requires</span><span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">CopyConstructible</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">)</span> <span class="comment">// Check concepts.</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">vector</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special"><=</span> <span class="identifier">capacity</span><span class="special">(),</span>
+ <span class="identifier">capacity</span><span class="special">()</span> <span class="special"><=</span> <span class="identifier">max_size</span><span class="special">()</span>
+ <span class="special">)</span>
+
+ <span class="comment">// ...</span>
+</pre>
+<p>
+ </p>
+<p>
+ If the class template <code class="computeroutput"><span class="identifier">vector</span></code>
+ is instantiated on a type <code class="computeroutput"><span class="identifier">T</span></code>
+ that is not CopyConstructible
,
+ the compiler will generate an error (with the usual format of Boost.ConceptCheck
+ errors).
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.concepts.function_templates"></a><a class="link" href="concepts.html#contract__.concepts.function_templates" title="Function Templates">Function Templates</a>
+</h3></div></div></div>
+<p>
+ It is possible to list concepts to check for function templates using <code class="computeroutput"><span class="keyword">requires</span></code> within the <code class="computeroutput"><a class="link" href="../CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code>
+ macro, after the template parameter declarations (see also the <a class="link" href="grammar.html" title="Grammar">Grammar</a>
+ section).
+ </p>
+<p>
+ For example, for a constructor function template (see also class_member_concept_vector.hpp
,
+ class_member_concept_vector_constructor_error.cpp
,
+ and class_member_concept_vector.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">template</span><span class="special">(</span> <span class="keyword">class</span> <span class="identifier">Iterator</span> <span class="special">)</span>
+ <span class="keyword">requires</span><span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">></span> <span class="special">)</span> <span class="comment">// Check concepts.</span>
+ <span class="special">(</span><span class="identifier">vector</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">Iterator</span><span class="special">)</span> <span class="identifier">first</span><span class="special">,</span> <span class="special">(</span><span class="identifier">Iterator</span><span class="special">)</span> <span class="identifier">last</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">size</span><span class="special">())</span> <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">vector_</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{}</span>
+</pre>
+<p>
+ </p>
+<p>
+ And, for a member function template (see also class_member_concept_vector.hpp
,
+ class_member_concept_vector_member_error.cpp
,
+ and class_member_concept_vector.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">template</span><span class="special">(</span> <span class="keyword">class</span> <span class="identifier">Iterator</span> <span class="special">)</span>
+ <span class="keyword">requires</span><span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">></span> <span class="special">)</span> <span class="comment">// Check concepts.</span>
+ <span class="keyword">void</span> <span class="special">(</span><span class="identifier">insert</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">Iterator</span><span class="special">)</span> <span class="identifier">where</span><span class="special">,</span> <span class="special">(</span><span class="identifier">Iterator</span><span class="special">)</span> <span class="identifier">first</span><span class="special">,</span> <span class="special">(</span><span class="identifier">Iterator</span><span class="special">)</span> <span class="identifier">last</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span> <span class="special"><</span> <span class="identifier">max_size</span><span class="special">()</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_increased_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">),</span>
+ <span class="keyword">auto</span> <span class="identifier">old_capacity</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">capacity</span><span class="special">(),</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_increased_size</span><span class="special">,</span>
+ <span class="identifier">capacity</span><span class="special">()</span> <span class="special">>=</span> <span class="identifier">old_capacity</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">where</span><span class="special">,</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">);</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+ If the <code class="computeroutput"><span class="identifier">vector</span></code> constructor
+ template or the <code class="computeroutput"><span class="identifier">vector</span><span class="special">::</span><span class="identifier">insert</span></code> member function template are instantiated
+ on a type <code class="computeroutput"><span class="identifier">Iterator</span></code> that is
+ not an InputIterator
,
+ the compiler will generate an error (with the usual format of Boost.ConceptCheck
+ errors).
+ </p>
+<p>
+ So far we have used concepts that are predefined by Boost.ConceptCheck
+ but it is also possible to check user-defined concepts as long as they are
+ defined using Boost.ConceptCheck.
+ For example, consider the following user-defined <code class="computeroutput"><span class="identifier">Addable</span></code>
+ concept (see also free_concept_operator_preinc.hpp
,
+ free_concept_operator_preinc_error.cpp
,
+ and free_concept_operator_preinc.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">></span>
+<span class="keyword">struct</span> <span class="identifier">Addable</span> <span class="comment">// New concept defined and implemented using Boost.ConceptCheck.</span>
+<span class="special">{</span>
+ <span class="identifier">BOOST_CONCEPT_USAGE</span><span class="special">(</span><span class="identifier">Addable</span><span class="special">)</span>
+ <span class="special">{</span>
+ <span class="identifier">return_type</span><span class="special">(</span><span class="identifier">x</span> <span class="special">+</span> <span class="identifier">y</span><span class="special">);</span>
+ <span class="special">}</span>
+
+<span class="keyword">private</span><span class="special">:</span>
+ <span class="keyword">void</span> <span class="identifier">return_type</span> <span class="special">(</span> <span class="identifier">T</span> <span class="special">)</span> <span class="special">{}</span>
+ <span class="keyword">static</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">x</span><span class="special">;</span>
+ <span class="keyword">static</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">y</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">requires</span><span class="special">(</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">Assignable</span><span class="special"><</span><span class="identifier">T</span><span class="special">>,</span> <span class="comment">// Check both predefined and</span>
+ <span class="identifier">Addable</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="comment">// newly defined concepts.</span>
+ <span class="special">)</span>
+ <span class="special">(</span><span class="identifier">T</span><span class="special">&)</span> <span class="keyword">operator</span><span class="special">(++)(</span><span class="identifier">preinc</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">T</span><span class="special">&)</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="keyword">auto</span> <span class="identifier">old_value</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">value</span><span class="special">,</span>
+ <span class="identifier">value</span> <span class="special">==</span> <span class="identifier">old_value</span> <span class="special">+</span> <span class="identifier">T</span><span class="special">(</span><span class="number">1</span><span class="special">),</span> <span class="keyword">requires</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">value</span><span class="special">,</span> <span class="keyword">requires</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">value</span> <span class="special">=</span> <span class="identifier">value</span> <span class="special">+</span> <span class="identifier">T</span><span class="special">(</span><span class="number">1</span><span class="special">);</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+ If this templated operator <code class="computeroutput"><span class="special">++</span></code>
+ is instantiated on a type <code class="computeroutput"><span class="identifier">T</span></code>
+ that is not Assignable
+ or not <code class="computeroutput"><span class="identifier">Addable</span></code>, the compiler
+ will generate an error (with the usual format of Boost.ConceptCheck
+ error).
+ </p>
+<p>
+ Note that concepts can also be specified for free function templates, for
+ free operator templates, and for member operator templates (as illustrated
+ in some of the above examples).
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.concepts.concept_definitions__not_implemented_"></a><a class="link" href="concepts.html#contract__.concepts.concept_definitions__not_implemented_" title="Concept Definitions (Not Implemented)">Concept
+ Definitions (Not Implemented)</a>
+</h3></div></div></div>
+<p>
+ Using the preprocessor parsing techniques introduced by the library, it should
+ be possible to implement the following syntax to define concepts.
+ Note how this syntax resembles the syntax proposed by <a class="link" href="bibliography.html#N2081_anchor">[N2081]</a>
+ for adding concepts to C++11
+ (<a class="link" href="bibliography.html#N2081_anchor">[N2081]</a> and concepts were unfortunately
+ not adopted by the standard committee).
+ </p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CONCEPT</span><span class="special">(</span> <span class="comment">// A concept definition.</span>
+ <span class="keyword">auto</span> <span class="keyword">concept</span> <span class="special">(</span><span class="identifier">LessThanComparable</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">(<)(</span><span class="identifier">less</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">T</span> <span class="special">,</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="special">)</span>
+<span class="special">)</span>
+
+<span class="identifier">CONTRACT_CONCEPT</span><span class="special">(</span> <span class="comment">// Concepts with multiple parameters.</span>
+ <span class="keyword">auto</span> <span class="keyword">concept</span> <span class="special">(</span><span class="identifier">Convertible</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">U</span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="keyword">operator</span><span class="special">(</span><span class="identifier">U</span><span class="special">)(</span><span class="identifier">U_type</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="special">)</span>
+ <span class="special">)</span>
+<span class="special">)</span>
+
+<span class="identifier">CONTRACT_CONCEPT</span><span class="special">(</span> <span class="comment">// Concept composition.</span>
+ <span class="keyword">concept</span> <span class="special">(</span><span class="identifier">InputIterator</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Value</span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="keyword">requires</span> <span class="identifier">Regular</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">>,</span>
+
+ <span class="special">(</span><span class="identifier">Value</span><span class="special">)</span> <span class="keyword">operator</span><span class="special">(*)(</span><span class="identifier">deref</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">Iterator</span> <span class="keyword">const</span><span class="special">&</span> <span class="special">),</span>
+ <span class="special">(</span><span class="identifier">Iterator</span><span class="special">&)</span> <span class="keyword">operator</span><span class="special">(++)(</span><span class="identifier">preinc</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">Iterator</span><span class="special">&</span> <span class="special">),</span>
+ <span class="special">(</span><span class="identifier">Iterator</span><span class="special">)</span> <span class="keyword">operator</span><span class="special">(++)(</span><span class="identifier">postinc</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">Iterator</span><span class="special">&,</span> <span class="keyword">int</span> <span class="special">)</span>
+ <span class="special">)</span>
+<span class="special">)</span>
+
+<span class="identifier">CONTRACT_CONCEPT</span><span class="special">(</span> <span class="comment">// Derived concepts.</span>
+ <span class="keyword">concept</span> <span class="special">(</span><span class="identifier">ForwardIterator</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Value</span> <span class="special">)</span>
+ <span class="keyword">extends</span><span class="special">(</span> <span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">,</span> <span class="identifier">Value</span><span class="special">></span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="comment">// Other requirements here...</span>
+ <span class="special">)</span>
+<span class="special">)</span>
+
+<span class="identifier">CONTRACT_CONCEPT</span><span class="special">(</span> <span class="comment">// Typenames within concepts.</span>
+ <span class="keyword">concept</span> <span class="special">(</span><span class="identifier">InputIterator</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">Iterator</span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="keyword">typename</span> <span class="identifier">value_type</span><span class="special">,</span>
+ <span class="keyword">typename</span> <span class="identifier">reference</span><span class="special">,</span>
+ <span class="keyword">typename</span> <span class="identifier">pointer</span><span class="special">,</span>
+ <span class="keyword">typename</span> <span class="identifier">difference_type</span><span class="special">,</span>
+
+ <span class="keyword">requires</span> <span class="identifier">Regular</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">>,</span>
+ <span class="keyword">requires</span> <span class="special">(</span><span class="identifier">Convertible</span><span class="special"><</span><span class="identifier">reference</span><span class="special">,</span> <span class="identifier">value_type</span><span class="special">>),</span>
+
+ <span class="special">(</span><span class="identifier">reference</span><span class="special">)</span> <span class="keyword">operator</span><span class="special">(*)(</span><span class="identifier">deref</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">const</span> <span class="identifier">Iterator</span><span class="special">&</span> <span class="special">),</span>
+ <span class="special">(</span><span class="identifier">Iterator</span><span class="special">&)</span> <span class="keyword">operator</span><span class="special">(++)(</span><span class="identifier">preinc</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">Iterator</span><span class="special">&</span> <span class="special">),</span>
+ <span class="special">(</span><span class="identifier">Iterator</span><span class="special">)</span> <span class="keyword">operator</span><span class="special">(++)(</span><span class="identifier">postinc</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">Iterator</span><span class="special">&,</span> <span class="keyword">int</span> <span class="special">)</span>
+ <span class="special">)</span>
+<span class="special">)</span>
+
+<span class="identifier">CONTRACT_CONCEPT</span><span class="special">(</span> <span class="comment">// Concept maps.</span>
+ <span class="keyword">concept_map</span> <span class="special">(</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="keyword">char</span><span class="special">*>)</span>
+ <span class="special">(</span>
+ <span class="keyword">typedef</span> <span class="keyword">char</span> <span class="identifier">value_type</span><span class="special">,</span>
+ <span class="keyword">typedef</span> <span class="special">(</span><span class="keyword">char</span><span class="special">&)</span> <span class="identifier">reference</span><span class="special">,</span>
+ <span class="keyword">typedef</span> <span class="special">(</span><span class="keyword">char</span><span class="special">*)</span> <span class="identifier">pointer</span><span class="special">,</span>
+ <span class="keyword">typedef</span> <span class="keyword">ptrdiff_t</span> <span class="identifier">difference_type</span>
+ <span class="special">)</span>
+<span class="special">)</span>
+
+<span class="identifier">CONTRACT_CONCEPT</span><span class="special">(</span> <span class="comment">// Concept maps can be templated.</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">concept_map</span> <span class="special">(</span><span class="identifier">InputIterator</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">*</span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="keyword">typedef</span> <span class="special">(</span><span class="identifier">T</span><span class="special">&)</span> <span class="identifier">value_type</span><span class="special">,</span>
+ <span class="keyword">typedef</span> <span class="special">(</span><span class="identifier">T</span><span class="special">&)</span> <span class="identifier">reference</span><span class="special">,</span>
+ <span class="keyword">typedef</span> <span class="special">(</span><span class="identifier">T</span><span class="special">*)</span> <span class="identifier">pointer</span><span class="special">,</span>
+ <span class="keyword">typedef</span> <span class="keyword">ptrdiff_t</span> <span class="identifier">difference_type</span>
+ <span class="special">)</span>
+<span class="special">)</span>
+
+<span class="identifier">CONTRACT_CONCEPT</span><span class="special">(</span> <span class="comment">// Concept maps as mini-types.</span>
+ <span class="keyword">concept</span> <span class="special">(</span><span class="identifier">Stack</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">X</span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="keyword">typename</span> <span class="identifier">value_type</span><span class="special">,</span>
+
+ <span class="keyword">void</span> <span class="special">(</span><span class="identifier">push</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">X</span><span class="special">&,</span> <span class="identifier">value_type</span> <span class="keyword">const</span><span class="special">&</span> <span class="special">),</span>
+ <span class="keyword">void</span> <span class="special">(</span><span class="identifier">pop</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">X</span><span class="special">&</span> <span class="special">),</span>
+ <span class="special">(</span><span class="identifier">value_type</span><span class="special">)</span> <span class="special">(</span><span class="identifier">top</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">X</span> <span class="keyword">const</span><span class="special">&</span> <span class="special">),</span>
+ <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">empty</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">X</span> <span class="keyword">const</span><span class="special">&</span> <span class="special">)</span>
+ <span class="special">)</span>
+<span class="special">)</span>
+
+<span class="identifier">CONTRACT_CONCEPT</span><span class="special">(</span> <span class="comment">// Concept maps as mini-types (specializations).</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">concept_map</span> <span class="special">(</span><span class="identifier">Stack</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="keyword">typedef</span> <span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="identifier">value_type</span><span class="special">,</span>
+
+ <span class="keyword">void</span> <span class="special">(</span><span class="identifier">push</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&)</span> <span class="identifier">v</span><span class="special">,</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">x</span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="identifier">v</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">x</span><span class="special">);</span>
+ <span class="special">),</span>
+
+ <span class="keyword">void</span> <span class="special">(</span><span class="identifier">pop</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&)</span> <span class="identifier">v</span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="identifier">v</span><span class="special">.</span><span class="identifier">pop_back</span><span class="special">();</span>
+ <span class="special">),</span>
+
+ <span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="special">(</span><span class="identifier">top</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">v</span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="keyword">return</span> <span class="identifier">v</span><span class="special">.</span><span class="identifier">back</span><span class="special">();</span>
+ <span class="special">),</span>
+
+ <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">empty</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">v</span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="keyword">return</span> <span class="identifier">v</span><span class="special">.</span><span class="identifier">emtpy</span><span class="special">();</span>
+ <span class="special">)</span>
+ <span class="special">)</span>
+<span class="special">)</span>
+
+<span class="identifier">CONTRACT_CONCEPT</span><span class="special">(</span> <span class="comment">// Axioms.</span>
+ <span class="keyword">concept</span> <span class="special">(</span><span class="identifier">Semigroup</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">Op</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">extends</span><span class="special">(</span> <span class="identifier">CopyConstructible</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="keyword">operator</span><span class="special">(())(</span><span class="identifier">call</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">Op</span><span class="special">,</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">T</span> <span class="special">),</span>
+
+ <span class="keyword">axiom</span> <span class="special">(</span><span class="identifier">Associativity</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">Op</span><span class="special">)</span> <span class="identifier">op</span><span class="special">,</span> <span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="identifier">x</span><span class="special">,</span> <span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="identifier">y</span><span class="special">,</span> <span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="identifier">z</span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="identifier">op</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span> <span class="identifier">op</span><span class="special">(</span><span class="identifier">y</span><span class="special">,</span> <span class="identifier">z</span><span class="special">))</span> <span class="special">==</span> <span class="identifier">op</span><span class="special">(</span><span class="identifier">op</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span> <span class="identifier">y</span><span class="special">),</span> <span class="identifier">z</span><span class="special">);</span>
+ <span class="special">)</span>
+ <span class="special">)</span>
+<span class="special">)</span>
+</pre>
+<p>
+ Note that:
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ Parenthesis around function parameter types can be always allowed but
+ they should be required only when the parameter name is also specified.
+ </li>
+<li class="listitem">
+ The function bodies need to be specified within the macros and that will
+ make compiler errors very hard to use (because the errors will all refer
+ to the same line number, the line number on which the <code class="computeroutput"><span class="identifier">CONTRACT_CONCEPT</span></code>
+ macro expanded). However, concept definitions, including possible function
+ bodies, might be simple enough for this not to be a major issue at least
+ in the most common cases (the authors do not have enough experience with
+ programming concept definitions to truly assess this).
+ </li>
+</ol></div>
+<p>
+ The authors <span class="emphasis"><em>think</em></span> this syntax can be implemented and
+ parsed using the preprocessor however the authors have not tried to implement
+ this yet. If this syntax can indeed be implemented, it should then be investigated
+ if the actual concept definitions can be programmed from the parsed concept
+ traits using C++ (this seems possible at least for C++11
+ based on some work done for the Generic
+ library).
+ </p>
+<p>
+ The authors recognize that implementing concept definitions would be a nice
+ addition to this library (again, concepts are parts of the program specifications,
+ they are contracts on the type system that are checked at compile-time, so
+ both concept checking and concept definition are within the scope of this
+ library). However, at the moment there are no concrete plans for extending
+ this library with the concept definitions (see also <a href="https://sourceforge.net/apps/trac/contractpp/ticket/49" target="_top">Ticket
+ 49</a>).
+ </p>
+<p>
+ The following is a side-by-side comparison of this possible concept definition
+ syntax with the syntax proposed by <a class="link" href="bibliography.html#N2081_anchor">[N2081]</a>:
+ </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>
+ <p>
+ Possible Extension of This Library (not implemented)
+ </p>
+ </th>
+<th>
+ <p>
+ [N2081] Proposal (not part of C++)
+ </p>
+ </th>
+</tr></thead>
+<tbody><tr>
+<td>
+ <p>
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">CONTRACT_CONCEPT</span><span class="special">(</span>
+ <span class="keyword">concept</span> <span class="special">(</span><span class="identifier">ArithmeticLike</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">extends</span><span class="special">(</span>
+ <span class="identifier">Regular</span><span class="special"><</span><span class="identifier">T</span><span class="special">>,</span>
+ <span class="identifier">LessThanComparable</span><span class="special"><</span><span class="identifier">T</span><span class="special">>,</span>
+ <span class="identifier">HasUnaryPlus</span><span class="special"><</span><span class="identifier">T</span><span class="special">>,</span>
+ <span class="identifier">HasNegate</span><span class="special"><</span><span class="identifier">T</span><span class="special">>,</span>
+ <span class="special">(</span><span class="identifier">HasPlus</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>),</span>
+ <span class="special">(</span><span class="identifier">HasMinus</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>)</span>
+ <span class="comment">// ...</span>
+ <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="keyword">explicit</span> <span class="keyword">constructor</span><span class="special">(</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">T</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">intmax_t</span><span class="special">),</span>
+ <span class="keyword">explicit</span> <span class="keyword">constructor</span><span class="special">(</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">T</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">uintmax_t</span> <span class="special">),</span>
+ <span class="keyword">explicit</span> <span class="keyword">constructor</span><span class="special">(</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">T</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">long</span> <span class="keyword">double</span> <span class="special">),</span>
+
+ <span class="keyword">requires</span> <span class="special">(</span><span class="identifier">Convertible</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">HasUnaryPlus</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">result_type</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>)</span>
+ <span class="comment">// ...</span>
+ <span class="special">)</span>
+<span class="special">)</span>
+
+<span class="identifier">CONTRACT_CONCEPT</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="keyword">concept</span> <span class="special">(</span><span class="identifier">HasFind</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="keyword">typename</span> <span class="identifier">key_type</span><span class="special">,</span> <span class="identifier">as</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">::</span><span class="identifier">key_type</span><span class="special">,</span>
+ <span class="keyword">typename</span> <span class="identifier">mapped_type</span><span class="special">,</span>
+
+ <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="identifier">key_type</span><span class="special">,</span> <span class="identifier">mapped_type</span><span class="special">>)</span> <span class="special">(</span><span class="identifier">find</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&,</span> <span class="identifier">key_type</span> <span class="keyword">const</span><span class="special">&</span> <span class="special">)</span>
+ <span class="special">)</span>
+<span class="special">)</span>
+
+<span class="identifier">CONTRACT_CONCEPT</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="keyword">concept</span> <span class="special">(</span><span class="identifier">HasDereference</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="keyword">typename</span> <span class="identifier">result_type</span><span class="special">,</span>
+
+ <span class="special">(</span><span class="identifier">result_type</span><span class="special">)</span> <span class="keyword">operator</span><span class="special">(*)(</span><span class="identifier">deref</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">&</span> <span class="special">),</span>
+ <span class="special">(</span><span class="identifier">result_type</span><span class="special">)</span> <span class="keyword">operator</span><span class="special">(*)(</span><span class="identifier">deref</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">&&</span> <span class="special">)</span>
+ <span class="special">)</span>
+<span class="special">)</span>
+
+<span class="identifier">CONTRACT_CONCEPT</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="keyword">concept</span> <span class="special">(</span><span class="identifier">IdentityOf</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="keyword">typename</span> <span class="identifier">type</span><span class="special">,</span> <span class="identifier">as</span> <span class="identifier">T</span><span class="special">,</span>
+ <span class="keyword">requires</span> <span class="special">(</span><span class="identifier">SameType</span><span class="special"><</span><span class="identifier">type</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>)</span>
+ <span class="special">)</span>
+<span class="special">)</span>
+
+<span class="identifier">CONTRACT_CONCEPT</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="keyword">concept</span> <span class="special">(</span><span class="identifier">MemberFunctionRequirements</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="keyword">constructor</span><span class="special">(</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">T</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">float</span> <span class="identifier">b</span> <span class="special">),</span>
+ <span class="keyword">destructor</span><span class="special">(</span><span class="identifier">T</span><span class="special">,</span> <span class="special">~</span><span class="identifier">T</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">),</span>
+ <span class="keyword">void</span> <span class="keyword">member</span><span class="special">(</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">f</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span>
+<span class="special">)</span>
+
+<span class="identifier">CONTRACT_CONCEPT</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="keyword">concept</span> <span class="special">(</span><span class="identifier">HasEqualTo</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">U</span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">(==)(</span><span class="identifier">equal</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&,</span> <span class="identifier">U</span> <span class="keyword">const</span><span class="special">&</span> <span class="special">)</span>
+ <span class="special">)</span>
+<span class="special">)</span>
+
+<span class="identifier">CONTRACT_CONCEPT</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="keyword">concept</span> <span class="special">(</span><span class="identifier">ExplicitlyConvertible</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">U</span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="keyword">explicit</span> <span class="keyword">operator</span><span class="special">(</span><span class="identifier">U</span><span class="special">)(</span><span class="identifier">U_type</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="special">)</span>
+ <span class="special">)</span>
+<span class="special">)</span>
+
+<span class="identifier">CONTRACT_CONCEPT</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="keyword">concept</span> <span class="special">(</span><span class="identifier">Convertible</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">U</span> <span class="special">)</span>
+ <span class="keyword">extends</span><span class="special">(</span> <span class="special">(</span><span class="identifier">ExplicitlyConvetible</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">U</span><span class="special">>)</span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="keyword">operator</span><span class="special">(</span><span class="identifier">U</span><span class="special">)(</span><span class="identifier">U_type</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="special">)</span>
+ <span class="special">)</span>
+<span class="special">)</span>
+
+<span class="identifier">CONTRACT_CONCEPT</span><span class="special">(</span>
+ <span class="keyword">concept</span> <span class="special">(</span><span class="identifier">True</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">bool</span> <span class="identifier">Value</span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="keyword">void</span> <span class="comment">// Empty concept definition.</span>
+ <span class="special">)</span>
+<span class="special">)</span>
+
+<span class="identifier">CONTRACT_CONCEPT</span><span class="special">(</span>
+ <span class="keyword">concept_map</span> <span class="special">(</span><span class="identifier">True</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">true</span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="keyword">void</span> <span class="comment">// Empty concept definition.</span>
+ <span class="special">)</span>
+<span class="special">)</span>
+
+<span class="identifier">CONTRACT_CONCEPT</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="keyword">concept</span> <span class="special">(</span><span class="identifier">IsEven</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">intmax_t</span> <span class="identifier">Value</span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="keyword">requires</span> <span class="identifier">True</span><span class="special"><</span><span class="identifier">V</span> <span class="special">%</span> <span class="number">2</span> <span class="special">==</span> <span class="number">0</span><span class="special">></span>
+ <span class="special">)</span>
+<span class="special">)</span>
+
+<span class="identifier">CONTRACT_CONCEPT</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="keyword">concept</span> <span class="special">(</span><span class="identifier">CopyConstructible</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">extends</span><span class="special">(</span> <span class="identifier">MoveConstructible</span><span class="special"><</span><span class="identifier">T</span><span class="special">>,</span> <span class="special">(</span><span class="identifier">Constructible</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&>)</span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="keyword">axiom</span> <span class="special">(</span><span class="identifier">CopyPreservation</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="identifier">x</span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="identifier">T</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">x</span><span class="special">;</span>
+ <span class="special">)</span>
+ <span class="special">)</span>
+<span class="special">)</span>
+
+<span class="identifier">CONTRACT_CONCEPT</span><span class="special">(</span>
+ <span class="keyword">concept</span> <span class="special">(</span><span class="identifier">Iterator</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">X</span> <span class="special">)</span> <span class="keyword">extends</span><span class="special">(</span> <span class="identifier">Semiregular</span><span class="special"><</span><span class="identifier">X</span><span class="special">></span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="keyword">typename</span><span class="special">(</span><span class="identifier">MoveConstructible</span><span class="special">)</span> <span class="identifier">reference</span><span class="special">,</span> <span class="identifier">as</span> <span class="keyword">typename</span> <span class="identifier">X</span><span class="special">::</span><span class="identifier">reference</span><span class="special">,</span>
+ <span class="keyword">typename</span><span class="special">(</span><span class="identifier">MoveConstructible</span><span class="special">)</span> <span class="identifier">postinc_result</span><span class="special">,</span>
+ <span class="keyword">requires</span> <span class="identifier">HasDereference</span><span class="special"><</span><span class="identifier">postinc_result</span><span class="special">>,</span>
+
+ <span class="special">(</span><span class="identifier">reference</span><span class="special">)</span> <span class="keyword">operator</span><span class="special">(*)(</span><span class="identifier">deref</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">X</span><span class="special">&</span> <span class="special">),</span>
+ <span class="special">(</span><span class="identifier">reference</span><span class="special">)</span> <span class="keyword">operator</span><span class="special">(*)(</span><span class="identifier">deref</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">X</span><span class="special">&&</span> <span class="special">),</span>
+ <span class="special">(</span><span class="identifier">X</span><span class="special">&)</span> <span class="keyword">operator</span><span class="special">(++)(</span><span class="identifier">preinc</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">X</span><span class="special">&</span> <span class="special">),</span>
+ <span class="special">(</span><span class="identifier">postinc_result</span><span class="special">)</span> <span class="keyword">operator</span><span class="special">(++)(</span><span class="identifier">postinc</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">X</span><span class="special">&,</span> <span class="keyword">int</span> <span class="special">)</span>
+ <span class="special">)</span>
+<span class="special">)</span>
+
+<span class="identifier">CONTRACT_CONCEPT</span><span class="special">(</span>
+ <span class="keyword">concept</span> <span class="special">(</span><span class="identifier">RandomAccessIterator</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">X</span> <span class="special">)</span>
+ <span class="keyword">extends</span><span class="special">(</span> <span class="identifier">BidirectionalIterator</span><span class="special"><</span><span class="identifier">X</span><span class="special">>,</span> <span class="identifier">LessThanComparable</span><span class="special"><</span><span class="identifier">X</span><span class="special">></span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="keyword">typename</span><span class="special">(</span><span class="identifier">MoveConstructible</span><span class="special">)</span> <span class="identifier">reference</span><span class="special">,</span>
+ <span class="keyword">requires</span> <span class="special">(</span><span class="identifier">Convertible</span><span class="special"><</span><span class="identifier">reference</span><span class="special">,</span> <span class="identifier">value_type</span> <span class="keyword">const</span><span class="special">&>),</span>
+
+ <span class="special">(</span><span class="identifier">X</span><span class="special">&)</span> <span class="keyword">operator</span><span class="special">(+=)(</span><span class="identifier">inc</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">X</span><span class="special">&,</span> <span class="identifier">difference_type</span> <span class="special">),</span>
+
+ <span class="special">(</span><span class="identifier">X</span><span class="special">)</span> <span class="keyword">operator</span><span class="special">(+)(</span><span class="identifier">add</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">X</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">x</span><span class="special">,</span> <span class="special">(</span><span class="identifier">difference_type</span><span class="special">)</span> <span class="identifier">n</span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="identifier">X</span> <span class="identifier">y</span><span class="special">(</span><span class="identifier">x</span><span class="special">);</span>
+ <span class="identifier">y</span> <span class="special">+=</span> <span class="identifier">n</span><span class="special">;</span>
+ <span class="keyword">return</span> <span class="identifier">y</span><span class="special">;</span>
+ <span class="special">),</span>
+
+ <span class="special">(</span><span class="identifier">X</span><span class="special">)</span> <span class="keyword">operator</span><span class="special">(+)(</span><span class="identifier">add</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">difference_type</span><span class="special">)</span> <span class="identifier">n</span><span class="special">,</span> <span class="special">(</span><span class="identifier">X</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">x</span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="identifier">X</span> <span class="identifier">y</span><span class="special">(</span><span class="identifier">x</span><span class="special">);</span>
+ <span class="identifier">y</span> <span class="special">+=</span> <span class="identifier">n</span><span class="special">;</span>
+ <span class="keyword">return</span> <span class="identifier">y</span><span class="special">;</span>
+ <span class="special">),</span>
+
+ <span class="special">(</span><span class="identifier">X</span><span class="special">)</span> <span class="keyword">operator</span><span class="special">(-=)(</span><span class="identifier">dec</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">X</span><span class="special">&,</span> <span class="identifier">difference_type</span> <span class="special">),</span>
+
+ <span class="special">(</span><span class="identifier">X</span><span class="special">)</span> <span class="keyword">operator</span><span class="special">(-)(</span><span class="identifier">sub</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">X</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">x</span><span class="special">,</span> <span class="special">(</span><span class="identifier">difference_type</span><span class="special">)</span> <span class="identifier">n</span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="identifier">X</span> <span class="identifier">y</span><span class="special">(</span><span class="identifier">x</span><span class="special">);</span>
+ <span class="identifier">y</span> <span class="special">-=</span> <span class="identifier">n</span><span class="special">;</span>
+ <span class="keyword">return</span> <span class="identifier">y</span><span class="special">;</span>
+ <span class="special">),</span>
+
+ <span class="special">(</span><span class="identifier">difference_type</span><span class="special">)</span> <span class="keyword">operator</span><span class="special">(-)(</span><span class="identifier">sub</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">X</span> <span class="keyword">const</span><span class="special">&,</span> <span class="identifier">X</span> <span class="keyword">const</span><span class="special">&</span> <span class="special">),</span>
+
+ <span class="special">(</span><span class="identifier">reference</span><span class="special">)</span> <span class="keyword">operator</span><span class="special">([])(</span><span class="identifier">at</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">X</span> <span class="keyword">const</span><span class="special">&,</span> <span class="identifier">difference_type</span> <span class="special">)</span>
+ <span class="special">)</span>
+<span class="special">)</span>
+
+<span class="identifier">CONTRACT_CONCEPT</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span><span class="special">(</span><span class="identifier">ObjectType</span><span class="special">)</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">concept_map</span> <span class="special">(</span><span class="identifier">RandomAccessIterator</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">*</span> <span class="special">)</span>
+ <span class="special">(</span>
+ <span class="keyword">typedef</span> <span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="identifier">value_type</span><span class="special">,</span>
+ <span class="keyword">typedef</span> <span class="keyword">ptrdiff_t</span> <span class="identifier">difference_type</span><span class="special">,</span>
+ <span class="keyword">typedef</span> <span class="special">(</span><span class="identifier">T</span><span class="special">&)</span> <span class="identifier">reference</span><span class="special">,</span>
+ <span class="keyword">typedef</span> <span class="special">(</span><span class="identifier">T</span><span class="special">*)</span> <span class="identifier">pointer</span>
+ <span class="special">)</span>
+<span class="special">)</span>
+</pre>
+<p>
+ </p>
+ </td>
+<td>
+ <p>
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="comment">// Extra spaces, newlines, etc used to align text with this library code.</span>
+<span class="keyword">concept</span> <span class="identifier">ArithmeticLike</span> <span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">></span>
+ <span class="special">:</span>
+ <span class="identifier">Regular</span><span class="special"><</span><span class="identifier">T</span><span class="special">>,</span>
+ <span class="identifier">LessThanComparable</span><span class="special"><</span><span class="identifier">T</span><span class="special">>,</span>
+ <span class="identifier">HasUnaryPlus</span><span class="special"><</span><span class="identifier">T</span><span class="special">>,</span>
+ <span class="identifier">HasNegate</span><span class="special"><</span><span class="identifier">T</span><span class="special">>,</span>
+ <span class="identifier">HasPlus</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>,</span>
+ <span class="identifier">HasMinus</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">T</span><span class="special">></span>
+ <span class="comment">// ...</span>
+
+<span class="special">{</span>
+ <span class="keyword">explicit</span> <span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span> <span class="special">(</span> <span class="identifier">intmax_t</span> <span class="special">)</span> <span class="special">;</span>
+ <span class="keyword">explicit</span> <span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span> <span class="special">(</span> <span class="identifier">uintmax_t</span> <span class="special">)</span> <span class="special">;</span>
+ <span class="keyword">explicit</span> <span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span> <span class="special">(</span> <span class="keyword">long</span> <span class="keyword">double</span> <span class="special">)</span> <span class="special">;</span>
+
+ <span class="keyword">requires</span> <span class="identifier">Convertible</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">HasUnaryPlus</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">result_type</span><span class="special">,</span> <span class="identifier">T</span><span class="special">></span> <span class="special">;</span>
+ <span class="comment">// ...</span>
+<span class="special">}</span>
+
+
+
+<span class="keyword">auto</span> <span class="keyword">concept</span> <span class="identifier">HasFind</span> <span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">></span>
+<span class="special">{</span>
+ <span class="keyword">typename</span> <span class="identifier">key_type</span> <span class="special">=</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">::</span><span class="identifier">key_type</span> <span class="special">;</span>
+ <span class="keyword">typename</span> <span class="identifier">mapped_type</span> <span class="special">;</span>
+
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="identifier">key_type</span><span class="special">,</span> <span class="identifier">mapped_type</span><span class="special">></span> <span class="identifier">find</span> <span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&,</span> <span class="identifier">key_type</span> <span class="keyword">const</span><span class="special">&</span> <span class="special">)</span> <span class="special">;</span>
+<span class="special">}</span>
+
+
+
+<span class="keyword">auto</span> <span class="keyword">concept</span> <span class="identifier">HasDereference</span> <span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">></span>
+<span class="special">{</span>
+ <span class="keyword">typename</span> <span class="identifier">result_type</span> <span class="special">;</span>
+
+ <span class="identifier">result_type</span> <span class="keyword">operator</span><span class="special">*</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">&</span> <span class="special">)</span> <span class="special">;</span>
+ <span class="identifier">result_type</span> <span class="keyword">operator</span><span class="special">*</span> <span class="special">(</span> <span class="identifier">T</span><span class="special">&&</span> <span class="special">)</span> <span class="special">;</span>
+<span class="special">}</span>
+
+
+
+<span class="keyword">auto</span> <span class="keyword">concept</span> <span class="identifier">IdentityOf</span> <span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">></span>
+<span class="special">{</span>
+ <span class="keyword">typename</span> <span class="identifier">type</span> <span class="special">=</span> <span class="identifier">T</span> <span class="special">;</span>
+ <span class="keyword">requires</span> <span class="identifier">SameType</span><span class="special"><</span><span class="identifier">type</span><span class="special">,</span> <span class="identifier">T</span><span class="special">></span> <span class="special">;</span>
+<span class="special">}</span>
+
+
+
+<span class="keyword">auto</span> <span class="keyword">concept</span> <span class="identifier">MemberFunctionRequirements</span> <span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">></span>
+<span class="special">{</span>
+ <span class="identifier">T</span><span class="special">::</span><span class="identifier">T</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">float</span> <span class="identifier">b</span> <span class="special">)</span> <span class="special">;</span>
+ <span class="identifier">T</span><span class="special">::~</span><span class="identifier">T</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="special">;</span>
+ <span class="keyword">void</span> <span class="identifier">T</span><span class="special">::</span><span class="identifier">f</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span> <span class="special">;</span>
+<span class="special">}</span>
+
+
+
+<span class="keyword">auto</span> <span class="keyword">concept</span> <span class="identifier">HasEqualTo</span> <span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">U</span> <span class="special">></span>
+<span class="special">{</span>
+ <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==</span> <span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&,</span> <span class="identifier">U</span> <span class="keyword">const</span><span class="special">&</span> <span class="special">)</span> <span class="special">;</span>
+<span class="special">}</span>
+
+
+
+<span class="keyword">auto</span> <span class="keyword">concept</span> <span class="identifier">ExplicitlyConvertible</span> <span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">U</span> <span class="special">></span>
+<span class="special">{</span>
+ <span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="identifier">U</span> <span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="special">)</span> <span class="special">;</span>
+<span class="special">}</span>
+
+
+
+<span class="keyword">auto</span> <span class="keyword">concept</span> <span class="identifier">Convertible</span> <span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">U</span> <span class="special">></span>
+ <span class="special">:</span> <span class="identifier">ExplicitlyConvetible</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">U</span><span class="special">></span>
+<span class="special">{</span>
+ <span class="keyword">operator</span> <span class="identifier">U</span> <span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="special">)</span> <span class="special">;</span>
+<span class="special">}</span>
+
+
+
+<span class="keyword">concept</span> <span class="identifier">True</span> <span class="special"><</span> <span class="keyword">bool</span> <span class="identifier">Value</span> <span class="special">></span>
+<span class="special">{</span>
+ <span class="comment">// No operation.</span>
+<span class="special">}</span>
+
+
+
+<span class="keyword">concept_map</span> <span class="identifier">True</span> <span class="special"><</span> <span class="keyword">true</span> <span class="special">></span>
+<span class="special">{</span>
+ <span class="comment">// No operation.</span>
+<span class="special">}</span>
+
+
+
+<span class="keyword">auto</span> <span class="keyword">concept</span> <span class="identifier">IsEven</span> <span class="special"><</span> <span class="identifier">intmax_t</span> <span class="identifier">Value</span> <span class="special">></span>
+<span class="special">{</span>
+ <span class="keyword">requires</span> <span class="identifier">True</span><span class="special"><</span><span class="identifier">V</span> <span class="special">%</span> <span class="number">2</span> <span class="special">==</span> <span class="number">0</span><span class="special">></span> <span class="special">;</span>
+<span class="special">}</span>
+
+
+
+<span class="keyword">auto</span> <span class="keyword">concept</span> <span class="identifier">CopyConstructible</span> <span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">></span>
+ <span class="special">:</span> <span class="identifier">MoveConstructible</span><span class="special"><</span><span class="identifier">T</span><span class="special">>,</span> <span class="identifier">Constructible</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&></span>
+<span class="special">{</span>
+ <span class="keyword">axiom</span> <span class="identifier">CopyPreservation</span> <span class="special">(</span> <span class="identifier">T</span> <span class="identifier">x</span> <span class="special">)</span>
+ <span class="special">{</span>
+ <span class="identifier">T</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">x</span><span class="special">;</span>
+ <span class="special">}</span>
+<span class="special">}</span>
+
+
+
+<span class="keyword">concept</span> <span class="identifier">Iterator</span> <span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">X</span> <span class="special">></span> <span class="special">:</span> <span class="identifier">Semiregular</span><span class="special"><</span><span class="identifier">X</span><span class="special">></span>
+<span class="special">{</span>
+ <span class="identifier">MoveConstructible</span> <span class="identifier">reference</span> <span class="special">=</span> <span class="keyword">typename</span> <span class="identifier">X</span><span class="special">::</span><span class="identifier">reference</span> <span class="special">;</span>
+ <span class="identifier">MoveConstructible</span> <span class="identifier">postinc_result</span> <span class="special">;</span>
+ <span class="keyword">requires</span> <span class="identifier">HasDereference</span><span class="special"><</span><span class="identifier">postinc_result</span><span class="special">></span> <span class="special">;</span>
+
+ <span class="identifier">reference</span> <span class="keyword">operator</span><span class="special">*</span> <span class="special">(</span> <span class="identifier">X</span><span class="special">&</span> <span class="special">)</span> <span class="special">;</span>
+ <span class="identifier">reference</span> <span class="keyword">operator</span><span class="special">*</span> <span class="special">(</span> <span class="identifier">X</span><span class="special">&&</span> <span class="special">)</span> <span class="special">;</span>
+ <span class="identifier">X</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">++</span> <span class="special">(</span> <span class="identifier">X</span><span class="special">&</span> <span class="special">)</span> <span class="special">;</span>
+ <span class="identifier">postinc_result</span> <span class="keyword">operator</span><span class="special">++</span> <span class="special">(</span> <span class="identifier">X</span><span class="special">&,</span> <span class="keyword">int</span> <span class="special">)</span> <span class="special">;</span>
+<span class="special">}</span>
+
+
+
+<span class="keyword">concept</span> <span class="identifier">RandomAccessIterator</span> <span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">X</span> <span class="special">></span>
+ <span class="special">:</span> <span class="identifier">BidirectionalIterator</span><span class="special"><</span><span class="identifier">X</span><span class="special">>,</span> <span class="identifier">LessThanComparable</span><span class="special"><</span><span class="identifier">X</span><span class="special">></span>
+<span class="special">{</span>
+ <span class="identifier">MoveConstructible</span> <span class="identifier">reference</span> <span class="special">;</span>
+ <span class="keyword">requires</span> <span class="identifier">Convertible</span><span class="special"><</span><span class="identifier">reference</span><span class="special">,</span> <span class="identifier">value_type</span> <span class="keyword">const</span><span class="special">&></span> <span class="special">;</span>
+
+ <span class="identifier">X</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">+=</span> <span class="special">(</span> <span class="identifier">X</span><span class="special">&,</span> <span class="identifier">difference_type</span> <span class="special">)</span> <span class="special">;</span>
+
+ <span class="identifier">X</span> <span class="keyword">operator</span><span class="special">+</span> <span class="special">(</span> <span class="identifier">X</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">difference_type</span> <span class="identifier">n</span> <span class="special">)</span>
+ <span class="special">{</span>
+ <span class="identifier">X</span> <span class="identifier">y</span><span class="special">(</span><span class="identifier">x</span><span class="special">);</span>
+ <span class="identifier">y</span> <span class="special">+=</span> <span class="identifier">n</span><span class="special">;</span>
+ <span class="keyword">return</span> <span class="identifier">y</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">X</span> <span class="keyword">operator</span><span class="special">+</span> <span class="special">(</span> <span class="identifier">difference_type</span> <span class="identifier">n</span><span class="special">,</span> <span class="identifier">X</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">x</span> <span class="special">)</span>
+ <span class="special">{</span>
+ <span class="identifier">X</span> <span class="identifier">y</span><span class="special">(</span><span class="identifier">x</span><span class="special">);</span>
+ <span class="identifier">x</span> <span class="special">+=</span> <span class="identifier">n</span><span class="special">;</span>
+ <span class="keyword">return</span> <span class="identifier">y</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">X</span> <span class="keyword">operator</span><span class="special">-=</span> <span class="special">(</span> <span class="identifier">X</span><span class="special">&,</span> <span class="identifier">difference_type</span> <span class="special">)</span> <span class="special">;</span>
+
+ <span class="identifier">X</span> <span class="keyword">operator</span><span class="special">-</span> <span class="special">(</span> <span class="identifier">X</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">difference_type</span> <span class="identifier">n</span> <span class="special">)</span>
+ <span class="special">{</span>
+ <span class="identifier">X</span> <span class="identifier">y</span><span class="special">(</span><span class="identifier">x</span><span class="special">);</span>
+ <span class="identifier">y</span> <span class="special">-=</span> <span class="identifier">n</span><span class="special">;</span>
+ <span class="keyword">return</span> <span class="identifier">y</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">difference_type</span> <span class="keyword">operator</span><span class="special">-</span> <span class="special">(</span> <span class="identifier">X</span> <span class="keyword">const</span><span class="special">&,</span> <span class="identifier">X</span> <span class="keyword">const</span><span class="special">&</span> <span class="special">)</span> <span class="special">;</span>
+
+ <span class="identifier">reference</span> <span class="keyword">operator</span><span class="special">[]</span> <span class="special">(</span> <span class="identifier">X</span> <span class="keyword">const</span><span class="special">&,</span> <span class="identifier">difference_type</span> <span class="special">)</span> <span class="special">;</span>
+<span class="special">}</span>
+
+
+
+<span class="keyword">template</span><span class="special"><</span> <span class="identifier">ObjectType</span> <span class="identifier">T</span> <span class="special">></span>
+<span class="keyword">concept_map</span> <span class="identifier">RandomAccessIterator</span> <span class="special"><</span> <span class="identifier">T</span><span class="special">*</span> <span class="special">></span>
+<span class="special">{</span>
+ <span class="keyword">typedef</span> <span class="identifier">T</span> <span class="identifier">value_type</span> <span class="special">;</span>
+ <span class="keyword">typedef</span> <span class="keyword">ptrdiff_t</span> <span class="identifier">difference_type</span> <span class="special">;</span>
+ <span class="keyword">typedef</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">reference</span> <span class="special">;</span>
+ <span class="keyword">typedef</span> <span class="identifier">T</span><span class="special">*</span> <span class="identifier">pointer</span> <span class="special">;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+ </td>
+</tr></tbody>
+</table></div>
+<p>
+ Note that:
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ Extra wrapping parenthesis are used when expressions contain unwrapped
+ commas <code class="computeroutput"><span class="special">,</span></code> or leading symbols.
+ </li>
+<li class="listitem">
+ The specifiers <code class="computeroutput"><span class="keyword">constructor</span></code>,
+ <code class="computeroutput"><span class="keyword">destructor</span></code>, and <code class="computeroutput"><span class="keyword">member</span></code> follow the same syntax as the
+ <code class="computeroutput"><a class="link" href="../CONTRACT_CONSTRUCTOR_BODY.html" title="Macro CONTRACT_CONSTRUCTOR_BODY">CONTRACT_CONSTRUCTOR_BODY</a></code>
+ and <code class="computeroutput"><a class="link" href="../CONTRACT_DESTRUCTOR_BODY.html" title="Macro CONTRACT_DESTRUCTOR_BODY">CONTRACT_DESTRUCTOR_BODY</a></code>,
+ and they serve a purpose similar to these macros in naming the constructors,
+ destructors, and member functions outside class declarations.
+ </li>
+</ol></div>
+<p>
+ If concept definitions were added to this library, concepts would still be
+ checked using the <code class="computeroutput"><span class="keyword">requires</span></code> specifier
+ in class and function declarations as we have seen so far (it might even
+ be possible for concepts defines using Boost.ConceptCheck
+ to be still specified using some type tagging of this library concept types
+ to internally distinguish between Boost.ConceptCheck
+ concepts and concepts define using this library). Furthermore, this library
+ could provide all the standard concepts defined in <a class="link" href="bibliography.html#N2914_anchor">[N2914]</a>
+ in an header file <code class="literal">contract/std/concept.hpp</code>.
+ </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="virtual_specifiers.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="named_parameters.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/contract__/contract_programming_overview.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/contract__/contract_programming_overview.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,1853 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Contract Programming Overview</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="prev" href="getting_started.html" title="Getting Started">
+<link rel="next" href="tutorial.html" title="Tutorial">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="getting_started.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="tutorial.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="contract__.contract_programming_overview"></a><a class="link" href="contract_programming_overview.html" title="Contract Programming Overview">Contract Programming
+ Overview</a>
+</h2></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section">Assertions</span></dt>
+<dt><span class="section">Benefits</span></dt>
+<dt><span class="section">Costs</span></dt>
+<dt><span class="section"><a href="contract_programming_overview.html#contract__.contract_programming_overview.free_function_calls">Free
+ Function Calls</a></span></dt>
+<dt><span class="section"><a href="contract_programming_overview.html#contract__.contract_programming_overview.member_function_calls">Member
+ Function Calls</a></span></dt>
+<dt><span class="section"><a href="contract_programming_overview.html#contract__.contract_programming_overview.constructor_calls">Constructor
+ Calls</a></span></dt>
+<dt><span class="section"><a href="contract_programming_overview.html#contract__.contract_programming_overview.destructor_calls">Destructor
+ Calls</a></span></dt>
+<dt><span class="section">Constant-Correctness</span></dt>
+<dt><span class="section"><a href="contract_programming_overview.html#contract__.contract_programming_overview.specification_vs__implementation">Specification
+ vs. Implementation</a></span></dt>
+<dt><span class="section"><a href="contract_programming_overview.html#contract__.contract_programming_overview.broken_contracts">Broken
+ Contracts</a></span></dt>
+<dt><span class="section">Features</span></dt>
+</dl></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <span class="emphasis"><em><span class="quote">“<span class="quote">It is absurd to make elaborate security checks on debugging
+ runs, when no trust is put in the results, and then remove them in production
+ runs, when an erroneous result could be expensive or disastrous. What would
+ we think of a sailing enthusiast who wears his life-jacket when training
+ on dry land but takes it off as soon as he goes to sea?</span>”</span></em></span>
+ </p></blockquote></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <span class="emphasis"><em>-- Charles Antony Richard Hoare (see <a class="link" href="bibliography.html#Hoare73_anchor">[Hoare73]</a>)</em></span>
+ </p></blockquote></div>
+<p>
+ This section gives an overview of Contract Programming (see <a class="link" href="bibliography.html#Meyer97_anchor">[Meyer97]</a>,
+ <a class="link" href="bibliography.html#Mitchell02_anchor">[Mitchell02]</a>, and <a class="link" href="bibliography.html#N1613_anchor">[N1613]</a>
+ for a detailed introduction to Contract Programming).
+ </p>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ The objective of this library is <span class="emphasis"><em>not</em></span> to convince programmers
+ to use Contract Programming. It is assumed that programmes understand the
+ benefits and trade-offs associated with Contract Programming and they have
+ already decided to use this methodology to formally program specifications.
+ Then, this library aims to be the best Contract Programming library for C++.
+ </p></td></tr>
+</table></div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.contract_programming_overview.assertions"></a><a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.assertions" title="Assertions">Assertions</a>
+</h3></div></div></div>
+<p>
+ Contract Programming is characterized by the following type of assertion
+ mechanisms.
+ </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>
+ <p>
+ Assertion
+ </p>
+ </th>
+<th>
+ <p>
+ Purpose
+ </p>
+ </th>
+</tr></thead>
+<tbody>
+<tr>
+<td>
+ <p>
+ Preconditions
+ </p>
+ </td>
+<td>
+ <p>
+ These are logical conditions that programmers expect to be true
+ when the function is called (e.g., to check constraints on the
+ function arguments).
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ Postconditions
+ </p>
+ </td>
+<td>
+ <p>
+ These are logical conditions that programmers expect to be true
+ when the function has ended normally (e.g., to check the result
+ and any side effect that a function might have). Postconditions
+ can usually access the function result value (for non-void functions)
+ and <span class="emphasis"><em>old values</em></span> that expressions had before
+ the body execution.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ Class Invariants
+ </p>
+ </td>
+<td>
+ <p>
+ These are logical conditions that programmers expect to be true
+ after the constructor has been executed successfully, before and
+ after the execution of every non-static public member function,
+ and before the destructor is executed (e.g, class invariants can
+ define valid states of all objects of a class). It is possible
+ to describe a different set of class invariants for volatile member
+ functions but <span class="emphasis"><em>volatile class invariants</em></span> are
+ assumed to be same as class invariants unless differently specified.
+ It is also possible to describe <span class="emphasis"><em>static class invariants</em></span>
+ which are excepted to be true before and after the execution of
+ any public member function (even if static), including constructor
+ entry and destructor exit. <sup>[<a name="contract__.contract_programming_overview.assertions.f0" href="#ftn.contract__.contract_programming_overview.assertions.f0" class="footnote">a</a>]</sup>
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ Subcontracting
+ </p>
+ </td>
+<td>
+ <p>
+ Subcontracting is defined using the <a href="http://en.wikipedia.org/wiki/Liskov_substitution_principle" target="_top">substitution
+ principle</a> and it predicates that: Preconditions cannot
+ be strengthen, postconditions and class invariants cannot be weaken.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ Block Invariants
+ </p>
+ </td>
+<td>
+ <p>
+ These are logical conditions that programmers except to be true
+ every time the execution reaches the point where the condition
+ is asserted. When used within a loop (i.e., a block of code that
+ can be executed in iteration), block invariants are also called
+ <span class="emphasis"><em>loop invariants</em></span> and they assert conditions
+ that are expected to be true for every loop iteration.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ Loop Variants
+ </p>
+ </td>
+<td>
+ <p>
+ For a given loop, a <a href="http://en.wikipedia.org/wiki/Loop_variant" target="_top">loop
+ variant</a> is a non-negative integer expression (<code class="computeroutput"><span class="special">>=</span> <span class="number">0</span></code>)
+ with a value that is expected to decrease at every subsequent loop
+ iteration. Loop variants are used to ensure that loops terminate
+ avoiding infinite iterations.
+ </p>
+ </td>
+</tr>
+</tbody>
+<tbody class="footnotes"><tr><td colspan="2"><div class="footnote"><p><sup>[<a id="ftn.contract__.contract_programming_overview.assertions.f0" href="#contract__.contract_programming_overview.assertions.f0" class="para">a</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> Static and volatile
+ class invariants were first introduced by this library to reflect
+ the fact that C++ support both static and volatile member functions.
+ Static and volatile class invariants are not part of <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a>.
+ </p></div></td></tr></tbody>
+</table></div>
+<p>
+ It is a common Contract Programming requirement to disable other contracts
+ while a contract assertions is being evaluated (in order to avoid infinite
+ recursive calls). This library implement this feature however it should be
+ noted that in order to globally disable assertions while checking another
+ assertion, some type of global variable needs to be used. In multi-threaded
+ environments, programmers can define the <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_THREAD_SAFE.html" title="Macro CONTRACT_CONFIG_THREAD_SAFE">CONTRACT_CONFIG_THREAD_SAFE</a></code>
+ configuration macro to protect such a global variable from racing conditions
+ (but that will effectively introduce a global lock in the program).
+ </p>
+<p>
+ A limited form of Contract Programming is the use of the C++ <code class="computeroutput"><span class="identifier">assert</span></code> macro. Using <code class="computeroutput"><span class="identifier">assert</span></code>
+ is common practice for many programmers but unfortunately it suffers from
+ the following problems (that are instead resolved by using Contract Programming):
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ <code class="computeroutput"><span class="identifier">assert</span></code> is used within
+ the implementation therefore the asserted conditions are not easily visible
+ to the caller which is only familiar with the class and function declarations.
+ </li>
+<li class="listitem">
+ <code class="computeroutput"><span class="identifier">assert</span></code> does not distinguish
+ between preconditions and postconditions. In well-tested production code,
+ postconditions can be disabled trusting the correctness of the implementation
+ while preconditions might still need to remain enabled because of the
+ evolution of the calling code. Using <code class="computeroutput"><span class="identifier">assert</span></code>
+ it is not possible to selectively disable only postconditions and all
+ assertions must be disabled at once.
+ </li>
+<li class="listitem">
+ <code class="computeroutput"><span class="identifier">assert</span></code> requires to manually
+ program extra code to check class invariants (e.g., extra member functions
+ and try blocks).
+ </li>
+<li class="listitem">
+ <code class="computeroutput"><span class="identifier">assert</span></code> does not support
+ subcontracting.
+ </li>
+</ol></div>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.contract_programming_overview.benefits"></a><a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.benefits" title="Benefits">Benefits</a>
+</h3></div></div></div>
+<p>
+ The main use of Contract Programming is to improve software quality. <a class="link" href="bibliography.html#Meyer97_anchor">[Meyer97]</a> discusses how Contract Programming
+ can be used as the basic tool to write <span class="quote">“<span class="quote">correct</span>”</span> software. Furhtermore,
+ <a class="link" href="bibliography.html#Stroustrup97_anchor">[Stroustrup97]</a> discusses the key
+ importance of class invariants plus advantages and disadvantages of preconditions
+ and postconditions. The following is a short summary of the benefits associated
+ with Contract Programming mainly taken from <a class="link" href="bibliography.html#N1613_anchor">[N1613]</a>.
+ </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>
+ <p>
+ #
+ </p>
+ </th>
+<th>
+ <p>
+ Topic
+ </p>
+ </th>
+<th>
+ <p>
+ Benefit
+ </p>
+ </th>
+</tr></thead>
+<tbody>
+<tr>
+<td>
+ <p>
+ 1.
+ </p>
+ </td>
+<td>
+ <p>
+ Preconditions and Postconditions
+ </p>
+ </td>
+<td>
+ <p>
+ Using function preconditions and postconditions, programmers can
+ give a precise semantic description of what a function requires
+ at its entry and what it ensures under its (normal) exit. In particular,
+ using postcondition old values, Contract Programming provides a
+ mechanism that allows programmers to compare values of an expression
+ before and after the function body execution. This mechanism is
+ powerful enough to enable programmers to express many constraints
+ within the code, constraints that would otherwise have to be captured
+ at best only informally by the code documentation.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ 2.
+ </p>
+ </td>
+<td>
+ <p>
+ Class Invariants
+ </p>
+ </td>
+<td>
+ <p>
+ Using class invariants, programmers can describe what to expect
+ from a class and the logic dependencies between the class members.
+ It is the job of the constructor to ensure that the class invariants
+ are satisfied when the object is first created. Then the implementation
+ of the member functions can be largely simplified as they can be
+ written knowing that the class invariants are satisfied because
+ Contract Programing checks them before and after the execution
+ of every member function. Finally, the destructor makes sure that
+ the class invariants hold for the entire life of the object, checking
+ the class invariants one last time before the object is destructed.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ 3.
+ </p>
+ </td>
+<td>
+ <p>
+ Self-Documenting Code
+ </p>
+ </td>
+<td>
+ <p>
+ Contracts are part of the source code, they are executed and verified
+ at run-time so they are always up to date with the code itself.
+ Therefore the specifications, as documented by the contracts, can
+ be trusted to always be up to date with the implementation code.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ 4.
+ </p>
+ </td>
+<td>
+ <p>
+ Easier Debugging
+ </p>
+ </td>
+<td>
+ <p>
+ Contract Programming can provide a powerful debugging facility
+ because, if contracts are well written, bugs will cause contract
+ assertions to fail exactly where the problem first occurs instead
+ than at some later stage of the program execution in an apparently
+ unrelated manner. Note that a precondition failure points to a
+ bug in the function caller, a postcondition failure points instead
+ to a bug in the function implementation. Furthermore, in case of
+ contract failure, this library provides detailed error messages
+ that greatly helps debugging. <sup>[<a name="contract__.contract_programming_overview.benefits.f0" href="#ftn.contract__.contract_programming_overview.benefits.f0" class="footnote">a</a>]</sup>
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ 5.
+ </p>
+ </td>
+<td>
+ <p>
+ Easier Testing
+ </p>
+ </td>
+<td>
+ <p>
+ Contract Programming facilitates testing because a contract naturally
+ specifies what a test should check. For example, preconditions
+ of a function state which inputs cause the function to fail and
+ postconditions state which outputs are produced by the function
+ on normal exit.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ 6.
+ </p>
+ </td>
+<td>
+ <p>
+ Formal Design
+ </p>
+ </td>
+<td>
+ <p>
+ Contract Programming can serve to reduce the gap between designers
+ and programmers by providing a precise and unambiguous specification
+ language. Moreover, contracts can make code reviews easier.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ 7.
+ </p>
+ </td>
+<td>
+ <p>
+ Formal Inheritance
+ </p>
+ </td>
+<td>
+ <p>
+ Contract Programming formalizes the virtual function overriding
+ mechanism using subcontracting as justified by the <a href="http://en.wikipedia.org/wiki/Liskov_substitution_principle" target="_top">substitution
+ principle</a>. This keeps the base class programmers in control
+ as overriding functions still have to fully satisfy the base class
+ contracts.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ 8.
+ </p>
+ </td>
+<td>
+ <p>
+ Replace Defensive Programming
+ </p>
+ </td>
+<td>
+ <p>
+ Contract Programming assertions can replace <a href="http://en.wikipedia.org/wiki/Defensive_programming" target="_top">Defensive
+ Programming</a> checks localizing these checks within the contract
+ and making the code more readable.
+ </p>
+ </td>
+</tr>
+</tbody>
+<tbody class="footnotes"><tr><td colspan="3"><div class="footnote"><p><sup>[<a id="ftn.contract__.contract_programming_overview.benefits.f0" href="#contract__.contract_programming_overview.benefits.f0" class="para">a</a>] </sup>
+ Of course, if the contract is ill written then Contract Programming
+ is of little use. However, it is less likely to have a bug in
+ both the function body and the contract than in the function
+ body only. For example, consider the validation of a result in
+ postconditions. Validating the return value might seem redundant,
+ but in this case we actually want that redundancy. When programmers
+ write a function, there is a certain probability that they make
+ a mistake in implementing the function body. When programmers
+ specify the result of the function in the postconditions, there
+ is also a certain probability that they make a mistake in writing
+ the contract. However, the probability that programmers make
+ a mistake twice (in both the body <span class="emphasis"><em>and</em></span> the
+ contract) is lower than the probability that the mistake is made
+ just once (in either the body or the contract).
+ </p></div></td></tr></tbody>
+</table></div>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.contract_programming_overview.costs"></a><a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.costs" title="Costs">Costs</a>
+</h3></div></div></div>
+<p>
+ Contract Programming benefits come to the cost of performance as discussed
+ in detail by both <a class="link" href="bibliography.html#Stroustrup97_anchor">[Stroustrup97]</a>
+ and <a class="link" href="bibliography.html#Meyer97_anchor">[Meyer97]</a>. However, while performance
+ trade-offs should be carefully considered depending on the specific application
+ domain, software quality cannot be sacrificed (it is difficult to see the
+ value of software that quickly and efficiently provides an incorrect result).
+ </p>
+<p>
+ The run-time performances are negatively impacted by Contract Programming
+ mainly because of the following:
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ The extra processing required to check the assertions.
+ </li>
+<li class="listitem">
+ The extra processing required by the additional function calls (additional
+ functions are invoked to check preconditions, postconditions, class invariants,
+ etc).
+ </li>
+<li class="listitem">
+ The extra processing required to copy expression results when old values
+ that are used in postconditions.
+ </li>
+</ol></div>
+<p>
+ To mitigate the run-time performance impact, programmers can selectively
+ turn off some of the contract compilation and the related run-time checking.
+ Programmers will have to decide based on the performance trade-offs required
+ by their applications but a reasonable approach usually is to:
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem">
+ Always write contracts to clarify the semantics of the design embedding
+ the specifications directly into the code and making the code self-documenting.
+ </li>
+<li class="listitem">
+ Enable preconditions, postconditions, and class invariants compilation
+ and checking during initial testing.
+ </li>
+<li class="listitem">
+ Enable only preconditions (and possibly class invariants) during release
+ testing and for the final release (see also <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_PRECONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_PRECONDITIONS">CONTRACT_CONFIG_NO_PRECONDITIONS</a></code>,
+ <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_POSTCONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_POSTCONDITIONS">CONTRACT_CONFIG_NO_POSTCONDITIONS</a></code>,
+ and <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_CLASS_INVARIANTS.html" title="Macro CONTRACT_CONFIG_NO_CLASS_INVARIANTS">CONTRACT_CONFIG_NO_CLASS_INVARIANTS</a></code>).
+ </li>
+</ul></div>
+<p>
+ This approach is usually reasonable because in well-tested production code,
+ validating the function body implementation using postconditions and class
+ invariants is rarely needed since the function has shown itself to be <span class="quote">“<span class="quote">correct</span>”</span>
+ during testing. On the other hand, checking function arguments using postconditions
+ is always needed because of the evolution of the calling code. Furthermore,
+ postconditions are usually computationally more expensive to check (see the
+ <a class="link" href="advanced_topics.html#contract__.advanced_topics.assertion_requirements" title="Assertion Requirements">Assertion
+ Requirements</a> section for a mechanism to selectively enable assertions
+ also based on their computational complexity).
+ </p>
+<p>
+ Compile-time performances are also impacted by this library mainly because:
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ The contracts appear in class and function declarations (usually header
+ files) so they have to be re-compiled for each translation unit.
+ </li>
+<li class="listitem">
+ The library implementation extensively uses preprocessor and template
+ meta-programming which significantly stress compiler performances.
+ </li>
+</ol></div>
+<a name="compilation_time_warning_anchor"></a><div class="warning"><table border="0" summary="Warning">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
+<th align="left">Warning</th>
+</tr>
+<tr><td align="left" valign="top">
+<p>
+ Unfortunately, the current implementation of this library significantly
+ slows down compilation. For example, for a project with 122 files and 15,471
+ lines of code, adding contracts to a total of 50 classes and 302 functions
+ increased compilation time from 1 minute to 26 minutes when compilation
+ was enabled for all contracts, and from 1 minute to 2 minutes when contracts
+ were left in the code but contract compilation was disabled using this
+ library configuration macros <code class="computeroutput"><span class="identifier">CONTRACT_CONFIG_NO_</span><span class="special">...</span></code>. <sup>[<a name="contract__.contract_programming_overview.costs.f0" href="#ftn.contract__.contract_programming_overview.costs.f0" class="footnote">6</a>]</sup>
+ </p>
+<p>
+ On compilers that support <a href="http://en.wikipedia.org/wiki/Precompiled_header" target="_top">pre-compiled
+ headers</a> (GCC, MSVC, etc), these can be used to reduce re-compilation
+ time. For example, re-compilation time of <a class="link" href="examples.html#contract__.examples.__n1962___vector__comparison_with_c___proposed_syntax" title="[N1962] Vector: Comparison with C++ proposed syntax"><code class="literal">vector.cpp</code></a>
+ from the <a class="link" href="examples.html" title="Examples">Examples</a> section is
+ reduced from 44 seconds to 24 seconds (55% faster) when its header <a class="link" href="examples.html#contract__.examples.__n1962___vector__comparison_with_c___proposed_syntax" title="[N1962] Vector: Comparison with C++ proposed syntax"><code class="literal">vector.hpp</code></a>
+ is pre-compiled (with all contracts enabled). <sup>[<a name="contract__.contract_programming_overview.costs.f1" href="#ftn.contract__.contract_programming_overview.costs.f1" class="footnote">7</a>]</sup>
+ </p>
+<p>
+ The authors have not done a detailed preprocessing-time and compile-time
+ analysis of the performances of this library. Therefore, the authors have
+ not yet tried to optimize this library compilation-time. Reducing compilation-time
+ will be a major focus of future releases (see also <a href="https://sourceforge.net/apps/trac/contractpp/ticket/48" target="_top">Ticket
+ 48</a>).
+ </p>
+</td></tr>
+</table></div>
+<p>
+ Finally, Contract Programming should be seen as a tool to complement (and
+ not to substitute) testing.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.contract_programming_overview.free_function_calls"></a><a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.free_function_calls" title="Free Function Calls">Free
+ Function Calls</a>
+</h3></div></div></div>
+<p>
+ A <span class="emphasis"><em>free function</em></span> <sup>[<a name="contract__.contract_programming_overview.free_function_calls.f0" href="#ftn.contract__.contract_programming_overview.free_function_calls.f0" class="footnote">8</a>]</sup> call executes the following steps:
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ Check the function preconditions.
+ </li>
+<li class="listitem">
+ Execute the function body.
+ </li>
+<li class="listitem">
+ Check the function postconditions.
+ </li>
+</ol></div>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.contract_programming_overview.member_function_calls"></a><a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.member_function_calls" title="Member Function Calls">Member
+ Function Calls</a>
+</h3></div></div></div>
+<p>
+ A member function call executes the following steps:
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ Check the static class invariants.
+ </li>
+<li class="listitem">
+ Check the non-static class invariants (in <a class="link" href="contract_programming_overview.html#logic_and_anchor">logic-and</a>
+ with the base class invariants when subcontracting). These are checked
+ only for non-static member functions. <sup>[<a name="contract__.contract_programming_overview.member_function_calls.f0" href="#ftn.contract__.contract_programming_overview.member_function_calls.f0" class="footnote">9</a>]</sup> Volatile member functions check volatile class invariants
+ instead.
+ </li>
+<li class="listitem">
+ Check the function preconditions (in <a class="link" href="contract_programming_overview.html#logic_or_anchor">logic-or</a>
+ with the overridden function preconditions when subcontracting).
+ </li>
+<li class="listitem">
+ Execute the function body.
+ </li>
+<li class="listitem">
+ Check the static class invariants (even if the body throws an exception).
+ </li>
+<li class="listitem">
+ Check the non-static class invariants (in <a class="link" href="contract_programming_overview.html#logic_and_anchor">logic-and</a>
+ with the base class invariants when subcontracting). These are checked
+ only for non-static member functions and even if the body throws an exception.
+ Volatile member functions check volatile class invariants instead.
+ </li>
+<li class="listitem">
+ Check the function postconditions (in <a class="link" href="contract_programming_overview.html#logic_and_anchor">logic-and</a>
+ with the overridden function postconditions when subcontracting). These
+ are checked only if the body does not throw an exception.
+ </li>
+</ol></div>
+<p>
+ <a name="logic_and_anchor"></a><a name="logic_or_anchor"></a>In this documentation
+ <a class="link" href="contract_programming_overview.html#logic_and_anchor">logic-and</a> and <a class="link" href="contract_programming_overview.html#logic_or_anchor">logic-or</a>
+ are the logic <span class="emphasis"><em>and</em></span> and <span class="emphasis"><em>or</em></span> operations
+ evaluated in short-circuit:
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem">
+ <code class="computeroutput"><span class="identifier">p</span></code> <a class="link" href="contract_programming_overview.html#logic_and_anchor">logic-and</a>
+ <code class="computeroutput"><span class="identifier">q</span></code> is true if and only
+ if both <code class="computeroutput"><span class="identifier">p</span></code> and <code class="computeroutput"><span class="identifier">q</span></code> are true but <code class="computeroutput"><span class="identifier">q</span></code>
+ is evaluated only when <code class="computeroutput"><span class="identifier">p</span></code>
+ is true.
+ </li>
+<li class="listitem">
+ <code class="computeroutput"><span class="identifier">p</span></code> <a class="link" href="contract_programming_overview.html#logic_or_anchor">logic-or</a>
+ <code class="computeroutput"><span class="identifier">q</span></code> is true if and only
+ if either <code class="computeroutput"><span class="identifier">p</span></code> or <code class="computeroutput"><span class="identifier">q</span></code> is true but <code class="computeroutput"><span class="identifier">q</span></code>
+ is evaluated only when <code class="computeroutput"><span class="identifier">p</span></code>
+ is false.
+ </li>
+</ul></div>
+<p>
+ Class invariants are checked before preconditions and postconditions so that
+ preconditions and postconditions assertions can be simplified by being programmed
+ under the assumption that class invariants are satisfied (e.g., if class
+ invariants assert that a pointer cannot be null then preconditions and postconditions
+ can safety dereference the pointer without additional checking). Similarly,
+ subcontracting checks contracts of base classes before checking the derived
+ class contracts so that the base class contract can be programmed under the
+ assumption that the base class contracts are satisfied. When a member function
+ overrides more than one virtual base function because of multiple inheritance:
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem">
+ Class invariants are checked in <a class="link" href="contract_programming_overview.html#logic_and_anchor">logic-and</a>
+ with the class invariants of all base classes following the inheritance
+ order.
+ </li>
+<li class="listitem">
+ Preconditions are checked in <a class="link" href="contract_programming_overview.html#logic_or_anchor">logic-or</a>
+ with the preconditions of all overridden functions following the inheritance
+ order.
+ </li>
+<li class="listitem">
+ Postconditions are checked in <a class="link" href="contract_programming_overview.html#logic_and_anchor">logic-and</a>
+ with the postconditions of all overridden functions following the inheritance
+ order.
+ </li>
+</ul></div>
+<p>
+ Note that:
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem">
+ Preconditions and postconditions of static member functions cannot access
+ the object.
+ </li>
+<li class="listitem">
+ Preconditions, postconditions, and volatile class invariants of volatile
+ member functions access the object as (constant) volatile.
+ </li>
+</ul></div>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.contract_programming_overview.constructor_calls"></a><a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.constructor_calls" title="Constructor Calls">Constructor
+ Calls</a>
+</h3></div></div></div>
+<p>
+ A constructor call executes the following steps:
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ Check the constructor preconditions.
+ </li>
+<li class="listitem">
+ Initialize base classes and members executing the constructor member
+ initialization list if present.
+ </li>
+<li class="listitem">
+ Check the static class invariants (but not the non-static class invariants).
+ </li>
+<li class="listitem">
+ Execute the constructor body.
+ </li>
+<li class="listitem">
+ Check the static class invariants (even if the body throws an exception).
+ </li>
+<li class="listitem">
+ Check the non-static class invariants, but only if the body did not throw
+ an exception.
+ </li>
+<li class="listitem">
+ Check the constructor postconditions, but only if the body did not throw
+ an exception.
+ </li>
+</ol></div>
+<p>
+ Preconditions are checked before initializing base classes and members so
+ that these initializations can relay on preconditions to be true (for example
+ to validate constructor arguments before they are used to initialize member
+ variables). C++ object construction mechanism will automatically check base
+ class contracts when subcontracting.
+ </p>
+<p>
+ Note that:
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem">
+ Non-static class invariants are not checked at constructor entry (because
+ there is no object before the constructor body is executed).
+ </li>
+<li class="listitem">
+ Preconditions cannot access the object (because there is no object before
+ the constructor body is executed).
+ </li>
+<li class="listitem">
+ Postconditions cannot access the object old value (because there was
+ no object before the constructor body was executed).
+ </li>
+<li class="listitem">
+ The object is never volatile within constructors so constructors do not
+ check volatile class invariants.
+ </li>
+</ul></div>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.contract_programming_overview.destructor_calls"></a><a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.destructor_calls" title="Destructor Calls">Destructor
+ Calls</a>
+</h3></div></div></div>
+<p>
+ A destructor call executes the following steps:
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ Check the static class invariants.
+ </li>
+<li class="listitem">
+ Check the non-static class invariants.
+ </li>
+<li class="listitem">
+ Execute the destructor body.
+ </li>
+<li class="listitem">
+ Check the static class invariants (even if the body throws an exception).
+ <sup>[<a name="contract__.contract_programming_overview.destructor_calls.f0" href="#ftn.contract__.contract_programming_overview.destructor_calls.f0" class="footnote">10</a>]</sup>
+ </li>
+<li class="listitem">
+ Check the non-static class invariants, but only if the body threw an
+ exception.
+ </li>
+</ol></div>
+<p>
+ C++ object destruction mechanism will automatically check base class contracts
+ when subcontracting.
+ </p>
+<p>
+ Note that:
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem">
+ Destructors have no parameter and they can be called at any time after
+ object construction so they have no preconditions.
+ </li>
+<li class="listitem">
+ After the destructor body is executed, the object no longer exists so
+ non-static class invariants do not have to be true and they are not checked
+ at destructor exit.
+ </li>
+<li class="listitem">
+ Destructors have no postconditions because they have no parameter and
+ after the body execution there is no object. <sup>[<a name="contract__.contract_programming_overview.destructor_calls.f1" href="#ftn.contract__.contract_programming_overview.destructor_calls.f1" class="footnote">11</a>]</sup>
+ </li>
+<li class="listitem">
+ The object is never volatile within destructors so destructors do not
+ check volatile class invariants.
+ </li>
+</ul></div>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.contract_programming_overview.constant_correctness"></a><a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.constant_correctness" title="Constant-Correctness">Constant-Correctness</a>
+</h3></div></div></div>
+<p>
+ Contracts are only responsible to check the program state in oder to ensure
+ its compliance with the specifications. Therefore, contracts should not be
+ able to modify the program state and exclusively "read-only" operations
+ (or <span class="emphasis"><em>queries</em></span>) should be used to program contracts.
+ </p>
+<p>
+ This library enforces this constraint at compile-time using C++ <code class="computeroutput"><span class="keyword">const</span></code> qualifier. <sup>[<a name="contract__.contract_programming_overview.constant_correctness.f0" href="#ftn.contract__.contract_programming_overview.constant_correctness.f0" class="footnote">12</a>]</sup> Contracts only have access to the object, function arguments,
+ and function return value via constant references <code class="computeroutput"><span class="keyword">const</span><span class="special">&</span></code> or pointers <code class="computeroutput"><span class="keyword">const</span><span class="special">*</span></code>. Other variables (static data members, global
+ variables, etc) can be explicitly made constant using <span class="emphasis"><em>constant
+ assertions</em></span> (see the <a class="link" href="advanced_topics.html" title="Advanced Topics">Advanced
+ Topics</a> section).
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.contract_programming_overview.specification_vs__implementation"></a><a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.specification_vs__implementation" title="Specification vs. Implementation">Specification
+ vs. Implementation</a>
+</h3></div></div></div>
+<p>
+ Contracts are part of the program specification and not of its implementation.
+ Therefore, contracts should appear within C++ declarations and not within
+ definitions. <sup>[<a name="contract__.contract_programming_overview.specification_vs__implementation.f0" href="#ftn.contract__.contract_programming_overview.specification_vs__implementation.f0" class="footnote">13</a>]</sup>
+ </p>
+<p>
+ Contracts are most useful when they assert conditions only using public members.
+ For example, the caller of a member function cannot in general make sure
+ that the member function preconditions are satisfied if these preconditions
+ use private members that are not accessible by the caller. Therefore, a failure
+ in the preconditions will not necessarily indicate a bug in the caller given
+ that the caller was not able to fully check the preconditions before calling
+ the member function. In most cases, the need of using non-public members
+ to check contracts indicates an error in the design of the class. However,
+ given that C++ provides programmers ways around access level restrictions
+ (e.g., <code class="computeroutput"><span class="keyword">friend</span></code> and function pointers),
+ this library leaves it up to the programmers to make sure that only public
+ members are used in contract assertions (<a class="link" href="bibliography.html#N1962_anchor">[N1962]</a>
+ follows the same approach not forcing contracts to only use public members,
+ Eiffel
+ instead generates a compiler error if preconditions use non-public members).
+ <sup>[<a name="contract__.contract_programming_overview.specification_vs__implementation.f1" href="#ftn.contract__.contract_programming_overview.specification_vs__implementation.f1" class="footnote">14</a>]</sup>
+ </p>
+<p>
+ Finally, only public member functions shall check class invariants. Private
+ and protected member functions are allowed to brake class invariants because
+ private and protected member are part of the class implementation and not
+ of its specification.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.contract_programming_overview.broken_contracts"></a><a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.broken_contracts" title="Broken Contracts">Broken
+ Contracts</a>
+</h3></div></div></div>
+<p>
+ After programmers specify contracts, this library automatically checks preconditions,
+ postconditions, class invariants, block invariants, and loop variants at
+ run-time. If a precondition, postcondition, class invariant, block invariants,
+ or loop variant is checked to be false or throws an exception then the library
+ invokes the <code class="computeroutput"><a class="link" href="../contract/precondition_broken.html" title="Function precondition_broken">contract::precondition_broken</a></code>,
+ <code class="computeroutput"><a class="link" href="../contract/postcondition_broken.html" title="Function postcondition_broken">contract::postcondition_broken</a></code>,
+ <code class="computeroutput"><a class="link" href="../contract/class_invariant_b_id552579.html" title="Function class_invariant_broken_on_entry">contract::class_invariant_broken_on_entry</a></code>
+ or <code class="computeroutput"><a class="link" href="../contract/class_invariant_b_id552657.html" title="Function class_invariant_broken_on_exit">contract::class_invariant_broken_on_exit</a></code>
+ or <code class="computeroutput"><a class="link" href="../contract/class_invariant_b_id552735.html" title="Function class_invariant_broken_on_throw">contract::class_invariant_broken_on_throw</a></code>,
+ <code class="computeroutput"><a class="link" href="../contract/block_invariant_broken.html" title="Function block_invariant_broken">contract::block_invariant_broken</a></code>,
+ and <code class="computeroutput"><a class="link" href="../contract/loop_variant_broken.html" title="Function loop_variant_broken">contract::loop_variant_broken</a></code>
+ function respectively.
+ </p>
+<p>
+ These function invoke <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span><span class="special">()</span></code> by default but programmers can redefine
+ them to take a different action (throw an exception, exit the program, etc)
+ using <code class="computeroutput"><a class="link" href="../reference.html#contract.set_precondition_broken">contract::set_precondition_broken</a></code>,
+ <code class="computeroutput"><a class="link" href="../reference.html#contract.set_postcondition_broken">contract::set_postcondition_broken</a></code>,
+ <code class="computeroutput"><a class="link" href="../reference.html#contract.set_class_invariant_broken">contract::set_class_invariant_broken</a></code>,
+ <code class="computeroutput"><a class="link" href="../reference.html#contract.set_block_invariant_broken">contract::set_block_invariant_broken</a></code>,
+ and <code class="computeroutput"><a class="link" href="../reference.html#contract.set_loop_variant_broken">contract::set_loop_variant_broken</a></code>
+ (this mechanism is similar to the one of C++'s <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span><span class="special">()</span></code>). See the <a class="link" href="advanced_topics.html#contract__.advanced_topics.contract_broken_handlers__throw_on_failure_" title="Contract Broken Handlers (Throw on Failure)">Contract
+ Broken Handlers</a> section for an example.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.contract_programming_overview.features"></a><a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.features" title="Features">Features</a>
+</h3></div></div></div>
+<p>
+ The design of this library was largely based on <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a>
+ and on the Eiffel
+ programming language as specified by <a class="link" href="bibliography.html#Meyer97_anchor">[Meyer97]</a>.
+ The following table compares features between this library, the proposal
+ for adding Contract Programming to the C++ standard <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a>,
+ the Eiffel
+ programming language <a class="link" href="bibliography.html#Meyer97_anchor">[Meyer97]</a>, and
+ the D programming language <a class="link" href="bibliography.html#Bright04_anchor">[Bright04]</a>.
+ </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+<col>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>
+ <p>
+ Feature
+ </p>
+ </th>
+<th>
+ <p>
+ This Library (C++03)
+ </p>
+ </th>
+<th>
+ <p>
+ [N1962] Proposal (not part of C++)
+ </p>
+ </th>
+<th>
+ <p>
+ ISE Eiffel 5.4
+ </p>
+ </th>
+<th>
+ <p>
+ D
+ </p>
+ </th>
+</tr></thead>
+<tbody>
+<tr>
+<td>
+ <p>
+ <span class="emphasis"><em>Keywords and Specifiers</em></span>
+ </p>
+ </td>
+<td>
+ <p>
+ <code class="computeroutput"><span class="keyword">precondition</span></code>, <code class="computeroutput"><span class="keyword">postcondition</span></code>, <code class="computeroutput"><span class="keyword">extends</span></code>,
+ <code class="computeroutput"><span class="keyword">initialize</span></code>, <code class="computeroutput"><span class="keyword">requires</span></code>, <code class="computeroutput"><span class="keyword">in</span></code>,
+ <code class="computeroutput"><span class="keyword">out</span></code>, <code class="computeroutput"><span class="keyword">deduce</span></code>, <code class="computeroutput"><span class="keyword">comma</span></code>
+ (these are specifiers and not keywords, they have special meaning
+ only in specific positions within the declarations passed to this
+ library macros)
+ </p>
+ </td>
+<td>
+ <p>
+ <code class="computeroutput"><span class="keyword">invariant</span></code>, <code class="computeroutput"><span class="keyword">precondition</span></code>, <code class="computeroutput"><span class="keyword">postcondition</span></code>,
+ <code class="computeroutput"><span class="keyword">oldof</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ <code class="literal">invariant</code>, <code class="literal">require</code>, <code class="literal">ensure</code>,
+ <code class="literal">do</code>, <code class="literal">require else</code>, <code class="literal">ensure
+ then</code>, <code class="literal">old</code>, <code class="literal">result</code>,
+ <code class="literal">variant</code>
+ </p>
+ </td>
+<td>
+ <p>
+ <code class="literal">invariant</code>, <code class="literal">in</code>, <code class="literal">out</code>,
+ <code class="literal">assert</code>, <code class="literal">static</code>
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <span class="emphasis"><em>On contract failure</em></span>
+ </p>
+ </td>
+<td>
+ <p>
+ Default to <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span><span class="special">()</span></code> (but can be customized to exit,
+ abort, throw exceptions, etc).
+ </p>
+ </td>
+<td>
+ <p>
+ Default to <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span><span class="special">()</span></code> (but can be customized to exit,
+ abort, throw exceptions, etc).
+ </p>
+ </td>
+<td>
+ <p>
+ Throw exceptions
+ </p>
+ </td>
+<td>
+ <p>
+ Throw exceptions
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <span class="emphasis"><em>Result value in postconditions</em></span>
+ </p>
+ </td>
+<td>
+ <p>
+ Yes, <code class="computeroutput"><span class="keyword">auto</span> </code><code class="literal"><span class="emphasis"><em>result-variable-name</em></span></code><code class="computeroutput">
+ <span class="special">=</span> <span class="keyword">return</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Yes, <code class="computeroutput"><span class="keyword">postcondition</span> <span class="special">(</span></code><code class="literal"><span class="emphasis"><em>result-variable-name</em></span></code><code class="computeroutput"><span class="special">)</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Yes, <code class="literal">result</code> keyword.
+ </p>
+ </td>
+<td>
+ <p>
+ No.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <span class="emphasis"><em>Old values in postconditions</em></span>
+ </p>
+ </td>
+<td>
+ <p>
+ Yes, <code class="computeroutput"><span class="keyword">auto</span> </code><code class="literal"><span class="emphasis"><em>old-variable-name</em></span></code><code class="computeroutput">
+ <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span>
+ </code><code class="literal"><span class="emphasis"><em>oldof-expression</em></span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Yes, <code class="computeroutput"><span class="keyword">oldof</span> </code><code class="literal"><span class="emphasis"><em>oldof-expression</em></span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Yes, <code class="literal">old <span class="emphasis"><em>old-expression</em></span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ No.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <span class="emphasis"><em>Subcontracting</em></span>
+ </p>
+ </td>
+<td>
+ <p>
+ Yes, also support multiple base contracts for multiple inheritance
+ (can force preconditions to be specified only by base classes using
+ <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS.html" title="Macro CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS">CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS</a></code>).
+ </p>
+ </td>
+<td>
+ <p>
+ Yes, also support multiple base contracts but only base classes
+ can specify preconditions.
+ </p>
+ </td>
+<td>
+ <p>
+ Yes.
+ </p>
+ </td>
+<td>
+ <p>
+ Yes.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <span class="emphasis"><em>Contracts for pure virtual functions</em></span>
+ </p>
+ </td>
+<td>
+ <p>
+ Yes.
+ </p>
+ </td>
+<td>
+ <p>
+ Yes.
+ </p>
+ </td>
+<td>
+ <p>
+ Yes (contracts for abstract functions).
+ </p>
+ </td>
+<td>
+ <p>
+ No (but planned).
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <span class="emphasis"><em>Arbitrary code in contracts</em></span>
+ </p>
+ </td>
+<td>
+ <p>
+ No, assertions only.
+ </p>
+ </td>
+<td>
+ <p>
+ No, assertions only.
+ </p>
+ </td>
+<td>
+ <p>
+ No, assertions only plus preconditions can only access public members.
+ </p>
+ </td>
+<td>
+ <p>
+ Yes.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <span class="emphasis"><em>Constant-correct</em></span>
+ </p>
+ </td>
+<td>
+ <p>
+ Yes.
+ </p>
+ </td>
+<td>
+ <p>
+ Yes.
+ </p>
+ </td>
+<td>
+ <p>
+ Yes.
+ </p>
+ </td>
+<td>
+ <p>
+ No.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <span class="emphasis"><em>Function code ordering</em></span>
+ </p>
+ </td>
+<td>
+ <p>
+ Preconditions, postconditions, body.
+ </p>
+ </td>
+<td>
+ <p>
+ Preconditions, postconditions, body.
+ </p>
+ </td>
+<td>
+ <p>
+ Preconditions, body, postconditions.
+ </p>
+ </td>
+<td>
+ <p>
+ Preconditions, postconditions, body.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <span class="emphasis"><em>Static assertions</em></span>
+ </p>
+ </td>
+<td>
+ <p>
+ Yes, can use <code class="computeroutput"><span class="keyword">static_assert</span></code>
+ (internally implemented using <code class="computeroutput"><span class="identifier">BOOST_MPL_ASSERT_MSG</span></code>,
+ no C++11
+ required).
+ </p>
+ </td>
+<td>
+ <p>
+ Yes, can use C++11
+ <code class="computeroutput"><span class="keyword">static_assert</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ No.
+ </p>
+ </td>
+<td>
+ <p>
+ Yes.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <span class="emphasis"><em>Block invariants</em></span>
+ </p>
+ </td>
+<td>
+ <p>
+ Yes, <code class="computeroutput"><a class="link" href="../CONTRACT_BLOCK_INVARIANT.html" title="Macro CONTRACT_BLOCK_INVARIANT">CONTRACT_BLOCK_INVARIANT</a></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Yes, <code class="computeroutput"><span class="keyword">invariant</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Yes (<code class="computeroutput"><span class="identifier">check</span></code> instruction
+ and loop invariants).
+ </p>
+ </td>
+<td>
+ <p>
+ No (just <code class="computeroutput"><span class="identifier">assert</span></code>).
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <span class="emphasis"><em>Loop variants</em></span>
+ </p>
+ </td>
+<td>
+ <p>
+ Yes, <code class="computeroutput"><a class="link" href="../CONTRACT_LOOP_VARIANT.html" title="Macro CONTRACT_LOOP_VARIANT">CONTRACT_LOOP_VARIANT</a></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ No.
+ </p>
+ </td>
+<td>
+ <p>
+ Yes.
+ </p>
+ </td>
+<td>
+ <p>
+ No.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <span class="emphasis"><em>Disable assertion checking within assertions checking</em></span>
+ </p>
+ </td>
+<td>
+ <p>
+ Yes (use <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION.html" title="Macro CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION">CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION</a></code>
+ for preconditions to disable no assertion). Use <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_THREAD_SAFE.html" title="Macro CONTRACT_CONFIG_THREAD_SAFE">CONTRACT_CONFIG_THREAD_SAFE</a></code>
+ to make the implementation of this feature thread-safe in multi-threaded
+ programs (but it will introduce a global lock).
+ </p>
+ </td>
+<td>
+ <p>
+ Yes for class invariants and postconditions but preconditions disable
+ no assertion.
+ </p>
+ </td>
+<td>
+ <p>
+ Yes.
+ </p>
+ </td>
+<td>
+ <p>
+ No.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <span class="emphasis"><em>Assertion requirements</em></span>
+ </p>
+ </td>
+<td>
+ <p>
+ Yes (compilation and run-time checking of single assertions can
+ be disabled when specific assertion requirements are not met).
+ </p>
+ </td>
+<td>
+ <p>
+ No.
+ </p>
+ </td>
+<td>
+ <p>
+ No (but all types are CopyConstructible
,
+ Assignable
,
+ and EqualityComparable
+ in Eiffel
+ so there is not a real need for this).
+ </p>
+ </td>
+<td>
+ <p>
+ No.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <span class="emphasis"><em>Nested member function calls</em></span>
+ </p>
+ </td>
+<td>
+ <p>
+ Disable nothing. <sup>[<a name="contract__.contract_programming_overview.features.f0" href="#ftn.contract__.contract_programming_overview.features.f0" class="footnote">a</a>]</sup>
+ </p>
+ </td>
+<td>
+ <p>
+ Disable nothing.
+ </p>
+ </td>
+<td>
+ <p>
+ Disable all checks.
+ </p>
+ </td>
+<td>
+ <p>
+ Disable nothing.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <span class="emphasis"><em>Non-static class invariants checking</em></span>
+ </p>
+ </td>
+<td>
+ <p>
+ At constructor exit, at destructor entry, and at public member
+ function entry, exit, and on throw (but only if programmers declare
+ these functions using this library macros). Same for volatile class
+ invariants.
+ </p>
+ </td>
+<td>
+ <p>
+ At constructor exit, at destructor entry, and at public member
+ function entry, exit, and on throw (volatile class invariants not
+ supported).
+ </p>
+ </td>
+<td>
+ <p>
+ At constructor exit, and around public member functions.
+ </p>
+ </td>
+<td>
+ <p>
+ At constructor exit, at destructor entry, an around public member
+ functions.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <span class="emphasis"><em>Static class invariants checking</em></span>
+ </p>
+ </td>
+<td>
+ <p>
+ At entry and exit of any (also static) member function, constructor,
+ and destructor.
+ </p>
+ </td>
+<td>
+ <p>
+ No.
+ </p>
+ </td>
+<td>
+ <p>
+ No (but Eiffel
+ does not have static members).
+ </p>
+ </td>
+<td>
+ <p>
+ No.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <span class="emphasis"><em>Removable from object code</em></span>
+ </p>
+ </td>
+<td>
+ <p>
+ Yes, using any combination of <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_PRECONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_PRECONDITIONS">CONTRACT_CONFIG_NO_PRECONDITIONS</a></code>,
+ <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_POSTCONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_POSTCONDITIONS">CONTRACT_CONFIG_NO_POSTCONDITIONS</a></code>,
+ <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_CLASS_INVARIANTS.html" title="Macro CONTRACT_CONFIG_NO_CLASS_INVARIANTS">CONTRACT_CONFIG_NO_CLASS_INVARIANTS</a></code>,
+ <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_BLOCK_INVARIANTS.html" title="Macro CONTRACT_CONFIG_NO_BLOCK_INVARIANTS">CONTRACT_CONFIG_NO_BLOCK_INVARIANTS</a></code>,
+ and <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_LOOP_VARIANTS.html" title="Macro CONTRACT_CONFIG_NO_LOOP_VARIANTS">CONTRACT_CONFIG_NO_LOOP_VARIANTS</a></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Yes.
+ </p>
+ </td>
+<td>
+ <p>
+ Yes (but predefined combinations only).
+ </p>
+ </td>
+<td>
+ <p>
+ Yes.
+ </p>
+ </td>
+</tr>
+</tbody>
+<tbody class="footnotes"><tr><td colspan="5"><div class="footnote"><p><sup>[<a id="ftn.contract__.contract_programming_overview.features.f0" href="#contract__.contract_programming_overview.features.f0" class="para">a</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> Older versions of
+ this library automatically defined a data member used to disable
+ checking of class invariants within member function calls. However,
+ this feature, which was required by older revisions of <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a>, is no longer required
+ by <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a>, it complicates
+ the implementation, and in multi-thread programs would introduce
+ a lock that synchronizes all member functions calls for a given
+ object so it was removed in the current revision of the library.
+ </p></div></td></tr></tbody>
+</table></div>
+<p>
+ Contract Programming is also provided by the following references.
+ </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>
+ <p>
+ Reference
+ </p>
+ </th>
+<th>
+ <p>
+ Language
+ </p>
+ </th>
+<th>
+ <p>
+ Notes
+ </p>
+ </th>
+</tr></thead>
+<tbody>
+<tr>
+<td>
+ <p>
+ <a class="link" href="bibliography.html#Bright04b_anchor">[Bright04b]</a>
+ </p>
+ </td>
+<td>
+ <p>
+ C++
+ </p>
+ </td>
+<td>
+ <p>
+ The Digital Mars C++ compiler extends C++ adding Contract Programming
+ language support (among many other features).
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="bibliography.html#Lindrud04_anchor">[Lindrud04]</a>
+ </p>
+ </td>
+<td>
+ <p>
+ C++
+ </p>
+ </td>
+<td>
+ <p>
+ This supports class invariants and old values but it does not support
+ subcontracting, contracts are specified within definitions instead
+ of declarations, assertions are not constant-correct (unfortunately,
+ these missing features are all essential to Contract Programming).
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="bibliography.html#Tandin04_anchor">[Tandin04]</a>
+ </p>
+ </td>
+<td>
+ <p>
+ C++
+ </p>
+ </td>
+<td>
+ <p>
+ Interestingly, these contract macros automatically generate Doxygen documentation <sup>[<a name="contract__.contract_programming_overview.features.f1" href="#ftn.contract__.contract_programming_overview.features.f1" class="footnote">a</a>]</sup> but old values, class invariants, and subcontracting
+ are not supported plus contracts are specified within definitions
+ instead of declarations (unfortunately, these missing features
+ are all essential to Contract Programming).
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="bibliography.html#Maley99_anchor">[Maley99]</a>
+ </p>
+ </td>
+<td>
+ <p>
+ C++
+ </p>
+ </td>
+<td>
+ <p>
+ This supports Contract Programming including subcontracting but
+ with some limitations (e.g., programmers need to manually build
+ an inheritance tree using artificial template parameters), it does
+ not use macros so programmers are required to write by hand a significant
+ amount of boiler-plate code. (The authors have found this work
+ very inspiring when they started to develop this library.)
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="bibliography.html#C2_anchor">[C2]</a>
+ </p>
+ </td>
+<td>
+ <p>
+ C++
+ </p>
+ </td>
+<td>
+ <p>
+ This uses an external preprocessing tool (the authors could no
+ longer find this project code-base to evaluate it).
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="bibliography.html#iContract_anchor">[iContract]</a>
+ </p>
+ </td>
+<td>
+ <p>
+ Java
+ </p>
+ </td>
+<td>
+ <p>
+ This uses an external preprocessing tool.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="bibliography.html#Jcontract_anchor">[Jcontract]</a>
+ </p>
+ </td>
+<td>
+ <p>
+ Java
+ </p>
+ </td>
+<td>
+ <p>
+ This uses an external preprocessing tool.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="bibliography.html#CodeContracts_anchor">[CodeContracts]</a>
+ </p>
+ </td>
+<td>
+ <p>
+ .NET
+ </p>
+ </td>
+<td>
+ <p>
+ Microsoft Contract Programming for .NET programming languages.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="bibliography.html#SpecSharp_anchor">[SpecSharp]</a>
+ </p>
+ </td>
+<td>
+ <p>
+ C#
+ </p>
+ </td>
+<td>
+ <p>
+ This is a C# extension with Contract Programming language support.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="bibliography.html#Chrome02_anchor">[Chrome02]</a>
+ </p>
+ </td>
+<td>
+ <p>
+ Object Pascal
+ </p>
+ </td>
+<td>
+ <p>
+ This is the .NET version of Object Pascal and it has language support
+ for Contract Programming.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="bibliography.html#SPARKAda_anchor">[SPARKAda]</a>
+ </p>
+ </td>
+<td>
+ <p>
+ Ada
+ </p>
+ </td>
+<td>
+ <p>
+ This is an Ada-like programming language with Contract Programming
+ support.
+ </p>
+ </td>
+</tr>
+</tbody>
+<tbody class="footnotes"><tr><td colspan="3"><div class="footnote"><p><sup>[<a id="ftn.contract__.contract_programming_overview.features.f1" href="#contract__.contract_programming_overview.features.f1" class="para">a</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> Older versions of
+ this library used to automatically generate Doxygen
+ documentation from the contract macros. This functionality was
+ abandoned for a number of reasons: this library macros became
+ too complex and the Doxygen
+ preprocessor is no longer able to expand them; the Doxygen
+ documentation was just a repeat of the contract code (so programmers
+ can directly look at contracts in the header files), Doxygen
+ might not necessarily be the documentation tool chosen by all
+ programmers.
+ </p></div></td></tr></tbody>
+</table></div>
+<p>
+ Typically, preprocessing tools external to the language work by transforming
+ specially formatted code comments into contract code that is then checked
+ at run-time. One of this library primary goals was to support Contract Programming
+ entirely within C++ and without using any tool external to the standard language
+ (C++ macros were used instead of external preprocessing tools).
+ </p>
+<p>
+ To the authors' knowledge, this the only library that fully support Contract
+ Programming for C++ (see the <a class="link" href="bibliography.html" title="Bibliography">Bibliography</a>
+ section for the complete list of Contract Programming references studied
+ by the authors).
+ </p>
+</div>
+<div class="footnotes">
+<br><hr width="100" align="left">
+<div class="footnote"><p><sup>[<a id="ftn.contract__.contract_programming_overview.costs.f0" href="#contract__.contract_programming_overview.costs.f0" class="para">6</a>] </sup>
+ This library macros always need to expand to generate the class and function
+ declarations even when contract compilation is disabled. That is why
+ there is a compile-time overhead, even if significantly smaller, also
+ when contracts are all disabled (in this case however there is zero run-time
+ overhead). The compilation time overhead when all contracts are turned
+ off could be further reduced by optimizing the library implementation
+ to not include internal headers that are not required when contracts
+ are off (this type of optimizations will be a major focus on future releases).
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.contract_programming_overview.costs.f1" href="#contract__.contract_programming_overview.costs.f1" class="para">7</a>] </sup>
+ There is essentially no gain in pre-compiling this library headers because
+ most of the compilation time is taken by expanding and compiling this
+ library macros as they appear in the user code (and not by the library
+ implementation code itself). Furthermore, pre-compiled headers should
+ be used with the usual care because they can complicate the build system
+ and they introduce extra dependencies that might limit the amount of
+ targets that can be built simultaneously in a parallel build. However,
+ if properly used, pre-compiled headers can significantly reduce re-compilation
+ time when using this library.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.contract_programming_overview.free_function_calls.f0" href="#contract__.contract_programming_overview.free_function_calls.f0" class="para">8</a>] </sup>
+ In C++, a free function is any function that is not a member function.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.contract_programming_overview.member_function_calls.f0" href="#contract__.contract_programming_overview.member_function_calls.f0" class="para">9</a>] </sup>
+ Static member functions cannot be virtual so they cannot be overridden
+ and they do not subcontract.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.contract_programming_overview.destructor_calls.f0" href="#contract__.contract_programming_overview.destructor_calls.f0" class="para">10</a>] </sup>
+ For generality, this library does not require the destructor body to
+ not throw exceptions. However, in order to comply with the STL exception
+ safety requirements, destructors should never throw.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.contract_programming_overview.destructor_calls.f1" href="#contract__.contract_programming_overview.destructor_calls.f1" class="para">11</a>] </sup>
+ In theory, destructors could have static postconditions (i.e., postconditions
+ that are not allowed to access the object which no longer exists after
+ destruction). Still destructors shall never have preconditions because
+ a destructor can be called at any point after the object is constructed
+ as long the class invariants hold. None of the Contract Programming
+ references that the authors have studied propose static postconditions
+ for destructor (neither <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a>
+ nor <a class="link" href="bibliography.html#Meyer97_anchor">[Meyer97]</a>, but Eiffel
+ has no static data member). Future revisions of this library might
+ implement destructor static postconditions (e.g., a destructor postconditions
+ of a class that counts object instances could assert that the instance
+ counter stored in a static data member should be decreased of one because
+ the object has been destructed, see also <a href="https://sourceforge.net/apps/trac/contractpp/ticket/41" target="_top">Ticket
+ 41</a>).
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.contract_programming_overview.constant_correctness.f0" href="#contract__.contract_programming_overview.constant_correctness.f0" class="para">12</a>] </sup>
+ As usual in C++, constant-correctness can be enforced at compile-time only
+ as long as programmers do not use <code class="computeroutput"><span class="keyword">const_cast</span></code>
+ and <code class="computeroutput"><span class="keyword">mutable</span></code>.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.contract_programming_overview.specification_vs__implementation.f0" href="#contract__.contract_programming_overview.specification_vs__implementation.f0" class="para">13</a>] </sup>
+ This is a major conceptual difference with respect to <a href="http://en.wikipedia.org/wiki/Defensive_programming" target="_top">Defensive
+ Programming</a> and using <code class="computeroutput"><span class="identifier">assert</span></code>
+ because they program assertions within the function body instead that with
+ the function declaration.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.contract_programming_overview.specification_vs__implementation.f1" href="#contract__.contract_programming_overview.specification_vs__implementation.f1" class="para">14</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> In theory, if C++ <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#45" target="_top">defect
+ 45</a> were not fixed, this library could have generated a compile-time
+ error for preconditions that use non-public members.
+ </p></div>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="getting_started.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="tutorial.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/contract__/examples.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/contract__/examples.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,5302 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Examples</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="prev" href="named_parameters.html" title="Named Parameters">
+<link rel="next" href="grammar.html" title="Grammar">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="named_parameters.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="grammar.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="contract__.examples"></a><a class="link" href="examples.html" title="Examples">Examples</a>
+</h2></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="examples.html#contract__.examples.__n1962___vector__comparison_with_c___proposed_syntax">[N1962]
+ Vector: Comparison with C++ proposed syntax</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__n1962___circle__subcontracting">[N1962]
+ Circle: Subcontracting</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__n1962___factorial__recursion_and_assertion_computational_complexity">[N1962]
+ Factorial: Recursion and assertion computational complexity</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__n1962___equal__operators">[N1962]
+ Equal: Operators</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__n1962___sum__separated_body_definitions">[N1962]
+ Sum: Separated body definitions</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__n1962___square_root__default_parameters_and_comparison_with_d_syntax">[N1962]
+ Square Root: Default parameters and comparison with D syntax</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__n1962___block__block_invariants">[N1962]
+ Block: Block invariants</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__n2081___add__generic_addition_algorithm">[N2081]
+ Add: Generic addition algorithm</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__n2081___advance__concept_based_iterator_overloading__emulated_using_tags_">[N2081]
+ Advance: Concept-based iterator overloading (emulated using tags)</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__n2081___find__generic_find_algorithm">[N2081]
+ Find: Generic find algorithm</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__n2081___apply__overloaded_invocation_of_functors">[N2081]
+ Apply: Overloaded invocation of functors</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__n2081___for_each__generic_for_each_algorithm">[N2081]
+ For Each: Generic for-each algorithm</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__n2081___transform__generic_binary_transformation_algorithm">[N2081]
+ Transform: Generic binary transformation algorithm</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__n2081___count__generic_counting_algorithm">[N2081]
+ Count: Generic counting algorithm</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__n2081___convert__conversion_between_two_types">[N2081]
+ Convert: Conversion between two types</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__n2081___equal__generic_equality_comparison">[N2081]
+ Equal: Generic equality comparison</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__n2081___less_equal__generic_less_than_or_equal_to_comparison">[N2081]
+ Less Equal: Generic less-than or equal-to comparison</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__n2081___de_ref__generic_iterator_dereferencing">[N2081]
+ De-Ref: Generic iterator dereferencing</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__n2081___min__generic_minimum_algorithm">[N2081]
+ Min: Generic minimum algorithm</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__meyer97___stack4__comparison_with_eiffel_syntax">[Meyer97]
+ Stack4: Comparison with Eiffel syntax</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__meyer97___stack3__error_codes_instead_of_preconditions">[Meyer97]
+ Stack3: Error codes instead of preconditions</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__meyer97___gcd__loop_variants_and_invariants_plus_comparison_with_eiffel_syntax">[Meyer97]
+ GCD: Loop variants and invariants plus comparison with Eiffel syntax</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__meyer97___max_array__nested_loop_variants_and_invariants">[Meyer97]
+ Max-Array: Nested loop variants and invariants</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__mitchell02___name_list__relaxed_subcontracts">[Mitchell02]
+ Name List: Relaxed subcontracts</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__mitchell02___dictionary__simple_key_value_map">[Mitchell02]
+ Dictionary: Simple key-value map</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__mitchell02___courier__subcontracting_and_static_class_invariants">[Mitchell02]
+ Courier: Subcontracting and static class invariants</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__mitchell02___stack__simple_stack_dispenser">[Mitchell02]
+ Stack: Simple stack dispenser</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__mitchell02___simple_queue__simple_queue_dispenser">[Mitchell02]
+ Simple Queue: Simple queue dispenser</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__mitchell02___customer_manager__contracts_instead_of_defensive_programming">[Mitchell02]
+ Customer Manager: Contracts instead of Defensive Programming</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__mitchell02___observer__contracts_for_pure_virtual_functions">[Mitchell02]
+ Observer: Contracts for pure virtual functions</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__mitchell02___counter__subcontracting_and_virtual_specifiers__final__override__new__and_pure_virtual_">[Mitchell02]
+ Counter: Subcontracting and virtual specifiers (final, override, new, and pure
+ virtual)</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__stroustrup97___string__throw_when_contract_is_broken">[Stroustrup97]
+ String: Throw when contract is broken</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__cline90___vector__comparison_with_a___proposed_syntax">[Cline90]
+ Vector: Comparison with A++ proposed syntax</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__cline90___stack__function_try_blocks_and_exception_specifications">[Cline90]
+ Stack: Function-Try blocks and exception specifications</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__cline90___vector_stack__subcontracting_from_abstract_data_type__adt_">[Cline90]
+ Vector-Stack: Subcontracting from Abstract Data Type (ADT)</a></span></dt>
+<dt><span class="section"><a href="examples.html#contract__.examples.__cline90___calendar__a_very_simple_calendar">[Cline90]
+ Calendar: A very simple calendar</a></span></dt>
+</dl></div>
+<p>
+ This section lists non-trivial examples programmed using this library. The
+ listed examples are taken from the foloowing sources (which are referenced
+ in the title of each example).
+ </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>
+ <p>
+ Sources
+ </p>
+ </th>
+<th>
+ <p>
+ Notes
+ </p>
+ </th>
+</tr></thead>
+<tbody>
+<tr>
+<td>
+ <p>
+ <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a>
+ </p>
+ </td>
+<td>
+ <p>
+ Examples from the proposal to add Contract Programming to C++11 submitted
+ to the standard committee (unfortunately, this proposal was never
+ accepted into the standard).
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="bibliography.html#N2081_anchor">[N2081]</a>
+ </p>
+ </td>
+<td>
+ <p>
+ Examples from the proposal to add concepts to C++11
+ submitted to the standard committee (unfortunately, this proposal
+ was never accepted into the standard). These examples have been extended
+ to specify both concepts and contracts.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="bibliography.html#Meyer97_anchor">[Meyer97]</a> <a class="link" href="bibliography.html#Mitchell02_anchor">[Mitchell02]</a>
+ </p>
+ </td>
+<td>
+ <p>
+ Examples using the Eiffel
+ programming language and reprogrammed using this library for C++.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="bibliography.html#Cline90_anchor">[Cline90]</a>
+ </p>
+ </td>
+<td>
+ <p>
+ Examples from a very early proposal called Annotated C++ (A++) to
+ add Contract Programming to C++ (A++ was never implemented or proposed
+ for addition to the standard).
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="bibliography.html#Stroustrup97_anchor">[Stroustrup97]</a>
+ </p>
+ </td>
+<td>
+ <p>
+ One example that shows the importance of class invariants and how
+ to configure this library to throw exceptions instead of terminating
+ the program when contracts are broken.
+ </p>
+ </td>
+</tr>
+</tbody>
+</table></div>
+<p>
+ The followings are among the most interesting examples:
+ </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>
+ <p>
+ Key Example
+ </p>
+ </th>
+<th>
+ <p>
+ Topic
+ </p>
+ </th>
+</tr></thead>
+<tbody>
+<tr>
+<td>
+ <p>
+ <a class="link" href="examples.html#contract__.examples.__n1962___vector__comparison_with_c___proposed_syntax" title="[N1962] Vector: Comparison with C++ proposed syntax">[N1962]
+ Vector</a>
+ </p>
+ </td>
+<td>
+ <p>
+ A comparison between this library syntax and the syntax for contract
+ and concept checking proposed by <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a>
+ and <a class="link" href="bibliography.html#N2081_anchor">[N2081]</a> respectively.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="examples.html#contract__.examples.__n2081___add__generic_addition_algorithm" title="[N2081] Add: Generic addition algorithm">[N2081]
+ Add</a>
+ </p>
+ </td>
+<td>
+ <p>
+ Contracts and user-defined concepts.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="examples.html#contract__.examples.__mitchell02___counter__subcontracting_and_virtual_specifiers__final__override__new__and_pure_virtual_" title="[Mitchell02] Counter: Subcontracting and virtual specifiers (final, override, new, and pure virtual)">[Mitchell02]
+ Counter</a>
+ </p>
+ </td>
+<td>
+ <p>
+ Subcontracting and C++11-like
+ virtual specifiers <code class="computeroutput"><span class="keyword">final</span></code>,
+ <code class="computeroutput"><span class="keyword">override</span></code>, <code class="computeroutput"><span class="keyword">new</span></code>, and pure virtual.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="examples.html#contract__.examples.__meyer97___stack4__comparison_with_eiffel_syntax" title="[Meyer97] Stack4: Comparison with Eiffel syntax">[Meyer97]
+ Stack4</a>
+ </p>
+ </td>
+<td>
+ <p>
+ A comparison between this library and Eiffel
+ syntax for preconditions, postconditions, and class invariants.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="examples.html#contract__.examples.__meyer97___gcd__loop_variants_and_invariants_plus_comparison_with_eiffel_syntax" title="[Meyer97] GCD: Loop variants and invariants plus comparison with Eiffel syntax">[Meyer97]
+ GCD</a>
+ </p>
+ </td>
+<td>
+ <p>
+ A comparison between this library and Eiffel
+ syntax for loop variants and block invariants.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="examples.html#contract__.examples.__cline90___vector__comparison_with_a___proposed_syntax" title="[Cline90] Vector: Comparison with A++ proposed syntax">[Cline90]
+ Vector</a>
+ </p>
+ </td>
+<td>
+ <p>
+ A comparison between this library and A++ syntax.
+ </p>
+ </td>
+</tr>
+</tbody>
+</table></div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__n1962___vector__comparison_with_c___proposed_syntax"></a><a class="link" href="examples.html#contract__.examples.__n1962___vector__comparison_with_c___proposed_syntax" title="[N1962] Vector: Comparison with C++ proposed syntax">[N1962]
+ Vector: Comparison with C++ proposed syntax</a>
+</h3></div></div></div>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>
+ <p>
+ This Library (C++03)
+ </p>
+ </th>
+<th>
+ <p>
+ [N1962] and [N2081] Proposals (not part of C++)
+ </p>
+ </th>
+</tr></thead>
+<tbody>
+<tr>
+<td>
+ <p>
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="comment">// File: vector.hpp</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">utility</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">/</span><span class="identifier">has_equal_to</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">algorithm</span><span class="special">/</span><span class="identifier">cxx11</span><span class="special">/</span><span class="identifier">all_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">concept_check</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iterator</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">vector</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// Vector wrapper with contracts.</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">,</span> <span class="keyword">default</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">vector</span><span class="special">)</span> <span class="comment">// No base classes so no subcontracting for this example.</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span> <span class="comment">// At very beginning of the class declaration.</span>
+ <span class="identifier">empty</span><span class="special">()</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">),</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">())</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">size</span><span class="special">()),</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">rbegin</span><span class="special">(),</span> <span class="identifier">rend</span><span class="special">())</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">size</span><span class="special">()),</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special"><=</span> <span class="identifier">capacity</span><span class="special">(),</span>
+ <span class="identifier">capacity</span><span class="special">()</span> <span class="special"><=</span> <span class="identifier">max_size</span><span class="special">()</span>
+ <span class="special">)</span> <span class="comment">// No static or volatile class invariants for this example.</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">>::</span><span class="identifier">allocator_type</span>
+ <span class="identifier">allocator_type</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">>::</span><span class="identifier">pointer</span> <span class="identifier">pointer</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">>::</span><span class="identifier">const_pointer</span>
+ <span class="identifier">const_pointer</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">>::</span><span class="identifier">reference</span> <span class="identifier">reference</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">>::</span><span class="identifier">const_reference</span>
+ <span class="identifier">const_reference</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">>::</span><span class="identifier">value_type</span> <span class="identifier">value_type</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">>::</span><span class="identifier">iterator</span> <span class="identifier">iterator</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">>::</span><span class="identifier">const_iterator</span>
+ <span class="identifier">const_iterator</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">>::</span><span class="identifier">size_type</span> <span class="identifier">size_type</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">>::</span><span class="identifier">difference_type</span>
+ <span class="identifier">difference_type</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">>::</span><span class="identifier">reverse_iterator</span>
+ <span class="identifier">reverse_iterator</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">>::</span><span class="identifier">const_reverse_iterator</span>
+ <span class="identifier">const_reverse_iterator</span><span class="special">;</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">vector</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="comment">// Always specify access level `public`, etc.</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="keyword">not</span> <span class="identifier">empty</span><span class="special">()</span> <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">vector_</span><span class="special">()</span> <span class="special">)</span> <span class="comment">// Member initializers.</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">explicit</span> <span class="special">(</span><span class="identifier">vector</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">Allocator</span><span class="special">&)</span> <span class="identifier">allocator</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="identifier">empty</span><span class="special">(),</span>
+ <span class="identifier">allocator</span> <span class="special">==</span> <span class="identifier">get_allocator</span><span class="special">()</span>
+ <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">vector_</span><span class="special">(</span><span class="identifier">allocator</span><span class="special">)</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">explicit</span> <span class="special">(</span><span class="identifier">vector</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">size_type</span><span class="special">)</span> <span class="identifier">count</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span><span class="special">,</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">T</span><span class="special">()),</span>
+ <span class="keyword">requires</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span> <span class="comment">// Requirements.</span>
+ <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">vector_</span><span class="special">(</span><span class="identifier">count</span><span class="special">)</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">vector</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">size_type</span><span class="special">)</span> <span class="identifier">count</span><span class="special">,</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&)</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span><span class="special">,</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">value</span><span class="special">),</span>
+ <span class="keyword">requires</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span>
+ <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">vector_</span><span class="special">(</span><span class="identifier">count</span><span class="special">,</span> <span class="identifier">value</span><span class="special">)</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">vector</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">size_type</span><span class="special">)</span> <span class="identifier">count</span><span class="special">,</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&)</span> <span class="identifier">value</span><span class="special">,</span>
+ <span class="special">(</span><span class="keyword">const</span> <span class="identifier">Allocator</span><span class="special">&)</span> <span class="identifier">allocator</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span><span class="special">,</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">value</span><span class="special">),</span>
+ <span class="keyword">requires</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span><span class="special">,</span>
+ <span class="identifier">allocator</span> <span class="special">==</span> <span class="identifier">get_allocator</span><span class="special">()</span>
+ <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">vector_</span><span class="special">(</span><span class="identifier">count</span><span class="special">,</span> <span class="identifier">value</span><span class="special">,</span> <span class="identifier">allocator</span><span class="special">)</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span> <span class="comment">// Contract with concepts.</span>
+ <span class="keyword">public</span> <span class="keyword">template</span><span class="special">(</span> <span class="keyword">class</span> <span class="identifier">Iterator</span> <span class="special">)</span>
+ <span class="keyword">requires</span><span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">></span> <span class="special">)</span>
+ <span class="special">(</span><span class="identifier">vector</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">Iterator</span><span class="special">)</span> <span class="identifier">first</span><span class="special">,</span> <span class="special">(</span><span class="identifier">Iterator</span><span class="special">)</span> <span class="identifier">last</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">size</span><span class="special">())</span> <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">vector_</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">template</span><span class="special">(</span> <span class="keyword">class</span> <span class="identifier">Iterator</span> <span class="special">)</span>
+ <span class="keyword">requires</span><span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">></span> <span class="special">)</span>
+ <span class="special">(</span><span class="identifier">vector</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">Iterator</span><span class="special">)</span> <span class="identifier">first</span><span class="special">,</span> <span class="special">(</span><span class="identifier">Iterator</span><span class="special">)</span> <span class="identifier">last</span><span class="special">,</span>
+ <span class="special">(</span><span class="keyword">const</span> <span class="identifier">Allocator</span><span class="special">&)</span> <span class="identifier">allocator</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">size</span><span class="special">()),</span>
+ <span class="identifier">allocator</span> <span class="special">==</span> <span class="identifier">get_allocator</span><span class="special">()</span>
+ <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">vector_</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">allocator</span><span class="special">)</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">vector</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">vector</span><span class="special">&)</span> <span class="identifier">right</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="identifier">right</span> <span class="special">==</span> <span class="special">*</span><span class="keyword">this</span><span class="special">,</span> <span class="keyword">requires</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span>
+ <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">vector_</span><span class="special">(</span><span class="identifier">right</span><span class="special">.</span><span class="identifier">vector_</span><span class="special">)</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Operator symbol and (arbitrary) name `copy`.</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">vector</span><span class="special">&)</span> <span class="keyword">operator</span><span class="special">(=)(</span><span class="identifier">copy</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">vector</span><span class="special">&)</span> <span class="identifier">right</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span> <span class="comment">// Return value.</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="special">*</span><span class="keyword">this</span><span class="special">,</span> <span class="keyword">requires</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">right</span><span class="special">,</span> <span class="keyword">requires</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span> <span class="special">=</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">vector_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR_TPL</span><span class="special">(</span> <span class="comment">// Destruct contract (check class invariant).</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">vector</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="comment">// Wrapping parenthesis optional for keyword types `void`, `bool`, etc.</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">reserve</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">size_type</span><span class="special">)</span> <span class="identifier">count</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">count</span> <span class="special"><</span> <span class="identifier">max_size</span><span class="special">()</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">capacity</span><span class="special">()</span> <span class="special">>=</span> <span class="identifier">count</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">reserve</span><span class="special">(</span><span class="identifier">count</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">size_type</span><span class="special">)</span> <span class="special">(</span><span class="identifier">capacity</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span> <span class="comment">// Constant member.</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span> <span class="identifier">result</span> <span class="special">>=</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">iterator</span><span class="special">)</span> <span class="special">(</span><span class="identifier">begin</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">empty</span><span class="special">())</span> <span class="special">(</span> <span class="comment">// Select assertions `if(...) ( ...)`.</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">end</span><span class="special">()</span>
+ <span class="special">)</span> <span class="comment">// Omitted optional `else( ... )`.</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Contract overloaded function (see above).</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">const_iterator</span><span class="special">)</span> <span class="special">(</span><span class="identifier">begin</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">empty</span><span class="special">())</span> <span class="special">(</span> <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">end</span><span class="special">()</span> <span class="special">)</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Contract with no pre/post checks class invariants.</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">iterator</span><span class="special">)</span> <span class="special">(</span><span class="identifier">end</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">const_iterator</span><span class="special">)</span> <span class="special">(</span><span class="identifier">end</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">reverse_iterator</span><span class="special">)</span> <span class="special">(</span><span class="identifier">rbegin</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">empty</span><span class="special">())</span> <span class="special">(</span> <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">rend</span><span class="special">()</span> <span class="special">)</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">rbegin</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">const_reverse_iterator</span><span class="special">)</span> <span class="special">(</span><span class="identifier">rbegin</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">empty</span><span class="special">())</span> <span class="special">(</span> <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">rend</span><span class="special">()</span> <span class="special">)</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">rbegin</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">reverse_iterator</span><span class="special">)</span> <span class="special">(</span><span class="identifier">rend</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">rend</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">const_reverse_iterator</span><span class="special">)</span> <span class="special">(</span><span class="identifier">rend</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">rend</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">resize</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">size_type</span><span class="special">)</span> <span class="identifier">count</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">size</span><span class="special">(),</span> <span class="comment">// Old value (at entry).</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span><span class="special">,</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">count</span> <span class="special">></span> <span class="identifier">old_size</span><span class="special">)</span> <span class="special">(</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">begin</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">old_size</span><span class="special">,</span> <span class="identifier">end</span><span class="special">(),</span>
+ <span class="identifier">T</span><span class="special">()),</span> <span class="keyword">requires</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span>
+ <span class="special">)</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span><span class="identifier">count</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">resize</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">size_type</span><span class="special">)</span> <span class="identifier">count</span><span class="special">,</span> <span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="special">(</span><span class="identifier">size_type</span><span class="special">)</span> <span class="identifier">old_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">size</span><span class="special">(),</span> <span class="comment">// With old type.</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span><span class="special">,</span>
+ <span class="identifier">count</span> <span class="special">></span> <span class="identifier">old_size</span> <span class="special">?</span> <span class="comment">// Ternary operator.</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">begin</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">old_size</span><span class="special">,</span> <span class="identifier">end</span><span class="special">(),</span>
+ <span class="identifier">value</span><span class="special">)</span>
+ <span class="special">:</span>
+ <span class="keyword">true</span>
+ <span class="special">,</span> <span class="keyword">requires</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span><span class="identifier">count</span><span class="special">,</span> <span class="identifier">value</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">size_type</span><span class="special">)</span> <span class="special">(</span><span class="identifier">size</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span> <span class="identifier">result</span> <span class="special"><=</span> <span class="identifier">capacity</span><span class="special">()</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">size_type</span><span class="special">)</span> <span class="special">(</span><span class="identifier">max_size</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span> <span class="identifier">result</span> <span class="special">>=</span> <span class="identifier">capacity</span><span class="special">()</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">max_size</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">empty</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">)</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">empty</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">Allocator</span><span class="special">)</span> <span class="special">(</span><span class="identifier">get_allocator</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">get_allocator</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">reference</span><span class="special">)</span> <span class="special">(</span><span class="identifier">at</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">size_type</span><span class="special">)</span> <span class="identifier">index</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">index</span> <span class="special"><</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">at</span><span class="special">(</span><span class="identifier">index</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">const_reference</span><span class="special">)</span> <span class="special">(</span><span class="identifier">at</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">size_type</span><span class="special">)</span> <span class="identifier">index</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">index</span> <span class="special"><</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">at</span><span class="special">(</span><span class="identifier">index</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">reference</span><span class="special">)</span> <span class="keyword">operator</span><span class="special">([])(</span><span class="identifier">at</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">size_type</span><span class="special">)</span> <span class="identifier">index</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">index</span> <span class="special"><</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">[</span><span class="identifier">index</span><span class="special">];</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">const_reference</span><span class="special">)</span> <span class="keyword">operator</span><span class="special">([])(</span><span class="identifier">at</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">size_type</span><span class="special">)</span> <span class="identifier">index</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">index</span> <span class="special"><</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">[</span><span class="identifier">index</span><span class="special">];</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">reference</span><span class="special">)</span> <span class="special">(</span><span class="identifier">front</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="keyword">not</span> <span class="identifier">empty</span><span class="special">()</span> <span class="special">)</span> <span class="comment">// `not` instead of symbol `!`.</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">front</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">const_reference</span><span class="special">)</span> <span class="special">(</span><span class="identifier">front</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="keyword">bool</span><span class="special">(!</span><span class="identifier">empty</span><span class="special">())</span> <span class="special">)</span> <span class="comment">// Or, `bool` to wrap symbol `!`.</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">front</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">reference</span><span class="special">)</span> <span class="special">(</span><span class="identifier">back</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="keyword">not</span> <span class="identifier">empty</span><span class="special">()</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">back</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">const_reference</span><span class="special">)</span> <span class="special">(</span><span class="identifier">back</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="keyword">not</span> <span class="identifier">empty</span><span class="special">()</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">back</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">push_back</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&)</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">size</span><span class="special">()</span> <span class="special"><</span> <span class="identifier">max_size</span><span class="special">()</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">size</span><span class="special">(),</span>
+ <span class="keyword">auto</span> <span class="identifier">old_capacity</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">capacity</span><span class="special">(),</span>
+ <span class="identifier">back</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">value</span><span class="special">,</span> <span class="keyword">requires</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span><span class="special">,</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_size</span> <span class="special">+</span> <span class="number">1</span><span class="special">,</span>
+ <span class="identifier">capacity</span><span class="special">()</span> <span class="special">>=</span> <span class="identifier">old_capacity</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">value</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">pop_back</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="keyword">not</span> <span class="identifier">empty</span><span class="special">()</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">size</span><span class="special">(),</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_size</span> <span class="special">-</span> <span class="number">1</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">pop_back</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">template</span><span class="special">(</span> <span class="keyword">class</span> <span class="identifier">Iterator</span> <span class="special">)</span>
+ <span class="keyword">requires</span><span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">></span> <span class="special">)</span>
+ <span class="keyword">void</span> <span class="special">(</span><span class="identifier">assign</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">Iterator</span><span class="special">)</span> <span class="identifier">first</span><span class="special">,</span> <span class="special">(</span><span class="identifier">Iterator</span><span class="special">)</span> <span class="identifier">last</span> <span class="special">)</span>
+ <span class="comment">// precondition: [begin(), end()) does not contain [first, last)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">size</span><span class="special">())</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">assign</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">assign</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">size_type</span><span class="special">)</span> <span class="identifier">count</span><span class="special">,</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&)</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">count</span> <span class="special"><=</span> <span class="identifier">max_size</span><span class="special">()</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">value</span><span class="special">),</span>
+ <span class="keyword">requires</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">assign</span><span class="special">(</span><span class="identifier">count</span><span class="special">,</span> <span class="identifier">value</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">iterator</span><span class="special">)</span> <span class="special">(</span><span class="identifier">insert</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">iterator</span><span class="special">)</span> <span class="identifier">where</span><span class="special">,</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&)</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">size</span><span class="special">()</span> <span class="special"><</span> <span class="identifier">max_size</span><span class="special">()</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="keyword">auto</span> <span class="identifier">old_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">size</span><span class="special">(),</span>
+ <span class="identifier">value</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">result</span><span class="special">,</span> <span class="keyword">requires</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span><span class="special">,</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_size</span> <span class="special">+</span> <span class="number">1</span>
+ <span class="comment">// if(capacity() > oldof capacity())</span>
+ <span class="comment">// [begin(), end()) is invalid</span>
+ <span class="comment">// else</span>
+ <span class="comment">// [where, end()) is invalid</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">where</span><span class="special">,</span> <span class="identifier">value</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">insert</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">iterator</span><span class="special">)</span> <span class="identifier">where</span><span class="special">,</span> <span class="special">(</span><span class="identifier">size_type</span><span class="special">)</span> <span class="identifier">count</span><span class="special">,</span>
+ <span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&)</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">count</span> <span class="special"><</span> <span class="identifier">max_size</span><span class="special">()</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">using</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">prior</span><span class="special">,</span>
+ <span class="keyword">auto</span> <span class="identifier">old_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">size</span><span class="special">(),</span>
+ <span class="keyword">auto</span> <span class="identifier">old_capacity</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">capacity</span><span class="special">(),</span>
+ <span class="keyword">auto</span> <span class="identifier">old_where</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">where</span><span class="special">,</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_size</span> <span class="special">+</span> <span class="identifier">count</span><span class="special">,</span>
+ <span class="identifier">capacity</span><span class="special">()</span> <span class="special">>=</span> <span class="identifier">old_capacity</span><span class="special">,</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_capacity</span><span class="special">)</span> <span class="special">(</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">prior</span><span class="special">(</span><span class="identifier">old_where</span><span class="special">),</span>
+ <span class="identifier">prior</span><span class="special">(</span><span class="identifier">old_where</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">count</span><span class="special">,</span> <span class="identifier">value</span><span class="special">),</span>
+ <span class="keyword">requires</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span>
+ <span class="comment">// [where, end()) is invalid</span>
+ <span class="special">)</span> <span class="comment">// else [begin(), end()) is invalid</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">where</span><span class="special">,</span> <span class="identifier">count</span><span class="special">,</span> <span class="identifier">value</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">template</span><span class="special">(</span> <span class="keyword">class</span> <span class="identifier">Iterator</span> <span class="special">)</span>
+ <span class="keyword">requires</span><span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">></span> <span class="special">)</span>
+ <span class="keyword">void</span> <span class="special">(</span><span class="identifier">insert</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">iterator</span><span class="special">)</span> <span class="identifier">where</span><span class="special">,</span> <span class="special">(</span><span class="identifier">Iterator</span><span class="special">)</span> <span class="identifier">first</span><span class="special">,</span> <span class="special">(</span><span class="identifier">Iterator</span><span class="special">)</span> <span class="identifier">last</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span>
+ <span class="comment">// [first, last) is not contained in [begin(), end())</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span> <span class="special"><</span> <span class="identifier">max_size</span><span class="special">()</span>
+ <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">size</span><span class="special">(),</span>
+ <span class="keyword">auto</span> <span class="identifier">old_capacity</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">capacity</span><span class="special">(),</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_size</span> <span class="special">+</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">),</span>
+ <span class="identifier">capacity</span><span class="special">()</span> <span class="special">>=</span> <span class="identifier">old_capacity</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">where</span><span class="special">,</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">iterator</span><span class="special">)</span> <span class="special">(</span><span class="identifier">erase</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">iterator</span><span class="special">)</span> <span class="identifier">where</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span>
+ <span class="keyword">not</span> <span class="identifier">empty</span><span class="special">(),</span>
+ <span class="identifier">where</span> <span class="special">!=</span> <span class="identifier">end</span><span class="special">()</span>
+ <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="keyword">auto</span> <span class="identifier">old_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">size</span><span class="special">(),</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_size</span> <span class="special">-</span> <span class="number">1</span><span class="special">,</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">empty</span><span class="special">())</span> <span class="special">(</span> <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">end</span><span class="special">()</span> <span class="special">)</span>
+ <span class="comment">// [where, end()) is invalid</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">where</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">iterator</span><span class="special">)</span> <span class="special">(</span><span class="identifier">erase</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">iterator</span><span class="special">)</span> <span class="identifier">first</span><span class="special">,</span> <span class="special">(</span><span class="identifier">iterator</span><span class="special">)</span> <span class="identifier">last</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">>=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="keyword">auto</span> <span class="identifier">old_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">size</span><span class="special">(),</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_size</span> <span class="special">-</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">),</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">empty</span><span class="special">())</span> <span class="special">(</span> <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">end</span><span class="special">()</span> <span class="special">)</span>
+ <span class="comment">// [first, last) is invalid</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">clear</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">empty</span><span class="special">()</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">clear</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">swap</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">vector</span><span class="special">&)</span> <span class="identifier">right</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_self</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="special">*</span><span class="keyword">this</span><span class="special">,</span>
+ <span class="keyword">auto</span> <span class="identifier">old_right</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">right</span><span class="special">,</span>
+ <span class="identifier">right</span> <span class="special">==</span> <span class="identifier">old_self</span><span class="special">,</span> <span class="keyword">requires</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span><span class="special">,</span>
+ <span class="identifier">old_right</span> <span class="special">==</span> <span class="special">*</span><span class="keyword">this</span><span class="special">,</span> <span class="keyword">requires</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">right</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="keyword">friend</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==</span> <span class="special">(</span> <span class="identifier">vector</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">left</span><span class="special">,</span> <span class="identifier">vector</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">right</span> <span class="special">)</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">left</span><span class="special">.</span><span class="identifier">vector_</span> <span class="special">==</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">vector_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">></span> <span class="identifier">vector_</span><span class="special">;</span>
+<span class="special">};</span>
+</pre>
+<p>
+ </p>
+ </td>
+<td>
+ <p>
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="comment">// File: vector_npaper.cpp</span>
+<span class="comment">// Extra spaces, newlines, etc used to align text with this library code.</span>
+
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">utility</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">algorithm</span><span class="special">/</span><span class="identifier">cxx11</span><span class="special">/</span><span class="identifier">all_of</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">concepts</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iterator</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">vector</span><span class="special">></span>
+
+
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Allocator</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">></span>
+<span class="keyword">class</span> <span class="identifier">vector</span>
+<span class="special">{</span>
+ <span class="keyword">invariant</span> <span class="special">{</span>
+ <span class="identifier">empty</span><span class="special">()</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">())</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">size</span><span class="special">());</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">rbegin</span><span class="special">(),</span> <span class="identifier">rend</span><span class="special">())</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">size</span><span class="special">());</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special"><=</span> <span class="identifier">capacity</span><span class="special">();</span>
+ <span class="identifier">capacity</span><span class="special">()</span> <span class="special"><=</span> <span class="identifier">max_size</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">>::</span><span class="identifier">allocator_type</span>
+ <span class="identifier">allocator_type</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">>::</span><span class="identifier">pointer</span> <span class="identifier">pointer</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">>::</span><span class="identifier">const_pointer</span>
+ <span class="identifier">const_pointer</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">>::</span><span class="identifier">reference</span> <span class="identifier">reference</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">>::</span><span class="identifier">const_reference</span>
+ <span class="identifier">const_reference</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">>::</span><span class="identifier">value_type</span> <span class="identifier">value_type</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">>::</span><span class="identifier">iterator</span> <span class="identifier">iterator</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">>::</span><span class="identifier">const_iterator</span>
+ <span class="identifier">const_iterator</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">>::</span><span class="identifier">size_type</span> <span class="identifier">size_type</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">>::</span><span class="identifier">difference_type</span>
+ <span class="identifier">difference_type</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">>::</span><span class="identifier">reverse_iterator</span>
+ <span class="identifier">reverse_iterator</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">>::</span><span class="identifier">const_reverse_iterator</span>
+ <span class="identifier">const_reverse_iterator</span><span class="special">;</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">vector</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span> <span class="special">{</span> <span class="keyword">not</span> <span class="identifier">empty</span><span class="special">();</span> <span class="special">}</span>
+ <span class="special">:</span> <span class="identifier">vector_</span><span class="special">()</span>
+ <span class="special">{}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">explicit</span> <span class="identifier">vector</span> <span class="special">(</span> <span class="keyword">const</span> <span class="identifier">Allocator</span><span class="special">&</span> <span class="identifier">alllocator</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span> <span class="special">{</span>
+ <span class="identifier">empty</span><span class="special">();</span>
+ <span class="identifier">allocator</span> <span class="special">==</span> <span class="identifier">get_allocator</span><span class="special">();</span>
+ <span class="special">}</span>
+ <span class="special">:</span> <span class="identifier">vector_</span><span class="special">(</span><span class="identifier">allocator</span><span class="special">)</span>
+ <span class="special">{}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">explicit</span> <span class="identifier">vector</span> <span class="special">(</span> <span class="identifier">size_type</span> <span class="identifier">count</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span> <span class="special">{</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span><span class="special">;</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">T</span><span class="special">());</span>
+ <span class="comment">// Assertion requirements not supported by [N1962].</span>
+ <span class="special">}</span>
+ <span class="special">:</span> <span class="identifier">vector_</span><span class="special">(</span><span class="identifier">count</span><span class="special">)</span>
+ <span class="special">{}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">vector</span> <span class="special">(</span> <span class="identifier">size_type</span> <span class="identifier">count</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span> <span class="special">{</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span><span class="special">;</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">value</span><span class="special">);</span>
+
+ <span class="special">}</span>
+ <span class="special">:</span> <span class="identifier">vector_</span><span class="special">(</span><span class="identifier">count</span><span class="special">,</span> <span class="identifier">value</span><span class="special">)</span>
+ <span class="special">{}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">vector</span> <span class="special">(</span> <span class="identifier">size_type</span> <span class="identifier">count</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">value</span><span class="special">,</span>
+ <span class="keyword">const</span> <span class="identifier">Allocator</span><span class="special">&</span> <span class="identifier">allocator</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span> <span class="special">{</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span><span class="special">;</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">value</span><span class="special">);</span>
+
+ <span class="identifier">allocator</span> <span class="special">==</span> <span class="identifier">get_allocator</span><span class="special">();</span>
+ <span class="special">}</span>
+ <span class="special">:</span> <span class="identifier">vector_</span><span class="special">(</span><span class="identifier">count</span><span class="special">,</span> <span class="identifier">value</span><span class="special">,</span> <span class="identifier">allocator</span><span class="special">)</span>
+ <span class="special">{}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">template</span><span class="special"><</span> <span class="keyword">class</span> <span class="identifier">Iterator</span> <span class="special">></span>
+ <span class="keyword">requires</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">></span>
+ <span class="identifier">vector</span> <span class="special">(</span> <span class="identifier">Iterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">Iterator</span> <span class="identifier">last</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span> <span class="special">{</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">size</span><span class="special">());</span> <span class="special">}</span>
+ <span class="special">:</span> <span class="identifier">vector_</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span>
+ <span class="special">{}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">template</span><span class="special"><</span> <span class="keyword">class</span> <span class="identifier">Iterator</span> <span class="special">></span>
+ <span class="keyword">requires</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">></span>
+ <span class="identifier">vector</span> <span class="special">(</span> <span class="identifier">Iterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">Iterator</span> <span class="identifier">last</span><span class="special">,</span>
+ <span class="keyword">const</span> <span class="identifier">Allocator</span><span class="special">&</span> <span class="identifier">allocator</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span> <span class="special">{</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">size</span><span class="special">());</span>
+ <span class="identifier">allocator</span> <span class="special">==</span> <span class="identifier">get_allocator</span><span class="special">();</span>
+ <span class="special">}</span>
+ <span class="special">:</span> <span class="identifier">vector_</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">allocator</span><span class="special">)</span>
+ <span class="special">{}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">vector</span> <span class="special">(</span> <span class="keyword">const</span> <span class="identifier">vector</span><span class="special">&</span> <span class="identifier">right</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span> <span class="special">{</span>
+ <span class="identifier">right</span> <span class="special">==</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
+ <span class="special">}</span>
+ <span class="special">:</span> <span class="identifier">vector_</span><span class="special">(</span><span class="identifier">right</span><span class="special">.</span><span class="identifier">vector_</span><span class="special">)</span>
+ <span class="special">{}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">vector</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">=</span> <span class="special">(</span> <span class="keyword">const</span> <span class="identifier">vector</span><span class="special">&</span> <span class="identifier">right</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span><span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
+
+ <span class="identifier">right</span> <span class="special">==</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
+ <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vect_</span> <span class="special">=</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">vect_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">vector</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">{}</span>
+
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">void</span> <span class="identifier">reserve</span> <span class="special">(</span> <span class="identifier">size_type</span> <span class="identifier">count</span> <span class="special">)</span>
+ <span class="keyword">precondition</span> <span class="special">{</span> <span class="identifier">count</span> <span class="special"><</span> <span class="identifier">max_size</span><span class="special">();</span> <span class="special">}</span>
+ <span class="keyword">postcondition</span> <span class="special">{</span> <span class="identifier">capacity</span><span class="special">()</span> <span class="special">>=</span> <span class="identifier">count</span><span class="special">;</span> <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">reserve</span><span class="special">(</span><span class="identifier">count</span><span class="special">);</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">size_type</span> <span class="identifier">capacity</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">postcondition</span><span class="special">(</span><span class="identifier">result</span><span class="special">)</span> <span class="special">{</span> <span class="identifier">result</span> <span class="special">>=</span> <span class="identifier">size</span><span class="special">();</span> <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">();</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">iterator</span> <span class="identifier">begin</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span> <span class="special">{</span>
+
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">empty</span><span class="special">())</span> <span class="special">{</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">end</span><span class="special">();</span>
+ <span class="special">}</span>
+ <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">const_iterator</span> <span class="identifier">begin</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">postcondition</span><span class="special">(</span><span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
+
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">empty</span><span class="special">())</span> <span class="special">{</span> <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">end</span><span class="special">();</span> <span class="special">}</span>
+ <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">iterator</span> <span class="identifier">end</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">const_iterator</span> <span class="identifier">end</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">reverse_iterator</span> <span class="identifier">rbegin</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span><span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
+
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">empty</span><span class="special">())</span> <span class="special">{</span> <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">rend</span><span class="special">();</span> <span class="special">}</span>
+ <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">rbegin</span><span class="special">();</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">const_reverse_iterator</span> <span class="identifier">rbegin</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">postcondition</span><span class="special">(</span><span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
+
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">empty</span><span class="special">())</span> <span class="special">{</span> <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">rend</span><span class="special">();</span> <span class="special">}</span>
+ <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">rbegin</span><span class="special">();</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">reverse_iterator</span> <span class="identifier">rend</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">rend</span><span class="special">();</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">const_reverse_iterator</span> <span class="identifier">rend</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">rend</span><span class="special">();</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">void</span> <span class="identifier">resize</span> <span class="special">(</span> <span class="identifier">size_type</span> <span class="identifier">count</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span> <span class="special">{</span>
+
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span><span class="special">;</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">count</span> <span class="special">></span> <span class="keyword">oldof</span> <span class="identifier">size</span><span class="special">())</span> <span class="special">{</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">begin</span><span class="special">()</span> <span class="special">+</span> <span class="keyword">oldof</span> <span class="identifier">size</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span>
+ <span class="identifier">T</span><span class="special">());</span>
+ <span class="special">}</span>
+ <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="identifier">vectcor_</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span><span class="identifier">count</span><span class="special">);</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">void</span> <span class="identifier">resize</span> <span class="special">(</span> <span class="identifier">size_type</span> <span class="identifier">count</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span> <span class="special">{</span>
+
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span><span class="special">;</span>
+ <span class="identifier">count</span> <span class="special">></span> <span class="keyword">oldof</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">?</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">begin</span><span class="special">()</span> <span class="special">+</span> <span class="keyword">oldof</span> <span class="identifier">size</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span>
+ <span class="identifier">value</span><span class="special">)</span>
+ <span class="special">:</span>
+ <span class="keyword">true</span>
+ <span class="special">;</span>
+ <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span><span class="identifier">count</span><span class="special">,</span> <span class="identifier">value</span><span class="special">);</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">size_type</span> <span class="identifier">size</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">postcondition</span><span class="special">(</span><span class="identifier">result</span><span class="special">)</span> <span class="special">{</span> <span class="identifier">result</span> <span class="special"><=</span> <span class="identifier">capacity</span><span class="special">();</span> <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">size_type</span> <span class="identifier">max_size</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">postcondition</span><span class="special">(</span><span class="identifier">result</span><span class="special">)</span> <span class="special">{</span> <span class="identifier">result</span> <span class="special">>=</span> <span class="identifier">capacity</span><span class="special">();</span> <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">max_size</span><span class="special">();</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">bool</span> <span class="identifier">empty</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">postcondition</span><span class="special">(</span><span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
+
+ <span class="identifier">result</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span>
+ <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">empty</span><span class="special">();</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">Alloctor</span> <span class="identifier">get_allocator</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">get_allocator</span><span class="special">();</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">reference</span> <span class="identifier">at</span> <span class="special">(</span> <span class="identifier">size_type</span> <span class="identifier">index</span> <span class="special">)</span>
+ <span class="keyword">precondition</span> <span class="special">{</span> <span class="identifier">index</span> <span class="special"><</span> <span class="identifier">size</span><span class="special">();</span> <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vectcor_</span><span class="special">.</span><span class="identifier">at</span><span class="special">(</span><span class="identifier">index</span><span class="special">);</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">const_reference</span> <span class="identifier">at</span> <span class="special">(</span> <span class="identifier">size_type</span> <span class="identifier">index</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">precondition</span> <span class="special">{</span> <span class="identifier">index</span> <span class="special"><</span> <span class="identifier">size</span><span class="special">();</span> <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">at</span><span class="special">(</span><span class="identifier">index</span><span class="special">);</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">reference</span> <span class="keyword">operator</span><span class="special">[]</span> <span class="special">(</span> <span class="identifier">size_type</span> <span class="identifier">index</span> <span class="special">)</span>
+ <span class="keyword">precondition</span> <span class="special">{</span> <span class="identifier">index</span> <span class="special"><</span> <span class="identifier">size</span><span class="special">();</span> <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">[</span><span class="identifier">index</span><span class="special">];</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">const_reference</span> <span class="keyword">operator</span><span class="special">[]</span> <span class="special">(</span> <span class="identifier">size_type</span> <span class="identifier">index</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">precondition</span> <span class="special">{</span> <span class="identifier">index</span> <span class="special"><</span> <span class="identifier">size</span><span class="special">();</span> <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vectcor_</span><span class="special">[</span><span class="identifier">index</span><span class="special">];</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">reference</span> <span class="identifier">front</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">precondition</span> <span class="special">{</span> <span class="keyword">not</span> <span class="identifier">empty</span><span class="special">();</span> <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vectcor_</span><span class="special">.</span><span class="identifier">front</span><span class="special">();</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">const_reference</span> <span class="identifier">front</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">precondition</span> <span class="special">{</span> <span class="keyword">bool</span><span class="special">(!</span><span class="identifier">empty</span><span class="special">());</span> <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">front</span><span class="special">();</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">reference</span> <span class="identifier">back</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">precondition</span> <span class="special">{</span> <span class="keyword">not</span> <span class="identifier">empty</span><span class="special">();</span> <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">back</span><span class="special">();</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">const_reference</span> <span class="identifier">back</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">precondition</span> <span class="special">{</span> <span class="keyword">not</span> <span class="identifier">empty</span><span class="special">();</span> <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">back</span><span class="special">();</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="identifier">push_back</span> <span class="special">(</span> <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="keyword">precondition</span> <span class="special">{</span> <span class="identifier">size</span><span class="special">()</span> <span class="special"><</span> <span class="identifier">max_size</span><span class="special">()</span> <span class="special">}</span>
+ <span class="keyword">postcondition</span> <span class="special">{</span>
+
+
+ <span class="keyword">static</span> <span class="keyword">if</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span><span class="special">)</span> <span class="special">{</span> <span class="identifier">back</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">value</span><span class="special">;</span> <span class="special">}</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">oldof</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">+</span> <span class="number">1</span><span class="special">;</span>
+ <span class="identifier">capacity</span><span class="special">()</span> <span class="special">>=</span> <span class="keyword">oldof</span> <span class="identifier">capacity</span><span class="special">()</span>
+ <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">value</span><span class="special">);</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">void</span> <span class="identifier">pop_back</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">precondition</span> <span class="special">{</span> <span class="keyword">not</span> <span class="identifier">empty</span><span class="special">();</span> <span class="special">}</span>
+ <span class="keyword">postcondition</span> <span class="special">{</span>
+
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">oldof</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">-</span> <span class="number">1</span><span class="special">;</span>
+ <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">pop_back</span><span class="special">();</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">template</span><span class="special"><</span> <span class="keyword">class</span> <span class="identifier">Iterator</span> <span class="special">></span>
+ <span class="keyword">requires</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">></span>
+ <span class="keyword">void</span> <span class="identifier">assign</span> <span class="special">(</span> <span class="identifier">Iterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">Iterator</span> <span class="identifier">last</span> <span class="special">)</span>
+ <span class="comment">// precondition: [begin(), end()) does not contain [first, last)</span>
+ <span class="keyword">postcondition</span> <span class="special">{</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">size</span><span class="special">());</span> <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">assign</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">);</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">void</span> <span class="identifier">assign</span> <span class="special">(</span> <span class="identifier">size_type</span> <span class="identifier">count</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">vallue</span> <span class="special">)</span>
+ <span class="keyword">precondition</span> <span class="special">{</span> <span class="identifier">count</span> <span class="special"><=</span> <span class="identifier">max_size</span><span class="special">();</span> <span class="special">}</span>
+ <span class="keyword">postcondition</span> <span class="special">{</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">value</span><span class="special">);</span>
+
+ <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">assign</span><span class="special">(</span><span class="identifier">count</span><span class="special">,</span> <span class="identifier">value</span><span class="special">);</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">iterator</span> <span class="identifier">insert</span> <span class="special">(</span> <span class="identifier">iterator</span> <span class="identifier">where</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="keyword">precondition</span> <span class="special">{</span> <span class="identifier">size</span><span class="special">()</span> <span class="special"><</span> <span class="identifier">max_size</span><span class="special">();</span> <span class="special">}</span>
+ <span class="keyword">postcondition</span><span class="special">(</span><span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
+
+
+ <span class="identifier">value</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">result</span><span class="special">;</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">oldof</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">+</span> <span class="number">1</span><span class="special">;</span>
+ <span class="comment">// if(capacity() > oldof capacity())</span>
+ <span class="comment">// [begin(), end()) is invalid</span>
+ <span class="comment">// else</span>
+ <span class="comment">// [where, end()) is invalid</span>
+ <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">where</span><span class="special">,</span> <span class="identifier">value</span><span class="special">);</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">void</span> <span class="identifier">insert</span> <span class="special">(</span> <span class="identifier">iterator</span> <span class="identifier">where</span><span class="special">,</span> <span class="identifier">size_type</span> <span class="identifier">count</span><span class="special">,</span>
+ <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="keyword">precondition</span> <span class="special">{</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">count</span> <span class="special"><</span> <span class="identifier">max_size</span><span class="special">();</span> <span class="special">}</span>
+ <span class="keyword">postcondition</span> <span class="special">{</span>
+
+
+
+
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">oldof</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">count</span><span class="special">;</span>
+ <span class="identifier">capacity</span><span class="special">()</span> <span class="special">>=</span> <span class="keyword">oldof</span> <span class="identifier">capacity</span><span class="special">();</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">oldof</span> <span class="identifier">capacity</span><span class="special">())</span> <span class="special">{</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">prior</span><span class="special">(</span><span class="keyword">oldof</span> <span class="identifier">where</span><span class="special">),</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">prior</span><span class="special">(</span><span class="keyword">oldof</span> <span class="identifier">where</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">count</span><span class="special">,</span> <span class="identifier">value</span><span class="special">);</span>
+
+ <span class="comment">// [where, end()) is invalid</span>
+ <span class="special">}</span> <span class="comment">// else [begin(), end()) is invalid</span>
+ <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">where</span><span class="special">,</span> <span class="identifier">count</span><span class="special">,</span> <span class="identifier">value</span><span class="special">);</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">template</span><span class="special"><</span> <span class="keyword">class</span> <span class="identifier">Iterator</span> <span class="special">></span>
+ <span class="keyword">requires</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">></span>
+ <span class="keyword">void</span> <span class="identifier">insert</span> <span class="special">(</span> <span class="identifier">iterator</span> <span class="identifier">where</span><span class="special">,</span> <span class="identifier">Iterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">Iterator</span> <span class="identifier">last</span> <span class="special">)</span>
+ <span class="keyword">precondition</span> <span class="special">{</span>
+ <span class="comment">// [first, last) is not contained in [begin(), end())</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span> <span class="special"><</span> <span class="identifier">max_size</span><span class="special">();</span>
+ <span class="special">}</span>
+ <span class="keyword">postcondition</span> <span class="special">{</span>
+
+
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">oldof</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">);</span>
+ <span class="identifier">capacity</span><span class="special">()</span> <span class="special">>=</span> <span class="keyword">oldof</span> <span class="identifier">capacity</span><span class="special">();</span>
+ <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">where</span><span class="special">,</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">);</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">iterator</span> <span class="identifier">erase</span> <span class="special">(</span> <span class="identifier">iterator</span> <span class="identifier">where</span> <span class="special">)</span>
+ <span class="keyword">precondition</span> <span class="special">{</span>
+ <span class="keyword">not</span> <span class="identifier">empty</span><span class="special">();</span>
+ <span class="identifier">where</span> <span class="special">!=</span> <span class="identifier">end</span><span class="special">();</span>
+ <span class="special">}</span>
+ <span class="keyword">postcondition</span><span class="special">(</span><span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
+
+
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">oldod</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">-</span> <span class="number">1</span><span class="special">;</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">empty</span><span class="special">())</span> <span class="special">{</span> <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">end</span><span class="special">();</span> <span class="special">}</span>
+ <span class="comment">// [where, end()) is invalid</span>
+ <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">where</span><span class="special">);</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">iterator</span> <span class="identifier">erase</span> <span class="special">(</span> <span class="identifier">iterator</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">iterator</span> <span class="identifier">last</span> <span class="special">)</span>
+ <span class="keyword">precondition</span> <span class="special">{</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">>=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">lasst</span><span class="special">);</span> <span class="special">}</span>
+ <span class="keyword">postcondition</span><span class="special">(</span><span class="identifier">result</span><span class="special">)</span> <span class="special">{</span>
+
+
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">oldof</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">-</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">);</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">empty</span><span class="special">())</span> <span class="special">{</span> <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">end</span><span class="special">();</span> <span class="special">}</span>
+ <span class="comment">// [first, last) is invalid</span>
+ <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">);</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">void</span> <span class="identifier">clear</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">empty</span><span class="special">()</span> <span class="special">)</span>
+ <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">clear</span><span class="special">();</span>
+ <span class="special">}</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">void</span> <span class="identifier">swap</span> <span class="special">(</span> <span class="identifier">vector</span><span class="special">&</span> <span class="identifier">right</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span> <span class="special">{</span>
+
+
+ <span class="identifier">right</span> <span class="special">==</span> <span class="keyword">oldof</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
+ <span class="keyword">oldof</span> <span class="identifier">right</span> <span class="special">==</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
+ <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">right</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="keyword">friend</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==</span> <span class="special">(</span> <span class="identifier">vector</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">left</span><span class="special">,</span> <span class="identifier">vector</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">right</span> <span class="special">)</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">left</span><span class="special">.</span><span class="identifier">vector_</span> <span class="special">==</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">vector_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">></span> <span class="identifier">vector_</span><span class="special">;</span>
+<span class="special">};</span>
+</pre>
+<p>
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="comment">// File: vector.cpp</span>
+<span class="preprocessor">#include</span> <span class="string">"vector.hpp"</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="comment">// Run a few of the operations (could test more of them...).</span>
+ <span class="identifier">vector</span><span class="special"><</span><span class="keyword">char</span><span class="special">></span> <span class="identifier">v</span><span class="special">(</span><span class="number">3</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">v</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">3</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="char">'\0'</span><span class="special">));</span>
+ <span class="keyword">const</span> <span class="identifier">vector</span><span class="special"><</span><span class="keyword">char</span><span class="special">>&</span> <span class="identifier">cv</span> <span class="special">=</span> <span class="identifier">v</span><span class="special">;</span> <span class="comment">// A reference so no copy.</span>
+
+ <span class="identifier">vector</span><span class="special"><</span><span class="keyword">char</span><span class="special">></span> <span class="identifier">w</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">w</span> <span class="special">==</span> <span class="identifier">v</span><span class="special">);</span>
+
+ <span class="identifier">vector</span><span class="special"><</span><span class="keyword">char</span><span class="special">>::</span><span class="identifier">iterator</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">v</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(*</span><span class="identifier">b</span> <span class="special">==</span> <span class="char">'\0'</span><span class="special">);</span>
+
+ <span class="identifier">vector</span><span class="special"><</span><span class="keyword">char</span><span class="special">>::</span><span class="identifier">const_iterator</span> <span class="identifier">cb</span> <span class="special">=</span> <span class="identifier">cv</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(*</span><span class="identifier">cb</span> <span class="special">==</span> <span class="char">'\0'</span><span class="special">);</span>
+
+ <span class="identifier">v</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">b</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="char">'a'</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">v</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="char">'a'</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">v</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">==</span> <span class="char">'a'</span><span class="special">);</span>
+
+ <span class="identifier">v</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="char">'b'</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">v</span><span class="special">.</span><span class="identifier">back</span><span class="special">()</span> <span class="special">==</span> <span class="char">'b'</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+ </td>
+<td>
+ </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__n1962___circle__subcontracting"></a><a class="link" href="examples.html#contract__.examples.__n1962___circle__subcontracting" title="[N1962] Circle: Subcontracting">[N1962]
+ Circle: Subcontracting</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: circle.cpp</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">shape</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="comment">// Must always specify class invariants.</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">shape</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keyword">int</span> <span class="special">(</span><span class="identifier">compute_area</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="comment">// No base preconditions so all derived preconditions true.</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span> <span class="identifier">result</span> <span class="special">></span> <span class="number">0</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="comment">// Contract for pure virtual function.</span>
+<span class="special">};</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">circle</span><span class="special">)</span> <span class="keyword">extends</span><span class="special">(</span> <span class="keyword">public</span> <span class="identifier">shape</span> <span class="special">)</span> <span class="comment">// Subcontract from base `shape`.</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="comment">// In AND with base class invariants.</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">int</span> <span class="identifier">radius</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="number">2</span><span class="special">;</span> <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Also using `override` specifier (optional).</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keyword">int</span> <span class="special">(</span><span class="identifier">compute_area</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span> <span class="keyword">override</span>
+ <span class="comment">// Eventual preconditions in OR with base function preconditions.</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="comment">// In AND with base function postconditions.</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">pi</span> <span class="special">*</span> <span class="identifier">radius</span><span class="special">()</span> <span class="special">*</span> <span class="identifier">radius</span><span class="special">()</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">pi</span> <span class="special">*</span> <span class="identifier">radius</span><span class="special">()</span> <span class="special">*</span> <span class="identifier">radius</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keyword">int</span> <span class="identifier">pi</span> <span class="special">=</span> <span class="number">3</span><span class="special">;</span> <span class="comment">// Truncated from 3.14...</span>
+<span class="special">};</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">circle</span> <span class="identifier">c</span><span class="special">;</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">c</span><span class="special">.</span><span class="identifier">compute_area</span><span class="special">()</span> <span class="special">==</span> <span class="number">12</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__n1962___factorial__recursion_and_assertion_computational_complexity"></a><a class="link" href="examples.html#contract__.examples.__n1962___factorial__recursion_and_assertion_computational_complexity" title="[N1962] Factorial: Recursion and assertion computational complexity">[N1962]
+ Factorial: Recursion and assertion computational complexity</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: factorial.cpp</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="comment">// Assertion requirements used to model assertion computational complexity.</span>
+<span class="preprocessor">#define</span> <span class="identifier">O_1</span> <span class="number">0</span> <span class="comment">// O(1) constant (default).</span>
+<span class="preprocessor">#define</span> <span class="identifier">O_N</span> <span class="number">1</span> <span class="comment">// O(n) linear.</span>
+<span class="preprocessor">#define</span> <span class="identifier">O_NN</span> <span class="number">2</span> <span class="comment">// O(n * n) quadratic.</span>
+<span class="preprocessor">#define</span> <span class="identifier">O_NX</span> <span class="number">3</span> <span class="comment">// O(n^x) polynomial.</span>
+<span class="preprocessor">#define</span> <span class="identifier">O_FACTN</span> <span class="number">4</span> <span class="comment">// O(n!) factorial.</span>
+<span class="preprocessor">#define</span> <span class="identifier">O_EXPN</span> <span class="number">5</span> <span class="comment">// O(e^n) exponential.</span>
+<span class="preprocessor">#define</span> <span class="identifier">O_ALL</span> <span class="number">10</span>
+<span class="preprocessor">#define</span> <span class="identifier">COMPLEXITY_MAX</span> <span class="identifier">O_ALL</span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">int</span> <span class="special">(</span><span class="identifier">factorial</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">n</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span>
+ <span class="identifier">n</span> <span class="special">>=</span> <span class="number">0</span><span class="special">,</span> <span class="comment">// Non-negative natural number.</span>
+ <span class="identifier">n</span> <span class="special"><=</span> <span class="number">12</span> <span class="comment">// Max function input.</span>
+ <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">>=</span> <span class="number">1</span><span class="special">,</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">n</span> <span class="special"><</span> <span class="number">2</span><span class="special">)</span> <span class="special">(</span> <span class="comment">// Select assertion.</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="number">1</span>
+ <span class="special">)</span> <span class="keyword">else</span> <span class="special">(</span>
+ <span class="comment">// Assertions automatically disabled within other assertions.</span>
+ <span class="comment">// Therefore, this postcondition can recursively call the</span>
+ <span class="comment">// function without causing infinite recursion.</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">n</span> <span class="special">*</span> <span class="identifier">factorial</span><span class="special">(</span><span class="identifier">n</span> <span class="special">-</span> <span class="number">1</span><span class="special">),</span>
+ <span class="comment">// This assertion introduces significant run-time</span>
+ <span class="comment">// overhead (same as the function body) so assertion</span>
+ <span class="comment">// requirements are used to selectively disable it.</span>
+ <span class="keyword">requires</span> <span class="identifier">O_FACTN</span> <span class="special"><=</span> <span class="identifier">COMPLEXITY_MAX</span>
+ <span class="special">)</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">n</span> <span class="special"><</span> <span class="number">2</span><span class="special">)</span> <span class="keyword">return</span> <span class="number">1</span><span class="special">;</span>
+ <span class="keyword">else</span> <span class="keyword">return</span> <span class="identifier">n</span> <span class="special">*</span> <span class="identifier">factorial</span><span class="special">(</span><span class="identifier">n</span> <span class="special">-</span> <span class="number">1</span><span class="special">);</span>
+<span class="special">}</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">factorial</span><span class="special">(</span><span class="number">4</span><span class="special">)</span> <span class="special">==</span> <span class="number">24</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__n1962___equal__operators"></a><a class="link" href="examples.html#contract__.examples.__n1962___equal__operators" title="[N1962] Equal: Operators">[N1962]
+ Equal: Operators</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: equal.hpp</span>
+<span class="preprocessor">#ifndef</span> <span class="identifier">EQUAL_HPP_</span>
+<span class="preprocessor">#define</span> <span class="identifier">EQUAL_HPP_</span>
+
+<span class="preprocessor">#include</span> <span class="string">"equal_not.hpp"</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">(==)(</span><span class="identifier">equal</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">left</span><span class="special">,</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">right</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="special">!(</span><span class="identifier">left</span> <span class="special">!=</span> <span class="identifier">right</span><span class="special">)</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">left</span><span class="special">.</span><span class="identifier">value</span> <span class="special">==</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">value</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="preprocessor">#endif</span> <span class="comment">// #include guard</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: equal_not.hpp</span>
+<span class="preprocessor">#ifndef</span> <span class="identifier">EQUAL_NOT_HPP_</span>
+<span class="preprocessor">#define</span> <span class="identifier">EQUAL_NOT_HPP_</span>
+
+<span class="preprocessor">#include</span> <span class="string">"equal.hpp"</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">(!=)(</span><span class="identifier">not_equal</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">left</span><span class="special">,</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">right</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="special">!(</span><span class="identifier">left</span> <span class="special">==</span> <span class="identifier">right</span><span class="special">)</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">left</span><span class="special">.</span><span class="identifier">value</span> <span class="special">!=</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">value</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="preprocessor">#endif</span> <span class="comment">// #include guard</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: equal_main.cpp</span>
+<span class="preprocessor">#include</span> <span class="string">"equal.hpp"</span>
+<span class="preprocessor">#include</span> <span class="string">"equal_not.hpp"</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="keyword">struct</span> <span class="identifier">number</span> <span class="special">{</span> <span class="keyword">int</span> <span class="identifier">value</span><span class="special">;</span> <span class="special">};</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">number</span> <span class="identifier">n</span><span class="special">;</span>
+ <span class="identifier">n</span><span class="special">.</span><span class="identifier">value</span> <span class="special">=</span> <span class="number">123</span><span class="special">;</span>
+
+ <span class="identifier">BOOST_TEST</span><span class="special">((</span><span class="identifier">n</span> <span class="special">==</span> <span class="identifier">n</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">true</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">((</span><span class="identifier">n</span> <span class="special">!=</span> <span class="identifier">n</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">false</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__n1962___sum__separated_body_definitions"></a><a class="link" href="examples.html#contract__.examples.__n1962___sum__separated_body_definitions" title="[N1962] Sum: Separated body definitions">[N1962]
+ Sum: Separated body definitions</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: sum.hpp</span>
+<span class="preprocessor">#ifndef</span> <span class="identifier">SUM_HPP_</span>
+<span class="preprocessor">#define</span> <span class="identifier">SUM_HPP_</span>
+
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">int</span> <span class="special">(</span><span class="identifier">sum</span><span class="special">)(</span> <span class="keyword">int</span> <span class="identifier">count</span><span class="special">,</span> <span class="special">(</span><span class="keyword">int</span><span class="special">*)</span> <span class="identifier">array</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">count</span> <span class="special">%</span> <span class="number">4</span> <span class="special">==</span> <span class="number">0</span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">;</span> <span class="comment">// Separate body definition from function declaration (see ".cpp" file).</span>
+
+<span class="preprocessor">#endif</span> <span class="comment">// #include guard</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: sum.cpp</span>
+<span class="preprocessor">#include</span> <span class="string">"sum.hpp"</span>
+
+<span class="keyword">int</span> <span class="identifier">CONTRACT_FREE_BODY</span><span class="special">(</span><span class="identifier">sum</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">count</span><span class="special">,</span> <span class="keyword">int</span><span class="special">*</span> <span class="identifier">array</span> <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">int</span> <span class="identifier">total</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
+ <span class="keyword">for</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">count</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="identifier">total</span> <span class="special">+=</span> <span class="identifier">array</span><span class="special">[</span><span class="identifier">i</span><span class="special">];</span>
+ <span class="keyword">return</span> <span class="identifier">total</span><span class="special">;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: sum_main.cpp</span>
+<span class="preprocessor">#include</span> <span class="string">"sum.hpp"</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="keyword">int</span> <span class="identifier">a</span><span class="special">[</span><span class="number">8</span><span class="special">]</span> <span class="special">=</span> <span class="special">{</span><span class="number">1</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">1</span><span class="special">};</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">sum</span><span class="special">(</span><span class="number">8</span><span class="special">,</span> <span class="identifier">a</span><span class="special">)</span> <span class="special">==</span> <span class="number">8</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__n1962___square_root__default_parameters_and_comparison_with_d_syntax"></a><a class="link" href="examples.html#contract__.examples.__n1962___square_root__default_parameters_and_comparison_with_d_syntax" title="[N1962] Square Root: Default parameters and comparison with D syntax">[N1962]
+ Square Root: Default parameters and comparison with D syntax</a>
+</h3></div></div></div>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>
+ <p>
+ This Library (C++03)
+ </p>
+ </th>
+<th>
+ <p>
+ The D Programming Language
+ </p>
+ </th>
+</tr></thead>
+<tbody><tr>
+<td>
+ <p>
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="comment">// File: sqrt.cpp</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cmath</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Default value for `precision` parameter.</span>
+ <span class="keyword">double</span> <span class="special">(</span><span class="identifier">mysqrt</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">double</span> <span class="identifier">x</span><span class="special">,</span> <span class="keyword">double</span> <span class="identifier">precision</span><span class="special">,</span> <span class="keyword">default</span><span class="special">(</span><span class="number">1e-6</span><span class="special">)</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">x</span> <span class="special">>=</span> <span class="number">0.0</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">root</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span> <span class="comment">// Result value named `root`.</span>
+ <span class="identifier">fabs</span><span class="special">(</span><span class="identifier">root</span> <span class="special">*</span> <span class="identifier">root</span> <span class="special">-</span> <span class="identifier">x</span><span class="special">)</span> <span class="special"><=</span> <span class="identifier">precision</span> <span class="comment">// Equal within precision.</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">sqrt</span><span class="special">(</span><span class="identifier">x</span><span class="special">);</span>
+<span class="special">}</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">fabs</span><span class="special">(</span><span class="identifier">mysqrt</span><span class="special">(</span><span class="number">4.0</span><span class="special">)</span> <span class="special">-</span> <span class="number">2.0</span><span class="special">)</span> <span class="special"><=</span> <span class="number">1e-6</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+ </td>
+<td>
+ <p>
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="comment">// File: sqrt.d</span>
+<span class="comment">// Extra spaces, newlines, etc used to align text with this library code.</span>
+
+
+
+
+<span class="identifier">real</span> <span class="identifier">mysqrt</span> <span class="special">(</span> <span class="identifier">real</span> <span class="identifier">x</span> <span class="special">)</span> <span class="comment">// No default parameters in D.</span>
+ <span class="keyword">in</span> <span class="special">{</span> <span class="identifier">assert</span><span class="special">(</span><span class="identifier">x</span> <span class="special">>=</span> <span class="number">0</span><span class="special">);</span> <span class="special">}</span>
+ <span class="keyword">out</span><span class="special">(</span><span class="identifier">root</span><span class="special">)</span> <span class="special">{</span>
+
+ <span class="identifier">assert</span><span class="special">(</span><span class="identifier">std</span><span class="special">.</span><span class="identifier">math</span><span class="special">.</span><span class="identifier">fabs</span><span class="special">(</span><span class="identifier">root</span> <span class="special">*</span> <span class="identifier">root</span> <span class="special">-</span> <span class="identifier">x</span><span class="special">)</span> <span class="special"><=</span> <span class="number">1e6</span><span class="special">);</span>
+ <span class="special">}</span>
+<span class="identifier">body</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">std</span><span class="special">.</span><span class="identifier">math</span><span class="special">.</span><span class="identifier">sqrt</span><span class="special">(</span><span class="identifier">x</span><span class="special">);</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+ </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__n1962___block__block_invariants"></a><a class="link" href="examples.html#contract__.examples.__n1962___block__block_invariants" title="[N1962] Block: Block invariants">[N1962]
+ Block: Block invariants</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: block_invariant.cpp</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
+ <span class="keyword">for</span><span class="special">(</span><span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="number">100</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span>
+ <span class="special">{</span>
+ <span class="identifier">CONTRACT_BLOCK_INVARIANT</span><span class="special">(</span> <span class="keyword">const</span><span class="special">(</span> <span class="identifier">i</span> <span class="special">)</span> <span class="identifier">i</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span>
+ <span class="special">}</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">i</span> <span class="special">==</span> <span class="number">100</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__n2081___add__generic_addition_algorithm"></a><a class="link" href="examples.html#contract__.examples.__n2081___add__generic_addition_algorithm" title="[N2081] Add: Generic addition algorithm">[N2081]
+ Add: Generic addition algorithm</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: add.hpp</span>
+<span class="preprocessor">#ifndef</span> <span class="identifier">ADD_HPP</span>
+<span class="preprocessor">#define</span> <span class="identifier">ADD_HPP</span>
+
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">concept_check</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">/</span><span class="identifier">has_equal_to</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">></span>
+<span class="keyword">struct</span> <span class="identifier">Addable</span> <span class="comment">// User-defined concept.</span>
+<span class="special">{</span>
+ <span class="identifier">BOOST_CONCEPT_USAGE</span><span class="special">(</span><span class="identifier">Addable</span><span class="special">)</span>
+ <span class="special">{</span>
+ <span class="identifier">return_type</span><span class="special">(</span><span class="identifier">x</span> <span class="special">+</span> <span class="identifier">y</span><span class="special">);</span> <span class="comment">// Check addition `T operator+(T x, T y)`.</span>
+ <span class="special">}</span>
+
+<span class="keyword">private</span><span class="special">:</span>
+ <span class="keyword">void</span> <span class="identifier">return_type</span> <span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="special">)</span> <span class="special">{}</span> <span class="comment">// Used to check addition returns type `T`.</span>
+
+ <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">x</span><span class="special">;</span>
+ <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">y</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span> <span class="keyword">requires</span><span class="special">(</span> <span class="identifier">Addable</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">)</span>
+ <span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="special">(</span><span class="identifier">add</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">x</span><span class="special">,</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">y</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">x</span> <span class="special">+</span> <span class="identifier">y</span><span class="special">,</span> <span class="keyword">requires</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">x</span> <span class="special">+</span> <span class="identifier">y</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="preprocessor">#endif</span> <span class="comment">// #include guard</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: add.cpp</span>
+<span class="preprocessor">#include</span> <span class="string">"add.hpp"</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="keyword">int</span> <span class="identifier">x</span> <span class="special">=</span> <span class="number">10</span><span class="special">,</span> <span class="identifier">y</span> <span class="special">=</span> <span class="number">20</span><span class="special">;</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">add</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span> <span class="identifier">y</span><span class="special">)</span> <span class="special">==</span> <span class="number">30</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: add_error.cpp</span>
+<span class="preprocessor">#include</span> <span class="string">"add.hpp"</span>
+
+<span class="keyword">struct</span> <span class="identifier">num</span>
+<span class="special">{</span>
+ <span class="keyword">int</span> <span class="identifier">value</span><span class="special">;</span>
+ <span class="identifier">num</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span> <span class="special">)</span> <span class="special">:</span> <span class="identifier">value</span><span class="special">(</span><span class="identifier">v</span><span class="special">)</span> <span class="special">{};</span>
+<span class="special">};</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">num</span> <span class="identifier">n</span><span class="special">(</span><span class="number">10</span><span class="special">),</span> <span class="identifier">m</span><span class="special">(</span><span class="number">20</span><span class="special">);</span>
+ <span class="identifier">add</span><span class="special">(</span><span class="identifier">n</span><span class="special">,</span> <span class="identifier">m</span><span class="special">);</span> <span class="comment">// Error: Correctly fails `add` concept requirements.</span>
+ <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__n2081___advance__concept_based_iterator_overloading__emulated_using_tags_"></a><a class="link" href="examples.html#contract__.examples.__n2081___advance__concept_based_iterator_overloading__emulated_using_tags_" title="[N2081] Advance: Concept-based iterator overloading (emulated using tags)">[N2081]
+ Advance: Concept-based iterator overloading (emulated using tags)</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: advance.cpp</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">mpl</span><span class="special">/</span><span class="keyword">bool</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">vector</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">list</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iterator</span><span class="special">></span>
+
+<span class="keyword">namespace</span> <span class="identifier">aux</span> <span class="special">{</span> <span class="comment">// Tag dispatch helpers (in a private namespace).</span>
+
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">InputIterator</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Distance</span> <span class="special">></span>
+<span class="keyword">void</span> <span class="identifier">myadvance_dispatch</span> <span class="special">(</span> <span class="identifier">InputIterator</span><span class="special">&</span> <span class="identifier">i</span><span class="special">,</span> <span class="identifier">Distance</span> <span class="identifier">n</span><span class="special">,</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">input_iterator_tag</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">CONTRACT_LOOP</span><span class="special">(</span> <span class="keyword">while</span><span class="special">(</span><span class="identifier">n</span><span class="special">--)</span> <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_LOOP_VARIANT_TPL</span><span class="special">(</span> <span class="keyword">const</span><span class="special">(</span> <span class="identifier">n</span> <span class="special">)</span> <span class="identifier">n</span> <span class="special">)</span>
+ <span class="special">++</span><span class="identifier">i</span><span class="special">;</span>
+ <span class="special">}</span>
+<span class="special">}</span>
+
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">BidirectionalIterator</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Distance</span> <span class="special">></span>
+<span class="keyword">void</span> <span class="identifier">myadvance_dispatch</span> <span class="special">(</span> <span class="identifier">BidirectionalIterator</span><span class="special">&</span> <span class="identifier">i</span><span class="special">,</span> <span class="identifier">Distance</span> <span class="identifier">n</span><span class="special">,</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">bidirectional_iterator_tag</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">n</span> <span class="special">>=</span> <span class="number">0</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_LOOP</span><span class="special">(</span> <span class="keyword">while</span><span class="special">(</span><span class="identifier">n</span><span class="special">--)</span> <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_LOOP_VARIANT_TPL</span><span class="special">(</span> <span class="keyword">const</span><span class="special">(</span> <span class="identifier">n</span> <span class="special">)</span> <span class="identifier">n</span> <span class="special">)</span>
+ <span class="special">++</span><span class="identifier">i</span><span class="special">;</span>
+ <span class="special">}</span>
+ <span class="special">}</span> <span class="keyword">else</span> <span class="special">{</span>
+<span class="preprocessor">#ifndef</span> <span class="identifier">CONTRACT_CONFIG_NO_LOOP_VARIANTS</span>
+ <span class="comment">// Avoid unused variable warning when loop invariants are disabled.</span>
+ <span class="identifier">Distance</span> <span class="identifier">n_max</span> <span class="special">=</span> <span class="identifier">n</span><span class="special">;</span>
+<span class="preprocessor">#endif</span>
+ <span class="identifier">CONTRACT_LOOP</span><span class="special">(</span> <span class="keyword">while</span><span class="special">(</span><span class="identifier">n</span><span class="special">++)</span> <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_LOOP_VARIANT_TPL</span><span class="special">(</span> <span class="keyword">const</span><span class="special">(</span> <span class="identifier">n_max</span><span class="special">,</span> <span class="identifier">n</span> <span class="special">)</span> <span class="identifier">n_max</span> <span class="special">-</span> <span class="identifier">n</span> <span class="special">)</span>
+ <span class="special">--</span><span class="identifier">i</span><span class="special">;</span>
+ <span class="special">}</span>
+ <span class="special">}</span>
+<span class="special">}</span>
+
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">RandomAccessIterator</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Distance</span> <span class="special">></span>
+<span class="keyword">void</span> <span class="identifier">myadvance_dispatch</span> <span class="special">(</span> <span class="identifier">RandomAccessIterator</span><span class="special">&</span> <span class="identifier">i</span><span class="special">,</span> <span class="identifier">Distance</span> <span class="identifier">n</span><span class="special">,</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">random_access_iterator_tag</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">i</span> <span class="special">+=</span> <span class="identifier">n</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="special">}</span> <span class="comment">// namespace aux</span>
+
+<span class="comment">// Contract helper meta-function.</span>
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">></span> <span class="keyword">struct</span> <span class="identifier">is_input_iterator</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">false_</span> <span class="special">{};</span>
+<span class="keyword">template</span><span class="special"><</span> <span class="special">></span> <span class="keyword">struct</span> <span class="identifier">is_input_iterator</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">input_iterator_tag</span><span class="special">></span> <span class="special">:</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">true_</span> <span class="special">{};</span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">InputIterator</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Distance</span> <span class="special">)</span>
+ <span class="keyword">void</span> <span class="special">(</span><span class="identifier">myadvance</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">InputIterator</span><span class="special">&)</span> <span class="identifier">i</span><span class="special">,</span> <span class="special">(</span><span class="identifier">Distance</span><span class="special">)</span> <span class="identifier">n</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span>
+ <span class="comment">// range [i, i + n] is non-singular.</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">is_input_iterator</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">iterator_traits</span><span class="special"><</span><span class="identifier">InputIterator</span><span class="special">>::</span>
+ <span class="identifier">iterator_category</span><span class="special">>::</span><span class="identifier">value</span><span class="special">)</span> <span class="special">(</span>
+ <span class="identifier">n</span> <span class="special">></span> <span class="number">0</span> <span class="comment">// if input iterator, n positive</span>
+ <span class="special">)</span>
+ <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_i</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">i</span><span class="special">,</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">old_i</span><span class="special">,</span> <span class="identifier">i</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">n</span> <span class="comment">// iterator advanced of n</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">aux</span><span class="special">::</span><span class="identifier">myadvance_dispatch</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">n</span><span class="special">,</span> <span class="keyword">typename</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">iterator_traits</span><span class="special"><</span><span class="identifier">InputIterator</span><span class="special">>::</span> <span class="identifier">iterator_category</span><span class="special">());</span>
+<span class="special">}</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">v</span><span class="special">(</span><span class="number">10</span><span class="special">);</span>
+ <span class="identifier">v</span><span class="special">[</span><span class="number">2</span><span class="special">]</span> <span class="special">=</span> <span class="number">123</span><span class="special">;</span> <span class="identifier">v</span><span class="special">[</span><span class="number">3</span><span class="special">]</span> <span class="special">=</span> <span class="special">-</span><span class="number">123</span><span class="special">;</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">>::</span><span class="identifier">iterator</span> <span class="identifier">r</span> <span class="special">=</span> <span class="identifier">v</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span> <span class="comment">// Random iterator.</span>
+ <span class="identifier">myadvance</span><span class="special">(</span><span class="identifier">r</span><span class="special">,</span> <span class="number">3</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(*</span><span class="identifier">r</span> <span class="special">==</span> <span class="special">-</span><span class="number">123</span><span class="special">);</span>
+
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">l</span><span class="special">(</span><span class="identifier">v</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">v</span><span class="special">.</span><span class="identifier">end</span><span class="special">());</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="keyword">int</span><span class="special">>::</span><span class="identifier">iterator</span> <span class="identifier">b</span> <span class="special">=</span> <span class="identifier">l</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span> <span class="comment">// Bidirectional and not random.</span>
+ <span class="identifier">myadvance</span><span class="special">(</span><span class="identifier">b</span><span class="special">,</span> <span class="number">2</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(*</span><span class="identifier">b</span> <span class="special">==</span> <span class="number">123</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__n2081___find__generic_find_algorithm"></a><a class="link" href="examples.html#contract__.examples.__n2081___find__generic_find_algorithm" title="[N2081] Find: Generic find algorithm">[N2081]
+ Find: Generic find algorithm</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: find.hpp</span>
+<span class="preprocessor">#ifndef</span> <span class="identifier">FIND_HPP_</span>
+<span class="preprocessor">#define</span> <span class="identifier">FIND_HPP_</span>
+
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">concept_check</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">Iterator</span> <span class="special">)</span>
+ <span class="keyword">requires</span><span class="special">(</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">>,</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">EqualityComparable</span><span class="special"><</span> <span class="comment">// Equality needed to find value.</span>
+ <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">>::</span><span class="identifier">value_type</span><span class="special">></span>
+ <span class="special">)</span>
+ <span class="special">(</span><span class="identifier">Iterator</span><span class="special">)</span> <span class="special">(</span><span class="identifier">myfind</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">Iterator</span><span class="special">)</span> <span class="identifier">first</span><span class="special">,</span> <span class="special">(</span><span class="identifier">Iterator</span><span class="special">)</span> <span class="identifier">last</span><span class="special">,</span>
+ <span class="special">(</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">>::</span><span class="identifier">value_type</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="comment">// precondition: range [first, last) is valid</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">result</span> <span class="special">!=</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">(</span>
+ <span class="identifier">value</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">result</span> <span class="comment">// if result not last, value found</span>
+ <span class="special">)</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_LOOP</span><span class="special">(</span> <span class="keyword">while</span><span class="special">(</span><span class="identifier">first</span> <span class="special">!=</span> <span class="identifier">last</span> <span class="special">&&</span> <span class="special">*</span><span class="identifier">first</span> <span class="special">!=</span> <span class="identifier">value</span><span class="special">)</span> <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_LOOP_VARIANT_TPL</span><span class="special">(</span>
+ <span class="keyword">const</span><span class="special">(</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span> <span class="special">)</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">)</span>
+ <span class="special">++</span><span class="identifier">first</span><span class="special">;</span>
+ <span class="special">}</span>
+ <span class="keyword">return</span> <span class="identifier">first</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="preprocessor">#endif</span> <span class="comment">// #include guard</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: find.cpp</span>
+<span class="preprocessor">#include</span> <span class="string">"find.hpp"</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">vector</span><span class="special">></span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">ints</span><span class="special">(</span><span class="number">3</span><span class="special">);</span>
+ <span class="identifier">ints</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span> <span class="identifier">ints</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">=</span> <span class="number">2</span><span class="special">;</span> <span class="identifier">ints</span><span class="special">[</span><span class="number">2</span><span class="special">]</span> <span class="special">=</span> <span class="number">3</span><span class="special">;</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(*</span><span class="identifier">myfind</span><span class="special">(</span><span class="identifier">ints</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">ints</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="number">2</span><span class="special">)</span> <span class="special">==</span> <span class="number">2</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: find_error.cpp</span>
+<span class="preprocessor">#include</span> <span class="string">"find.hpp"</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">vector</span><span class="special">></span>
+
+<span class="keyword">struct</span> <span class="identifier">num</span>
+<span class="special">{</span>
+ <span class="keyword">int</span> <span class="identifier">value</span><span class="special">;</span>
+ <span class="keyword">explicit</span> <span class="identifier">num</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span> <span class="special">)</span> <span class="special">:</span> <span class="identifier">value</span><span class="special">(</span><span class="identifier">v</span><span class="special">)</span> <span class="special">{}</span>
+<span class="special">};</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">num</span><span class="special">></span> <span class="identifier">nums</span><span class="special">(</span><span class="number">3</span><span class="special">);</span>
+ <span class="identifier">nums</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">num</span><span class="special">(</span><span class="number">1</span><span class="special">);</span> <span class="identifier">nums</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">num</span><span class="special">(</span><span class="number">2</span><span class="special">);</span> <span class="identifier">nums</span><span class="special">[</span><span class="number">2</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">num</span><span class="special">(</span><span class="number">3</span><span class="special">);</span>
+ <span class="comment">// Error: Correctly, num does not meet concept requirements.</span>
+ <span class="identifier">myfind</span><span class="special">(</span><span class="identifier">nums</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">nums</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">num</span><span class="special">(</span><span class="number">2</span><span class="special">));</span>
+ <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__n2081___apply__overloaded_invocation_of_functors"></a><a class="link" href="examples.html#contract__.examples.__n2081___apply__overloaded_invocation_of_functors" title="[N2081] Apply: Overloaded invocation of functors">[N2081]
+ Apply: Overloaded invocation of functors</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: apply.cpp</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">/</span><span class="identifier">has_equal_to</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">concept_check</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="comment">// Use assertion requirements to model assertion computational complexity.</span>
+<span class="preprocessor">#define</span> <span class="identifier">O_1</span> <span class="number">0</span> <span class="comment">// constant computational complexity O(1)</span>
+<span class="preprocessor">#define</span> <span class="identifier">O_BODY</span> <span class="number">10</span> <span class="comment">// same computation complexity of the body</span>
+<span class="preprocessor">#define</span> <span class="identifier">COMPLEXITY_MAX</span> <span class="identifier">O_1</span> <span class="comment">// only check assertions with complexity within O(1)</span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Invoke unary functors.</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">Result</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Argument0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Function</span> <span class="special">)</span>
+ <span class="keyword">requires</span><span class="special">(</span> <span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">UnaryFunction</span><span class="special"><</span><span class="identifier">Function</span><span class="special">,</span> <span class="identifier">Result</span><span class="special">,</span> <span class="identifier">Argument0</span><span class="special">>)</span> <span class="special">)</span>
+ <span class="special">(</span><span class="identifier">Result</span><span class="special">)</span> <span class="special">(</span><span class="identifier">apply</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">Function</span><span class="special">)</span> <span class="identifier">function</span><span class="special">,</span> <span class="special">(</span><span class="identifier">Argument0</span><span class="special">)</span> <span class="identifier">argument0</span><span class="special">,</span>
+ <span class="special">(</span><span class="identifier">Result</span><span class="special">&)</span> <span class="identifier">result</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">return_value</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">function</span><span class="special">(</span><span class="identifier">argument0</span><span class="special">),</span>
+ <span class="keyword">requires</span> <span class="identifier">O_BODY</span> <span class="special"><=</span> <span class="identifier">COMPLEXITY_MAX</span> <span class="special">&&</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">Result</span><span class="special">>::</span><span class="identifier">value</span><span class="special">,</span>
+ <span class="identifier">return_value</span> <span class="special">==</span> <span class="identifier">result</span><span class="special">,</span>
+ <span class="keyword">requires</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">Result</span><span class="special">>::</span><span class="identifier">value</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">function</span><span class="special">(</span><span class="identifier">argument0</span><span class="special">);</span>
+<span class="special">}</span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Overload to invoke binary functors.</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">Result</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Argument0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Argument1</span><span class="special">,</span>
+ <span class="keyword">typename</span> <span class="identifier">Function</span> <span class="special">)</span>
+ <span class="keyword">requires</span><span class="special">(</span> <span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">BinaryFunction</span><span class="special"><</span><span class="identifier">Function</span><span class="special">,</span> <span class="identifier">Result</span><span class="special">,</span> <span class="identifier">Argument0</span><span class="special">,</span>
+ <span class="identifier">Argument1</span><span class="special">>)</span> <span class="special">)</span>
+ <span class="special">(</span><span class="identifier">Result</span><span class="special">)</span> <span class="special">(</span><span class="identifier">apply</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">Function</span><span class="special">)</span> <span class="identifier">function</span><span class="special">,</span> <span class="special">(</span><span class="identifier">Argument0</span><span class="special">)</span> <span class="identifier">argument0</span><span class="special">,</span>
+ <span class="special">(</span><span class="identifier">Argument1</span><span class="special">)</span> <span class="identifier">argument1</span><span class="special">,</span> <span class="special">(</span><span class="identifier">Result</span><span class="special">&)</span> <span class="identifier">result</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">return_value</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">function</span><span class="special">(</span><span class="identifier">argument0</span><span class="special">,</span> <span class="identifier">argument1</span><span class="special">),</span>
+ <span class="keyword">requires</span> <span class="identifier">O_BODY</span> <span class="special"><=</span> <span class="identifier">COMPLEXITY_MAX</span> <span class="special">&&</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">Result</span><span class="special">>::</span><span class="identifier">value</span><span class="special">,</span>
+ <span class="identifier">return_value</span> <span class="special">==</span> <span class="identifier">result</span><span class="special">,</span>
+ <span class="keyword">requires</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">Result</span><span class="special">>::</span><span class="identifier">value</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">function</span><span class="special">(</span><span class="identifier">argument0</span><span class="special">,</span> <span class="identifier">argument1</span><span class="special">);</span>
+<span class="special">}</span>
+
+<span class="keyword">int</span> <span class="identifier">complement</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">x</span> <span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="special">-</span><span class="identifier">x</span><span class="special">;</span> <span class="special">}</span>
+<span class="keyword">int</span> <span class="identifier">add</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">x</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">x</span> <span class="special">+</span> <span class="identifier">y</span><span class="special">;</span> <span class="special">}</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="keyword">int</span> <span class="identifier">r</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
+ <span class="identifier">apply</span><span class="special">(</span><span class="identifier">complement</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="identifier">r</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">r</span> <span class="special">==</span> <span class="special">-</span><span class="number">1</span><span class="special">);</span>
+
+ <span class="identifier">apply</span><span class="special">(</span><span class="identifier">add</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="identifier">r</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">r</span> <span class="special">==</span> <span class="number">3</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__n2081___for_each__generic_for_each_algorithm"></a><a class="link" href="examples.html#contract__.examples.__n2081___for_each__generic_for_each_algorithm" title="[N2081] For Each: Generic for-each algorithm">[N2081]
+ For Each: Generic for-each algorithm</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: for_each.cpp</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">/</span><span class="identifier">has_equal_to</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">concept_check</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">vector</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Function</span> <span class="special">)</span>
+ <span class="keyword">requires</span><span class="special">(</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">>,</span>
+ <span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">UnaryFunction</span><span class="special"><</span><span class="identifier">Function</span><span class="special">,</span> <span class="keyword">void</span><span class="special">,</span> <span class="keyword">typename</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">>::</span><span class="identifier">value_type</span><span class="special">>)</span>
+ <span class="special">)</span>
+ <span class="special">(</span><span class="identifier">Function</span><span class="special">)</span> <span class="special">(</span><span class="identifier">my_for_each</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">Iterator</span><span class="special">)</span> <span class="identifier">first</span><span class="special">,</span> <span class="special">(</span><span class="identifier">Iterator</span><span class="special">)</span> <span class="identifier">last</span><span class="special">,</span>
+ <span class="special">(</span><span class="identifier">Function</span><span class="special">)</span> <span class="identifier">function</span> <span class="special">)</span>
+ <span class="comment">// precondition: range [first, last) is valid</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">function</span><span class="special">,</span> <span class="keyword">requires</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">Function</span><span class="special">>::</span><span class="identifier">value</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_LOOP</span><span class="special">(</span> <span class="keyword">while</span><span class="special">(</span><span class="identifier">first</span> <span class="special"><</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">)</span> <span class="special">{</span> <span class="comment">// OK: Iterator is InputIterator.</span>
+ <span class="identifier">CONTRACT_LOOP_VARIANT_TPL</span><span class="special">(</span>
+ <span class="keyword">const</span><span class="special">(</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span> <span class="special">)</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">)</span>
+ <span class="identifier">function</span><span class="special">(*</span><span class="identifier">first</span><span class="special">);</span> <span class="comment">// OK: Function is UnaryFunction.</span>
+ <span class="special">++</span><span class="identifier">first</span><span class="special">;</span> <span class="comment">// OK: Iterator is InputIterator.</span>
+ <span class="special">}</span>
+ <span class="keyword">return</span> <span class="identifier">function</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="keyword">int</span> <span class="identifier">total</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
+<span class="keyword">void</span> <span class="identifier">add</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">i</span> <span class="special">)</span> <span class="special">{</span> <span class="identifier">total</span> <span class="special">+=</span> <span class="identifier">i</span><span class="special">;</span> <span class="special">}</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">v</span><span class="special">(</span><span class="number">3</span><span class="special">);</span>
+ <span class="identifier">v</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span> <span class="identifier">v</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">=</span> <span class="number">2</span><span class="special">;</span> <span class="identifier">v</span><span class="special">[</span><span class="number">2</span><span class="special">]</span> <span class="special">=</span> <span class="number">3</span><span class="special">;</span>
+ <span class="identifier">my_for_each</span><span class="special">(</span><span class="identifier">v</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">v</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">add</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">total</span> <span class="special">==</span> <span class="number">6</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__n2081___transform__generic_binary_transformation_algorithm"></a><a class="link" href="examples.html#contract__.examples.__n2081___transform__generic_binary_transformation_algorithm" title="[N2081] Transform: Generic binary transformation algorithm">[N2081]
+ Transform: Generic binary transformation algorithm</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: transform.cpp</span>
+
+<span class="preprocessor">#define</span> <span class="identifier">CONTRACT_CONFIG_FUNCTION_ARITY_MAX</span> <span class="number">5</span> <span class="comment">// Support for 5 parameters.</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">/</span><span class="identifier">has_equal_to</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">concept_check</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">vector</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">algorithm</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span>
+ <span class="keyword">typename</span> <span class="identifier">Iterator1</span><span class="special">,</span>
+ <span class="keyword">typename</span> <span class="identifier">Iterator2</span><span class="special">,</span>
+ <span class="keyword">typename</span> <span class="identifier">ResultIterator</span><span class="special">,</span>
+ <span class="keyword">typename</span> <span class="identifier">Function</span>
+ <span class="special">)</span>
+ <span class="keyword">requires</span><span class="special">(</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator1</span><span class="special">>,</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator2</span><span class="special">>,</span>
+ <span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">OutputIterator</span><span class="special"><</span><span class="identifier">ResultIterator</span><span class="special">,</span> <span class="keyword">typename</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator1</span><span class="special">>::</span><span class="identifier">value_type</span><span class="special">>),</span>
+ <span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">BinaryFunction</span><span class="special"><</span><span class="identifier">Function</span><span class="special">,</span>
+ <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator1</span><span class="special">>::</span><span class="identifier">value_type</span><span class="special">,</span>
+ <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator1</span><span class="special">>::</span><span class="identifier">value_type</span><span class="special">,</span>
+ <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator2</span><span class="special">>::</span><span class="identifier">value_type</span><span class="special">>)</span>
+ <span class="special">)</span>
+ <span class="special">(</span><span class="identifier">ResultIterator</span><span class="special">)</span> <span class="special">(</span><span class="identifier">mytransform</span><span class="special">)</span> <span class="special">(</span>
+ <span class="special">(</span><span class="identifier">Iterator1</span><span class="special">)</span> <span class="identifier">first1</span><span class="special">,</span>
+ <span class="special">(</span><span class="identifier">Iterator1</span><span class="special">)</span> <span class="identifier">last1</span><span class="special">,</span>
+ <span class="special">(</span><span class="identifier">Iterator2</span><span class="special">)</span> <span class="identifier">first2</span><span class="special">,</span>
+ <span class="special">(</span><span class="identifier">ResultIterator</span><span class="special">)</span> <span class="identifier">result</span><span class="special">,</span>
+ <span class="special">(</span><span class="identifier">Function</span><span class="special">)</span> <span class="identifier">function</span>
+ <span class="special">)</span>
+ <span class="comment">// precondition: [first1, last1) is valid</span>
+ <span class="comment">// precondition: [first2, first2 + (last1 - first1)) is valid</span>
+ <span class="comment">// precondition: result is not an iterator within [first1 + 1, last1)</span>
+ <span class="comment">// or [first2 + 1, first2 + (last1 - first1))</span>
+ <span class="comment">// precondition: [result, result + (last1 - first1)) is valid</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">transform</span><span class="special">(</span><span class="identifier">first1</span><span class="special">,</span> <span class="identifier">last1</span><span class="special">,</span> <span class="identifier">first2</span><span class="special">,</span> <span class="identifier">result</span><span class="special">,</span> <span class="identifier">function</span><span class="special">);</span>
+<span class="special">}</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">v</span><span class="special">(</span><span class="number">3</span><span class="special">);</span>
+ <span class="identifier">v</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span> <span class="identifier">v</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">=</span> <span class="number">2</span><span class="special">;</span> <span class="identifier">v</span><span class="special">[</span><span class="number">2</span><span class="special">]</span> <span class="special">=</span> <span class="number">3</span><span class="special">;</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">w</span><span class="special">(</span><span class="number">3</span><span class="special">);</span>
+ <span class="identifier">w</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="number">10</span><span class="special">;</span> <span class="identifier">w</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">=</span> <span class="number">20</span><span class="special">;</span> <span class="identifier">w</span><span class="special">[</span><span class="number">2</span><span class="special">]</span> <span class="special">=</span> <span class="number">30</span><span class="special">;</span>
+
+ <span class="identifier">mytransform</span><span class="special">(</span><span class="identifier">v</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">v</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">w</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">v</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">plus</span><span class="special"><</span><span class="keyword">int</span><span class="special">>());</span>
+
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">v</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="number">11</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">v</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">==</span> <span class="number">22</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">v</span><span class="special">[</span><span class="number">2</span><span class="special">]</span> <span class="special">==</span> <span class="number">33</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__n2081___count__generic_counting_algorithm"></a><a class="link" href="examples.html#contract__.examples.__n2081___count__generic_counting_algorithm" title="[N2081] Count: Generic counting algorithm">[N2081]
+ Count: Generic counting algorithm</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: count.cpp</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">concept_check</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">vector</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">Iterator</span> <span class="special">)</span>
+ <span class="keyword">requires</span><span class="special">(</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">>,</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">EqualityComparable</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">>,</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">EqualityComparable</span><span class="special"><</span>
+ <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">>::</span><span class="identifier">value_type</span><span class="special">></span>
+ <span class="special">)</span>
+ <span class="special">(</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">>::</span><span class="identifier">difference_type</span><span class="special">)</span> <span class="special">(</span><span class="identifier">mycount</span><span class="special">)</span> <span class="special">(</span>
+ <span class="special">(</span><span class="identifier">Iterator</span><span class="special">)</span> <span class="identifier">first</span><span class="special">,</span> <span class="special">(</span><span class="identifier">Iterator</span><span class="special">)</span> <span class="identifier">last</span><span class="special">,</span>
+ <span class="special">(</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">>::</span><span class="identifier">value_type</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="comment">// precondition: range [first, last) is valid</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span> <span class="identifier">result</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">>::</span><span class="identifier">difference_type</span> <span class="identifier">result</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
+ <span class="identifier">CONTRACT_LOOP</span><span class="special">(</span> <span class="keyword">while</span><span class="special">(</span><span class="identifier">first</span> <span class="special">!=</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">)</span> <span class="special">{</span> <span class="comment">// OK: Iterator has `==`.</span>
+ <span class="identifier">CONTRACT_LOOP_VARIANT_TPL</span><span class="special">(</span>
+ <span class="keyword">const</span><span class="special">(</span> <span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span> <span class="special">)</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">)</span> <span class="special">)</span>
+ <span class="keyword">if</span><span class="special">(*</span><span class="identifier">first</span> <span class="special">==</span> <span class="identifier">value</span><span class="special">)</span> <span class="comment">// OK: Value is equality comparable.</span>
+ <span class="special">++</span><span class="identifier">result</span><span class="special">;</span>
+ <span class="special">++</span><span class="identifier">first</span><span class="special">;</span> <span class="comment">// OK: Iterator is input iterator.</span>
+ <span class="special">}</span>
+ <span class="keyword">return</span> <span class="identifier">result</span><span class="special">;</span> <span class="comment">// OK: Input iterator difference is copy constructible.</span>
+<span class="special">}</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">v</span><span class="special">(</span><span class="number">3</span><span class="special">);</span>
+ <span class="identifier">v</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="special">-</span><span class="number">1</span><span class="special">;</span> <span class="identifier">v</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">v</span><span class="special">[</span><span class="number">2</span><span class="special">]</span> <span class="special">=</span> <span class="special">-</span><span class="number">1</span><span class="special">;</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">mycount</span><span class="special">(</span><span class="identifier">v</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">v</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="special">-</span><span class="number">1</span><span class="special">)</span> <span class="special">==</span> <span class="number">2</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__n2081___convert__conversion_between_two_types"></a><a class="link" href="examples.html#contract__.examples.__n2081___convert__conversion_between_two_types" title="[N2081] Convert: Conversion between two types">[N2081]
+ Convert: Conversion between two types</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: convert.hpp</span>
+<span class="preprocessor">#ifndef</span> <span class="identifier">CONVERT_HPP_</span>
+<span class="preprocessor">#define</span> <span class="identifier">CONVERT_HPP_</span>
+
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">concept_check</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">To</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">From</span> <span class="special">)</span>
+ <span class="keyword">requires</span><span class="special">(</span> <span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">Convertible</span><span class="special"><</span><span class="identifier">From</span><span class="special">,</span> <span class="identifier">To</span><span class="special">>)</span> <span class="special">)</span>
+ <span class="special">(</span><span class="identifier">To</span><span class="special">)</span> <span class="special">(</span><span class="identifier">convert</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">From</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">from</span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">from</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="preprocessor">#endif</span> <span class="comment">// #include guard</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: convert.cpp</span>
+<span class="preprocessor">#include</span> <span class="string">"convert.hpp"</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">convert</span><span class="special"><</span><span class="keyword">int</span><span class="special">>(</span><span class="char">'\0'</span><span class="special">)</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: convert_error.cpp</span>
+<span class="preprocessor">#include</span> <span class="string">"convert.hpp"</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">convert</span><span class="special"><</span><span class="keyword">int</span><span class="special">*>(</span><span class="number">10</span><span class="special">);</span> <span class="comment">// Error: Correctly cannot convert type.</span>
+ <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__n2081___equal__generic_equality_comparison"></a><a class="link" href="examples.html#contract__.examples.__n2081___equal__generic_equality_comparison" title="[N2081] Equal: Generic equality comparison">[N2081]
+ Equal: Generic equality comparison</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: equal.hpp</span>
+<span class="preprocessor">#ifndef</span> <span class="identifier">EQUAL_HPP_</span>
+<span class="preprocessor">#define</span> <span class="identifier">EQUAL_HPP_</span>
+
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">concept_check</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">requires</span><span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">EqualityComparable</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">)</span>
+ <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">equal</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">left</span><span class="special">,</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">right</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span> <span class="identifier">result</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">left</span> <span class="special">==</span> <span class="identifier">right</span><span class="special">)</span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">left</span> <span class="special">==</span> <span class="identifier">right</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="preprocessor">#endif</span> <span class="comment">// #include guard</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: equal.cpp</span>
+<span class="preprocessor">#include</span> <span class="string">"equal.hpp"</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span><span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">equal</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="number">1</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">true</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">equal</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">false</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: equal_error.cpp</span>
+<span class="preprocessor">#include</span> <span class="string">"equal.hpp"</span>
+
+<span class="keyword">struct</span> <span class="identifier">num</span>
+<span class="special">{</span>
+ <span class="keyword">int</span> <span class="identifier">value</span><span class="special">;</span>
+ <span class="keyword">explicit</span> <span class="identifier">num</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span> <span class="special">)</span> <span class="special">:</span> <span class="identifier">value</span><span class="special">(</span><span class="identifier">v</span><span class="special">)</span> <span class="special">{}</span>
+<span class="special">};</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">equal</span><span class="special">(</span><span class="identifier">num</span><span class="special">(</span><span class="number">1</span><span class="special">),</span> <span class="identifier">num</span><span class="special">(</span><span class="number">1</span><span class="special">));</span> <span class="comment">// Compiler error.</span>
+ <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__n2081___less_equal__generic_less_than_or_equal_to_comparison"></a><a class="link" href="examples.html#contract__.examples.__n2081___less_equal__generic_less_than_or_equal_to_comparison" title="[N2081] Less Equal: Generic less-than or equal-to comparison">[N2081]
+ Less Equal: Generic less-than or equal-to comparison</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: less_eq.cpp</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">concept_check</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">requires</span><span class="special">(</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">EqualityComparable</span><span class="special"><</span><span class="identifier">T</span><span class="special">>,</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">LessThanComparable</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span>
+ <span class="special">)</span>
+ <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">less_eq</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="identifier">left</span><span class="special">,</span> <span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="identifier">right</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">left</span> <span class="special"><</span> <span class="identifier">right</span> <span class="special">||</span> <span class="identifier">left</span> <span class="special">==</span> <span class="identifier">right</span><span class="special">)</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">left</span> <span class="special"><</span> <span class="identifier">right</span> <span class="special">||</span> <span class="identifier">left</span> <span class="special">==</span> <span class="identifier">right</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">less_eq</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">true</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">less_eq</span><span class="special">(</span><span class="number">2</span><span class="special">,</span> <span class="number">1</span><span class="special">)</span> <span class="special">==</span> <span class="keyword">false</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__n2081___de_ref__generic_iterator_dereferencing"></a><a class="link" href="examples.html#contract__.examples.__n2081___de_ref__generic_iterator_dereferencing" title="[N2081] De-Ref: Generic iterator dereferencing">[N2081]
+ De-Ref: Generic iterator dereferencing</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: deref.cpp</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">/</span><span class="identifier">has_equal_to</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">concept_check</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">vector</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">Iterator</span> <span class="special">)</span>
+ <span class="keyword">requires</span><span class="special">(</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">>,</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">CopyConstructible</span><span class="special"><</span>
+ <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">>::</span><span class="identifier">value_type</span><span class="special">></span>
+ <span class="special">)</span>
+ <span class="special">(</span><span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">>::</span><span class="identifier">value_type</span><span class="special">)</span> <span class="special">(</span><span class="identifier">deref</span><span class="special">)</span> <span class="special">(</span>
+ <span class="special">(</span><span class="identifier">Iterator</span><span class="special">)</span> <span class="identifier">iterator</span> <span class="special">)</span>
+ <span class="comment">// precondition: iterator is non-singular</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">iterator</span><span class="special">,</span> <span class="keyword">requires</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span>
+ <span class="keyword">typename</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">InputIterator</span><span class="special"><</span><span class="identifier">Iterator</span><span class="special">>::</span><span class="identifier">value_type</span><span class="special">>::</span><span class="identifier">value</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="special">*</span><span class="identifier">iterator</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">v</span><span class="special">(</span><span class="number">1</span><span class="special">);</span>
+ <span class="identifier">v</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="number">123</span><span class="special">;</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">deref</span><span class="special">(</span><span class="identifier">v</span><span class="special">.</span><span class="identifier">begin</span><span class="special">())</span> <span class="special">==</span> <span class="number">123</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__n2081___min__generic_minimum_algorithm"></a><a class="link" href="examples.html#contract__.examples.__n2081___min__generic_minimum_algorithm" title="[N2081] Min: Generic minimum algorithm">[N2081]
+ Min: Generic minimum algorithm</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: min.hpp</span>
+<span class="preprocessor">#ifndef</span> <span class="identifier">MIN_HPP_</span>
+<span class="preprocessor">#define</span> <span class="identifier">MIN_HPP_</span>
+
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">/</span><span class="identifier">has_equal_to</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">concept_check</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span> <span class="keyword">requires</span><span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">LessThanComparable</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">)</span>
+ <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">(</span><span class="identifier">min</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">x</span><span class="special">,</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">y</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">x</span> <span class="special"><</span> <span class="identifier">y</span> <span class="special">?</span> <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">x</span> <span class="special">:</span> <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">y</span><span class="special">,</span>
+ <span class="keyword">requires</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">x</span> <span class="special"><</span> <span class="identifier">y</span> <span class="special">?</span> <span class="identifier">x</span> <span class="special">:</span> <span class="identifier">y</span><span class="special">;</span> <span class="comment">// OK: T is less than comparable `<`.</span>
+<span class="special">}</span>
+
+<span class="preprocessor">#endif</span> <span class="comment">// #include guard</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: min.cpp</span>
+<span class="preprocessor">#include</span> <span class="string">"min.hpp"</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">min</span><span class="special">(</span><span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">)</span> <span class="special">==</span> <span class="number">1</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">min</span><span class="special">(-</span><span class="number">1</span><span class="special">,</span> <span class="special">-</span><span class="number">2</span><span class="special">)</span> <span class="special">==</span> <span class="special">-</span><span class="number">2</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: min_error.cpp</span>
+<span class="preprocessor">#include</span> <span class="string">"min.hpp"</span>
+
+<span class="keyword">struct</span> <span class="identifier">num</span>
+<span class="special">{</span>
+ <span class="keyword">int</span> <span class="identifier">value</span><span class="special">;</span>
+ <span class="keyword">explicit</span> <span class="identifier">num</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span> <span class="special">)</span> <span class="special">:</span> <span class="identifier">value</span><span class="special">(</span><span class="identifier">v</span><span class="special">)</span> <span class="special">{}</span>
+<span class="special">};</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">min</span><span class="special">(</span><span class="identifier">num</span><span class="special">(</span><span class="number">1</span><span class="special">),</span> <span class="identifier">num</span><span class="special">(</span><span class="number">2</span><span class="special">));</span> <span class="comment">// Compiler error: Fail concept requirements.</span>
+ <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__meyer97___stack4__comparison_with_eiffel_syntax"></a><a class="link" href="examples.html#contract__.examples.__meyer97___stack4__comparison_with_eiffel_syntax" title="[Meyer97] Stack4: Comparison with Eiffel syntax">[Meyer97]
+ Stack4: Comparison with Eiffel syntax</a>
+</h3></div></div></div>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>
+ <p>
+ This Library (C++03)
+ </p>
+ </th>
+<th>
+ <p>
+ The Eiffel Programming Language
+ </p>
+ </th>
+</tr></thead>
+<tbody>
+<tr>
+<td>
+ <p>
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="comment">// File: stack4.hpp</span>
+<span class="preprocessor">#ifndef</span> <span class="identifier">STACK4_HPP_</span>
+<span class="preprocessor">#define</span> <span class="identifier">STACK4_HPP_</span>
+
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="comment">// Specification.</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// Dispenser with LIFO access policy and a fixed max capacity.</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">stack4</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span>
+ <span class="identifier">count</span><span class="special">()</span> <span class="special">>=</span> <span class="number">0</span><span class="special">,</span> <span class="comment">// count non negative</span>
+ <span class="identifier">count</span><span class="special">()</span> <span class="special"><=</span> <span class="identifier">capacity</span><span class="special">(),</span> <span class="comment">// count bounded</span>
+ <span class="identifier">empty</span><span class="special">()</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">)</span> <span class="comment">// empty if no elements</span>
+ <span class="special">)</span>
+
+ <span class="comment">// Initialization.</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span> <span class="comment">// Allocate stack for a maximum of n elements.</span>
+ <span class="keyword">public</span> <span class="keyword">explicit</span> <span class="special">(</span><span class="identifier">stack4</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="keyword">const</span> <span class="keyword">int</span><span class="special">&)</span> <span class="identifier">n</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span>
+ <span class="identifier">n</span> <span class="special">>=</span> <span class="number">0</span> <span class="comment">// non negative capacity</span>
+ <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">n</span> <span class="comment">// capacity set</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span> <span class="comment">// Deferred body definition (see bottom).</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span> <span class="comment">// Deep copy.</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">stack4</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">stack4</span><span class="special">&)</span> <span class="identifier">right</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">(),</span>
+ <span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span>
+ <span class="comment">// all items equal right's items one by one</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Deep assignment.</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">stack4</span><span class="special">&)</span> <span class="keyword">operator</span><span class="special">(=)(</span><span class="identifier">assign</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">stack4</span><span class="special">&)</span> <span class="identifier">right</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">(),</span>
+ <span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span>
+ <span class="comment">// all items equal right's items one by one</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR_TPL</span><span class="special">(</span> <span class="comment">// Destroy this stack.</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">stack4</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="comment">// Access.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Max number of stack elements.</span>
+ <span class="keyword">public</span> <span class="keyword">int</span> <span class="special">(</span><span class="identifier">capacity</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Number of stack elements.</span>
+ <span class="keyword">public</span> <span class="keyword">int</span> <span class="special">(</span><span class="identifier">count</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Top element.</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&)</span> <span class="special">(</span><span class="identifier">item</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">precondition</span><span class="special">(</span>
+ <span class="keyword">not</span> <span class="identifier">empty</span><span class="special">()</span> <span class="comment">// not empty (i.e., count > 0)</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="comment">// Status report.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Is stack empty?</span>
+ <span class="keyword">public</span> <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">empty</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">)</span> <span class="comment">// empty definition</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Is stack full?</span>
+ <span class="keyword">public</span> <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">full</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">capacity</span><span class="special">())</span> <span class="comment">// full definition</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="comment">// Element change.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Add x on top.</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">put</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&)</span> <span class="identifier">x</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span>
+ <span class="keyword">not</span> <span class="identifier">full</span><span class="special">()</span> <span class="comment">// not full</span>
+ <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_count</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">count</span><span class="special">(),</span>
+ <span class="keyword">not</span> <span class="identifier">empty</span><span class="special">(),</span> <span class="comment">// not empty</span>
+ <span class="identifier">item</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">x</span><span class="special">,</span> <span class="comment">// added to top</span>
+ <span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_count</span> <span class="special">+</span> <span class="number">1</span> <span class="comment">// one more item</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Remove top item.</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">remove</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span>
+ <span class="keyword">not</span> <span class="identifier">empty</span><span class="special">()</span> <span class="comment">// not empty (i.e., count > 0)</span>
+ <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_count</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">count</span><span class="special">(),</span>
+ <span class="keyword">not</span> <span class="identifier">full</span><span class="special">(),</span> <span class="comment">// not full</span>
+ <span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_count</span> <span class="special">-</span> <span class="number">1</span> <span class="comment">// one fewer item</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="keyword">int</span> <span class="identifier">capacity_</span><span class="special">;</span>
+ <span class="keyword">private</span><span class="special">:</span> <span class="keyword">int</span> <span class="identifier">count_</span><span class="special">;</span>
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">T</span><span class="special">*</span> <span class="identifier">representation_</span><span class="special">;</span> <span class="comment">// Using C-style array.</span>
+<span class="special">};</span>
+
+<span class="comment">// Implementation.</span>
+
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">></span>
+<span class="identifier">CONTRACT_CONSTRUCTOR_BODY</span><span class="special">(</span><span class="identifier">stack4</span><span class="special"><</span><span class="identifier">T</span><span class="special">>,</span> <span class="identifier">stack4</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">const</span> <span class="keyword">int</span><span class="special">&</span> <span class="identifier">n</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">capacity_</span> <span class="special">=</span> <span class="identifier">n</span><span class="special">;</span>
+ <span class="identifier">count_</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
+ <span class="identifier">representation_</span> <span class="special">=</span> <span class="keyword">new</span> <span class="identifier">T</span><span class="special">[</span><span class="identifier">n</span><span class="special">];</span>
+<span class="special">}</span>
+
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">></span>
+<span class="identifier">CONTRACT_CONSTRUCTOR_BODY</span><span class="special">(</span><span class="identifier">stack4</span><span class="special"><</span><span class="identifier">T</span><span class="special">>,</span> <span class="identifier">stack4</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">const</span> <span class="identifier">stack4</span><span class="special">&</span> <span class="identifier">right</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">capacity_</span> <span class="special">=</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">capacity_</span><span class="special">;</span>
+ <span class="identifier">count_</span> <span class="special">=</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">count_</span><span class="special">;</span>
+ <span class="identifier">representation_</span> <span class="special">=</span> <span class="keyword">new</span> <span class="identifier">T</span><span class="special">[</span><span class="identifier">right</span><span class="special">.</span><span class="identifier">capacity_</span><span class="special">];</span>
+ <span class="keyword">for</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">count_</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span>
+ <span class="identifier">representation_</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">representation_</span><span class="special">[</span><span class="identifier">i</span><span class="special">];</span>
+<span class="special">}</span>
+
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">></span>
+<span class="identifier">stack4</span><span class="special"><</span><span class="identifier">T</span><span class="special">>&</span> <span class="identifier">stack4</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="keyword">operator</span><span class="special">(=)(</span><span class="identifier">assign</span><span class="special">))</span> <span class="special">(</span>
+ <span class="keyword">const</span> <span class="identifier">stack4</span><span class="special">&</span> <span class="identifier">right</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="keyword">delete</span><span class="special">[]</span> <span class="identifier">representation_</span><span class="special">;</span>
+ <span class="identifier">capacity_</span> <span class="special">=</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">capacity_</span><span class="special">;</span>
+ <span class="identifier">count_</span> <span class="special">=</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">count_</span><span class="special">;</span>
+ <span class="identifier">representation_</span> <span class="special">=</span> <span class="keyword">new</span> <span class="identifier">T</span><span class="special">[</span><span class="identifier">right</span><span class="special">.</span><span class="identifier">capacity_</span><span class="special">];</span>
+ <span class="keyword">for</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">count_</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span>
+ <span class="identifier">representation_</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">representation_</span><span class="special">[</span><span class="identifier">i</span><span class="special">];</span>
+ <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">></span>
+<span class="identifier">CONTRACT_DESTRUCTOR_BODY</span><span class="special">(</span><span class="identifier">stack4</span><span class="special"><</span><span class="identifier">T</span><span class="special">>,</span> <span class="special">~</span><span class="identifier">stack4</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="keyword">delete</span><span class="special">[]</span> <span class="identifier">representation_</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">></span>
+<span class="keyword">int</span> <span class="identifier">stack4</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+<span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">capacity_</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">></span>
+<span class="keyword">int</span> <span class="identifier">stack4</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">count</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+<span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">count_</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">></span>
+<span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">stack4</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">item</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+<span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">representation_</span><span class="special">[</span><span class="identifier">count</span><span class="special">()</span> <span class="special">-</span> <span class="number">1</span><span class="special">];</span>
+<span class="special">}</span>
+
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">></span>
+<span class="keyword">bool</span> <span class="identifier">stack4</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">empty</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+<span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">></span>
+<span class="keyword">bool</span> <span class="identifier">stack4</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">full</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+<span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">capacity</span><span class="special">();</span>
+<span class="special">}</span>
+
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">></span>
+<span class="keyword">void</span> <span class="identifier">stack4</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">put</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">const</span> <span class="identifier">T</span><span class="special">&</span> <span class="identifier">x</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">representation_</span><span class="special">[</span><span class="identifier">count_</span><span class="special">++]</span> <span class="special">=</span> <span class="identifier">x</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">></span>
+<span class="keyword">void</span> <span class="identifier">stack4</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">remove</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="special">--</span><span class="identifier">count_</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="preprocessor">#endif</span> <span class="comment">// #include guard</span>
+</pre>
+<p>
+ </p>
+ </td>
+<td>
+ <p>
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="special">--</span> <span class="identifier">File</span><span class="special">:</span> <span class="identifier">stack4</span><span class="special">.</span><span class="identifier">e</span>
+<span class="special">--</span> <span class="identifier">Extra</span> <span class="identifier">spaces</span><span class="special">,</span> <span class="identifier">newlines</span><span class="special">,</span> <span class="identifier">etc</span> <span class="identifier">used</span> <span class="identifier">to</span> <span class="identifier">align</span> <span class="identifier">text</span> <span class="identifier">with</span> <span class="keyword">this</span> <span class="identifier">library</span> <span class="identifier">code</span><span class="special">.</span>
+
+
+
+
+
+
+<span class="identifier">indexing</span>
+ <span class="identifier">destription</span><span class="special">:</span> <span class="string">"Dispenser with LIFO access policy and a fixed max capacity."</span>
+<span class="keyword">class</span> <span class="identifier">interface</span> <span class="identifier">STACK4</span><span class="special">[</span><span class="identifier">G</span><span class="special">]</span> <span class="identifier">creation</span> <span class="identifier">make</span>
+
+<span class="keyword">invariant</span>
+ <span class="identifier">count_non_negative</span><span class="special">:</span> <span class="identifier">count</span> <span class="special">>=</span> <span class="number">0</span>
+ <span class="identifier">count_bounded</span><span class="special">:</span> <span class="identifier">count</span> <span class="special"><=</span> <span class="identifier">capacity</span>
+ <span class="identifier">empty_if_no_elements</span><span class="special">:</span> <span class="identifier">empty</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">count</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span>
+
+
+<span class="identifier">feature</span> <span class="special">--</span> <span class="identifier">Initialization</span><span class="special">.</span>
+
+ <span class="special">--</span> <span class="identifier">Allocate</span> <span class="identifier">stack</span> <span class="keyword">for</span> <span class="identifier">a</span> <span class="identifier">maximum</span> <span class="identifier">of</span> <span class="identifier">n</span> <span class="identifier">elements</span><span class="special">.</span>
+ <span class="identifier">make</span> <span class="special">(</span> <span class="identifier">n</span> <span class="special">:</span> <span class="identifier">INTEGER</span> <span class="special">)</span> <span class="identifier">is</span>
+ <span class="identifier">require</span>
+ <span class="identifier">non_negative_capacity</span><span class="special">:</span> <span class="identifier">n</span> <span class="special">>=</span> <span class="number">0</span>
+
+ <span class="identifier">ensure</span>
+ <span class="identifier">capacity_set</span><span class="special">:</span> <span class="identifier">capacity</span> <span class="special">=</span> <span class="identifier">n</span>
+
+ <span class="identifier">end</span>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<span class="identifier">feature</span> <span class="special">--</span> <span class="identifier">Access</span><span class="special">.</span>
+
+ <span class="special">--</span> <span class="identifier">Max</span> <span class="identifier">number</span> <span class="identifier">of</span> <span class="identifier">stack</span> <span class="identifier">elements</span><span class="special">.</span>
+ <span class="identifier">capacity</span> <span class="special">:</span> <span class="identifier">INTEGER</span>
+
+
+ <span class="special">--</span> <span class="identifier">Number</span> <span class="identifier">of</span> <span class="identifier">stack</span> <span class="identifier">elements</span><span class="special">.</span>
+ <span class="identifier">count</span> <span class="special">:</span> <span class="identifier">INTEGER</span>
+
+
+ <span class="special">--</span> <span class="identifier">Top</span> <span class="identifier">element</span>
+ <span class="identifier">item</span> <span class="special">:</span> <span class="identifier">G</span> <span class="identifier">is</span>
+ <span class="identifier">require</span>
+ <span class="identifier">not_empty</span><span class="special">:</span> <span class="keyword">not</span> <span class="identifier">empty</span> <span class="special">--</span> <span class="identifier">i</span><span class="special">.</span><span class="identifier">e</span><span class="special">.,</span> <span class="identifier">count</span> <span class="special">></span> <span class="number">0</span>
+
+ <span class="identifier">end</span>
+
+<span class="identifier">feature</span> <span class="special">--</span> <span class="identifier">Status</span> <span class="identifier">report</span><span class="special">.</span>
+
+ <span class="special">--</span> <span class="identifier">Is</span> <span class="identifier">stack</span> <span class="identifier">empty</span><span class="special">?</span>
+ <span class="identifier">empty</span> <span class="special">:</span> <span class="identifier">BOOLEAN</span> <span class="identifier">is</span>
+ <span class="identifier">ensure</span>
+
+ <span class="identifier">empty_definition</span><span class="special">:</span> <span class="identifier">result</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">count</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span>
+
+ <span class="identifier">end</span>
+
+ <span class="special">--</span> <span class="identifier">Is</span> <span class="identifier">stack</span> <span class="identifier">full</span><span class="special">?</span>
+ <span class="identifier">full</span> <span class="special">:</span> <span class="identifier">BOOLEAN</span> <span class="identifier">is</span>
+ <span class="identifier">ensure</span>
+
+ <span class="identifier">full_definition</span><span class="special">:</span> <span class="identifier">result</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">count</span> <span class="special">=</span> <span class="identifier">capacity</span><span class="special">)</span>
+
+ <span class="identifier">end</span>
+
+<span class="identifier">feature</span> <span class="special">--</span> <span class="identifier">Element</span> <span class="identifier">change</span><span class="special">.</span>
+
+ <span class="special">--</span> <span class="identifier">Add</span> <span class="identifier">x</span> <span class="identifier">on</span> <span class="identifier">top</span><span class="special">.</span>
+ <span class="identifier">put</span> <span class="special">(</span> <span class="identifier">x</span> <span class="special">:</span> <span class="identifier">G</span> <span class="special">)</span> <span class="identifier">is</span>
+ <span class="identifier">require</span>
+ <span class="identifier">not_full</span><span class="special">:</span> <span class="keyword">not</span> <span class="identifier">full</span>
+
+ <span class="identifier">ensure</span>
+
+ <span class="identifier">not_empty</span><span class="special">:</span> <span class="keyword">not</span> <span class="identifier">empty</span>
+ <span class="identifier">added_to_top</span><span class="special">:</span> <span class="identifier">item</span> <span class="special">=</span> <span class="identifier">x</span>
+ <span class="identifier">one_more_item</span><span class="special">:</span> <span class="identifier">count</span> <span class="special">=</span> <span class="identifier">old</span> <span class="identifier">count</span> <span class="special">+</span> <span class="number">1</span>
+
+ <span class="identifier">end</span>
+
+ <span class="special">--</span> <span class="identifier">Remove</span> <span class="identifier">top</span> <span class="identifier">element</span><span class="special">.</span>
+ <span class="identifier">remove</span> <span class="identifier">is</span>
+ <span class="identifier">require</span>
+ <span class="identifier">not_empty</span><span class="special">:</span> <span class="keyword">not</span> <span class="identifier">empty</span> <span class="special">--</span> <span class="identifier">i</span><span class="special">.</span><span class="identifier">e</span><span class="special">.,</span> <span class="identifier">count</span> <span class="special">></span> <span class="number">0</span>
+
+ <span class="identifier">ensure</span>
+
+ <span class="identifier">not_full</span><span class="special">:</span> <span class="keyword">not</span> <span class="identifier">full</span>
+ <span class="identifier">one_fewer_item</span><span class="special">:</span> <span class="identifier">count</span> <span class="special">=</span> <span class="identifier">old</span> <span class="identifier">count</span> <span class="special">-</span> <span class="number">1</span>
+
+ <span class="identifier">end</span>
+
+
+
+
+<span class="identifier">end</span> <span class="special">--</span> <span class="keyword">class</span> <span class="identifier">interface</span> <span class="identifier">STACK4</span>
+</pre>
+<p>
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="comment">// File: stack4_main.cpp</span>
+<span class="preprocessor">#include</span> <span class="string">"stack4.hpp"</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">stack4</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">s</span><span class="special">(</span><span class="number">3</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="number">3</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span>
+ <span class="identifier">s</span><span class="special">.</span><span class="identifier">put</span><span class="special">(</span><span class="number">123</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="keyword">not</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">empty</span><span class="special">());</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="keyword">not</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">full</span><span class="special">());</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">item</span><span class="special">()</span> <span class="special">==</span> <span class="number">123</span><span class="special">);</span>
+ <span class="identifier">s</span><span class="special">.</span><span class="identifier">remove</span><span class="special">();</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">empty</span><span class="special">());</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+ </td>
+<td>
+ </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__meyer97___stack3__error_codes_instead_of_preconditions"></a><a class="link" href="examples.html#contract__.examples.__meyer97___stack3__error_codes_instead_of_preconditions" title="[Meyer97] Stack3: Error codes instead of preconditions">[Meyer97]
+ Stack3: Error codes instead of preconditions</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: stack3.cpp</span>
+<span class="preprocessor">#include</span> <span class="string">"stack4.hpp"</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// Dispenser LIFO and max capacity using error codes.</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">stack3</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="comment">// no class invariant</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">enum</span> <span class="identifier">Error</span> <span class="special">{</span> <span class="comment">// Error codes.</span>
+ <span class="identifier">NO_ERROR</span> <span class="special">=</span> <span class="number">0</span><span class="special">,</span>
+ <span class="identifier">OVERFLOW_ERROR</span><span class="special">,</span>
+ <span class="identifier">UNDERFLOW_ERROR</span><span class="special">,</span>
+ <span class="identifier">SIZE_ERROR</span>
+ <span class="special">};</span>
+
+ <span class="comment">// Initialization.</span>
+
+ <span class="comment">// Create stack for max of n elements, if n < 0 set error (no precondition).</span>
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">stack3</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="keyword">const</span> <span class="keyword">int</span><span class="special">&)</span> <span class="identifier">n</span><span class="special">,</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&)</span> <span class="identifier">none</span><span class="special">,</span> <span class="keyword">default</span> <span class="identifier">T</span><span class="special">()</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">bool</span><span class="special">(</span><span class="identifier">n</span> <span class="special"><</span> <span class="number">0</span><span class="special">)</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">error</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">SIZE_ERROR</span><span class="special">),</span> <span class="comment">// error if impossible</span>
+ <span class="keyword">bool</span><span class="special">(</span><span class="identifier">n</span> <span class="special">>=</span> <span class="number">0</span><span class="special">)</span> <span class="special">==</span> <span class="special">!</span><span class="identifier">error</span><span class="special">(),</span> <span class="comment">// no error if possible</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="keyword">bool</span><span class="special">(!</span><span class="identifier">error</span><span class="special">()))</span> <span class="special">(</span> <span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">n</span> <span class="special">)</span> <span class="comment">// created if no error</span>
+ <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">none_</span><span class="special">(</span><span class="identifier">none</span><span class="special">),</span> <span class="identifier">representation_</span><span class="special">(</span><span class="number">0</span><span class="special">),</span> <span class="identifier">error_</span><span class="special">(</span><span class="identifier">NO_ERROR</span><span class="special">)</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">n</span> <span class="special">>=</span> <span class="number">0</span><span class="special">)</span> <span class="identifier">representation_</span> <span class="special">=</span> <span class="identifier">stack4</span><span class="special"><</span><span class="identifier">T</span><span class="special">>(</span><span class="identifier">n</span><span class="special">);</span>
+ <span class="keyword">else</span> <span class="identifier">error_</span> <span class="special">=</span> <span class="identifier">SIZE_ERROR</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR_TPL</span><span class="special">(</span> <span class="comment">// Destroy stack.</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">stack3</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="comment">// Access.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Max number of stack elements.</span>
+ <span class="keyword">public</span> <span class="keyword">int</span> <span class="special">(</span><span class="identifier">capacity</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">representation_</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Number of stack elements.</span>
+ <span class="keyword">public</span> <span class="keyword">int</span> <span class="special">(</span><span class="identifier">count</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">representation_</span><span class="special">.</span><span class="identifier">count</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="comment">// Top element if present, otherwise set error (no precondition).</span>
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&)</span> <span class="special">(</span><span class="identifier">item</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="identifier">empty</span><span class="special">()</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">error</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">UNDERFLOW_ERROR</span><span class="special">),</span> <span class="comment">// error if impossible</span>
+ <span class="keyword">bool</span><span class="special">(!</span><span class="identifier">empty</span><span class="special">()</span> <span class="special">==</span> <span class="special">!</span><span class="identifier">error</span><span class="special">())</span> <span class="comment">// no error if possible</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">if</span><span class="special">(!</span><span class="identifier">empty</span><span class="special">())</span> <span class="special">{</span>
+ <span class="identifier">error_</span> <span class="special">=</span> <span class="identifier">NO_ERROR</span><span class="special">;</span>
+ <span class="keyword">return</span> <span class="identifier">representation_</span><span class="special">.</span><span class="identifier">item</span><span class="special">();</span>
+ <span class="special">}</span> <span class="keyword">else</span> <span class="special">{</span>
+ <span class="identifier">error_</span> <span class="special">=</span> <span class="identifier">UNDERFLOW_ERROR</span><span class="special">;</span>
+ <span class="keyword">return</span> <span class="identifier">none_</span><span class="special">;</span>
+ <span class="special">}</span>
+ <span class="special">}</span>
+
+ <span class="comment">// Status report.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Error indicator set by various operations.</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">Error</span><span class="special">)</span> <span class="special">(</span><span class="identifier">error</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">error_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Is stack empty?</span>
+ <span class="keyword">public</span> <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">empty</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">representation_</span><span class="special">.</span><span class="identifier">empty</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Is stack full?</span>
+ <span class="keyword">public</span> <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">full</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">representation_</span><span class="special">.</span><span class="identifier">full</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="comment">// Element change.</span>
+
+ <span class="comment">// Add x to top if capacity left, otherwise set error (no precondition).</span>
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">put</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">T</span><span class="special">&)</span> <span class="identifier">x</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_full</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">full</span><span class="special">(),</span>
+ <span class="keyword">auto</span> <span class="identifier">old_count</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">count</span><span class="special">(),</span>
+ <span class="identifier">old_full</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">error</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">OVERFLOW_ERROR</span><span class="special">),</span> <span class="comment">// error if impossible</span>
+ <span class="keyword">not</span> <span class="identifier">old_full</span> <span class="special">==</span> <span class="keyword">not</span> <span class="identifier">error</span><span class="special">(),</span> <span class="comment">// no error if possible</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="keyword">not</span> <span class="identifier">error</span><span class="special">())</span> <span class="special">(</span>
+ <span class="keyword">not</span> <span class="identifier">empty</span><span class="special">(),</span> <span class="comment">// not empty if no error</span>
+ <span class="identifier">item</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">x</span><span class="special">,</span> <span class="comment">// added to top is no error</span>
+ <span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_count</span> <span class="special">+</span> <span class="number">1</span> <span class="comment">// one more item if no error</span>
+ <span class="special">)</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">full</span><span class="special">())</span> <span class="special">{</span>
+ <span class="identifier">error_</span> <span class="special">=</span> <span class="identifier">OVERFLOW_ERROR</span><span class="special">;</span>
+ <span class="special">}</span> <span class="keyword">else</span> <span class="special">{</span>
+ <span class="identifier">representation_</span><span class="special">.</span><span class="identifier">put</span><span class="special">(</span><span class="identifier">x</span><span class="special">);</span>
+ <span class="identifier">error_</span> <span class="special">=</span> <span class="identifier">NO_ERROR</span><span class="special">;</span>
+ <span class="special">}</span>
+ <span class="special">}</span>
+
+ <span class="comment">// Remove top item if possible, otherwise set error to (no precondition).</span>
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">remove</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_empty</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">empty</span><span class="special">(),</span>
+ <span class="keyword">auto</span> <span class="identifier">old_count</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">count</span><span class="special">(),</span>
+ <span class="identifier">old_empty</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">error</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">UNDERFLOW_ERROR</span><span class="special">),</span> <span class="comment">// if impossible</span>
+ <span class="keyword">not</span> <span class="identifier">old_empty</span> <span class="special">==</span> <span class="keyword">not</span> <span class="identifier">error</span><span class="special">(),</span> <span class="comment">// no error if possible</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="keyword">not</span> <span class="identifier">error</span><span class="special">())</span> <span class="special">(</span>
+ <span class="keyword">not</span> <span class="identifier">full</span><span class="special">(),</span> <span class="comment">// not full is no error</span>
+ <span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_count</span> <span class="special">-</span> <span class="number">1</span> <span class="comment">// one fewer item if no error</span>
+ <span class="special">)</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">empty</span><span class="special">())</span> <span class="special">{</span>
+ <span class="identifier">error_</span> <span class="special">=</span> <span class="identifier">UNDERFLOW_ERROR</span><span class="special">;</span>
+ <span class="special">}</span> <span class="keyword">else</span> <span class="special">{</span>
+ <span class="identifier">representation_</span><span class="special">.</span><span class="identifier">remove</span><span class="special">();</span>
+ <span class="identifier">error_</span> <span class="special">=</span> <span class="identifier">NO_ERROR</span><span class="special">;</span>
+ <span class="special">}</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="keyword">const</span> <span class="identifier">T</span> <span class="identifier">none_</span><span class="special">;</span>
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">stack4</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">representation_</span><span class="special">;</span>
+ <span class="keyword">private</span><span class="special">:</span> <span class="keyword">mutable</span> <span class="identifier">Error</span> <span class="identifier">error_</span><span class="special">;</span> <span class="comment">// Mutable for logic constantness.</span>
+<span class="special">};</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">stack3</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">s</span><span class="special">(</span><span class="number">3</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="number">3</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">empty</span><span class="special">());</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="keyword">not</span> <span class="identifier">s</span><span class="special">.</span><span class="identifier">full</span><span class="special">());</span>
+ <span class="identifier">s</span><span class="special">.</span><span class="identifier">put</span><span class="special">(</span><span class="number">123</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">item</span><span class="special">()</span> <span class="special">==</span> <span class="number">123</span><span class="special">);</span>
+ <span class="identifier">s</span><span class="special">.</span><span class="identifier">remove</span><span class="special">();</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">empty</span><span class="special">());</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__meyer97___gcd__loop_variants_and_invariants_plus_comparison_with_eiffel_syntax"></a><a class="link" href="examples.html#contract__.examples.__meyer97___gcd__loop_variants_and_invariants_plus_comparison_with_eiffel_syntax" title="[Meyer97] GCD: Loop variants and invariants plus comparison with Eiffel syntax">[Meyer97]
+ GCD: Loop variants and invariants plus comparison with Eiffel syntax</a>
+</h3></div></div></div>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>
+ <p>
+ This Library (C++03)
+ </p>
+ </th>
+<th>
+ <p>
+ The Eiffel Programming Language
+ </p>
+ </th>
+</tr></thead>
+<tbody><tr>
+<td>
+ <p>
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="comment">// File: gcd.cpp</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">algorithm</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Great common divisor of given positive integers.</span>
+ <span class="keyword">int</span> <span class="special">(</span><span class="identifier">gcd</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">a</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">b</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span>
+ <span class="identifier">a</span> <span class="special">></span> <span class="number">0</span><span class="special">,</span> <span class="identifier">b</span> <span class="special">></span> <span class="number">0</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">int</span> <span class="identifier">x</span> <span class="special">=</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">y</span> <span class="special">=</span> <span class="identifier">b</span><span class="special">;</span>
+
+ <span class="identifier">CONTRACT_LOOP</span><span class="special">(</span> <span class="keyword">while</span><span class="special">(</span><span class="identifier">x</span> <span class="special">!=</span> <span class="identifier">y</span><span class="special">)</span> <span class="special">)</span> <span class="special">{</span> <span class="comment">// Loop contracted with a variant.</span>
+ <span class="comment">// Block invariant assert loop invariant.</span>
+ <span class="identifier">CONTRACT_BLOCK_INVARIANT</span><span class="special">(</span> <span class="keyword">const</span><span class="special">(</span> <span class="identifier">x</span> <span class="special">)</span> <span class="identifier">x</span> <span class="special">></span> <span class="number">0</span><span class="special">,</span> <span class="keyword">const</span><span class="special">(</span> <span class="identifier">y</span> <span class="special">)</span> <span class="identifier">y</span> <span class="special">></span> <span class="number">0</span> <span class="special">)</span>
+ <span class="comment">// Loop variant is non-negative and monotonically decreasing.</span>
+ <span class="identifier">CONTRACT_LOOP_VARIANT</span><span class="special">(</span> <span class="keyword">const</span><span class="special">(</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">y</span> <span class="special">)</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">max</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span> <span class="identifier">y</span><span class="special">)</span> <span class="special">)</span>
+
+ <span class="comment">// `x` and `y` have the same GCD as `a` and `b`. </span>
+
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">x</span> <span class="special">></span> <span class="identifier">y</span><span class="special">)</span> <span class="identifier">x</span> <span class="special">=</span> <span class="identifier">x</span> <span class="special">-</span> <span class="identifier">y</span><span class="special">;</span> <span class="keyword">else</span> <span class="identifier">y</span> <span class="special">=</span> <span class="identifier">y</span> <span class="special">-</span> <span class="identifier">x</span><span class="special">;</span>
+ <span class="special">}</span>
+ <span class="keyword">return</span> <span class="identifier">x</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">gcd</span><span class="special">(</span><span class="number">12</span><span class="special">,</span> <span class="number">18</span><span class="special">)</span> <span class="special">==</span> <span class="number">6</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">gcd</span><span class="special">(</span><span class="number">4</span><span class="special">,</span> <span class="number">14</span><span class="special">)</span> <span class="special">==</span> <span class="number">2</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+ </td>
+<td>
+ <p>
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="special">--</span> <span class="identifier">File</span><span class="special">:</span> <span class="identifier">gcd</span><span class="special">.</span><span class="identifier">e</span>
+<span class="special">--</span> <span class="identifier">Extra</span> <span class="identifier">spaces</span><span class="special">,</span> <span class="identifier">newlines</span><span class="special">,</span> <span class="identifier">etc</span> <span class="identifier">used</span> <span class="identifier">to</span> <span class="identifier">align</span> <span class="identifier">text</span> <span class="identifier">with</span> <span class="keyword">this</span> <span class="identifier">library</span> <span class="identifier">code</span><span class="special">.</span>
+
+
+
+<span class="special">--</span> <span class="identifier">Greatest</span> <span class="identifier">common</span> <span class="identifier">divisor</span> <span class="identifier">of</span> <span class="identifier">a</span> <span class="keyword">and</span> <span class="identifier">b</span><span class="special">.</span>
+<span class="identifier">gcd</span> <span class="special">(</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">b</span> <span class="special">:</span> <span class="identifier">INTEGER</span> <span class="special">)</span> <span class="special">:</span> <span class="identifier">INTEGER</span> <span class="identifier">is</span>
+ <span class="identifier">require</span>
+ <span class="identifier">a</span> <span class="special">></span> <span class="number">0</span><span class="special">;</span> <span class="identifier">b</span> <span class="special">></span> <span class="number">0</span>
+ <span class="identifier">local</span>
+ <span class="identifier">x</span><span class="special">,</span> <span class="identifier">y</span> <span class="special">:</span> <span class="identifier">INTEGER</span>
+ <span class="keyword">do</span>
+ <span class="identifier">from</span>
+ <span class="identifier">x</span> <span class="special">:=</span> <span class="identifier">a</span><span class="special">;</span> <span class="identifier">y</span> <span class="special">:=</span> <span class="identifier">b</span>
+ <span class="keyword">invariant</span>
+ <span class="identifier">x</span> <span class="special">></span> <span class="number">0</span><span class="special">;</span> <span class="identifier">y</span> <span class="special">></span> <span class="number">0</span>
+ <span class="identifier">variant</span>
+ <span class="identifier">x</span><span class="special">.</span><span class="identifier">max</span><span class="special">(</span><span class="identifier">y</span><span class="special">)</span>
+ <span class="identifier">until</span>
+ <span class="identifier">x</span> <span class="special">=</span> <span class="identifier">y</span>
+ <span class="identifier">loop</span>
+ <span class="keyword">if</span> <span class="identifier">x</span> <span class="special">></span> <span class="identifier">y</span> <span class="identifier">then</span> <span class="identifier">x</span> <span class="special">:=</span> <span class="identifier">x</span> <span class="special">-</span> <span class="identifier">y</span> <span class="keyword">else</span> <span class="identifier">y</span> <span class="special">:=</span> <span class="identifier">y</span> <span class="special">-</span> <span class="identifier">x</span> <span class="identifier">end</span>
+ <span class="identifier">end</span>
+ <span class="identifier">Result</span> <span class="special">:=</span> <span class="identifier">x</span>
+ <span class="identifier">end</span>
+</pre>
+<p>
+ </p>
+ </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__meyer97___max_array__nested_loop_variants_and_invariants"></a><a class="link" href="examples.html#contract__.examples.__meyer97___max_array__nested_loop_variants_and_invariants" title="[Meyer97] Max-Array: Nested loop variants and invariants">[Meyer97]
+ Max-Array: Nested loop variants and invariants</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: maxarray.cpp</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">algorithm</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">int</span> <span class="special">(</span><span class="identifier">maxarray</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="keyword">int</span> <span class="keyword">const</span><span class="special">*</span> <span class="keyword">const</span><span class="special">)</span> <span class="identifier">array</span><span class="special">,</span> <span class="special">(</span><span class="keyword">size_t</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">size</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span>
+ <span class="identifier">array</span><span class="special">,</span> <span class="comment">// array allocated</span>
+ <span class="identifier">size</span> <span class="special">>=</span> <span class="number">1</span> <span class="comment">// size in range</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">int</span> <span class="identifier">maxnow</span> <span class="special">=</span> <span class="identifier">array</span><span class="special">[</span><span class="number">0</span><span class="special">];</span>
+ <span class="identifier">CONTRACT_LOOP</span><span class="special">(</span> <span class="keyword">for</span><span class="special">(</span><span class="keyword">size_t</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="special">(</span><span class="identifier">size</span> <span class="special">-</span> <span class="number">1</span><span class="special">);</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// Nested loop (with variant) used to assert enclosing loop invariants.</span>
+ <span class="identifier">CONTRACT_LOOP</span><span class="special">(</span> <span class="keyword">for</span><span class="special">(</span><span class="keyword">size_t</span> <span class="identifier">j</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">j</span> <span class="special"><</span> <span class="identifier">i</span><span class="special">;</span> <span class="special">++</span><span class="identifier">j</span><span class="special">)</span> <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_LOOP_VARIANT</span><span class="special">(</span> <span class="keyword">const</span><span class="special">(</span> <span class="identifier">i</span><span class="special">,</span> <span class="identifier">j</span> <span class="special">)</span> <span class="identifier">i</span> <span class="special">-</span> <span class="identifier">j</span> <span class="special">)</span>
+ <span class="identifier">CONTRACT_BLOCK_INVARIANT</span><span class="special">(</span> <span class="keyword">const</span><span class="special">(</span> <span class="identifier">maxnow</span><span class="special">,</span> <span class="identifier">array</span><span class="special">,</span> <span class="identifier">j</span> <span class="special">)</span>
+ <span class="identifier">maxnow</span> <span class="special">>=</span> <span class="identifier">array</span><span class="special">[</span><span class="identifier">j</span><span class="special">]</span> <span class="special">)</span>
+ <span class="special">}</span>
+ <span class="comment">// -2 because starts from 0 (not 1) and already done element at 0.</span>
+ <span class="identifier">CONTRACT_LOOP_VARIANT</span><span class="special">(</span> <span class="keyword">const</span><span class="special">(</span> <span class="identifier">size</span><span class="special">,</span> <span class="identifier">i</span> <span class="special">)</span> <span class="identifier">size</span> <span class="special">-</span> <span class="identifier">i</span> <span class="special">-</span> <span class="number">2</span> <span class="special">)</span>
+
+ <span class="identifier">maxnow</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">max</span><span class="special">(</span><span class="identifier">maxnow</span><span class="special">,</span> <span class="identifier">array</span><span class="special">[</span><span class="identifier">i</span><span class="special">]);</span>
+ <span class="special">}</span>
+ <span class="keyword">return</span> <span class="identifier">maxnow</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="keyword">int</span> <span class="identifier">a</span><span class="special">[]</span> <span class="special">=</span> <span class="special">{</span><span class="number">1</span><span class="special">,</span> <span class="number">5</span><span class="special">,</span> <span class="number">3</span><span class="special">};</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">maxarray</span><span class="special">(</span><span class="identifier">a</span><span class="special">,</span> <span class="number">3</span><span class="special">)</span> <span class="special">==</span> <span class="number">5</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__mitchell02___name_list__relaxed_subcontracts"></a><a class="link" href="examples.html#contract__.examples.__mitchell02___name_list__relaxed_subcontracts" title="[Mitchell02] Name List: Relaxed subcontracts">[Mitchell02]
+ Name List: Relaxed subcontracts</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: name_list.hpp</span>
+<span class="preprocessor">#ifndef</span> <span class="identifier">NAME_LIST_HPP_</span>
+<span class="preprocessor">#define</span> <span class="identifier">NAME_LIST_HPP_</span>
+
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">string</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">list</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// List of names.</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">name_list</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="identifier">count</span><span class="special">()</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span> <span class="comment">// non-negative count</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR</span><span class="special">(</span> <span class="comment">// Create an empty list.</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">name_list</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span> <span class="special">)</span> <span class="comment">// empty list</span>
+ <span class="special">)</span> <span class="special">;</span> <span class="comment">// Deferred body definition.</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR</span><span class="special">(</span> <span class="comment">// Destroy list.</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">name_list</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Number of names in list.</span>
+ <span class="keyword">public</span> <span class="keyword">int</span> <span class="special">(</span><span class="identifier">count</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="comment">// postcondition: non-negative count already in class invariants</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Is name in list?</span>
+ <span class="keyword">public</span> <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">has</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">name</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">not</span> <span class="identifier">result</span> <span class="special">)</span> <span class="comment">// does not have is empty</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Add name to list.</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">put</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">name</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span>
+ <span class="keyword">not</span> <span class="identifier">has</span><span class="special">(</span><span class="identifier">name</span><span class="special">)</span> <span class="comment">// not already in list</span>
+ <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_has_name</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">has</span><span class="special">(</span><span class="identifier">name</span><span class="special">),</span>
+ <span class="keyword">auto</span> <span class="identifier">old_count</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">count</span><span class="special">(),</span>
+ <span class="comment">// Following if-guard allows to relax subcontracts.</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="keyword">not</span> <span class="identifier">old_has_name</span><span class="special">)</span> <span class="special">(</span>
+ <span class="identifier">has</span><span class="special">(</span><span class="identifier">name</span><span class="special">),</span> <span class="comment">// name on list</span>
+ <span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_count</span> <span class="special">+</span> <span class="number">1</span> <span class="comment">// number of names increased</span>
+ <span class="special">)</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">></span> <span class="identifier">names_</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// List of names that allows for duplicates.</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">relaxed_name_list</span><span class="special">)</span> <span class="keyword">extends</span><span class="special">(</span> <span class="keyword">public</span> <span class="identifier">name_list</span> <span class="special">)</span> <span class="comment">// Subcontracting.</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="comment">// no subcontracted invariants</span>
+
+ <span class="comment">// Creation.</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR</span><span class="special">(</span> <span class="comment">// Create an empty list.</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">relaxed_name_list</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR</span><span class="special">(</span> <span class="comment">// Destroy list.</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">relaxed_name_list</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="comment">// Commands.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Add name to list.</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">put</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">name</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="comment">// Relax inherited precondition.</span>
+ <span class="identifier">has</span><span class="special">(</span><span class="identifier">name</span><span class="special">)</span> <span class="comment">// already in list</span>
+ <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_has_name</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">has</span><span class="special">(</span><span class="identifier">name</span><span class="special">),</span>
+ <span class="keyword">auto</span> <span class="identifier">old_count</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">count</span><span class="special">(),</span>
+ <span class="comment">// Inherited postconditions not checked because of its if-guard.</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">old_has_name</span><span class="special">)</span> <span class="special">(</span>
+ <span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_count</span> <span class="comment">// unchanged if name already in list</span>
+ <span class="special">)</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span>
+<span class="special">};</span>
+
+<span class="preprocessor">#endif</span> <span class="comment">// #include guard</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: name_list.cpp</span>
+<span class="preprocessor">#include</span> <span class="string">"name_list.hpp"</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">algorithm</span><span class="special">></span>
+
+<span class="comment">// name_list</span>
+
+<span class="identifier">CONTRACT_CONSTRUCTOR_BODY</span><span class="special">(</span><span class="identifier">name_list</span><span class="special">,</span> <span class="identifier">name_list</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="special">{}</span>
+
+<span class="identifier">CONTRACT_DESTRUCTOR_BODY</span><span class="special">(</span><span class="identifier">name_list</span><span class="special">,</span> <span class="special">~</span><span class="identifier">name_list</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="special">{}</span>
+
+<span class="keyword">int</span> <span class="identifier">name_list</span><span class="special">::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">count</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">names_</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span> <span class="special">}</span>
+
+<span class="keyword">bool</span> <span class="identifier">name_list</span><span class="special">::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">has</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">name</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">names_</span><span class="special">.</span><span class="identifier">end</span><span class="special">()</span> <span class="special">!=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">names_</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">names_</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">name</span><span class="special">);</span> <span class="special">}</span>
+
+<span class="keyword">void</span> <span class="identifier">name_list</span><span class="special">::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">put</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">name</span> <span class="special">)</span>
+ <span class="special">{</span> <span class="identifier">names_</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">name</span><span class="special">);</span> <span class="special">}</span>
+
+<span class="comment">// relaxed_name_list</span>
+
+<span class="identifier">CONTRACT_CONSTRUCTOR_BODY</span><span class="special">(</span><span class="identifier">relaxed_name_list</span><span class="special">,</span> <span class="identifier">relaxed_name_list</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="special">{}</span>
+
+<span class="identifier">CONTRACT_DESTRUCTOR_BODY</span><span class="special">(</span><span class="identifier">relaxed_name_list</span><span class="special">,</span> <span class="special">~</span><span class="identifier">relaxed_name_list</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="special">{}</span>
+
+<span class="keyword">void</span> <span class="identifier">relaxed_name_list</span><span class="special">::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">put</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">name</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="comment">// Must use `BODY` to call base functions (to avoid infinite recursion).</span>
+ <span class="keyword">if</span><span class="special">(!</span><span class="identifier">has</span><span class="special">(</span><span class="identifier">name</span><span class="special">))</span> <span class="identifier">name_list</span><span class="special">::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">put</span><span class="special">)(</span><span class="identifier">name</span><span class="special">);</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: name_list_main.cpp</span>
+<span class="preprocessor">#include</span> <span class="string">"name_list.hpp"</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">relaxed_name_list</span> <span class="identifier">rl</span><span class="special">;</span>
+ <span class="identifier">rl</span><span class="special">.</span><span class="identifier">put</span><span class="special">(</span><span class="string">"abc"</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">rl</span><span class="special">.</span><span class="identifier">has</span><span class="special">(</span><span class="string">"abc"</span><span class="special">));</span>
+ <span class="identifier">rl</span><span class="special">.</span><span class="identifier">put</span><span class="special">(</span><span class="string">"abc"</span><span class="special">);</span> <span class="comment">// Note: Can call `put("abc")` this gain.</span>
+
+ <span class="identifier">name_list</span> <span class="identifier">nl</span><span class="special">;</span>
+ <span class="identifier">nl</span><span class="special">.</span><span class="identifier">put</span><span class="special">(</span><span class="string">"abc"</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">nl</span><span class="special">.</span><span class="identifier">has</span><span class="special">(</span><span class="string">"abc"</span><span class="special">));</span>
+ <span class="comment">// Note: Cannot call `put("abc")` again.</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__mitchell02___dictionary__simple_key_value_map"></a><a class="link" href="examples.html#contract__.examples.__mitchell02___dictionary__simple_key_value_map" title="[Mitchell02] Dictionary: Simple key-value map">[Mitchell02]
+ Dictionary: Simple key-value map</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: dictionary.cpp</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">utility</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">map</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// Simple dictionary.</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">Key</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Value</span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">dictionary</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span> <span class="identifier">count</span><span class="special">()</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span> <span class="comment">// non-negative count</span>
+
+ <span class="comment">// Creation.</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span> <span class="comment">// Create empty dictionary.</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">dictionary</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span> <span class="special">)</span> <span class="comment">// empty</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR_TPL</span><span class="special">(</span> <span class="comment">// Destroy dictionary.</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">dictionary</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="comment">// Basic queries.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Number of key entires.</span>
+ <span class="keyword">public</span> <span class="keyword">int</span> <span class="special">(</span><span class="identifier">count</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="comment">// postcondition: non-negative count asserted by class invariants</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">items_</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Has entry for key?</span>
+ <span class="keyword">public</span> <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">has</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">Key</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">key</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">not</span> <span class="identifier">result</span> <span class="special">)</span> <span class="comment">// empty has no key</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">items_</span><span class="special">.</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">key</span><span class="special">)</span> <span class="special">!=</span> <span class="identifier">items_</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Value for given key.</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">Value</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">(</span><span class="identifier">value_for</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">Key</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">key</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">has</span><span class="special">(</span><span class="identifier">key</span><span class="special">)</span> <span class="special">)</span> <span class="comment">// has key</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">items_</span><span class="special">.</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">key</span><span class="special">)-></span><span class="identifier">second</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="comment">// Commands.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Put value for given key.</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">put</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">Key</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">key</span><span class="special">,</span> <span class="special">(</span><span class="identifier">Value</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_count</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">count</span><span class="special">(),</span>
+ <span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_count</span> <span class="special">+</span> <span class="number">1</span><span class="special">,</span> <span class="comment">// count increased</span>
+ <span class="identifier">has</span><span class="special">(</span><span class="identifier">key</span><span class="special">),</span> <span class="comment">// has key</span>
+ <span class="identifier">value_for</span><span class="special">(</span><span class="identifier">key</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">value</span> <span class="comment">// value for key set</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">items_</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">make_pair</span><span class="special">(</span><span class="identifier">key</span><span class="special">,</span> <span class="identifier">value</span><span class="special">));</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Remove value for given key.</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">remove</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">Key</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">key</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">has</span><span class="special">(</span><span class="identifier">key</span><span class="special">)</span> <span class="special">)</span> <span class="comment">// has key</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_count</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">count</span><span class="special">(),</span>
+ <span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_count</span> <span class="special">-</span> <span class="number">1</span><span class="special">,</span> <span class="comment">// count decreased</span>
+ <span class="keyword">not</span> <span class="identifier">has</span><span class="special">(</span><span class="identifier">key</span><span class="special">)</span> <span class="comment">// does not have key</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">items_</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">key</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span> <span class="identifier">Value</span><span class="special">></span> <span class="identifier">items_</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">dictionary</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="keyword">int</span><span class="special">></span> <span class="identifier">ages</span><span class="special">;</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="keyword">not</span> <span class="identifier">ages</span><span class="special">.</span><span class="identifier">has</span><span class="special">(</span><span class="string">"john"</span><span class="special">));</span>
+ <span class="identifier">ages</span><span class="special">.</span><span class="identifier">put</span><span class="special">(</span><span class="string">"john"</span><span class="special">,</span> <span class="number">23</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">ages</span><span class="special">.</span><span class="identifier">value_for</span><span class="special">(</span><span class="string">"john"</span><span class="special">)</span> <span class="special">==</span> <span class="number">23</span><span class="special">);</span>
+ <span class="identifier">ages</span><span class="special">.</span><span class="identifier">remove</span><span class="special">(</span><span class="string">"john"</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">ages</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__mitchell02___courier__subcontracting_and_static_class_invariants"></a><a class="link" href="examples.html#contract__.examples.__mitchell02___courier__subcontracting_and_static_class_invariants" title="[Mitchell02] Courier: Subcontracting and static class invariants">[Mitchell02]
+ Courier: Subcontracting and static class invariants</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: courier.hpp</span>
+<span class="preprocessor">#ifndef</span> <span class="identifier">COURIER_HPP_</span>
+<span class="preprocessor">#define</span> <span class="identifier">COURIER_HPP_</span>
+
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">string</span><span class="special">></span>
+
+<span class="keyword">struct</span> <span class="identifier">package</span> <span class="comment">// Basic package information.</span>
+<span class="special">{</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">double</span> <span class="identifier">weight_kg</span><span class="special">;</span> <span class="comment">// Weight in kilograms.</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">location</span><span class="special">;</span> <span class="comment">// Current location.</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">double</span> <span class="identifier">accepted_hour</span><span class="special">;</span> <span class="comment">// Hour when it was accepted for delivery.</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">double</span> <span class="identifier">delivered_hour</span><span class="special">;</span> <span class="comment">// Hour when it was delivered.</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">explicit</span> <span class="identifier">package</span> <span class="special">(</span>
+ <span class="keyword">double</span> <span class="keyword">const</span> <span class="identifier">a_weight_kg</span><span class="special">,</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span> <span class="identifier">a_location</span> <span class="special">=</span> <span class="string">""</span><span class="special">,</span>
+ <span class="keyword">double</span> <span class="keyword">const</span> <span class="identifier">an_accepted_hour</span> <span class="special">=</span> <span class="number">0.0</span><span class="special">,</span>
+ <span class="keyword">double</span> <span class="keyword">const</span> <span class="identifier">a_delivered_hour</span> <span class="special">=</span> <span class="number">0.0</span>
+ <span class="special">)</span>
+ <span class="special">:</span> <span class="identifier">weight_kg</span><span class="special">(</span><span class="identifier">a_weight_kg</span><span class="special">),</span>
+ <span class="identifier">location</span><span class="special">(</span><span class="identifier">a_location</span><span class="special">),</span>
+ <span class="identifier">accepted_hour</span><span class="special">(</span><span class="identifier">an_accepted_hour</span><span class="special">),</span>
+ <span class="identifier">delivered_hour</span><span class="special">(</span><span class="identifier">a_delivered_hour</span><span class="special">)</span>
+ <span class="special">{}</span>
+<span class="special">};</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// Basic courier for package delivery.</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">courier</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span>
+ <span class="identifier">insurance_cover_dollar</span><span class="special">()</span> <span class="special">>=</span> <span class="identifier">min_insurance_dollar</span><span class="special">,</span> <span class="comment">// above min insur.</span>
+ <span class="keyword">static</span> <span class="keyword">class</span><span class="special">(</span> <span class="comment">// Static class invariants.</span>
+ <span class="identifier">min_insurance_dollar</span> <span class="special">></span> <span class="number">0.0</span> <span class="comment">// positive min insurance</span>
+ <span class="special">)</span>
+ <span class="special">)</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">static</span> <span class="keyword">double</span> <span class="identifier">min_insurance_dollar</span><span class="special">;</span>
+
+ <span class="comment">// Creation.</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR</span><span class="special">(</span> <span class="comment">// Create courier with specified insurance value.</span>
+ <span class="keyword">public</span> <span class="keyword">explicit</span> <span class="special">(</span><span class="identifier">courier</span><span class="special">)</span> <span class="special">(</span>
+ <span class="keyword">double</span> <span class="keyword">const</span> <span class="identifier">an_insurance_cover_dollar</span><span class="special">,</span>
+ <span class="keyword">default</span> <span class="identifier">min_insurance_dollar</span>
+ <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">an_insurance_cover_dollar</span> <span class="special">></span> <span class="number">0.0</span> <span class="special">)</span> <span class="comment">// positive insur.</span>
+ <span class="special">)</span> <span class="special">;</span> <span class="comment">// Deferred body definition.</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR</span><span class="special">(</span> <span class="comment">// Destroy courier.</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">courier</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="comment">// Queries.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Return insurance cover.</span>
+ <span class="keyword">public</span> <span class="keyword">double</span> <span class="special">(</span><span class="identifier">insurance_cover_dollar</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="comment">// Commands.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Deliver package to destination.</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">deliver</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">package</span><span class="special">&)</span> <span class="identifier">the_package</span><span class="special">,</span>
+ <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">)</span> <span class="identifier">destination</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span>
+ <span class="identifier">the_package</span><span class="special">.</span><span class="identifier">weight_kg</span> <span class="special"><</span> <span class="number">5.0</span> <span class="comment">// within max wight</span>
+ <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">double</span><span class="special">(</span><span class="identifier">the_package</span><span class="special">.</span><span class="identifier">delivered_hour</span> <span class="special">-</span> <span class="identifier">the_package</span><span class="special">.</span><span class="identifier">accepted_hour</span><span class="special">)</span>
+ <span class="special"><=</span> <span class="number">3.0</span><span class="special">,</span> <span class="comment">// within max delivery time</span>
+ <span class="identifier">the_package</span><span class="special">.</span><span class="identifier">location</span> <span class="special">==</span> <span class="identifier">destination</span> <span class="comment">// delivered at destination</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="keyword">double</span> <span class="identifier">insurance_cover_dollar_</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// Different courier for package delivery.</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">different_courier</span><span class="special">)</span> <span class="keyword">extends</span><span class="special">(</span> <span class="keyword">public</span> <span class="identifier">courier</span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span>
+ <span class="identifier">insurance_cover_dollar</span><span class="special">()</span> <span class="special">>=</span> <span class="identifier">different_insurance_dollar</span><span class="special">,</span>
+ <span class="keyword">static</span> <span class="keyword">class</span><span class="special">(</span>
+ <span class="identifier">different_insurance_dollar</span> <span class="special">>=</span> <span class="identifier">courier</span><span class="special">::</span><span class="identifier">min_insurance_dollar</span>
+ <span class="special">)</span>
+ <span class="special">)</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">static</span> <span class="keyword">double</span> <span class="identifier">different_insurance_dollar</span><span class="special">;</span>
+
+ <span class="comment">// Creation.</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR</span><span class="special">(</span> <span class="comment">// Create currier with specified insurance value.</span>
+ <span class="keyword">public</span> <span class="keyword">explicit</span> <span class="special">(</span><span class="identifier">different_courier</span><span class="special">)</span> <span class="special">(</span>
+ <span class="keyword">double</span> <span class="keyword">const</span> <span class="identifier">insurance_cover_dollar</span><span class="special">,</span>
+ <span class="keyword">default</span> <span class="identifier">different_insurance_dollar</span>
+ <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">insurance_cover_dollar</span> <span class="special">></span> <span class="number">0.0</span> <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">courier</span><span class="special">(</span><span class="identifier">insurance_cover_dollar</span><span class="special">)</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span> <span class="comment">// Cannot separated body definition because has member initializers.</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR</span><span class="special">(</span> <span class="comment">// Destroy courier.</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">different_courier</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="comment">// Commands.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">deliver</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">package</span><span class="special">&)</span> <span class="identifier">the_package</span><span class="special">,</span>
+ <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">)</span> <span class="identifier">destination</span> <span class="special">)</span> <span class="keyword">override</span> <span class="keyword">final</span>
+ <span class="keyword">precondition</span><span class="special">(</span>
+ <span class="comment">// Weaker precondition on weight (it can weight more).</span>
+ <span class="identifier">the_package</span><span class="special">.</span><span class="identifier">weight_kg</span> <span class="special"><=</span> <span class="number">8.0</span>
+ <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="comment">// Stronger postcondition on delivery time (faster delivery).</span>
+ <span class="keyword">double</span><span class="special">(</span><span class="identifier">the_package</span><span class="special">.</span><span class="identifier">delivered_hour</span> <span class="special">-</span> <span class="identifier">the_package</span><span class="special">.</span><span class="identifier">accepted_hour</span><span class="special">)</span>
+ <span class="special"><=</span> <span class="number">2.0</span>
+ <span class="comment">// Inherits "delivered at destination" postcondition.</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span>
+<span class="special">};</span>
+
+<span class="preprocessor">#endif</span> <span class="comment">// #include guard</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: courier.cpp</span>
+<span class="preprocessor">#include</span> <span class="string">"courier.hpp"</span>
+
+<span class="comment">// Courier.</span>
+
+<span class="keyword">double</span> <span class="identifier">courier</span><span class="special">::</span><span class="identifier">min_insurance_dollar</span> <span class="special">=</span> <span class="number">10.0e+6</span><span class="special">;</span>
+
+<span class="identifier">CONTRACT_CONSTRUCTOR_BODY</span><span class="special">(</span><span class="identifier">courier</span><span class="special">,</span> <span class="identifier">courier</span><span class="special">)</span> <span class="special">(</span>
+ <span class="keyword">double</span> <span class="keyword">const</span> <span class="identifier">an_insurance_cover_dollar</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">insurance_cover_dollar_</span> <span class="special">=</span> <span class="identifier">an_insurance_cover_dollar</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="identifier">CONTRACT_DESTRUCTOR_BODY</span><span class="special">(</span><span class="identifier">courier</span><span class="special">,</span> <span class="special">~</span><span class="identifier">courier</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="special">{}</span>
+
+<span class="keyword">double</span> <span class="identifier">courier</span><span class="special">::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">insurance_cover_dollar</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">insurance_cover_dollar_</span><span class="special">;</span> <span class="special">}</span>
+
+<span class="keyword">void</span> <span class="identifier">courier</span><span class="special">::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">deliver</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">package</span><span class="special">&</span> <span class="identifier">the_package</span><span class="special">,</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span> <span class="identifier">destination</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">the_package</span><span class="special">.</span><span class="identifier">location</span> <span class="special">=</span> <span class="identifier">destination</span><span class="special">;</span>
+ <span class="comment">// Delivery takes 2.5 hours.</span>
+ <span class="identifier">the_package</span><span class="special">.</span><span class="identifier">delivered_hour</span> <span class="special">=</span> <span class="identifier">the_package</span><span class="special">.</span><span class="identifier">accepted_hour</span> <span class="special">+</span> <span class="number">2.5</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="comment">// Different courier.</span>
+
+<span class="keyword">double</span> <span class="identifier">different_courier</span><span class="special">::</span><span class="identifier">different_insurance_dollar</span> <span class="special">=</span> <span class="number">20.0e+6</span><span class="special">;</span>
+
+<span class="identifier">CONTRACT_DESTRUCTOR_BODY</span><span class="special">(</span><span class="identifier">different_courier</span><span class="special">,</span> <span class="special">~</span><span class="identifier">different_courier</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="special">{}</span>
+
+<span class="keyword">void</span> <span class="identifier">different_courier</span><span class="special">::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">deliver</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">package</span><span class="special">&</span> <span class="identifier">the_package</span><span class="special">,</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span> <span class="identifier">destination</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">the_package</span><span class="special">.</span><span class="identifier">location</span> <span class="special">=</span> <span class="identifier">destination</span><span class="special">;</span>
+ <span class="comment">// Delivery takes only 0.5 hours.</span>
+ <span class="identifier">the_package</span><span class="special">.</span><span class="identifier">delivered_hour</span> <span class="special">=</span> <span class="identifier">the_package</span><span class="special">.</span><span class="identifier">accepted_hour</span> <span class="special">+</span> <span class="number">0.5</span><span class="special">;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: courier_main.cpp</span>
+<span class="preprocessor">#include</span> <span class="string">"courier.hpp"</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">courier</span> <span class="identifier">c</span><span class="special">;</span>
+ <span class="identifier">different_courier</span> <span class="identifier">dc</span><span class="special">;</span>
+ <span class="identifier">package</span> <span class="identifier">cups</span><span class="special">(</span><span class="number">3.6</span><span class="special">,</span> <span class="string">"store"</span><span class="special">);</span>
+ <span class="identifier">package</span> <span class="identifier">desk</span><span class="special">(</span><span class="number">7.2</span><span class="special">,</span> <span class="string">"store"</span><span class="special">);</span>
+ <span class="identifier">c</span><span class="special">.</span><span class="identifier">deliver</span><span class="special">(</span><span class="identifier">cups</span><span class="special">,</span> <span class="string">"home"</span><span class="special">);</span>
+ <span class="identifier">dc</span><span class="special">.</span><span class="identifier">deliver</span><span class="special">(</span><span class="identifier">desk</span><span class="special">,</span> <span class="string">"office"</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__mitchell02___stack__simple_stack_dispenser"></a><a class="link" href="examples.html#contract__.examples.__mitchell02___stack__simple_stack_dispenser" title="[Mitchell02] Stack: Simple stack dispenser">[Mitchell02]
+ Stack: Simple stack dispenser</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: stack.cpp</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">vector</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// Simple stack.</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">stack</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span> <span class="identifier">count</span><span class="special">()</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span> <span class="comment">// non-negative count</span>
+
+ <span class="comment">// Creation.</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span> <span class="comment">// Create empty stack.</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">stack</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span> <span class="special">)</span> <span class="comment">// empty</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR_TPL</span><span class="special">(</span> <span class="comment">// Destroy stack.</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">stack</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="comment">// Basic queries.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Number of items.</span>
+ <span class="keyword">public</span> <span class="keyword">int</span> <span class="special">(</span><span class="identifier">count</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">items_</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Item at index in [1, count()] (as in Eiffel).</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">(</span><span class="identifier">item_at</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="keyword">const</span> <span class="identifier">index</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">precondition</span><span class="special">(</span>
+ <span class="identifier">index</span> <span class="special">></span> <span class="number">0</span><span class="special">,</span> <span class="comment">// positive index</span>
+ <span class="identifier">index</span> <span class="special"><=</span> <span class="identifier">count</span><span class="special">()</span> <span class="comment">// index within count</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">items_</span><span class="special">.</span><span class="identifier">at</span><span class="special">(</span><span class="identifier">index</span> <span class="special">-</span> <span class="number">1</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="comment">// Derived queries.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// If no items.</span>
+ <span class="keyword">public</span> <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">is_empty</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">)</span> <span class="comment">// consistent with count</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Top item.</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">(</span><span class="identifier">item</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">count</span><span class="special">()</span> <span class="special">></span> <span class="number">0</span> <span class="special">)</span> <span class="comment">// not empty</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">item_at</span><span class="special">(</span><span class="identifier">count</span><span class="special">())</span> <span class="comment">// item on top</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">item_at</span><span class="special">(</span><span class="identifier">count</span><span class="special">());</span>
+ <span class="special">}</span>
+
+ <span class="comment">// Commands.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Push item to the top.</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">put</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">new_item</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_count</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">count</span><span class="special">(),</span>
+ <span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_count</span> <span class="special">+</span> <span class="number">1</span><span class="special">,</span> <span class="comment">// count increased</span>
+ <span class="identifier">item</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">new_item</span> <span class="comment">// item set</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">items_</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">new_item</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Pop top item.</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">remove</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">count</span><span class="special">()</span> <span class="special">></span> <span class="number">0</span> <span class="special">)</span> <span class="comment">// not empty</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_count</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">count</span><span class="special">(),</span>
+ <span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_count</span> <span class="special">-</span> <span class="number">1</span> <span class="comment">// count decreased</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">items_</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span><span class="identifier">items_</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">-</span> <span class="number">1</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">items_</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">stack</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">s</span><span class="special">;</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span>
+ <span class="identifier">s</span><span class="special">.</span><span class="identifier">put</span><span class="special">(</span><span class="number">123</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">item_at</span><span class="special">(</span><span class="number">1</span><span class="special">)</span> <span class="special">==</span> <span class="number">123</span><span class="special">);</span>
+ <span class="identifier">s</span><span class="special">.</span><span class="identifier">remove</span><span class="special">();</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">is_empty</span><span class="special">());</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__mitchell02___simple_queue__simple_queue_dispenser"></a><a class="link" href="examples.html#contract__.examples.__mitchell02___simple_queue__simple_queue_dispenser" title="[Mitchell02] Simple Queue: Simple queue dispenser">[Mitchell02]
+ Simple Queue: Simple queue dispenser</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: simple_queue.cpp</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">vector</span><span class="special">></span>
+
+<span class="comment">// Assertion requirements used to model assertion computational complexity.</span>
+<span class="preprocessor">#define</span> <span class="identifier">O_1</span> <span class="number">0</span> <span class="comment">// O(1) constant (default)</span>
+<span class="preprocessor">#define</span> <span class="identifier">O_N</span> <span class="number">1</span> <span class="comment">// O(n) linear</span>
+<span class="preprocessor">#define</span> <span class="identifier">COMPLEXITY_MAX</span> <span class="identifier">O_1</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">simple_queue</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="identifier">count</span><span class="special">()</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span> <span class="comment">// non-negative count</span>
+
+ <span class="comment">// Creation.</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span> <span class="comment">// Create empty queue.</span>
+ <span class="keyword">public</span> <span class="keyword">explicit</span> <span class="special">(</span><span class="identifier">simple_queue</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="keyword">const</span> <span class="identifier">the_capacity</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">the_capacity</span> <span class="special">></span> <span class="number">0</span> <span class="special">)</span> <span class="comment">// positive capacity</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">the_capacity</span><span class="special">,</span> <span class="comment">// capacity set</span>
+ <span class="identifier">is_empty</span><span class="special">()</span> <span class="comment">// empty</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">items_</span><span class="special">.</span><span class="identifier">reserve</span><span class="special">(</span><span class="identifier">the_capacity</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR_TPL</span><span class="special">(</span> <span class="comment">// Destroy queue.</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">simple_queue</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="comment">// Basic queries.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Items in the queue (in their order).</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">(</span><span class="identifier">items</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">items_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Max number of items queue can hold.</span>
+ <span class="keyword">public</span> <span class="keyword">int</span> <span class="special">(</span><span class="identifier">capacity</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">items_</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="comment">// Derived queries.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Number of items.</span>
+ <span class="keyword">public</span> <span class="keyword">int</span> <span class="special">(</span><span class="identifier">count</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">items</span><span class="special">().</span><span class="identifier">size</span><span class="special">())</span> <span class="comment">// return items count</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">items_</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Item at head.</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">(</span><span class="identifier">head</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="keyword">not</span> <span class="identifier">is_empty</span><span class="special">()</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">items</span><span class="special">().</span><span class="identifier">at</span><span class="special">(</span><span class="number">0</span><span class="special">)</span> <span class="comment">// return item on top</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">items_</span><span class="special">.</span><span class="identifier">at</span><span class="special">(</span><span class="number">0</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// If queue contains no item.</span>
+ <span class="keyword">public</span> <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">is_empty</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">)</span> <span class="comment">// consistent with count</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">items_</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// If queue has no room for another item.</span>
+ <span class="keyword">public</span> <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">is_full</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="comment">// consistent with size and capacity</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">items</span><span class="special">().</span><span class="identifier">size</span><span class="special">()))</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">items_</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">items_</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="comment">// Commands.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Remove head item and shift all other items.</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">remove</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="keyword">not</span> <span class="identifier">is_empty</span><span class="special">()</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_count</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">count</span><span class="special">(),</span>
+ <span class="keyword">auto</span> <span class="identifier">old_items</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">items</span><span class="special">(),</span>
+ <span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_count</span> <span class="special">-</span> <span class="number">1</span><span class="special">,</span> <span class="comment">// count decreased</span>
+ <span class="comment">// Expensive assertion to check so marked with its complexity.</span>
+ <span class="identifier">all_equal</span><span class="special">(</span><span class="identifier">items</span><span class="special">(),</span> <span class="identifier">old_items</span><span class="special">,</span> <span class="number">1</span> <span class="comment">/* shifted */</span><span class="special">),</span>
+ <span class="keyword">requires</span> <span class="identifier">O_N</span> <span class="special"><=</span> <span class="identifier">COMPLEXITY_MAX</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">items_</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">items_</span><span class="special">.</span><span class="identifier">begin</span><span class="special">());</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Add item to tail.</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">put</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">item</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">count</span><span class="special">()</span> <span class="special"><</span> <span class="identifier">capacity</span><span class="special">()</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_count</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">count</span><span class="special">(),</span>
+ <span class="keyword">auto</span> <span class="identifier">old_items</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">items</span><span class="special">(),</span>
+ <span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_count</span> <span class="special">+</span> <span class="number">1</span><span class="special">,</span> <span class="comment">// count increased</span>
+ <span class="identifier">items</span><span class="special">().</span><span class="identifier">at</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">-</span> <span class="number">1</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">item</span><span class="special">,</span> <span class="comment">// second last item</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">count</span><span class="special">()</span> <span class="special">>=</span> <span class="number">2</span><span class="special">)</span> <span class="special">(</span>
+ <span class="comment">// Computationally expensive assertion to check.</span>
+ <span class="identifier">all_equal</span><span class="special">(</span><span class="identifier">items</span><span class="special">(),</span> <span class="identifier">old_items</span><span class="special">),</span>
+ <span class="keyword">requires</span> <span class="identifier">O_N</span> <span class="special"><=</span> <span class="identifier">COMPLEXITY_MAX</span>
+ <span class="special">)</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">items_</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">item</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span> <span class="comment">// Contract helper.</span>
+ <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">all_equal</span><span class="special">)</span> <span class="special">(</span>
+ <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">left</span><span class="special">,</span>
+ <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">right</span><span class="special">,</span>
+ <span class="keyword">size_t</span> <span class="identifier">offset</span><span class="special">,</span> <span class="keyword">default</span> <span class="number">0</span>
+ <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span>
+ <span class="identifier">right</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">left</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">offset</span> <span class="comment">// correct offset</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">for</span><span class="special">(</span><span class="keyword">size_t</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">offset</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">left</span><span class="special">.</span><span class="identifier">at</span><span class="special">(</span><span class="identifier">i</span> <span class="special">-</span> <span class="identifier">offset</span><span class="special">)</span> <span class="special">!=</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">at</span><span class="special">(</span><span class="identifier">i</span><span class="special">))</span> <span class="keyword">return</span> <span class="keyword">false</span><span class="special">;</span>
+ <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">items_</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">simple_queue</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">q</span><span class="special">(</span><span class="number">10</span><span class="special">);</span>
+ <span class="identifier">q</span><span class="special">.</span><span class="identifier">put</span><span class="special">(</span><span class="number">123</span><span class="special">);</span>
+ <span class="identifier">q</span><span class="special">.</span><span class="identifier">put</span><span class="special">(</span><span class="number">456</span><span class="special">);</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">items</span> <span class="special">=</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">items</span><span class="special">();</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">items</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="number">123</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">items</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">==</span> <span class="number">456</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">q</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="number">10</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">q</span><span class="special">.</span><span class="identifier">head</span><span class="special">()</span> <span class="special">==</span> <span class="number">123</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="keyword">not</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">is_empty</span><span class="special">());</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="keyword">not</span> <span class="identifier">q</span><span class="special">.</span><span class="identifier">is_full</span><span class="special">());</span>
+ <span class="identifier">q</span><span class="special">.</span><span class="identifier">remove</span><span class="special">();</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">q</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">1</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__mitchell02___customer_manager__contracts_instead_of_defensive_programming"></a><a class="link" href="examples.html#contract__.examples.__mitchell02___customer_manager__contracts_instead_of_defensive_programming" title="[Mitchell02] Customer Manager: Contracts instead of Defensive Programming">[Mitchell02]
+ Customer Manager: Contracts instead of Defensive Programming</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: customer_manager.hpp</span>
+<span class="preprocessor">#ifndef</span> <span class="identifier">CUSTOMER_MANAGER_HPP_</span>
+<span class="preprocessor">#define</span> <span class="identifier">CUSTOMER_MANAGER_HPP_</span>
+
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">string</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">map</span><span class="special">></span>
+
+<span class="keyword">class</span> <span class="identifier">basic_customer_details</span> <span class="comment">// Basic customer information.</span>
+<span class="special">{</span>
+ <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">customer_manager</span><span class="special">;</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">identifier</span><span class="special">;</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">explicit</span> <span class="identifier">basic_customer_details</span> <span class="special">(</span> <span class="identifier">identifier</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">an_id</span> <span class="special">)</span>
+ <span class="special">:</span> <span class="identifier">id</span><span class="special">(</span><span class="identifier">an_id</span><span class="special">),</span> <span class="identifier">name</span><span class="special">(),</span> <span class="identifier">address</span><span class="special">(),</span> <span class="identifier">birthday</span><span class="special">()</span>
+ <span class="special">{}</span>
+
+ <span class="keyword">protected</span><span class="special">:</span> <span class="identifier">identifier</span> <span class="identifier">id</span><span class="special">;</span> <span class="comment">// Customer identifier.</span>
+ <span class="keyword">protected</span><span class="special">:</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">name</span><span class="special">;</span> <span class="comment">// Customer name.</span>
+ <span class="keyword">protected</span><span class="special">:</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">address</span><span class="special">;</span> <span class="comment">// Customer address.</span>
+ <span class="keyword">protected</span><span class="special">:</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">birthday</span><span class="special">;</span> <span class="comment">// Customer date of birth.</span>
+<span class="special">};</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// Manage customers.</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">customer_manager</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="identifier">count</span><span class="special">()</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span> <span class="comment">// non-negative count</span>
+
+ <span class="comment">// Creation.</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">customer_manager</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="comment">// LIMITATION: Cannot use member initializes because deferring</span>
+ <span class="comment">// body definition.</span>
+ <span class="special">)</span> <span class="special">;</span> <span class="comment">// Deferred body definition.</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">customer_manager</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="comment">// Basic queries.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">int</span> <span class="special">(</span><span class="identifier">count</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="comment">// postcondition: non-negative count asserted by class invariants</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// There is a customer with given identifier.</span>
+ <span class="keyword">public</span> <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">id_active</span><span class="special">)</span> <span class="special">(</span>
+ <span class="special">(</span><span class="identifier">basic_customer_details</span><span class="special">::</span><span class="identifier">identifier</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">id</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="comment">// Derived queries.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Name of customer with given identifier.</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">(</span><span class="identifier">name_for</span><span class="special">)</span> <span class="special">(</span>
+ <span class="special">(</span><span class="identifier">basic_customer_details</span><span class="special">::</span><span class="identifier">identifier</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">id</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">id_active</span><span class="special">(</span><span class="identifier">id</span><span class="special">)</span> <span class="special">)</span> <span class="comment">// id active</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="comment">// Commands.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Add given customer.</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">add</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">basic_customer_details</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">details</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="keyword">not</span> <span class="identifier">id_active</span><span class="special">(</span><span class="identifier">details</span><span class="special">.</span><span class="identifier">id</span><span class="special">)</span> <span class="special">)</span> <span class="comment">// id not active</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_count</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">count</span><span class="special">(),</span>
+ <span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_count</span> <span class="special">+</span> <span class="number">1</span><span class="special">,</span> <span class="comment">// count increased</span>
+ <span class="identifier">id_active</span><span class="special">(</span><span class="identifier">details</span><span class="special">.</span><span class="identifier">id</span><span class="special">)</span> <span class="comment">// id active</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Set name of customer with given identifier.</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">set_name</span><span class="special">)</span> <span class="special">(</span>
+ <span class="special">(</span><span class="identifier">basic_customer_details</span><span class="special">::</span><span class="identifier">identifier</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">id</span><span class="special">,</span>
+ <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">name</span>
+ <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">id_active</span><span class="special">(</span><span class="identifier">id</span><span class="special">)</span> <span class="special">)</span> <span class="comment">// id active</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">name_for</span><span class="special">(</span><span class="identifier">id</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">name</span> <span class="special">)</span> <span class="comment">// name set</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="keyword">class</span> <span class="identifier">agent</span> <span class="special">{};</span> <span class="comment">// Customer agent.</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="keyword">struct</span> <span class="identifier">customer</span> <span class="special">:</span> <span class="identifier">basic_customer_details</span> <span class="comment">// Basic customer.</span>
+ <span class="special">{</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">agent</span> <span class="identifier">managing_agent</span><span class="special">;</span> <span class="comment">// Customer agent.</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">last_contact</span><span class="special">;</span> <span class="comment">// Customer last contacted.</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">explicit</span> <span class="identifier">customer</span> <span class="special">(</span> <span class="identifier">basic_customer_details</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">details</span> <span class="special">)</span>
+ <span class="special">:</span> <span class="identifier">basic_customer_details</span><span class="special">(</span><span class="identifier">details</span><span class="special">),</span> <span class="identifier">managing_agent</span><span class="special">(),</span>
+ <span class="identifier">last_contact</span><span class="special">()</span>
+ <span class="special">{}</span>
+ <span class="special">};</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special"><</span><span class="identifier">basic_customer_details</span><span class="special">::</span><span class="identifier">identifier</span><span class="special">,</span> <span class="identifier">customer</span><span class="special">></span> <span class="identifier">customers_</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="preprocessor">#endif</span> <span class="comment">// #include guard</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: customer_manager.cpp</span>
+<span class="preprocessor">#include</span> <span class="string">"customer_manager.hpp"</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">utility</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_CONSTRUCTOR_BODY</span><span class="special">(</span><span class="identifier">customer_manager</span><span class="special">,</span> <span class="identifier">customer_manager</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="special">{}</span>
+
+<span class="identifier">CONTRACT_DESTRUCTOR_BODY</span><span class="special">(</span><span class="identifier">customer_manager</span><span class="special">,</span> <span class="special">~</span><span class="identifier">customer_manager</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="special">{}</span>
+
+<span class="keyword">int</span> <span class="identifier">customer_manager</span><span class="special">::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">count</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">customers_</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span> <span class="special">}</span>
+
+<span class="keyword">bool</span> <span class="identifier">customer_manager</span><span class="special">::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">id_active</span><span class="special">)</span> <span class="special">(</span>
+ <span class="identifier">basic_customer_details</span><span class="special">::</span><span class="identifier">identifier</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">id</span><span class="special">)</span> <span class="keyword">const</span>
+<span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">customers_</span><span class="special">.</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">id</span><span class="special">)</span> <span class="special">!=</span> <span class="identifier">customers_</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span>
+<span class="special">}</span>
+
+<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">customer_manager</span><span class="special">::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">name_for</span><span class="special">)</span> <span class="special">(</span>
+ <span class="identifier">basic_customer_details</span><span class="special">::</span><span class="identifier">identifier</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">id</span><span class="special">)</span> <span class="keyword">const</span>
+<span class="special">{</span>
+ <span class="comment">// Find != end because of `id_active()` pre so no defensive programming.</span>
+ <span class="keyword">return</span> <span class="identifier">customers_</span><span class="special">.</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">id</span><span class="special">)-></span><span class="identifier">second</span><span class="special">.</span><span class="identifier">name</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="keyword">void</span> <span class="identifier">customer_manager</span><span class="special">::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">add</span><span class="special">)</span> <span class="special">(</span>
+ <span class="identifier">basic_customer_details</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">details</span> <span class="special">)</span>
+ <span class="special">{</span> <span class="identifier">customers_</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">make_pair</span><span class="special">(</span><span class="identifier">details</span><span class="special">.</span><span class="identifier">id</span><span class="special">,</span> <span class="identifier">customer</span><span class="special">(</span><span class="identifier">details</span><span class="special">)));</span> <span class="special">}</span>
+
+<span class="keyword">void</span> <span class="identifier">customer_manager</span><span class="special">::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">set_name</span><span class="special">)</span> <span class="special">(</span>
+ <span class="identifier">basic_customer_details</span><span class="special">::</span><span class="identifier">identifier</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">id</span><span class="special">,</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">name</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="comment">// Find != end because of `id_active()` pre so no defensive programming.</span>
+ <span class="identifier">customers_</span><span class="special">.</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">id</span><span class="special">)-></span><span class="identifier">second</span><span class="special">.</span><span class="identifier">name</span> <span class="special">=</span> <span class="identifier">name</span><span class="special">;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: customer_manager_main.cpp </span>
+<span class="preprocessor">#include</span> <span class="string">"customer_manager.hpp"</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">customer_manager</span> <span class="identifier">mgr</span><span class="special">;</span>
+ <span class="identifier">basic_customer_details</span> <span class="identifier">d</span><span class="special">(</span><span class="string">"id1"</span><span class="special">);</span>
+
+ <span class="identifier">mgr</span><span class="special">.</span><span class="identifier">add</span><span class="special">(</span><span class="identifier">d</span><span class="special">);</span>
+ <span class="identifier">mgr</span><span class="special">.</span><span class="identifier">set_name</span><span class="special">(</span><span class="string">"id1"</span><span class="special">,</span> <span class="string">"abc"</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">mgr</span><span class="special">.</span><span class="identifier">name_for</span><span class="special">(</span><span class="string">"id1"</span><span class="special">)</span> <span class="special">==</span> <span class="string">"abc"</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">mgr</span><span class="special">.</span><span class="identifier">count</span><span class="special">()</span> <span class="special">==</span> <span class="number">1</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">mgr</span><span class="special">.</span><span class="identifier">id_active</span><span class="special">(</span><span class="string">"id1"</span><span class="special">));</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__mitchell02___observer__contracts_for_pure_virtual_functions"></a><a class="link" href="examples.html#contract__.examples.__mitchell02___observer__contracts_for_pure_virtual_functions" title="[Mitchell02] Observer: Contracts for pure virtual functions">[Mitchell02]
+ Observer: Contracts for pure virtual functions</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: observer/observer.hpp</span>
+<span class="preprocessor">#ifndef</span> <span class="identifier">OBSERVER_HPP_</span>
+<span class="preprocessor">#define</span> <span class="identifier">OBSERVER_HPP_</span>
+
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// Observer.</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">observer</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="comment">// no invariant</span>
+
+ <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">subject</span><span class="special">;</span>
+
+ <span class="comment">// Creation.</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR</span><span class="special">(</span> <span class="comment">// Create observer.</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">observer</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR</span><span class="special">(</span> <span class="comment">// Destroy observer.</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">observer</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="comment">// Commands.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// If up to date with its subject.</span>
+ <span class="keyword">protected</span> <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">up_to_date_with_subject</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span> <span class="keyword">new</span>
+ <span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Update and inform its subject.</span>
+ <span class="keyword">protected</span> <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">update</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">new</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">up_to_date_with_subject</span><span class="special">()</span> <span class="special">)</span> <span class="comment">// up-to-date</span>
+ <span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="preprocessor">#endif</span> <span class="comment">// #include guard</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: observer/subject.hpp</span>
+<span class="preprocessor">#ifndef</span> <span class="identifier">SUBJECT_HPP_</span>
+<span class="preprocessor">#define</span> <span class="identifier">SUBJECT_HPP_</span>
+
+<span class="preprocessor">#include</span> <span class="string">"observer.hpp"</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">list</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">algorithm</span><span class="special">></span>
+
+<span class="comment">// Assertion requirements used to model assertion computational complexity.</span>
+<span class="preprocessor">#define</span> <span class="identifier">O_1</span> <span class="number">0</span> <span class="comment">// O(1) constant (default)</span>
+<span class="preprocessor">#define</span> <span class="identifier">O_N</span> <span class="number">1</span> <span class="comment">// O(n) linear</span>
+<span class="preprocessor">#define</span> <span class="identifier">COMPLEXITY_MAX</span> <span class="identifier">O_1</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// Subject for observer design pattern.</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">subject</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span>
+ <span class="identifier">all_observers_valid</span><span class="special">(</span><span class="identifier">observers</span><span class="special">()),</span> <span class="comment">// observes valid</span>
+ <span class="keyword">requires</span> <span class="identifier">O_N</span> <span class="special"><=</span> <span class="identifier">COMPLEXITY_MAX</span>
+ <span class="special">)</span>
+
+ <span class="comment">// Creation.</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR</span><span class="special">(</span> <span class="comment">// Construct subject with no observer.</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">subject</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR</span><span class="special">(</span> <span class="comment">// Destroy subject.</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">subject</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="comment">// Queries.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// If given observer is attached.</span>
+ <span class="keyword">public</span> <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">attached</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">observer</span> <span class="keyword">const</span><span class="special">*</span> <span class="keyword">const</span><span class="special">)</span> <span class="identifier">obs</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">obs</span> <span class="special">)</span> <span class="comment">// not null</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">observers_</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">observers_</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">obs</span><span class="special">)</span> <span class="special">!=</span>
+ <span class="identifier">observers_</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="comment">// Commands.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Remember given object as an observer.</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">attach</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">observer</span><span class="special">*</span> <span class="keyword">const</span><span class="special">)</span> <span class="identifier">obs</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span>
+ <span class="identifier">obs</span><span class="special">,</span> <span class="comment">// not null</span>
+ <span class="keyword">not</span> <span class="identifier">attached</span><span class="special">(</span><span class="identifier">obs</span><span class="special">)</span> <span class="comment">// not already attached</span>
+ <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_observers</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">observers</span><span class="special">(),</span>
+ <span class="identifier">attached</span><span class="special">(</span><span class="identifier">obs</span><span class="special">),</span> <span class="comment">// attached</span>
+ <span class="identifier">other_observers_unchanged</span><span class="special">(</span><span class="identifier">old_observers</span><span class="special">,</span> <span class="identifier">observers</span><span class="special">(),</span> <span class="identifier">obs</span><span class="special">),</span>
+ <span class="comment">// others not changed (frame rule)</span>
+ <span class="keyword">requires</span> <span class="identifier">O_N</span> <span class="special"><=</span> <span class="identifier">COMPLEXITY_MAX</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">observers_</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">obs</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="comment">// Queries.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// All observers attached to this subject.</span>
+ <span class="keyword">protected</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">observer</span> <span class="keyword">const</span><span class="special">*>)</span> <span class="special">(</span><span class="identifier">observers</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// Create list of pointers to const observers.</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="keyword">const</span> <span class="identifier">observer</span><span class="special">*></span> <span class="identifier">obs</span><span class="special">;</span>
+ <span class="keyword">for</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">observer</span><span class="special">*>::</span><span class="identifier">const_iterator</span>
+ <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">observers_</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span> <span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">observers_</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">obs</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(*</span><span class="identifier">i</span><span class="special">);</span>
+ <span class="special">}</span>
+ <span class="keyword">return</span> <span class="identifier">obs</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="comment">// Commands.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Update all attached observers.</span>
+ <span class="keyword">protected</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">notify</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">all_observers_updated</span><span class="special">(</span><span class="identifier">observers</span><span class="special">())</span> <span class="special">)</span> <span class="comment">// all updated</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">for</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">observer</span><span class="special">*>::</span><span class="identifier">iterator</span>
+ <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">observers_</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span> <span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">observers_</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// Class invariant ensures no null pointers in observers but</span>
+ <span class="comment">// class invariants not checked for non-public members so check.</span>
+ <span class="identifier">CONTRACT_BLOCK_INVARIANT</span><span class="special">(</span> <span class="keyword">const</span><span class="special">(</span> <span class="identifier">i</span> <span class="special">)</span> <span class="number">0</span> <span class="special">!=</span> <span class="special">*</span><span class="identifier">i</span> <span class="special">)</span> <span class="comment">// pointer not null</span>
+ <span class="special">(*</span><span class="identifier">i</span><span class="special">)-></span><span class="identifier">update</span><span class="special">();</span>
+ <span class="special">}</span>
+ <span class="special">}</span>
+
+ <span class="comment">// Contract helpers.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">all_observers_valid</span><span class="special">)</span> <span class="special">(</span>
+ <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">observer</span> <span class="keyword">const</span><span class="special">*></span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">observers</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">for</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">observer</span> <span class="keyword">const</span><span class="special">*>::</span><span class="identifier">const_iterator</span>
+ <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">observers</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span> <span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">observers</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">if</span><span class="special">(!(*</span><span class="identifier">i</span><span class="special">))</span> <span class="keyword">return</span> <span class="keyword">false</span><span class="special">;</span>
+ <span class="special">}</span>
+ <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">private</span> <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">other_observers_unchanged</span><span class="special">)</span> <span class="special">(</span>
+ <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">observer</span> <span class="keyword">const</span><span class="special">*></span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">old</span><span class="special">,</span>
+ <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">observer</span> <span class="keyword">const</span><span class="special">*></span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">now</span><span class="special">,</span>
+ <span class="special">(</span><span class="identifier">observer</span> <span class="keyword">const</span><span class="special">*)</span> <span class="identifier">obs</span>
+ <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">obs</span> <span class="special">)</span> <span class="comment">// not null</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">observer</span> <span class="keyword">const</span><span class="special">*></span> <span class="identifier">remaining</span> <span class="special">=</span> <span class="identifier">now</span><span class="special">;</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">remove</span><span class="special">(</span><span class="identifier">remaining</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">remaining</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="identifier">obs</span><span class="special">);</span>
+
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">observer</span> <span class="keyword">const</span><span class="special">*>::</span><span class="identifier">const_iterator</span>
+ <span class="identifier">remaining_it</span> <span class="special">=</span> <span class="identifier">remaining</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">observer</span> <span class="keyword">const</span><span class="special">*>::</span><span class="identifier">const_iterator</span> <span class="identifier">old_it</span> <span class="special">=</span> <span class="identifier">old</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span>
+ <span class="keyword">while</span><span class="special">(</span><span class="identifier">remaining</span><span class="special">.</span><span class="identifier">end</span><span class="special">()</span> <span class="special">!=</span> <span class="identifier">remaining_it</span> <span class="special">&&</span> <span class="identifier">old</span><span class="special">.</span><span class="identifier">end</span><span class="special">()</span> <span class="special">!=</span> <span class="identifier">old_it</span><span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">if</span><span class="special">(*</span><span class="identifier">remaining_it</span> <span class="special">!=</span> <span class="special">*</span><span class="identifier">old_it</span><span class="special">)</span> <span class="keyword">return</span> <span class="keyword">false</span><span class="special">;</span>
+ <span class="special">++</span><span class="identifier">remaining_it</span><span class="special">;</span>
+ <span class="special">++</span><span class="identifier">old_it</span><span class="special">;</span>
+ <span class="special">}</span>
+ <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">private</span> <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">all_observers_updated</span><span class="special">)</span> <span class="special">(</span>
+ <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">observer</span> <span class="keyword">const</span><span class="special">*></span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">observers</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">for</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">observer</span> <span class="keyword">const</span><span class="special">*>::</span><span class="identifier">const_iterator</span>
+ <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">observers</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span> <span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">observers</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">if</span><span class="special">(!(*</span><span class="identifier">i</span><span class="special">))</span> <span class="keyword">return</span> <span class="keyword">false</span><span class="special">;</span>
+ <span class="keyword">if</span><span class="special">(!(*</span><span class="identifier">i</span><span class="special">)-></span><span class="identifier">up_to_date_with_subject</span><span class="special">())</span> <span class="keyword">return</span> <span class="keyword">false</span><span class="special">;</span>
+ <span class="special">}</span>
+ <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="identifier">observer</span><span class="special">*></span> <span class="identifier">observers_</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="preprocessor">#endif</span> <span class="comment">// #include guard</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: observer_main.cpp</span>
+<span class="preprocessor">#include</span> <span class="string">"observer/observer.hpp"</span>
+<span class="preprocessor">#include</span> <span class="string">"observer/subject.hpp"</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="keyword">int</span> <span class="identifier">state_check</span><span class="special">;</span> <span class="comment">// For unit testing.</span>
+
+<span class="keyword">class</span> <span class="identifier">concrete_subject</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">subject</span> <span class="comment">// Implement an actual subject.</span>
+<span class="special">{</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">int</span> <span class="identifier">state</span><span class="special">;</span> <span class="comment">// Some state being observed.</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">concrete_subject</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="special">:</span> <span class="identifier">state_</span><span class="special">()</span> <span class="special">{}</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">void</span> <span class="identifier">set_state</span> <span class="special">(</span><span class="identifier">state</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">the_state</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">state_</span> <span class="special">=</span> <span class="identifier">the_state</span><span class="special">;</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">state_</span> <span class="special">==</span> <span class="identifier">state_check</span><span class="special">);</span>
+ <span class="identifier">notify</span><span class="special">();</span> <span class="comment">// Notify observers.</span>
+ <span class="special">}</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">state</span> <span class="identifier">get_state</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">state_</span><span class="special">;</span> <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">state</span> <span class="identifier">state_</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// Implement of actual observer.</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">concrete_observer</span><span class="special">)</span> <span class="keyword">extends</span><span class="special">(</span> <span class="keyword">public</span> <span class="identifier">observer</span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR</span><span class="special">(</span> <span class="comment">// Create concrete observer.</span>
+ <span class="keyword">public</span> <span class="keyword">explicit</span> <span class="special">(</span><span class="identifier">concrete_observer</span><span class="special">)</span> <span class="special">(</span>
+ <span class="special">(</span><span class="identifier">concrete_subject</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">the_subject</span> <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">subject_</span><span class="special">(</span><span class="identifier">the_subject</span><span class="special">),</span> <span class="identifier">observed_state_</span><span class="special">()</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="comment">// Implement base virtual functions.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">private</span> <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">up_to_date_with_subject</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span> <span class="keyword">override</span> <span class="keyword">final</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span> <span class="comment">// For simplicity, always up-to-date.</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">private</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">update</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">override</span> <span class="keyword">final</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">observed_state_</span> <span class="special">=</span> <span class="identifier">subject_</span><span class="special">.</span><span class="identifier">get_state</span><span class="special">();</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">observed_state_</span> <span class="special">==</span> <span class="identifier">state_check</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">concrete_subject</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">subject_</span><span class="special">;</span>
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">concrete_subject</span><span class="special">::</span><span class="identifier">state</span> <span class="identifier">observed_state_</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">concrete_subject</span> <span class="identifier">sbj</span><span class="special">;</span>
+ <span class="identifier">concrete_observer</span> <span class="identifier">ob</span><span class="special">(</span><span class="identifier">sbj</span><span class="special">);</span>
+ <span class="identifier">sbj</span><span class="special">.</span><span class="identifier">attach</span><span class="special">(&</span><span class="identifier">ob</span><span class="special">);</span>
+ <span class="identifier">sbj</span><span class="special">.</span><span class="identifier">set_state</span><span class="special">(</span><span class="identifier">state_check</span> <span class="special">=</span> <span class="number">123</span><span class="special">);</span>
+ <span class="identifier">sbj</span><span class="special">.</span><span class="identifier">set_state</span><span class="special">(</span><span class="identifier">state_check</span> <span class="special">=</span> <span class="number">456</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__mitchell02___counter__subcontracting_and_virtual_specifiers__final__override__new__and_pure_virtual_"></a><a class="link" href="examples.html#contract__.examples.__mitchell02___counter__subcontracting_and_virtual_specifiers__final__override__new__and_pure_virtual_" title="[Mitchell02] Counter: Subcontracting and virtual specifiers (final, override, new, and pure virtual)">[Mitchell02]
+ Counter: Subcontracting and virtual specifiers (final, override, new, and pure
+ virtual)</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: counter/push_button.hpp</span>
+<span class="preprocessor">#ifndef</span> <span class="identifier">PUSH_BUTTON_HPP_</span>
+<span class="preprocessor">#define</span> <span class="identifier">PUSH_BUTTON_HPP_</span>
+
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// Basic button.</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">push_button</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="comment">// no invariant</span>
+
+ <span class="comment">// Creation.</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR</span><span class="special">(</span> <span class="comment">// Create an enabled button.</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">push_button</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">enabled</span><span class="special">()</span> <span class="special">)</span> <span class="comment">// enabled</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">enabled_</span><span class="special">(</span><span class="keyword">true</span><span class="special">)</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR</span><span class="special">(</span> <span class="comment">// Destroy button.</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">push_button</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="comment">// Queries.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// If button enabled.</span>
+ <span class="keyword">public</span> <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">enabled</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">enabled_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="comment">// Commands.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Enable this button.</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">enable</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">enabled</span><span class="special">()</span> <span class="special">)</span> <span class="comment">// enabled</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">enabled_</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Disable this button.</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">disable</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="keyword">not</span> <span class="identifier">enabled</span><span class="special">()</span> <span class="special">)</span> <span class="comment">// disabled</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">enabled_</span> <span class="special">=</span> <span class="keyword">false</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Invoked externally when this button is clicked.</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">on_bn_clicked</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">new</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">enabled</span><span class="special">()</span> <span class="special">)</span> <span class="comment">// enabled</span>
+ <span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="comment">// Contract for pure virtual function.</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="keyword">bool</span> <span class="identifier">enabled_</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="preprocessor">#endif</span> <span class="comment">// #include guard</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: counter/decrement_button.hpp</span>
+<span class="preprocessor">#ifndef</span> <span class="identifier">DECREMENT_BUTTON_HPP_</span>
+<span class="preprocessor">#define</span> <span class="identifier">DECREMENT_BUTTON_HPP_</span>
+
+<span class="preprocessor">#include</span> <span class="string">"push_button.hpp"</span>
+<span class="preprocessor">#include</span> <span class="string">"counter.hpp"</span>
+<span class="preprocessor">#include</span> <span class="string">"../observer/observer.hpp"</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">utility</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// Button that decrements counter.</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">decrement_button</span><span class="special">)</span> <span class="keyword">final</span> <span class="comment">// Contract for final class.</span>
+ <span class="keyword">extends</span><span class="special">(</span> <span class="keyword">public</span> <span class="identifier">push_button</span><span class="special">,</span> <span class="keyword">protected</span> <span class="identifier">observer</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">noncopyable</span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="comment">// no invariant</span>
+
+ <span class="comment">// Creation.</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR</span><span class="special">(</span> <span class="comment">// Create button associated with given counter.</span>
+ <span class="keyword">public</span> <span class="keyword">explicit</span> <span class="special">(</span><span class="identifier">decrement_button</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">counter</span><span class="special">&)</span> <span class="identifier">the_counter</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="comment">// enabled iff positive value</span>
+ <span class="identifier">enabled</span><span class="special">()</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">the_counter</span><span class="special">.</span><span class="identifier">value</span><span class="special">()</span> <span class="special">></span> <span class="number">0</span><span class="special">)</span>
+ <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">counter_ref_</span><span class="special">(</span><span class="identifier">the_counter</span><span class="special">)</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">counter_ref_</span><span class="special">.</span><span class="identifier">attach</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR</span><span class="special">(</span> <span class="comment">// Destroy button.</span>
+ <span class="keyword">public</span> <span class="special">(~</span><span class="identifier">decrement_button</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="comment">// Commands.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">on_bn_clicked</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">override</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="identifier">old_value</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">counter_ref_</span><span class="special">.</span><span class="identifier">value</span><span class="special">(),</span>
+ <span class="identifier">counter_ref_</span><span class="special">.</span><span class="identifier">value</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_value</span> <span class="special">-</span> <span class="number">1</span> <span class="comment">// counter decremented</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">counter_ref_</span><span class="special">.</span><span class="identifier">decrement</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">private</span> <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">up_to_date_with_subject</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span> <span class="keyword">override</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span> <span class="comment">// For simplicity, always up-to-date.</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">private</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">update</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">override</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="comment">// enabled if positive value</span>
+ <span class="identifier">enabled</span><span class="special">()</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">counter_ref_</span><span class="special">.</span><span class="identifier">value</span><span class="special">()</span> <span class="special">></span> <span class="number">0</span><span class="special">)</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">counter_ref_</span><span class="special">.</span><span class="identifier">value</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">)</span> <span class="identifier">disable</span><span class="special">();</span>
+ <span class="keyword">else</span> <span class="identifier">enable</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">counter</span><span class="special">&</span> <span class="identifier">counter_ref_</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="preprocessor">#endif</span> <span class="comment">// #include guard</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: counter/counter.hpp</span>
+<span class="preprocessor">#ifndef</span> <span class="identifier">COUNTER_HPP_</span>
+<span class="preprocessor">#define</span> <span class="identifier">COUNTER_HPP_</span>
+
+<span class="preprocessor">#include</span> <span class="string">"../observer/subject.hpp"</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// Positive integer counter.</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">counter</span><span class="special">)</span> <span class="keyword">extends</span><span class="special">(</span> <span class="keyword">public</span> <span class="identifier">subject</span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="comment">// no invariants</span>
+
+ <span class="comment">// Creation.</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR</span><span class="special">(</span> <span class="comment">// Construct counter with specified value.</span>
+ <span class="keyword">public</span> <span class="keyword">explicit</span> <span class="special">(</span><span class="identifier">counter</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="keyword">const</span> <span class="identifier">a_value</span><span class="special">,</span> <span class="keyword">default</span> <span class="number">10</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">value</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">a_value</span> <span class="special">)</span> <span class="comment">// value set</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">value_</span><span class="special">(</span><span class="identifier">a_value</span><span class="special">)</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR</span><span class="special">(</span> <span class="comment">// Destroy counter.</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">counter</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="comment">// Queries.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Current counter value.</span>
+ <span class="keyword">public</span> <span class="keyword">int</span> <span class="special">(</span><span class="identifier">value</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">value_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="comment">// Commands.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Decrement counter value.</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">decrement</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_value</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">value</span><span class="special">(),</span>
+ <span class="identifier">value</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_value</span> <span class="special">-</span> <span class="number">1</span> <span class="comment">// decremented</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="special">--</span><span class="identifier">value_</span><span class="special">;</span>
+ <span class="identifier">notify</span><span class="special">();</span> <span class="comment">// Notifies all attached observers.</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="keyword">int</span> <span class="identifier">value_</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="preprocessor">#endif</span> <span class="comment">// #include guard</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: counter_main.cpp</span>
+<span class="preprocessor">#include</span> <span class="string">"counter/counter.hpp"</span>
+<span class="preprocessor">#include</span> <span class="string">"counter/decrement_button.hpp"</span>
+<span class="preprocessor">#include</span> <span class="string">"observer/observer.hpp"</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="keyword">int</span> <span class="identifier">counter_check</span><span class="special">;</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// Show current value of associated counter.</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">view_of_counter</span><span class="special">)</span> <span class="keyword">extends</span><span class="special">(</span> <span class="keyword">private</span> <span class="identifier">observer</span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="comment">// no invariant</span>
+
+ <span class="comment">// Creation.</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR</span><span class="special">(</span> <span class="comment">// Create viewer associated with given counter.</span>
+ <span class="keyword">public</span> <span class="keyword">explicit</span> <span class="special">(</span><span class="identifier">view_of_counter</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">counter</span><span class="special">&)</span> <span class="identifier">the_counter</span> <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">counter_ref_</span><span class="special">(</span><span class="identifier">the_counter</span><span class="special">)</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">counter_ref_</span><span class="special">.</span><span class="identifier">attach</span><span class="special">(</span><span class="keyword">this</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">counter_ref_</span><span class="special">.</span><span class="identifier">value</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">counter_check</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR</span><span class="special">(</span> <span class="comment">// Destroy viewer.</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">view_of_counter</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">private</span> <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">up_to_date_with_subject</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span> <span class="keyword">override</span> <span class="keyword">final</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span> <span class="comment">// For simplicity, always up-to-date.</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">private</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">update</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">override</span> <span class="keyword">final</span> <span class="comment">// Contract final func.</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">counter_ref_</span><span class="special">.</span><span class="identifier">value</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">counter_check</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">counter</span><span class="special">&</span> <span class="identifier">counter_ref_</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">counter</span> <span class="identifier">count</span><span class="special">(</span><span class="identifier">counter_check</span> <span class="special">=</span> <span class="number">1</span><span class="special">);</span>
+ <span class="identifier">view_of_counter</span> <span class="identifier">view</span><span class="special">(</span><span class="identifier">count</span><span class="special">);</span>
+ <span class="identifier">decrement_button</span> <span class="identifier">decrement</span><span class="special">(</span><span class="identifier">count</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">decrement</span><span class="special">.</span><span class="identifier">enabled</span><span class="special">());</span>
+
+ <span class="identifier">counter_check</span><span class="special">--;</span>
+ <span class="identifier">decrement</span><span class="special">.</span><span class="identifier">on_bn_clicked</span><span class="special">();</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="keyword">not</span> <span class="identifier">decrement</span><span class="special">.</span><span class="identifier">enabled</span><span class="special">());</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__stroustrup97___string__throw_when_contract_is_broken"></a><a class="link" href="examples.html#contract__.examples.__stroustrup97___string__throw_when_contract_is_broken" title="[Stroustrup97] String: Throw when contract is broken">[Stroustrup97]
+ String: Throw when contract is broken</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: string.hpp</span>
+<span class="preprocessor">#ifndef</span> <span class="identifier">STRING_HPP_</span>
+<span class="preprocessor">#define</span> <span class="identifier">STRING_HPP_</span>
+
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cstring</span><span class="special">></span>
+
+<span class="comment">// Adapted from an example presented in [Stroustrup1997] to illustrate</span>
+<span class="comment">// importance of class invariants. Simple preconditions were added where it</span>
+<span class="comment">// made sense. This should be compiled with postconditions checking turned off</span>
+<span class="comment">// (define the `CONTRACT_CONFIG_NO_POSTCONDITIONS` macro) because</span>
+<span class="comment">// postconditions are deliberately not used.</span>
+<span class="comment">// See [Stroustrup1997] for a discussion on the importance of class invariants,</span>
+<span class="comment">// and on pros and cons of using pre and post conditions.</span>
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">string</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span>
+ <span class="comment">// It would be better to assert conditions separately so to generate</span>
+ <span class="comment">// more informative error in case they fail.</span>
+ <span class="identifier">chars_</span> <span class="special">?</span> <span class="keyword">true</span> <span class="special">:</span> <span class="keyword">throw</span> <span class="identifier">invariant_error</span><span class="special">(),</span>
+ <span class="identifier">size_</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">?</span> <span class="keyword">true</span> <span class="special">:</span> <span class="keyword">throw</span> <span class="identifier">invariant_error</span><span class="special">(),</span>
+ <span class="identifier">too_large</span> <span class="special">>=</span> <span class="identifier">size_</span> <span class="special">?</span> <span class="keyword">true</span> <span class="special">:</span> <span class="keyword">throw</span> <span class="identifier">invariant_error</span><span class="special">(),</span>
+ <span class="identifier">chars_</span><span class="special">[</span><span class="identifier">size_</span><span class="special">]</span> <span class="special">==</span> <span class="char">'\0'</span> <span class="special">?</span> <span class="keyword">true</span> <span class="special">:</span> <span class="keyword">throw</span> <span class="identifier">invariant_error</span><span class="special">()</span>
+ <span class="special">)</span>
+
+ <span class="comment">// Broken contracts throw user defined exceptions.</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">class</span> <span class="identifier">range_error</span> <span class="special">{};</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">class</span> <span class="identifier">invariant_error</span> <span class="special">{};</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">class</span> <span class="identifier">null_error</span> <span class="special">{};</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">class</span> <span class="identifier">too_large_error</span> <span class="special">{};</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">enum</span> <span class="special">{</span> <span class="identifier">too_large</span> <span class="special">=</span> <span class="number">16000</span> <span class="special">};</span> <span class="comment">// Length limit.</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">string</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*)</span> <span class="identifier">chars</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span>
+ <span class="identifier">chars</span> <span class="special">?</span> <span class="keyword">true</span> <span class="special">:</span> <span class="keyword">throw</span> <span class="identifier">null_error</span><span class="special">(),</span>
+ <span class="identifier">strlen</span><span class="special">(</span><span class="identifier">chars</span><span class="special">)</span> <span class="special"><=</span> <span class="identifier">too_large</span> <span class="special">?</span> <span class="keyword">true</span> <span class="special">:</span> <span class="keyword">throw</span> <span class="identifier">too_large_error</span><span class="special">()</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span> <span class="comment">// Deferred body definition.</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">string</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">string</span><span class="special">&)</span> <span class="identifier">other</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(~</span><span class="identifier">string</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="keyword">char</span><span class="special">&)</span> <span class="keyword">operator</span><span class="special">([])(</span><span class="identifier">at</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">index</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span>
+ <span class="identifier">index</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">?</span> <span class="keyword">true</span> <span class="special">:</span> <span class="keyword">throw</span> <span class="identifier">range_error</span><span class="special">(),</span>
+ <span class="identifier">size_</span> <span class="special">></span> <span class="identifier">index</span> <span class="special">?</span> <span class="keyword">true</span> <span class="special">:</span> <span class="keyword">throw</span> <span class="identifier">range_error</span><span class="special">()</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">int</span> <span class="special">(</span><span class="identifier">size</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Not public so it does not check class invariants.</span>
+ <span class="keyword">private</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">init</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="keyword">const</span> <span class="keyword">char</span><span class="special">*)</span> <span class="identifier">q</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="keyword">int</span> <span class="identifier">size_</span><span class="special">;</span>
+ <span class="keyword">private</span><span class="special">:</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">chars_</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="preprocessor">#endif</span> <span class="comment">// #include guard</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: string.cpp</span>
+<span class="preprocessor">#include</span> <span class="string">"string.hpp"</span>
+
+<span class="identifier">CONTRACT_CONSTRUCTOR_BODY</span><span class="special">(</span><span class="identifier">string</span><span class="special">,</span> <span class="identifier">string</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">chars</span> <span class="special">)</span>
+ <span class="special">{</span> <span class="identifier">init</span><span class="special">(</span><span class="identifier">chars</span><span class="special">);</span> <span class="special">}</span>
+
+<span class="identifier">CONTRACT_CONSTRUCTOR_BODY</span><span class="special">(</span><span class="identifier">string</span><span class="special">,</span> <span class="identifier">string</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">const</span> <span class="identifier">string</span><span class="special">&</span> <span class="identifier">other</span> <span class="special">)</span>
+ <span class="special">{</span> <span class="identifier">init</span><span class="special">(</span><span class="identifier">other</span><span class="special">.</span><span class="identifier">chars_</span><span class="special">);</span> <span class="special">}</span>
+
+<span class="identifier">CONTRACT_DESTRUCTOR_BODY</span><span class="special">(</span><span class="identifier">string</span><span class="special">,</span> <span class="special">~</span><span class="identifier">string</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">{</span> <span class="keyword">delete</span><span class="special">[]</span> <span class="identifier">chars_</span><span class="special">;</span> <span class="special">}</span>
+
+<span class="keyword">char</span><span class="special">&</span> <span class="identifier">string</span><span class="special">::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="keyword">operator</span><span class="special">([])(</span><span class="identifier">at</span><span class="special">))</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">index</span> <span class="special">)</span>
+ <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">chars_</span><span class="special">[</span><span class="identifier">index</span><span class="special">];</span> <span class="special">}</span>
+
+<span class="keyword">int</span> <span class="identifier">string</span><span class="special">::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">size</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">size_</span><span class="special">;</span> <span class="special">}</span>
+
+<span class="keyword">void</span> <span class="identifier">string</span><span class="special">::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">init</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">const</span> <span class="keyword">char</span><span class="special">*</span> <span class="identifier">chars</span> <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">size_</span> <span class="special">=</span> <span class="identifier">strlen</span><span class="special">(</span><span class="identifier">chars</span><span class="special">);</span>
+ <span class="identifier">chars_</span> <span class="special">=</span> <span class="keyword">new</span> <span class="keyword">char</span><span class="special">[</span><span class="identifier">size_</span> <span class="special">+</span> <span class="number">1</span><span class="special">];</span>
+ <span class="keyword">for</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">size_</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="identifier">chars_</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">chars</span><span class="special">[</span><span class="identifier">i</span><span class="special">];</span>
+ <span class="identifier">chars_</span><span class="special">[</span><span class="identifier">size_</span><span class="special">]</span> <span class="special">=</span> <span class="char">'\0'</span><span class="special">;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: string_main.cpp</span>
+<span class="preprocessor">#include</span> <span class="string">"string.hpp"</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="comment">// Handler that re-throws contract broken exceptions instead of terminating.</span>
+<span class="keyword">void</span> <span class="identifier">throwing_handler</span> <span class="special">(</span> <span class="identifier">contract</span><span class="special">::</span><span class="identifier">from</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">context</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">context</span> <span class="special">==</span> <span class="identifier">contract</span><span class="special">::</span><span class="identifier">FROM_DESTRUCTOR</span><span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// Destructor cannot throw for STL exception safety (ignore error).</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">clog</span> <span class="special"><<</span> <span class="string">"Ignored destructor contract failure"</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
+ <span class="special">}</span> <span class="keyword">else</span> <span class="special">{</span>
+ <span class="comment">// Failure handlers always called with active an exception.</span>
+ <span class="keyword">throw</span><span class="special">;</span> <span class="comment">// Re-throw active exception thrown by precondition.</span>
+ <span class="special">}</span>
+<span class="special">}</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="comment">// Setup all contract failure handlers to throw (instead of terminate).</span>
+ <span class="identifier">contract</span><span class="special">::</span><span class="identifier">set_precondition_broken</span><span class="special">(&</span><span class="identifier">throwing_handler</span><span class="special">);</span>
+ <span class="identifier">contract</span><span class="special">::</span><span class="identifier">set_postcondition_broken</span><span class="special">(&</span><span class="identifier">throwing_handler</span><span class="special">);</span>
+ <span class="identifier">contract</span><span class="special">::</span><span class="identifier">set_class_invariant_broken</span><span class="special">(&</span><span class="identifier">throwing_handler</span><span class="special">);</span>
+ <span class="identifier">contract</span><span class="special">::</span><span class="identifier">set_block_invariant_broken</span><span class="special">(&</span><span class="identifier">throwing_handler</span><span class="special">);</span>
+ <span class="identifier">contract</span><span class="special">::</span><span class="identifier">set_loop_variant_broken</span><span class="special">(&</span><span class="identifier">throwing_handler</span><span class="special">);</span>
+
+ <span class="identifier">string</span> <span class="identifier">s</span><span class="special">(</span><span class="string">"abc"</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">s</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="char">'a'</span><span class="special">);</span>
+
+<span class="preprocessor">#ifndef</span> <span class="identifier">CONTRACT_CONFIG_NO_PRECONDITIONS</span>
+ <span class="keyword">bool</span> <span class="identifier">pass</span> <span class="special">=</span> <span class="keyword">false</span><span class="special">;</span>
+ <span class="keyword">try</span> <span class="special">{</span> <span class="identifier">s</span><span class="special">[</span><span class="number">3</span><span class="special">];</span> <span class="special">}</span> <span class="comment">// Out of range.</span>
+ <span class="keyword">catch</span><span class="special">(</span><span class="identifier">string</span><span class="special">::</span><span class="identifier">range_error</span><span class="special">)</span> <span class="special">{</span> <span class="identifier">pass</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">;</span> <span class="special">}</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">pass</span><span class="special">);</span>
+<span class="preprocessor">#endif</span>
+
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__cline90___vector__comparison_with_a___proposed_syntax"></a><a class="link" href="examples.html#contract__.examples.__cline90___vector__comparison_with_a___proposed_syntax" title="[Cline90] Vector: Comparison with A++ proposed syntax">[Cline90]
+ Vector: Comparison with A++ proposed syntax</a>
+</h3></div></div></div>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>
+ <p>
+ This Library (C++03)
+ </p>
+ </th>
+<th>
+ <p>
+ A++ Proposal (not part of C++)
+ </p>
+ </th>
+</tr></thead>
+<tbody>
+<tr>
+<td>
+ <p>
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="comment">// File: vector.hpp</span>
+<span class="preprocessor">#ifndef</span> <span class="identifier">VECTOR_HPP_</span>
+<span class="preprocessor">#define</span> <span class="identifier">VECTOR_HPP_</span>
+
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">vector</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// NOTE: Incomplete set of assertions addressing only `size`.</span>
+
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">explicit</span> <span class="special">(</span><span class="identifier">vector</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">count</span><span class="special">,</span> <span class="keyword">default</span> <span class="number">10</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">count</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span> <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">data_</span><span class="special">(</span><span class="keyword">new</span> <span class="identifier">T</span><span class="special">[</span><span class="identifier">count</span><span class="special">]),</span> <span class="identifier">size_</span><span class="special">(</span><span class="identifier">count</span><span class="special">)</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">for</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">size_</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="identifier">data_</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">T</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">vector</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">delete</span><span class="special">[]</span> <span class="identifier">data_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">int</span> <span class="special">(</span><span class="identifier">size</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="comment">// postcondition: Result non-negative checked by class invariant</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">size_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">resize</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">count</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">count</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">T</span><span class="special">*</span> <span class="identifier">slice</span> <span class="special">=</span> <span class="keyword">new</span> <span class="identifier">T</span><span class="special">[</span><span class="identifier">count</span><span class="special">];</span>
+ <span class="keyword">for</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">count</span> <span class="special">&&</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">size_</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="identifier">slice</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">data_</span><span class="special">[</span><span class="identifier">i</span><span class="special">];</span>
+ <span class="keyword">delete</span><span class="special">[]</span> <span class="identifier">data_</span><span class="special">;</span>
+ <span class="identifier">data_</span> <span class="special">=</span> <span class="identifier">slice</span><span class="special">;</span>
+ <span class="identifier">size_</span> <span class="special">=</span> <span class="identifier">count</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">T</span><span class="special">&)</span> <span class="keyword">operator</span><span class="special">([])(</span><span class="identifier">at</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">index</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span>
+ <span class="identifier">index</span> <span class="special">>=</span> <span class="number">0</span><span class="special">,</span>
+ <span class="identifier">index</span> <span class="special"><</span> <span class="identifier">size</span><span class="special">()</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">data_</span><span class="special">[</span><span class="identifier">index</span><span class="special">];</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">T</span><span class="special">*</span> <span class="identifier">data_</span><span class="special">;</span>
+ <span class="keyword">private</span><span class="special">:</span> <span class="keyword">int</span> <span class="identifier">size_</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="preprocessor">#endif</span> <span class="comment">// #include guard</span>
+</pre>
+<p>
+ </p>
+ </td>
+<td>
+ <p>
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="comment">// File: vector_app.hpp</span>
+<span class="comment">// Extra spaces, newlines, etc used to align text with this library code.</span>
+
+
+
+
+
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
+<span class="keyword">class</span> <span class="identifier">vector</span>
+<span class="special">{</span>
+ <span class="identifier">legal</span><span class="special">:</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">>=</span> <span class="number">0</span><span class="special">;</span> <span class="comment">// Class invariants (legal).</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">explicit</span> <span class="identifier">vector</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">count</span> <span class="special">=</span> <span class="number">10</span> <span class="special">)</span>
+ <span class="special">:</span> <span class="identifier">data_</span><span class="special">(</span><span class="keyword">new</span> <span class="identifier">T</span><span class="special">[</span><span class="identifier">count</span><span class="special">]),</span> <span class="identifier">size_</span><span class="special">(</span><span class="identifier">count</span><span class="special">)</span>
+ <span class="special">{</span>
+ <span class="keyword">for</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">size_</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="identifier">data_</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">T</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">vector</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">{</span>
+ <span class="keyword">delete</span><span class="special">[]</span> <span class="identifier">data_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">int</span> <span class="identifier">size</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">size_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">void</span> <span class="identifier">resize</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">count</span> <span class="special">)</span>
+ <span class="special">{</span>
+ <span class="identifier">T</span><span class="special">*</span> <span class="identifier">slice</span> <span class="special">=</span> <span class="keyword">new</span> <span class="identifier">T</span><span class="special">[</span><span class="identifier">count</span><span class="special">];</span>
+ <span class="keyword">for</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">count</span> <span class="special">&&</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">size_</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="identifier">slice</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">data_</span><span class="special">[</span><span class="identifier">i</span><span class="special">];</span>
+ <span class="keyword">delete</span><span class="special">[]</span> <span class="identifier">data_</span><span class="special">;</span>
+ <span class="identifier">data_</span> <span class="special">=</span> <span class="identifier">slice</span><span class="special">;</span>
+ <span class="identifier">size_</span> <span class="special">=</span> <span class="identifier">count</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">T</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">[]</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">index</span> <span class="special">)</span>
+ <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">data_</span><span class="special">[</span><span class="identifier">index</span><span class="special">];</span>
+ <span class="special">}</span>
+
+ <span class="comment">// Preconditions (require) and postconditions (promise) for each function.</span>
+ <span class="identifier">axioms</span><span class="special">:</span> <span class="special">[</span> <span class="keyword">int</span> <span class="identifier">count</span><span class="special">;</span> <span class="identifier">require</span> <span class="identifier">count</span> <span class="special">>=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">promise</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span> <span class="special">]</span>
+ <span class="identifier">vector</span><span class="special">(</span><span class="identifier">count</span><span class="special">);</span>
+ <span class="identifier">axioms</span><span class="special">:</span> <span class="special">[</span> <span class="keyword">int</span> <span class="identifier">count</span><span class="special">;</span> <span class="identifier">require</span> <span class="identifier">count</span> <span class="special">>=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">promise</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span> <span class="special">]</span>
+ <span class="identifier">resize</span><span class="special">(</span><span class="identifier">count</span><span class="special">);</span>
+ <span class="identifier">axioms</span><span class="special">:</span> <span class="special">[</span> <span class="keyword">int</span> <span class="identifier">index</span><span class="special">;</span> <span class="identifier">require</span> <span class="identifier">index</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">&&</span> <span class="identifier">index</span> <span class="special"><</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">]</span>
+ <span class="special">(*</span><span class="keyword">this</span><span class="special">)[</span><span class="identifier">x</span><span class="special">];</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">T</span><span class="special">*</span> <span class="identifier">data_</span><span class="special">;</span>
+ <span class="keyword">private</span><span class="special">:</span> <span class="keyword">int</span> <span class="identifier">size_</span><span class="special">;</span>
+<span class="special">};</span>
+</pre>
+<p>
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="comment">// File: vector_main.cpp</span>
+<span class="preprocessor">#include</span> <span class="string">"vector.hpp"</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">v</span><span class="special">(</span><span class="number">3</span><span class="special">);</span> <span class="comment">// Also set all elements to 0.0.</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">v</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">3</span><span class="special">);</span>
+ <span class="identifier">v</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">=</span> <span class="number">123</span><span class="special">;</span>
+ <span class="identifier">v</span><span class="special">.</span><span class="identifier">resize</span><span class="special">(</span><span class="number">2</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">v</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">==</span> <span class="number">123</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">v</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">2</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+ </td>
+<td>
+ </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__cline90___stack__function_try_blocks_and_exception_specifications"></a><a class="link" href="examples.html#contract__.examples.__cline90___stack__function_try_blocks_and_exception_specifications" title="[Cline90] Stack: Function-Try blocks and exception specifications">[Cline90]
+ Stack: Function-Try blocks and exception specifications</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: stack.cpp</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">config</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">utility</span><span class="special">/</span><span class="identifier">identity_type</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">exception</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="keyword">new</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">utility</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">iostream</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">stack</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// NOTE: Incomplete set of assertions addressing only `empty` and `full`.</span>
+
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">struct</span> <span class="identifier">out_of_memory</span> <span class="special">{};</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">struct</span> <span class="identifier">error</span> <span class="special">{};</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">explicit</span> <span class="special">(</span><span class="identifier">stack</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">capacity</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">capacity</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="identifier">empty</span><span class="special">(),</span>
+ <span class="identifier">full</span><span class="special">()</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">capacity</span> <span class="special">==</span> <span class="number">0</span><span class="special">)</span>
+ <span class="special">)</span>
+ <span class="comment">// Function-Try blocks are programmed within the macros only for</span>
+ <span class="comment">// constructors with member initializers otherwise they are</span>
+ <span class="comment">// programmed with the body definition and outside the macros.</span>
+ <span class="keyword">try</span> <span class="keyword">initialize</span><span class="special">(</span> <span class="comment">// Try-block for constructor initializers and body.</span>
+ <span class="identifier">data_</span><span class="special">(</span><span class="keyword">new</span> <span class="identifier">T</span><span class="special">[</span><span class="identifier">capacity</span><span class="special">]),</span>
+ <span class="identifier">capacity_</span><span class="special">(</span><span class="identifier">capacity</span><span class="special">),</span>
+ <span class="identifier">size_</span><span class="special">(</span><span class="number">0</span><span class="special">)</span>
+ <span class="special">)</span> <span class="keyword">catch</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span><span class="special">&</span> <span class="identifier">e</span><span class="special">)</span> <span class="special">(</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span> <span class="special"><<</span> <span class="string">"out of memory for "</span> <span class="special"><<</span> <span class="identifier">capacity</span> <span class="special"><<</span> <span class="string">"-stack: "</span> <span class="special"><<</span>
+ <span class="identifier">e</span><span class="special">.</span><span class="identifier">what</span><span class="special">()</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
+ <span class="keyword">throw</span> <span class="identifier">out_of_memory</span><span class="special">();</span>
+ <span class="comment">// Unfortunately, cannot wrap exception type commas with extra</span>
+ <span class="comment">// parenthesis (because symbol `...` used to catch-all) but</span>
+ <span class="comment">// `BOOST_IDENTITY_TYPE` can be used.</span>
+ <span class="special">)</span> <span class="keyword">catch</span><span class="special">(</span><span class="identifier">BOOST_IDENTITY_TYPE</span><span class="special">((</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">char</span> <span class="keyword">const</span><span class="special">*>&))</span> <span class="identifier">e</span><span class="special">)</span> <span class="special">(</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span> <span class="special"><<</span> <span class="string">"error number "</span> <span class="special"><<</span> <span class="identifier">e</span><span class="special">.</span><span class="identifier">first</span> <span class="special"><<</span> <span class="string">" for "</span> <span class="special"><<</span>
+ <span class="identifier">capacity</span> <span class="special"><<</span> <span class="string">"-stack: "</span> <span class="special"><<</span> <span class="identifier">e</span><span class="special">.</span><span class="identifier">second</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
+ <span class="keyword">throw</span> <span class="identifier">error</span><span class="special">();</span>
+ <span class="special">)</span> <span class="keyword">catch</span><span class="special">(...)</span> <span class="special">(</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span> <span class="special"><<</span> <span class="string">"unknown error for "</span> <span class="special"><<</span> <span class="identifier">capacity</span> <span class="special"><<</span> <span class="string">"-stack"</span> <span class="special"><<</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
+ <span class="keyword">throw</span><span class="special">;</span> <span class="comment">// Re-throw exception.</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">for</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">capacity_</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="identifier">data_</span><span class="special">[</span><span class="identifier">i</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">T</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">stack</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span>
+<span class="preprocessor">#if</span> <span class="special">!</span><span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_MSVC</span><span class="special">)</span> <span class="comment">// MSVC supports only constructor-try blocks.</span>
+ <span class="keyword">try</span> <span class="special">{</span> <span class="comment">// Function-try block (outside the macro).</span>
+ <span class="keyword">delete</span><span class="special">[]</span> <span class="identifier">data_</span><span class="special">;</span>
+ <span class="special">}</span> <span class="keyword">catch</span><span class="special">(...)</span> <span class="special">{</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span> <span class="special"><<</span> <span class="string">"error for stack destruction, terminating"</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span><span class="special">();</span> <span class="comment">// Destructor should never throw.</span>
+ <span class="special">}</span>
+<span class="preprocessor">#else</span> <span class="comment">// MSVC</span>
+ <span class="special">{</span>
+ <span class="keyword">delete</span><span class="special">[]</span> <span class="identifier">data_</span><span class="special">;</span>
+ <span class="special">}</span>
+<span class="preprocessor">#endif</span> <span class="comment">// MSVC</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">empty</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">size_</span> <span class="special">==</span> <span class="number">0</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">full</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">size_</span> <span class="special">==</span> <span class="identifier">capacity_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">push</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="identifier">value</span> <span class="special">)</span>
+<span class="preprocessor">#if</span> <span class="special">!</span><span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_MSVC</span><span class="special">)</span> <span class="comment">// MSVC only supports throw( void ) exception spec.</span>
+ <span class="keyword">throw</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">exception</span><span class="special">,</span> <span class="identifier">error</span> <span class="special">)</span> <span class="comment">// Ex spec.</span>
+<span class="preprocessor">#endif</span> <span class="comment">// MSVC</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="keyword">not</span> <span class="identifier">full</span><span class="special">()</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="keyword">not</span> <span class="identifier">empty</span><span class="special">()</span> <span class="special">)</span>
+ <span class="special">)</span>
+<span class="preprocessor">#if</span> <span class="special">!</span><span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_MSVC</span><span class="special">)</span> <span class="comment">// MSVC supports only constructor-try blocks.</span>
+ <span class="keyword">try</span>
+<span class="preprocessor">#endif</span> <span class="comment">// MSVC</span>
+ <span class="special">{</span> <span class="comment">// Function-Try block (outside the macro).</span>
+ <span class="identifier">data_</span><span class="special">[</span><span class="identifier">size_</span><span class="special">++]</span> <span class="special">=</span> <span class="identifier">value</span><span class="special">;</span>
+ <span class="special">}</span>
+<span class="preprocessor">#if</span> <span class="special">!</span><span class="identifier">defined</span><span class="special">(</span><span class="identifier">BOOST_MSVC</span><span class="special">)</span> <span class="comment">// MSVC supports only constructor-try blocks.</span>
+ <span class="keyword">catch</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">exception</span><span class="special">&</span> <span class="identifier">e</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span> <span class="special"><<</span> <span class="string">"error for "</span> <span class="special"><<</span> <span class="identifier">capacity_</span> <span class="special"><<</span> <span class="string">"-stack: "</span> <span class="special"><<</span> <span class="identifier">e</span><span class="special">.</span><span class="identifier">what</span><span class="special">()</span> <span class="special"><<</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
+ <span class="keyword">throw</span><span class="special">;</span> <span class="comment">// Re-throw STL exception.</span>
+ <span class="special">}</span> <span class="keyword">catch</span><span class="special">(...)</span> <span class="special">{</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span> <span class="special"><<</span> <span class="string">"unknown error for "</span> <span class="special"><<</span> <span class="identifier">capacity_</span> <span class="special"><<</span> <span class="string">"-stack"</span> <span class="special"><<</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
+ <span class="keyword">throw</span> <span class="identifier">error</span><span class="special">();</span>
+ <span class="special">}</span>
+<span class="preprocessor">#endif</span> <span class="comment">// MSVC</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="special">(</span><span class="identifier">pop</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="keyword">not</span> <span class="identifier">empty</span><span class="special">()</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="keyword">not</span> <span class="identifier">full</span><span class="special">()</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">data_</span><span class="special">[--</span><span class="identifier">size_</span><span class="special">];</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">T</span><span class="special">*</span> <span class="identifier">data_</span><span class="special">;</span>
+ <span class="keyword">private</span><span class="special">:</span> <span class="keyword">int</span> <span class="identifier">capacity_</span><span class="special">;</span>
+ <span class="keyword">private</span><span class="special">:</span> <span class="keyword">int</span> <span class="identifier">size_</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">stack</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">s</span><span class="special">(</span><span class="number">3</span><span class="special">);</span>
+ <span class="identifier">s</span><span class="special">.</span><span class="identifier">push</span><span class="special">(</span><span class="number">123</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">pop</span><span class="special">()</span> <span class="special">==</span> <span class="number">123</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__cline90___vector_stack__subcontracting_from_abstract_data_type__adt_"></a><a class="link" href="examples.html#contract__.examples.__cline90___vector_stack__subcontracting_from_abstract_data_type__adt_" title="[Cline90] Vector-Stack: Subcontracting from Abstract Data Type (ADT)">[Cline90]
+ Vector-Stack: Subcontracting from Abstract Data Type (ADT)</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: vstack.cpp</span>
+<span class="preprocessor">#include</span> <span class="string">"vector.hpp"</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// Stack Abstract Data Type (ADT).</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">stack_adt</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// NOTE: Incomplete set of assertions addressing only empty/full issues.</span>
+
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="comment">// no invariants</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">stack_adt</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="comment">// postcondition:</span>
+ <span class="comment">// empty (cannot be checked because empty's postcondition uses</span>
+ <span class="comment">// length which is pure virtual during construction)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(~</span><span class="identifier">stack_adt</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">full</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">length</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">capacity</span><span class="special">())</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">length</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">capacity</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">empty</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span> <span class="identifier">result</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">length</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">)</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">length</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keyword">int</span> <span class="special">(</span><span class="identifier">length</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span> <span class="identifier">result</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keyword">int</span> <span class="special">(</span><span class="identifier">capacity</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span> <span class="identifier">result</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">push</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="keyword">not</span> <span class="identifier">full</span><span class="special">()</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="keyword">not</span> <span class="identifier">empty</span><span class="special">()</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="comment">// Contract for pure virtual function.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="special">(</span><span class="identifier">pop</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="keyword">not</span> <span class="identifier">empty</span><span class="special">()</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="keyword">not</span> <span class="identifier">full</span><span class="special">()</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">clear</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">empty</span><span class="special">()</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// Vector-based stack.</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">vstack</span><span class="special">)</span> <span class="keyword">extends</span><span class="special">(</span> <span class="keyword">public</span> <span class="identifier">stack_adt</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span>
+ <span class="identifier">length</span><span class="special">()</span> <span class="special">>=</span> <span class="number">0</span><span class="special">,</span>
+ <span class="identifier">length</span><span class="special">()</span> <span class="special"><</span> <span class="identifier">capacity</span><span class="special">()</span>
+ <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">explicit</span> <span class="special">(</span><span class="identifier">vstack</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">count</span><span class="special">,</span> <span class="keyword">default</span> <span class="number">10</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">count</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">length</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">,</span> <span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span> <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">vect_</span><span class="special">(</span><span class="identifier">count</span><span class="special">),</span> <span class="identifier">length_</span><span class="special">(</span><span class="number">0</span><span class="special">)</span> <span class="special">)</span> <span class="comment">// OK, after preconditions.</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">vstack</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="comment">// NOTE: All following inherit contracts from `stack_adt`.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">int</span> <span class="special">(</span><span class="identifier">length</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span> <span class="keyword">override</span> <span class="keyword">final</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">length_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">int</span> <span class="special">(</span><span class="identifier">capacity</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">push</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="identifier">value</span> <span class="special">)</span> <span class="keyword">override</span> <span class="keyword">final</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">vect_</span><span class="special">[</span><span class="identifier">length_</span><span class="special">++]</span> <span class="special">=</span> <span class="identifier">value</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="special">(</span><span class="identifier">pop</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">override</span> <span class="keyword">final</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vect_</span><span class="special">[--</span><span class="identifier">length_</span><span class="special">];</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">clear</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">override</span> <span class="keyword">final</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">length_</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">vect_</span><span class="special">;</span>
+ <span class="keyword">private</span><span class="special">:</span> <span class="keyword">int</span> <span class="identifier">length_</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">vstack</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">s</span><span class="special">(</span><span class="number">3</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">==</span> <span class="number">3</span><span class="special">);</span>
+ <span class="identifier">s</span><span class="special">.</span><span class="identifier">push</span><span class="special">(</span><span class="number">123</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">length</span><span class="special">()</span> <span class="special">==</span> <span class="number">1</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">s</span><span class="special">.</span><span class="identifier">pop</span><span class="special">()</span> <span class="special">==</span> <span class="number">123</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.examples.__cline90___calendar__a_very_simple_calendar"></a><a class="link" href="examples.html#contract__.examples.__cline90___calendar__a_very_simple_calendar" title="[Cline90] Calendar: A very simple calendar">[Cline90]
+ Calendar: A very simple calendar</a>
+</h3></div></div></div>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// File: calendar.cpp</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">lightweight_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">calendar</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span>
+ <span class="identifier">month</span><span class="special">()</span> <span class="special">>=</span> <span class="number">1</span><span class="special">,</span>
+ <span class="identifier">month</span><span class="special">()</span> <span class="special"><=</span> <span class="number">12</span><span class="special">,</span>
+ <span class="identifier">date</span><span class="special">()</span> <span class="special">>=</span> <span class="number">1</span><span class="special">,</span>
+ <span class="identifier">date</span><span class="special">()</span> <span class="special"><=</span> <span class="identifier">days_in</span><span class="special">(</span><span class="identifier">month</span><span class="special">())</span>
+ <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">calendar</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">month</span><span class="special">()</span> <span class="special">==</span> <span class="number">1</span><span class="special">,</span> <span class="identifier">date</span><span class="special">()</span> <span class="special">==</span> <span class="number">31</span> <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">month_</span><span class="special">(</span><span class="number">1</span><span class="special">),</span> <span class="identifier">date_</span><span class="special">(</span><span class="number">31</span><span class="special">)</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">calendar</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">int</span> <span class="special">(</span><span class="identifier">month</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">month_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">int</span> <span class="special">(</span><span class="identifier">date</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">date_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">reset</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">new_month</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">new_month</span> <span class="special">>=</span> <span class="number">1</span><span class="special">,</span> <span class="identifier">new_month</span> <span class="special"><=</span> <span class="number">12</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">month</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">new_month</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">month_</span> <span class="special">=</span> <span class="identifier">new_month</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">int</span> <span class="special">(</span><span class="identifier">days_in</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">month</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">month</span> <span class="special">>=</span> <span class="number">1</span><span class="special">,</span> <span class="identifier">month</span> <span class="special"><=</span> <span class="number">12</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span> <span class="identifier">result</span> <span class="special">>=</span> <span class="number">1</span><span class="special">,</span> <span class="identifier">result</span> <span class="special"><=</span> <span class="number">31</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="number">31</span><span class="special">;</span> <span class="comment">// For simplicity, assume all months have 31 days.</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="keyword">int</span> <span class="identifier">month_</span><span class="special">,</span> <span class="identifier">date_</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">calendar</span> <span class="identifier">c</span><span class="special">;</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">c</span><span class="special">.</span><span class="identifier">date</span><span class="special">()</span> <span class="special">==</span> <span class="number">31</span><span class="special">);</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">c</span><span class="special">.</span><span class="identifier">month</span><span class="special">()</span> <span class="special">==</span> <span class="number">1</span><span class="special">);</span>
+ <span class="identifier">c</span><span class="special">.</span><span class="identifier">reset</span><span class="special">(</span><span class="number">8</span><span class="special">);</span> <span class="comment">// Set month to August.</span>
+ <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">c</span><span class="special">.</span><span class="identifier">month</span><span class="special">()</span> <span class="special">==</span> <span class="number">8</span><span class="special">);</span>
+ <span class="keyword">return</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="named_parameters.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="grammar.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/contract__/full_table_of_contents.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/contract__/full_table_of_contents.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,308 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Full Table of Contents</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="prev" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="next" href="getting_started.html" title="Getting Started">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../index.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="getting_started.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="contract__.full_table_of_contents"></a><a class="link" href="full_table_of_contents.html" title="Full Table of Contents">Full Table of Contents</a>
+</h2></div></div></div>
+<p>
+ <a class="link" href="../index.html#contract__.introduction" title="Introduction">Introduction</a>
+ </p>
+<p>
+ <a class="link" href="full_table_of_contents.html" title="Full Table of Contents">Full Table Of Contents</a>
+ </p>
+<p>
+ <a class="link" href="getting_started.html" title="Getting Started">Getting Started</a>
+ </p>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <a class="link" href="getting_started.html#contract__.getting_started.this_documentation" title="This Documentation">This Documentation</a>
+ <br> <a class="link" href="getting_started.html#contract__.getting_started.compilers_and_platforms" title="Compilers and Platforms">Compilers
+ and Platforms</a> <br> <a class="link" href="getting_started.html#contract__.getting_started.installation" title="Installation">Installation</a>
+ <br> <a class="link" href="getting_started.html#contract__.getting_started.disable_contract_compilation" title="Disable Contract Compilation">Disable
+ Contract Compilation</a> <br>
+ </p></blockquote></div>
+<p>
+ <a class="link" href="contract_programming_overview.html" title="Contract Programming Overview">Contract Programming
+ Overview</a>
+ </p>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.assertions" title="Assertions">Assertions</a>
+ <br> <a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.benefits" title="Benefits">Benefits</a>
+ <br> <a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.costs" title="Costs">Costs</a>
+ <br> <a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.free_function_calls" title="Free Function Calls">Free
+ Function Calls</a> <br> <a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.member_function_calls" title="Member Function Calls">Member
+ Function Calls</a> <br> <a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.constructor_calls" title="Constructor Calls">Constructor
+ Calls</a> <br> <a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.destructor_calls" title="Destructor Calls">Destructor
+ Calls</a> <br> <a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.constant_correctness" title="Constant-Correctness">Constant-Correctness</a>
+ <br> <a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.specification_vs__implementation" title="Specification vs. Implementation">Specification
+ vs. Implementation</a> <br> <a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.broken_contracts" title="Broken Contracts">Broken
+ Contracts</a> <br> <a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.features" title="Features">Features</a>
+ <br>
+ </p></blockquote></div>
+<p>
+ <a class="link" href="tutorial.html" title="Tutorial">Tutorial</a>
+ </p>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <a class="link" href="tutorial.html#contract__.tutorial.free_functions" title="Free Functions">Free Functions</a>
+ <br> <a class="link" href="tutorial.html#contract__.tutorial.preconditions" title="Preconditions">Preconditions</a>
+ <br> <a class="link" href="tutorial.html#contract__.tutorial.postconditions__result_and_old_values_" title="Postconditions (Result and Old Values)">Postconditions
+ (Result and Old Values)</a> <br> <a class="link" href="tutorial.html#contract__.tutorial.classes_and_class_invariants" title="Classes and Class Invariants">Classes
+ and Class Invariants</a> <br> <a class="link" href="tutorial.html#contract__.tutorial.constructors" title="Constructors">Constructors</a>
+ <br> <a class="link" href="tutorial.html#contract__.tutorial.destructors" title="Destructors">Destructors</a>
+ <br> <a class="link" href="tutorial.html#contract__.tutorial.member_functions" title="Member Functions">Member Functions</a>
+ <br> <a class="link" href="tutorial.html#contract__.tutorial.inheritance_and_subcontracting" title="Inheritance and Subcontracting">Inheritance
+ and Subcontracting</a> <br> <a class="link" href="tutorial.html#contract__.tutorial.class_templates" title="Class Templates">Class
+ Templates</a> <br> <a class="link" href="tutorial.html#contract__.tutorial.function_templates" title="Function Templates">Function
+ Templates</a> <br> <a class="link" href="tutorial.html#contract__.tutorial.forward_declarations_and_body_definitions" title="Forward Declarations and Body Definitions">Forward
+ Declarations and Body Definitions</a> <br>
+ </p></blockquote></div>
+<p>
+ <a class="link" href="advanced_topics.html" title="Advanced Topics">Advanced Topics</a>
+ </p>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <a class="link" href="advanced_topics.html#contract__.advanced_topics.commas_and_leading_symbols_in_macros" title="Commas and Leading Symbols in Macros">Commas
+ and Leading Symbols in Macros</a> <br> <a class="link" href="advanced_topics.html#contract__.advanced_topics.static_assertions" title="Static Assertions">Static
+ Assertions</a> <br> <a class="link" href="advanced_topics.html#contract__.advanced_topics.constant_assertions" title="Constant Assertions">Constant
+ Assertions</a> <br> <a class="link" href="advanced_topics.html#contract__.advanced_topics.select_assertions" title="Select Assertions">Select
+ Assertions</a> <br> <a class="link" href="advanced_topics.html#contract__.advanced_topics.assertion_statements" title="Assertion Statements">Assertion
+ Statements</a> <br> <a class="link" href="advanced_topics.html#contract__.advanced_topics.assertion_requirements" title="Assertion Requirements">Assertion
+ Requirements</a> <br> <a class="link" href="advanced_topics.html#contract__.advanced_topics.old_of_requirements" title="Old-Of Requirements">Old-Of
+ Requirements</a> <br> <a class="link" href="advanced_topics.html#contract__.advanced_topics.old_and_result_value_copies" title="Old and Result Value Copies">Old
+ and Result Value Copies</a> <br> <a class="link" href="advanced_topics.html#contract__.advanced_topics.pure_virtual_functions" title="Pure Virtual Functions">Pure
+ Virtual Functions</a> <br> <a class="link" href="advanced_topics.html#contract__.advanced_topics.subcontracting_preconditions" title="Subcontracting Preconditions">Subcontracting
+ Preconditions</a> <br> <a class="link" href="advanced_topics.html#contract__.advanced_topics.static_member_functions" title="Static Member Functions">Static
+ Member Functions</a> <br> <a class="link" href="advanced_topics.html#contract__.advanced_topics.volatile_member_functions" title="Volatile Member Functions">Volatile
+ Member Functions</a> <br> <a class="link" href="advanced_topics.html#contract__.advanced_topics.operators" title="Operators">Operators</a>
+ <br> <a class="link" href="advanced_topics.html#contract__.advanced_topics.nested_classes" title="Nested Classes">Nested Classes</a>
+ <br> <a class="link" href="advanced_topics.html#contract__.advanced_topics.friends" title="Friends">Friends</a>
+ <br> <a class="link" href="advanced_topics.html#contract__.advanced_topics.template_specializations" title="Template Specializations">Template
+ Specializations</a> <br> <a class="link" href="advanced_topics.html#contract__.advanced_topics.exception_specifications_and_function_try_blocks" title="Exception Specifications and Function-Try Blocks">Exception
+ Specifications and Function-Try Blocks</a> <br> <a class="link" href="advanced_topics.html#contract__.advanced_topics.specifying_types__no_boost_typeof_" title="Specifying Types (no Boost.Typeof)">Specifying
+ Types (no Boost.Typeof)</a> <br> <a class="link" href="advanced_topics.html#contract__.advanced_topics.block_invariants_and_loop_variants" title="Block Invariants and Loop Variants">Block
+ Invariants and Loop Variants</a> <br> <a class="link" href="advanced_topics.html#contract__.advanced_topics.contract_broken_handlers__throw_on_failure_" title="Contract Broken Handlers (Throw on Failure)">Contract
+ Broken Handlers (Throw on Failure)</a> <br>
+ </p></blockquote></div>
+<p>
+ <a class="link" href="virtual_specifiers.html" title="Virtual Specifiers">Virtual Specifiers</a>
+ </p>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <a class="link" href="virtual_specifiers.html#contract__.virtual_specifiers.final_classes" title="Final Classes">Final Classes</a>
+ <br> <a class="link" href="virtual_specifiers.html#contract__.virtual_specifiers.final_member_functions" title="Final Member Functions">Final
+ Member Functions</a> <br> <a class="link" href="virtual_specifiers.html#contract__.virtual_specifiers.overriding_member_functions" title="Overriding Member Functions">Overriding
+ Member Functions</a> <br> <a class="link" href="virtual_specifiers.html#contract__.virtual_specifiers.new_member_functions" title="New Member Functions">New
+ Member Functions</a> <br>
+ </p></blockquote></div>
+<p>
+ <a class="link" href="concepts.html" title="Concepts">Concepts</a>
+ </p>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <a class="link" href="concepts.html#contract__.concepts.class_templates" title="Class Templates">Class Templates</a>
+ <br> <a class="link" href="concepts.html#contract__.concepts.function_templates" title="Function Templates">Function Templates</a>
+ <br> <a class="link" href="concepts.html#contract__.concepts.concept_definitions__not_implemented_" title="Concept Definitions (Not Implemented)">Concept
+ Definitions (Not Implemented)</a> <br>
+ </p></blockquote></div>
+<p>
+ <a class="link" href="named_parameters.html" title="Named Parameters">Named Parameters</a>
+ </p>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <a class="link" href="named_parameters.html#contract__.named_parameters.overview" title="Overview">Overview</a> <br>
+ <a class="link" href="named_parameters.html#contract__.named_parameters.named_function_parameters" title="Named Function Parameters">Named
+ Function Parameters</a> <br> <a class="link" href="named_parameters.html#contract__.named_parameters.deduced_function_parameters" title="Deduced Function Parameters">Deduced
+ Function Parameters</a> <br> <a class="link" href="named_parameters.html#contract__.named_parameters.member_function_parameters" title="Member Function Parameters">Member
+ Function Parameters</a> <br> <a class="link" href="named_parameters.html#contract__.named_parameters.constructor_parameters" title="Constructor Parameters">Constructor
+ Parameters</a> <br> <a class="link" href="named_parameters.html#contract__.named_parameters.class_template_parameters" title="Class Template Parameters">Class
+ Template Parameters</a> <br> <a class="link" href="named_parameters.html#contract__.named_parameters.concepts" title="Concepts">Concepts</a>
+ <br> <a class="link" href="named_parameters.html#contract__.named_parameters.parameter_identifiers" title="Parameter Identifiers">Parameter
+ Identifiers</a> <br>
+ </p></blockquote></div>
+<p>
+ <a class="link" href="examples.html" title="Examples">Examples</a>
+ </p>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <a class="link" href="examples.html#contract__.examples.__n1962___vector__comparison_with_c___proposed_syntax" title="[N1962] Vector: Comparison with C++ proposed syntax">[N1962]
+ Vector: Comparison with C++ proposed syntax</a> <br> <a class="link" href="examples.html#contract__.examples.__n1962___circle__subcontracting" title="[N1962] Circle: Subcontracting">[N1962]
+ Circle: Subcontracting</a> <br> <a class="link" href="examples.html#contract__.examples.__n1962___factorial__recursion_and_assertion_computational_complexity" title="[N1962] Factorial: Recursion and assertion computational complexity">[N1962]
+ Factorial: Recursion and assertion computational complexity</a> <br>
+ <a class="link" href="examples.html#contract__.examples.__n1962___equal__operators" title="[N1962] Equal: Operators">[N1962] Equal:
+ Operators</a> <br> <a class="link" href="examples.html#contract__.examples.__n1962___sum__separated_body_definitions" title="[N1962] Sum: Separated body definitions">[N1962]
+ Sum: Separated body definitions</a> <br> <a class="link" href="examples.html#contract__.examples.__n1962___square_root__default_parameters_and_comparison_with_d_syntax" title="[N1962] Square Root: Default parameters and comparison with D syntax">[N1962]
+ Square Root: Default parameters and comparison with D syntax</a> <br>
+ <a class="link" href="examples.html#contract__.examples.__n1962___block__block_invariants" title="[N1962] Block: Block invariants">[N1962]
+ Block: Block invariants</a> <br> <a class="link" href="examples.html#contract__.examples.__n2081___add__generic_addition_algorithm" title="[N2081] Add: Generic addition algorithm">[N2081]
+ Add: Generic addition algorithm</a> <br> <a class="link" href="examples.html#contract__.examples.__n2081___advance__concept_based_iterator_overloading__emulated_using_tags_" title="[N2081] Advance: Concept-based iterator overloading (emulated using tags)">[N2081]
+ Advance: Concept-based iterator overloading (emulated using tags)</a>
+ <br> <a class="link" href="examples.html#contract__.examples.__n2081___find__generic_find_algorithm" title="[N2081] Find: Generic find algorithm">[N2081]
+ Find: Generic find algorithm</a> <br> <a class="link" href="examples.html#contract__.examples.__n2081___apply__overloaded_invocation_of_functors" title="[N2081] Apply: Overloaded invocation of functors">[N2081]
+ Apply: Overloaded invocation of functors</a> <br> <a class="link" href="examples.html#contract__.examples.__n2081___for_each__generic_for_each_algorithm" title="[N2081] For Each: Generic for-each algorithm">[N2081]
+ For Each: Generic for-each algorithm</a> <br> <a class="link" href="examples.html#contract__.examples.__n2081___transform__generic_binary_transformation_algorithm" title="[N2081] Transform: Generic binary transformation algorithm">[N2081]
+ Transform: Generic binary transformation algorithm</a> <br> <a class="link" href="examples.html#contract__.examples.__n2081___count__generic_counting_algorithm" title="[N2081] Count: Generic counting algorithm">[N2081]
+ Count: Generic counting algorithm</a> <br> <a class="link" href="examples.html#contract__.examples.__n2081___convert__conversion_between_two_types" title="[N2081] Convert: Conversion between two types">[N2081]
+ Convert: Conversion between two types</a> <br> <a class="link" href="examples.html#contract__.examples.__n2081___equal__generic_equality_comparison" title="[N2081] Equal: Generic equality comparison">[N2081]
+ Equal: Generic equality comparison</a> <br> <a class="link" href="examples.html#contract__.examples.__n2081___less_equal__generic_less_than_or_equal_to_comparison" title="[N2081] Less Equal: Generic less-than or equal-to comparison">[N2081]
+ Less Equal: Generic less-than or equal-to comparison</a> <br> <a class="link" href="examples.html#contract__.examples.__n2081___de_ref__generic_iterator_dereferencing" title="[N2081] De-Ref: Generic iterator dereferencing">[N2081]
+ De-Ref: Generic iterator dereferencing</a> <br> <a class="link" href="examples.html#contract__.examples.__n2081___min__generic_minimum_algorithm" title="[N2081] Min: Generic minimum algorithm">[N2081]
+ Min: Generic minimum algorithm</a> <br> <a class="link" href="examples.html#contract__.examples.__meyer97___stack4__comparison_with_eiffel_syntax" title="[Meyer97] Stack4: Comparison with Eiffel syntax">[Meyer97]
+ Stack4: Comparison with Eiffel Syntax</a> <br> <a class="link" href="examples.html#contract__.examples.__meyer97___stack3__error_codes_instead_of_preconditions" title="[Meyer97] Stack3: Error codes instead of preconditions">[Meyer97]
+ Stack3: Error codes instead of preconditions</a> <br> <a class="link" href="examples.html#contract__.examples.__meyer97___gcd__loop_variants_and_invariants_plus_comparison_with_eiffel_syntax" title="[Meyer97] GCD: Loop variants and invariants plus comparison with Eiffel syntax">[Meyer97]
+ GCD: Loop variants and invariants plus comparison with Eiffel syntax</a>
+ <br> <a class="link" href="examples.html#contract__.examples.__meyer97___max_array__nested_loop_variants_and_invariants" title="[Meyer97] Max-Array: Nested loop variants and invariants">[Meyer97]
+ Max-Array: Nested loop variants and invariants</a> <br> <a class="link" href="examples.html#contract__.examples.__mitchell02___name_list__relaxed_subcontracts" title="[Mitchell02] Name List: Relaxed subcontracts">[Mitchell02]
+ Name List: Relaxed subcontracts</a> <br> <a class="link" href="examples.html#contract__.examples.__mitchell02___dictionary__simple_key_value_map" title="[Mitchell02] Dictionary: Simple key-value map">[Mitchell02]
+ Dictionary: Simple key-value map</a> <br> <a class="link" href="examples.html#contract__.examples.__mitchell02___courier__subcontracting_and_static_class_invariants" title="[Mitchell02] Courier: Subcontracting and static class invariants">[Mitchell02]
+ Courier: Subcontracting and static class invariants</a> <br> <a class="link" href="examples.html#contract__.examples.__mitchell02___stack__simple_stack_dispenser" title="[Mitchell02] Stack: Simple stack dispenser">[Mitchell02]
+ Stack: Simple stack dispenser</a> <br> <a class="link" href="examples.html#contract__.examples.__mitchell02___simple_queue__simple_queue_dispenser" title="[Mitchell02] Simple Queue: Simple queue dispenser">[Mitchell02]
+ Simple Queue: Simple queue dispenser</a> <br> <a class="link" href="examples.html#contract__.examples.__mitchell02___customer_manager__contracts_instead_of_defensive_programming" title="[Mitchell02] Customer Manager: Contracts instead of Defensive Programming">[Mitchell02]
+ Customer Manager: Contracts instead of Defensive Programming</a> <br>
+ <a class="link" href="examples.html#contract__.examples.__mitchell02___observer__contracts_for_pure_virtual_functions" title="[Mitchell02] Observer: Contracts for pure virtual functions">[Mitchell02]
+ Observer: Contracts for pure virtual functions</a> <br> <a class="link" href="examples.html#contract__.examples.__mitchell02___counter__subcontracting_and_virtual_specifiers__final__override__new__and_pure_virtual_" title="[Mitchell02] Counter: Subcontracting and virtual specifiers (final, override, new, and pure virtual)">[Mitchell02]
+ Counter: Subcontracting and virtual specifiers (final, override, new, and
+ pure virtual)</a> <br> <a class="link" href="examples.html#contract__.examples.__stroustrup97___string__throw_when_contract_is_broken" title="[Stroustrup97] String: Throw when contract is broken">[Stroustrup97]
+ String: Throw when contract is broken</a> <br> <a class="link" href="examples.html#contract__.examples.__cline90___vector__comparison_with_a___proposed_syntax" title="[Cline90] Vector: Comparison with A++ proposed syntax">[Cline90]
+ Vector: Comparison with A++ proposed syntax</a> <br> <a class="link" href="examples.html#contract__.examples.__cline90___stack__function_try_blocks_and_exception_specifications" title="[Cline90] Stack: Function-Try blocks and exception specifications">[Cline90]
+ Stack: Function-Try blocks and exception specifications</a> <br> <a class="link" href="examples.html#contract__.examples.__cline90___vector_stack__subcontracting_from_abstract_data_type__adt_" title="[Cline90] Vector-Stack: Subcontracting from Abstract Data Type (ADT)">[Cline90]
+ Vector-Stack: Subcontracting from Abstract Data Type (ADT)</a> <br>
+ <a class="link" href="examples.html#contract__.examples.__cline90___calendar__a_very_simple_calendar" title="[Cline90] Calendar: A very simple calendar">[Cline90]
+ Calendar: A very simple calendar</a> <br>
+ </p></blockquote></div>
+<p>
+ <a class="link" href="grammar.html" title="Grammar">Grammar</a>
+ </p>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <a class="link" href="grammar.html#contract__.grammar.preprocessor_dsel" title="Preprocessor DSEL">Preprocessor DSEL</a>
+ <br> <a class="link" href="grammar.html#contract__.grammar.differences_with_c___syntax" title="Differences with C++ Syntax">Differences
+ with C++ Syntax</a> <br> <a class="link" href="grammar.html#contract__.grammar.macro_interface" title="Macro Interface">Macro
+ Interface</a> <br> <a class="link" href="grammar.html#contract__.grammar.lexical_conventions" title="Lexical Conventions">Lexical
+ Conventions</a> <br> <a class="link" href="grammar.html#contract__.grammar.class_declarations" title="Class Declarations">Class
+ Declarations</a> <br> <a class="link" href="grammar.html#contract__.grammar.base_classes" title="Base Classes">Base
+ Classes</a> <br> <a class="link" href="grammar.html#contract__.grammar.template_specializations" title="Template Specializations">Template
+ Specializations</a> <br> <a class="link" href="grammar.html#contract__.grammar.template_parameters" title="Template Parameters">Template
+ Parameters</a> <br> <a class="link" href="grammar.html#contract__.grammar.concepts" title="Concepts">Concepts</a>
+ <br> <a class="link" href="grammar.html#contract__.grammar.types" title="Types">Types</a> <br> <a class="link" href="grammar.html#contract__.grammar.function_declarations" title="Function Declarations">Function Declarations</a>
+ <br> <a class="link" href="grammar.html#contract__.grammar.result_type" title="Result Type">Result Type</a>
+ <br> <a class="link" href="grammar.html#contract__.grammar.function_and_operator_names" title="Function and Operator Names">Function
+ and Operator Names</a> <br> <a class="link" href="grammar.html#contract__.grammar.exception_specifications" title="Exception Specifications">Exception
+ Specifications</a> <br> <a class="link" href="grammar.html#contract__.grammar.member_initializers" title="Member Initializers">Member
+ Initializers</a> <br> <a class="link" href="grammar.html#contract__.grammar.function_parameters" title="Function Parameters">Function
+ Parameters</a> <br> <a class="link" href="grammar.html#contract__.grammar.result_and_old_values" title="Result and Old Values">Result
+ and Old Values</a> <br> <a class="link" href="grammar.html#contract__.grammar.class_invariants" title="Class Invariants">Class
+ Invariants</a> <br> <a class="link" href="grammar.html#contract__.grammar.assertions" title="Assertions">Assertions</a>
+ <br> <a class="link" href="grammar.html#contract__.grammar.loop_variants" title="Loop Variants">Loop Variants</a>
+ <br> <a class="link" href="grammar.html#contract__.grammar.named_parameter_declarations" title="Named Parameter Declarations">Named
+ Parameter Declarations</a> <br> <a class="link" href="grammar.html#contract__.grammar.terminals" title="Terminals">Terminals</a>
+ <br> <a class="link" href="grammar.html#contract__.grammar.alternative_assertion_syntax__not_implemented_" title="Alternative Assertion Syntax (Not Implemented)">Alternative
+ Assertion Syntax (Not Implemented)</a> <br>
+ </p></blockquote></div>
+<p>
+ <a class="link" href="no_variadic_macros.html" title="No Variadic Macros">No Variadic Macros</a>
+ </p>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <a class="link" href="no_variadic_macros.html#contract__.no_variadic_macros.sequence_syntax" title="Sequence Syntax">Sequence Syntax</a>
+ <br> <a class="link" href="no_variadic_macros.html#contract__.no_variadic_macros.commas_and_leading_symbols_in_macros" title="Commas and Leading Symbols in Macros">Commas
+ and Leading Symbols in Macros</a> <br>
+ </p></blockquote></div>
+<p>
+ <a class="link" href="../reference.html" title="Reference">Reference</a>
+ </p>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <code class="computeroutput"><a class="link" href="../contract/block_invariant_broken.html" title="Function block_invariant_broken">contract::block_invariant_broken</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../contract/broken.html" title="Class broken">contract::broken</a></code> <br>
+ <code class="computeroutput"><a class="link" href="../contract/broken_contract_handler.html" title="Type definition broken_contract_handler">contract::broken_contract_handler</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../contract/class_invariant_b_id552579.html" title="Function class_invariant_broken_on_entry">contract::class_invariant_broken_on_entry</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../contract/class_invariant_b_id552657.html" title="Function class_invariant_broken_on_exit">contract::class_invariant_broken_on_exit</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../contract/class_invariant_b_id552735.html" title="Function class_invariant_broken_on_throw">contract::class_invariant_broken_on_throw</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../contract/copy.html" title="Class template copy">contract::copy</a></code> <br>
+ <code class="computeroutput"><a class="link" href="../contract/from.html" title="Type from">contract::from</a></code> <br> <code class="computeroutput"><a class="link" href="../contract/has_oldof.html" title="Struct template has_oldof">contract::has_oldof</a></code> <br> <code class="computeroutput"><a class="link" href="../contract/loop_variant_broken.html" title="Function loop_variant_broken">contract::loop_variant_broken</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../contract/postcondition_broken.html" title="Function postcondition_broken">contract::postcondition_broken</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../contract/precondition_broken.html" title="Function precondition_broken">contract::precondition_broken</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../reference.html#contract.set_block_invariant_broken">contract::set_block_invariant_broken</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../reference.html#contract.set_class_invariant_broken">contract::set_class_invariant_broken</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../reference.html#contract.set_class_invaria_id552567">contract::set_class_invariant_broken_on_entry</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../reference.html#contract.set_class_invaria_id552645">contract::set_class_invariant_broken_on_exit</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../reference.html#contract.set_class_invaria_id552723">contract::set_class_invariant_broken_on_throw</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../reference.html#contract.set_loop_variant_broken">contract::set_loop_variant_broken</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../reference.html#contract.set_postcondition_broken">contract::set_postcondition_broken</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../reference.html#contract.set_precondition_broken">contract::set_precondition_broken</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_BLOCK_INVARIANT.html" title="Macro CONTRACT_BLOCK_INVARIANT">CONTRACT_BLOCK_INVARIANT</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_BLOCK_INVARIANT_TPL.html" title="Macro CONTRACT_BLOCK_INVARIANT_TPL">CONTRACT_BLOCK_INVARIANT_TPL</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_CLASS.html" title="Macro CONTRACT_CLASS">CONTRACT_CLASS</a></code> <br>
+ <code class="computeroutput"><a class="link" href="../CONTRACT_CLASS_INVARIANT.html" title="Macro CONTRACT_CLASS_INVARIANT">CONTRACT_CLASS_INVARIANT</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_CLASS_INVARIANT_TPL.html" title="Macro CONTRACT_CLASS_INVARIANT_TPL">CONTRACT_CLASS_INVARIANT_TPL</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_CLASS_TPL.html" title="Macro CONTRACT_CLASS_TPL">CONTRACT_CLASS_TPL</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_ARRAY_DIMENSION_MAX.html" title="Macro CONTRACT_CONFIG_ARRAY_DIMENSION_MAX">CONTRACT_CONFIG_ARRAY_DIMENSION_MAX</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS.html" title="Macro CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS">CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_FUNCTION_ARITY_MAX.html" title="Macro CONTRACT_CONFIG_FUNCTION_ARITY_MAX">CONTRACT_CONFIG_FUNCTION_ARITY_MAX</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_INHERITANCE_MAX.html" title="Macro CONTRACT_CONFIG_INHERITANCE_MAX">CONTRACT_CONFIG_INHERITANCE_MAX</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_BLOCK_INVARIANTS.html" title="Macro CONTRACT_CONFIG_NO_BLOCK_INVARIANTS">CONTRACT_CONFIG_NO_BLOCK_INVARIANTS</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_CLASS_INVARIANTS.html" title="Macro CONTRACT_CONFIG_NO_CLASS_INVARIANTS">CONTRACT_CONFIG_NO_CLASS_INVARIANTS</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_LOOP_VARIANTS.html" title="Macro CONTRACT_CONFIG_NO_LOOP_VARIANTS">CONTRACT_CONFIG_NO_LOOP_VARIANTS</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_POSTCONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_POSTCONDITIONS">CONTRACT_CONFIG_NO_POSTCONDITIONS</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_PRECONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_PRECONDITIONS">CONTRACT_CONFIG_NO_PRECONDITIONS</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_OLDOF_MAX.html" title="Macro CONTRACT_CONFIG_OLDOF_MAX">CONTRACT_CONFIG_OLDOF_MAX</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION.html" title="Macro CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION">CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE.html" title="Macro CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE">CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_THREAD_SAFE.html" title="Macro CONTRACT_CONFIG_THREAD_SAFE">CONTRACT_CONFIG_THREAD_SAFE</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_CONSTRUCTOR.html" title="Macro CONTRACT_CONSTRUCTOR">CONTRACT_CONSTRUCTOR</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_CONSTRUCTOR_ARG.html" title="Macro CONTRACT_CONSTRUCTOR_ARG">CONTRACT_CONSTRUCTOR_ARG</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_CONSTRUCTOR_BODY.html" title="Macro CONTRACT_CONSTRUCTOR_BODY">CONTRACT_CONSTRUCTOR_BODY</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_CONSTRUCTOR_TPL.html" title="Macro CONTRACT_CONSTRUCTOR_TPL">CONTRACT_CONSTRUCTOR_TPL</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_DESTRUCTOR.html" title="Macro CONTRACT_DESTRUCTOR">CONTRACT_DESTRUCTOR</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_DESTRUCTOR_BODY.html" title="Macro CONTRACT_DESTRUCTOR_BODY">CONTRACT_DESTRUCTOR_BODY</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_DESTRUCTOR_TPL.html" title="Macro CONTRACT_DESTRUCTOR_TPL">CONTRACT_DESTRUCTOR_TPL</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_FREE_BODY.html" title="Macro CONTRACT_FREE_BODY">CONTRACT_FREE_BODY</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_FUNCTION_TPL.html" title="Macro CONTRACT_FUNCTION_TPL">CONTRACT_FUNCTION_TPL</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES.html" title="Macro CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES">CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS.html" title="Macro CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS">CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_LIMIT_OLDOFS.html" title="Macro CONTRACT_LIMIT_OLDOFS">CONTRACT_LIMIT_OLDOFS</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_LOOP.html" title="Macro CONTRACT_LOOP">CONTRACT_LOOP</a></code> <br> <code class="computeroutput"><a class="link" href="../CONTRACT_LOOP_VARIANT.html" title="Macro CONTRACT_LOOP_VARIANT">CONTRACT_LOOP_VARIANT</a></code> <br> <code class="computeroutput"><a class="link" href="../CONTRACT_LOOP_VARIANT_TPL.html" title="Macro CONTRACT_LOOP_VARIANT_TPL">CONTRACT_LOOP_VARIANT_TPL</a></code> <br>
+ <code class="computeroutput"><a class="link" href="../CONTRACT_MEMBER_BODY.html" title="Macro CONTRACT_MEMBER_BODY">CONTRACT_MEMBER_BODY</a></code> <br>
+ <code class="computeroutput"><a class="link" href="../CONTRACT_OLDOF.html" title="Macro CONTRACT_OLDOF">CONTRACT_OLDOF</a></code> <br> <code class="computeroutput"><a class="link" href="../CONTRACT_PARAMETER.html" title="Macro CONTRACT_PARAMETER">CONTRACT_PARAMETER</a></code> <br> <code class="computeroutput"><a class="link" href="../CONTRACT_PARAMETER_BODY.html" title="Macro CONTRACT_PARAMETER_BODY">CONTRACT_PARAMETER_BODY</a></code> <br>
+ <code class="computeroutput"><a class="link" href="../CONTRACT_PARAMETER_TYPEOF.html" title="Macro CONTRACT_PARAMETER_TYPEOF">CONTRACT_PARAMETER_TYPEOF</a></code>
+ <br> <code class="computeroutput"><a class="link" href="../CONTRACT_TEMPLATE_PARAMETER.html" title="Macro CONTRACT_TEMPLATE_PARAMETER">CONTRACT_TEMPLATE_PARAMETER</a></code>
+ <br>
+ </p></blockquote></div>
+<p>
+ <a class="link" href="release_notes.html" title="Release Notes">Release Notes</a>
+ </p>
+<p>
+ <a class="link" href="bibliography.html" title="Bibliography">Bibliography</a>
+ </p>
+<p>
+ <a class="link" href="acknowledgments.html" title="Acknowledgments">Acknowledgments</a>
+ </p>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../index.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="getting_started.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/contract__/getting_started.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/contract__/getting_started.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,290 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Getting Started</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="prev" href="full_table_of_contents.html" title="Full Table of Contents">
+<link rel="next" href="contract_programming_overview.html" title="Contract Programming Overview">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="full_table_of_contents.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="contract_programming_overview.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="contract__.getting_started"></a><a class="link" href="getting_started.html" title="Getting Started">Getting Started</a>
+</h2></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section">This Documentation</span></dt>
+<dt><span class="section"><a href="getting_started.html#contract__.getting_started.compilers_and_platforms">Compilers
+ and Platforms</a></span></dt>
+<dt><span class="section">Installation</span></dt>
+<dt><span class="section"><a href="getting_started.html#contract__.getting_started.disable_contract_compilation">Disable
+ Contract Compilation</a></span></dt>
+</dl></div>
+<p>
+ This section explains how to setup a system to use this library.
+ </p>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.getting_started.this_documentation"></a><a class="link" href="getting_started.html#contract__.getting_started.this_documentation" title="This Documentation">This Documentation</a>
+</h3></div></div></div>
+<p>
+ Programmers should have enough knowledge to use this library after reading
+ the <a class="link" href="../index.html#contract__.introduction" title="Introduction">Introduction</a>, <a class="link" href="getting_started.html" title="Getting Started">Getting
+ Started</a>, and <a class="link" href="tutorial.html" title="Tutorial">Tutorial</a> sections.
+ The other sections can be consulted to gain a more in depth knowledge of
+ the library.
+ </p>
+<p>
+ Some footnotes are marked by the word "<span class="bold"><strong>Rationale</strong></span>".
+ They explain reasons behind decisions made during the design and implementation
+ of this library.
+ </p>
+<p>
+ In most of the examples presented in this documentation the Boost.Detail/LightweightTest
+ macro <code class="computeroutput"><span class="identifier">BOOST_TEST</span></code> is used
+ to assert test conditions (see also <code class="literal">boost/detail/lightweight_test.hpp</code>).
+ The <code class="computeroutput"><span class="identifier">BOOST_TEST</span></code> macro is conceptually
+ similar to C++ <code class="computeroutput"><span class="identifier">assert</span></code> but
+ a failure of the checked condition does not abort the program, instead it
+ makes <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">report_errors</span></code> return a non-zero program
+ exit code. <sup>[<a name="contract__.getting_started.this_documentation.f0" href="#ftn.contract__.getting_started.this_documentation.f0" class="footnote">2</a>]</sup>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.getting_started.compilers_and_platforms"></a><a class="link" href="getting_started.html#contract__.getting_started.compilers_and_platforms" title="Compilers and Platforms">Compilers
+ and Platforms</a>
+</h3></div></div></div>
+<p>
+ The implementation of this library uses preprocessor and template meta-programming
+ (as supported by Boost.Preprocessor
+ and Boost.MPL
+ respectively), templates with partial specializations and function pointers
+ (similarly to Boost.Function),
+ and local functions (as supported by Boost.LocalFunction).
+ The authors originally developed and tested the library on:
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ GCC 4.5.3 on Cygwin (with and without C++11
+ features enabled <code class="literal">-std=c++0x</code>). <sup>[<a name="contract__.getting_started.compilers_and_platforms.f0" href="#ftn.contract__.getting_started.compilers_and_platforms.f0" class="footnote">3</a>]</sup>
+ </li>
+<li class="listitem">
+ Microsoft Visual C++ (MSVC) 8.0 on Windows XP and Windows 7.
+ </li>
+</ol></div>
+<p>
+ At present, the library has not been tested on other compilers or platforms.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.getting_started.installation"></a><a class="link" href="getting_started.html#contract__.getting_started.installation" title="Installation">Installation</a>
+</h3></div></div></div>
+<p>
+ This library is composed of header files only. Therefore there is no pre-compiled
+ object file which needs to be installed or linked. Programmers can simply
+ instruct the C++ compiler where to find the library header files and they
+ can start compiling code using this library.
+ </p>
+<div class="important"><table border="0" summary="Important">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../doc/src/images/important.png"></td>
+<th align="left">Important</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ This library extensively uses Boost
+ libraries. Boost version 1.50
+ must be properly installed in order for this library to compile.
+ </p></td></tr>
+</table></div>
+<p>
+ Let <span class="emphasis"><em><code class="literal">ROOT</code></em></span> be the root directory of
+ this library installation then the directory structure is as follow:
+ </p>
+<pre class="programlisting"><span class="emphasis"><em>ROOT</em></span>/
+ doc/
+ html/ # This documentation.
+ example/ # Examples using this library.
+ include/ # This library source files (headers only).
+</pre>
+<p>
+ For example, the following commands can be used to compile code using this
+ library: <sup>[<a name="contract__.getting_started.installation.f0" href="#ftn.contract__.getting_started.installation.f0" class="footnote">4</a>]</sup>
+ </p>
+<pre class="programlisting">$ g++ -I <span class="emphasis"><em>ROOT</em></span>/include ... # For GCC.
+> cl /I <span class="emphasis"><em>ROOT</em></span>\include ... # For MSVC.
+</pre>
+<p>
+ All necessary library headers are included in the source code by the following
+ instruction (it is not necessary to include single headers separately):
+ </p>
+<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// Include this library headers.</span>
+</pre>
+<p>
+ The following symbols are part of the library private interface, they are
+ not documented, and they should not be directly used by programmers: <sup>[<a name="contract__.getting_started.installation.f1" href="#ftn.contract__.getting_started.installation.f1" class="footnote">5</a>]</sup>
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem">
+ Any symbol defined by files within the <code class="literal">contract/aux_/</code>
+ or <code class="literal">contract/detail/</code> directories (these header files
+ should not be directly included by programmers).
+ </li>
+<li class="listitem">
+ Any symbol within the <code class="computeroutput"><span class="identifier">contract</span><span class="special">::</span><span class="identifier">aux</span></code>
+ or <code class="computeroutput"><span class="identifier">contract</span><span class="special">::</span><span class="identifier">detail</span></code> namespace.
+ </li>
+<li class="listitem">
+ Any symbol prefixed by <code class="computeroutput"><span class="identifier">contract_aux_</span><span class="special">...</span></code> or <code class="computeroutput"><span class="identifier">contract_detail_</span><span class="special">...</span></code> (regardless of its namespace).
+ </li>
+<li class="listitem">
+ Any symbol prefixed by <code class="computeroutput"><span class="identifier">CONTRACT_AUX_</span><span class="special">...</span></code> or <code class="computeroutput"><span class="identifier">CONTRACT_DETAIL_</span><span class="special">...</span></code> (regardless of its namespace).
+ </li>
+</ul></div>
+<p>
+ Symbols starting with <code class="computeroutput"><span class="identifier">ERROR_</span><span class="special">...</span></code> are used to report compile-time errors
+ via static assertions and programmers should not use these symbols to define
+ macros or other constructs in the global namespace.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.getting_started.disable_contract_compilation"></a><a class="link" href="getting_started.html#contract__.getting_started.disable_contract_compilation" title="Disable Contract Compilation">Disable
+ Contract Compilation</a>
+</h3></div></div></div>
+<p>
+ Some of the library behaviour can be customized at compile-time by defining
+ special <span class="emphasis"><em>configuration macros</em></span> (see <code class="computeroutput"><a class="link" href="../reference.html#header.contract.config_hpp" title="Header <contract/config.hpp>">contract/config.hpp</a></code>).
+ In particular, the following configuration macros can be used to selectively
+ turn on or off contract compilation and the related run-time checks:
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem">
+ Defining the <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_PRECONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_PRECONDITIONS">CONTRACT_CONFIG_NO_PRECONDITIONS</a></code>
+ macro turns off compilation and run-time checking of all preconditions.
+ </li>
+<li class="listitem">
+ Defining the <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_POSTCONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_POSTCONDITIONS">CONTRACT_CONFIG_NO_POSTCONDITIONS</a></code>
+ macro turns off compilation and run-time checking of all postconditions.
+ </li>
+<li class="listitem">
+ Defining the <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_CLASS_INVARIANTS.html" title="Macro CONTRACT_CONFIG_NO_CLASS_INVARIANTS">CONTRACT_CONFIG_NO_CLASS_INVARIANTS</a></code>
+ macro turns off compilation and run-time checking of all class invariants.
+ </li>
+<li class="listitem">
+ Defining the <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_BLOCK_INVARIANTS.html" title="Macro CONTRACT_CONFIG_NO_BLOCK_INVARIANTS">CONTRACT_CONFIG_NO_BLOCK_INVARIANTS</a></code>
+ macro turns off compilation and run-time checking of all block invariants.
+ </li>
+<li class="listitem">
+ Defining the <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_LOOP_VARIANTS.html" title="Macro CONTRACT_CONFIG_NO_LOOP_VARIANTS">CONTRACT_CONFIG_NO_LOOP_VARIANTS</a></code>
+ macro turns off compilation and run-time checking of all loop variants.
+ </li>
+</ul></div>
+<p>
+ By default, all contracts are compiled and checked at run-time (i.e., all
+ the macros above are not defined).
+ </p>
+<div class="important"><table border="0" summary="Important">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../doc/src/images/important.png"></td>
+<th align="left">Important</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ In Contract Programming, it is usually important to selectively turn off
+ contract compilation to reduce run-time, binary size, and compilation-time
+ overhead associated with the contracts (see <a class="link" href="bibliography.html#Meyer97_anchor">[Meyer97]</a>).
+ This library guarantees zero run-time and binary size overhead when all
+ contracts are all turned off (however, even when contracts are all turned
+ off there is a limited compile-time overhead associated with expanding
+ the contract macros to generate the original class and function declarations).
+ Note that when contracts are turned off their assertions are completely
+ ignored by the compiler so the assertion code might not even be syntactically
+ correct.
+ </p></td></tr>
+</table></div>
+<p>
+ For example, the following commands compile and check preconditions and class
+ invariants, but they do not compile and check postconditions, block invariants,
+ and loop variants:
+ </p>
+<pre class="programlisting">$ g++ -DCONTRACT_CONFIG_NO_POSTCONDITONS -DCONTRACT_CONFIG_NO_BLOCK_INVARIANTS -DCONTRACT_CONFIG_NO_LOOP_VARIANTS ... # For GCC.
+> cl /DCONTRACT_CONFIG_NO_POSTCONDITONS /DCONTRACT_CONFIG_NO_BLOCK_INVARIANTS /DCONTRACT_CONFIG_NO_LOOP_VARIANTS ... # For MSVC.
+</pre>
+<p>
+ Other configuration macros are provided to customize other aspects of the
+ library. For example, the <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_FUNCTION_ARITY_MAX.html" title="Macro CONTRACT_CONFIG_FUNCTION_ARITY_MAX">CONTRACT_CONFIG_FUNCTION_ARITY_MAX</a></code>
+ macro is used to specify the maximum number of function parameters and the
+ <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_INHERITANCE_MAX.html" title="Macro CONTRACT_CONFIG_INHERITANCE_MAX">CONTRACT_CONFIG_INHERITANCE_MAX</a></code>
+ macro is used to specify the maxim number of base classes. All configuration
+ macros have appropriate default values when they are left undefined by programmers.
+ </p>
+</div>
+<div class="footnotes">
+<br><hr width="100" align="left">
+<div class="footnote"><p><sup>[<a id="ftn.contract__.getting_started.this_documentation.f0" href="#contract__.getting_started.this_documentation.f0" class="para">2</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> Using Boost.Detail/LightweightTest
+ allows to add the examples to the library regression tests so to make sure
+ that they always compile and run correctly.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.getting_started.compilers_and_platforms.f0" href="#contract__.getting_started.compilers_and_platforms.f0" class="para">3</a>] </sup>
+ When using GCC to compile large projects that use this library, it
+ might be necessary to appropriately set the <code class="computeroutput"><span class="special">--</span><span class="identifier">param</span> <span class="identifier">gcc</span><span class="special">-</span><span class="identifier">min</span><span class="special">-</span><span class="identifier">expand</span></code>
+ option to avoid internal compiler errors due to excessive virtual memory
+ usage.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.getting_started.installation.f0" href="#contract__.getting_started.installation.f0" class="para">4</a>] </sup>
+ For convenience, a <code class="literal">Jamfile.v2</code> file is provided in the
+ example directory that can be used to compile and test all the examples
+ using Boost.Jam.
+ However, it is not necessary to use Boost.Jam
+ to compile code that uses this library.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.getting_started.installation.f1" href="#contract__.getting_started.installation.f1" class="para">5</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> This library concatenates symbols
+ specified by programmers (e.g., the function name) with other symbols (e.g.,
+ special prefixes and line numbers) to make internal symbols with unique
+ names to avoid name clashes. These symbols are separated by the letter
+ <code class="computeroutput"><span class="identifier">X</span></code> when they are concatenated
+ so they read more easily during debugging (unfortunately, the underscore
+ character <code class="computeroutput"><span class="identifier">_</span></code> could not be
+ used instead of the letter <code class="computeroutput"><span class="identifier">X</span></code>
+ because if the original symbol already contained a leading or trailing
+ underscore, the concatenation could result in a symbol with double underscores
+ <code class="computeroutput"><span class="identifier">__</span></code> which is reserved by
+ the C++ standard). The <span class="quote">“<span class="quote">aux</span>”</span> symbols are internal to the implementation
+ of this library. The <span class="quote">“<span class="quote">detail</span>”</span> symbols are not officially part
+ of the library public interface and they are not documented however they
+ constitute a separate set of standalone libraries that could be added to
+ the library public interface in the future.
+ </p></div>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="full_table_of_contents.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="contract_programming_overview.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/contract__/grammar.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/contract__/grammar.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,2005 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Grammar</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="prev" href="examples.html" title="Examples">
+<link rel="next" href="no_variadic_macros.html" title="No Variadic Macros">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="examples.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="no_variadic_macros.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="contract__.grammar"></a><a class="link" href="grammar.html" title="Grammar">Grammar</a>
+</h2></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section">Preprocessor DSEL</span></dt>
+<dt><span class="section"><a href="grammar.html#contract__.grammar.differences_with_c___syntax">Differences
+ with C++ Syntax</a></span></dt>
+<dt><span class="section">Macro Interface</span></dt>
+<dt><span class="section">Lexical Conventions</span></dt>
+<dt><span class="section">Class Declarations</span></dt>
+<dt><span class="section">Base Classes</span></dt>
+<dt><span class="section"><a href="grammar.html#contract__.grammar.template_specializations">Template
+ Specializations</a></span></dt>
+<dt><span class="section">Template Parameters</span></dt>
+<dt><span class="section">Concepts</span></dt>
+<dt><span class="section">Types</span></dt>
+<dt><span class="section">Function Declarations</span></dt>
+<dt><span class="section">Result Type</span></dt>
+<dt><span class="section"><a href="grammar.html#contract__.grammar.function_and_operator_names">Function
+ and Operator Names</a></span></dt>
+<dt><span class="section"><a href="grammar.html#contract__.grammar.exception_specifications">Exception
+ Specifications</a></span></dt>
+<dt><span class="section">Member Initializers</span></dt>
+<dt><span class="section">Function Parameters</span></dt>
+<dt><span class="section"><a href="grammar.html#contract__.grammar.result_and_old_values">Result and
+ Old Values</a></span></dt>
+<dt><span class="section">Class Invariants</span></dt>
+<dt><span class="section">Assertions</span></dt>
+<dt><span class="section">Loop Variants</span></dt>
+<dt><span class="section"><a href="grammar.html#contract__.grammar.named_parameter_declarations">Named
+ Parameter Declarations</a></span></dt>
+<dt><span class="section">Terminals</span></dt>
+<dt><span class="section"><a href="grammar.html#contract__.grammar.alternative_assertion_syntax__not_implemented_">Alternative
+ Assertion Syntax (Not Implemented)</a></span></dt>
+</dl></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <span class="emphasis"><em><span class="quote">“<span class="quote">Almost every macro demonstrates a flaw in the programming
+ language, in the program, or in the programmer.</span>”</span></em></span>
+ </p></blockquote></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <span class="emphasis"><em>-- Bjarne Stroustrup (see <a class="link" href="bibliography.html#Stroustrup97_anchor">[Stroustrup97]</a>
+ page 160)</em></span>
+ </p></blockquote></div>
+<p>
+ This library uses macros to overcome a limitation of C++, namely the fact that
+ the core language does not support preconditions, postconditions, class invariants,
+ old values, and subcontracting. This section lists the complete grammar of
+ the syntax used by this library macros.
+ </p>
+<a name="syntax_error_warning_anchor"></a><div class="warning"><table border="0" summary="Warning">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
+<th align="left">Warning</th>
+</tr>
+<tr><td align="left" valign="top">
+<p>
+ In general, an error in programming this library syntax will generate cryptic
+ compiler errors (often exposing internal code from this library and from
+ Boost.Preprocessor).
+ <sup>[<a name="contract__.grammar.f0" href="#ftn.contract__.grammar.f0" class="footnote">70</a>]</sup>
+ </p>
+<p>
+ There are intrinsic limitations on the amount of error checking that can
+ be implemented by this library because it uses the preprocessor to parse
+ its syntax (e.g., there is no way the preprocessor can gracefully detect
+ and report unbalanced round parenthesis <code class="computeroutput"><span class="special">(</span>
+ <span class="special">...</span> <span class="comment">/* missing closing
+ parenthesis here */</span></code> or an invalid concatenation symbol <code class="computeroutput"><span class="identifier">BOOST_PP_CAT</span><span class="special">(</span><span class="identifier">xyz</span><span class="special">,</span> <span class="special">::</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">)</span></code>). In addition, for a given macro all compiler
+ error messages report the same line number (because macros always expand
+ on a single line) so line numbers are not very useful in identifying syntactic
+ errors.
+ </p>
+<p>
+ While the preprocessor imposes limits on the error checking that can be implemented,
+ the current version of this library does not focus on providing the best
+ possible syntax error messages (this will be the focus of future releases,
+ see also <a href="https://sourceforge.net/apps/trac/contractpp/ticket/44" target="_top">Ticket
+ 44</a>).
+ </p>
+</td></tr>
+</table></div>
+<p>
+ The best way to resolve syntactic errors is for programmers to inspect the
+ code <span class="quote">“<span class="quote">by eye</span>”</span> instead of trying to make sense of the compiler
+ errors. This section is very useful for programmers to make sure that they
+ are using the syntax correctly.
+ </p>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.grammar.preprocessor_dsel"></a><a class="link" href="grammar.html#contract__.grammar.preprocessor_dsel" title="Preprocessor DSEL">Preprocessor DSEL</a>
+</h3></div></div></div>
+<p>
+ The syntax used by this library macros effectively defies a new language
+ within C++. More precisely, this library macros define a <a href="http://en.wikipedia.org/wiki/Domain-specific_language" target="_top">Domain-Specific
+ Embedded Language (DSEL)</a> that replaces the usual C++ syntax for class
+ and function declarations. This is the <span class="emphasis"><em>Language of Contract++</em></span>
+ (or <span class="emphasis"><em>LC++</em></span> for short).
+ </p>
+<p>
+ In contrast with other DSEL hosted by C++ which are parsed using template
+ meta-programming (e.g., Boost.Phoenix),
+ this library DSEL is parsed <span class="quote">“<span class="quote">one meta-programming level higher</span>”</span>
+ using preprocessor meta-programming. Using both processor meta-programming
+ and template meta-programming allows this library to implement rules like
+ this:
+ </p>
+<pre class="programlisting"><span class="emphasis"><em>if a member function is not public then it does not check the class invariants</em></span>
+</pre>
+<p>
+ This rule cannot be implemented using only template meta-programming because
+ it is not possible to check if a function is public using template meta-programming
+ introspection techniques. For example, it is not possible to implement a
+ boolean meta-function like the following: <sup>[<a name="contract__.grammar.preprocessor_dsel.f0" href="#ftn.contract__.grammar.preprocessor_dsel.f0" class="footnote">71</a>]</sup>
+ </p>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span> <span class="special">...</span> <span class="special">></span>
+<span class="keyword">struct</span> <span class="identifier">is_public</span> <span class="special">{</span> <span class="special">...</span> <span class="special">};</span> <span class="comment">// Unfortunately, this cannot be implemented.</span>
+</pre>
+<p>
+ Instead a macro can be programmed to parse the following function declarations
+ and expand to <code class="computeroutput"><span class="number">1</span></code> if and only if
+ the function is public:
+ </p>
+<pre class="programlisting"><span class="preprocessor">#define</span> <span class="identifier">IS_PUBLIC</span><span class="special">(</span><span class="identifier">function_declaration</span><span class="special">)</span> <span class="special">...</span> <span class="comment">// This can be implemented.</span>
+
+<span class="identifier">IS_PUBLIC</span><span class="special">(</span> <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">f</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">x</span> <span class="special">)</span> <span class="special">)</span> <span class="comment">// Expand to 1.</span>
+<span class="identifier">IS_PUBLIC</span><span class="special">(</span> <span class="keyword">private</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">g</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">)</span> <span class="comment">// Expand to 0.</span>
+<span class="identifier">IS_PUBLIC</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">h</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">z</span> <span class="special">)</span> <span class="special">)</span> <span class="comment">// Expand to 0.</span>
+</pre>
+<p>
+ There are more examples of class and function declaration traits (<code class="computeroutput"><span class="keyword">virtual</span></code>, etc) that need to be known to correctly
+ implement Contract Programming but that cannot be inspected using template
+ meta-programming. This library macros can instead parse the specified class
+ and function declarations extracting <span class="emphasis"><em>any</em></span> declaration
+ trait (if a constructor is <code class="computeroutput"><span class="keyword">explicit</span></code>,
+ if a member function is <code class="computeroutput"><span class="keyword">virtual</span></code>,
+ if a base class is <code class="computeroutput"><span class="keyword">protected</span></code>,
+ if a parameter has a default value, etc).
+ </p>
+<p>
+ It should be noted that while the syntax of the DSEL defined by this library
+ macros is rather extensive and complex, macros always define a DSEL that
+ is intrinsically different from the core C++ language. For example, consider
+ the following function-like macro:
+ </p>
+<pre class="programlisting"><span class="preprocessor">#define</span> <span class="identifier">F</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span> <span class="identifier">y</span><span class="special">)</span> <span class="special">(</span><span class="keyword">int</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span> <span class="special">-</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">y</span><span class="special">))</span>
+
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">X</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Y</span> <span class="special">></span>
+<span class="keyword">int</span> <span class="identifier">f</span> <span class="special">(</span> <span class="identifier">X</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">x</span><span class="special">,</span> <span class="identifier">Y</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">y</span> <span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="special">(</span><span class="keyword">int</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span> <span class="special">-</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">y</span><span class="special">));</span> <span class="special">}</span>
+
+<span class="keyword">int</span> <span class="identifier">main</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">F</span><span class="special">(</span> <span class="special">,</span> <span class="number">2</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> <span class="comment">// OK, no syntax error, it prints `-2`.</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">f</span><span class="special">(</span> <span class="special">,</span> <span class="number">2</span><span class="special">)</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> <span class="comment">// Compiler generates a syntax error.</span>
+ <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ Note how it is valid to invoke the macro with an empty parameter <code class="computeroutput"><span class="identifier">F</span><span class="special">(</span> <span class="special">,</span>
+ <span class="number">2</span><span class="special">)</span></code>
+ while it is syntactically invalid to invoke a function with an empty parameter
+ <code class="computeroutput"><span class="identifier">f</span><span class="special">(</span>
+ <span class="special">,</span> <span class="number">2</span><span class="special">)</span></code>. This very simple macro already shows fundamental
+ differences between the syntax of macros and the syntax of the core language.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.grammar.differences_with_c___syntax"></a><a class="link" href="grammar.html#contract__.grammar.differences_with_c___syntax" title="Differences with C++ Syntax">Differences
+ with C++ Syntax</a>
+</h3></div></div></div>
+<p>
+ The following is a summary of all the differences between the syntax of this
+ library macros and the usual C++ class and function declaration syntax.
+ </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>
+ <p>
+ Rule
+ </p>
+ </th>
+<th>
+ <p>
+ Syntactic Element
+ </p>
+ </th>
+<th>
+ <p>
+ Syntax Differences
+ </p>
+ </th>
+</tr></thead>
+<tbody>
+<tr>
+<td>
+ <p>
+ 1
+ </p>
+ </td>
+<td>
+ <p>
+ Template Declarations
+ </p>
+ </td>
+<td>
+ <p>
+ Use round parenthesis <code class="computeroutput"><span class="keyword">template</span><span class="special">(</span> </code><code class="literal"><span class="emphasis"><em>template-parameters</em></span></code><code class="computeroutput">
+ <span class="special">)</span></code> instead of angular parenthesis
+ <code class="computeroutput"><span class="keyword">template</span><span class="special"><</span>
+ </code><code class="literal"><span class="emphasis"><em>template-parameters</em></span></code><code class="computeroutput">
+ <span class="special">></span></code> to declare templates
+ (note that template instantiations are not template declarations
+ and they use angular parenthesis as usual).
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ 2
+ </p>
+ </td>
+<td>
+ <p>
+ Template Specializations
+ </p>
+ </td>
+<td>
+ <p>
+ Use round parenthesis <code class="computeroutput"><span class="special">(</span>
+ </code><code class="literal"><span class="emphasis"><em>template-specializations</em></span></code><code class="computeroutput">
+ <span class="special">)</span></code> instead of angular parenthesis
+ <code class="computeroutput"><span class="special"><</span> </code><code class="literal"><span class="emphasis"><em>template-specializations</em></span></code><code class="computeroutput">
+ <span class="special">></span></code> after a class template
+ name to specify template specialization arguments.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ 3
+ </p>
+ </td>
+<td>
+ <p>
+ Class, Function, and Operator Names
+ </p>
+ </td>
+<td>
+ <p>
+ Wrap class and function declaration names within round parenthesis
+ <code class="computeroutput"><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>class-name</em></span></code><code class="computeroutput"><span class="special">)</span></code> and <code class="computeroutput"><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>function-name</em></span></code><code class="computeroutput"><span class="special">)</span></code>. Use <code class="computeroutput"><span class="keyword">operator</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>symbol</em></span></code><code class="computeroutput"><span class="special">)(</span></code><code class="literal"><span class="emphasis"><em>arbitrary-name</em></span></code><code class="computeroutput"><span class="special">)</span></code> for operators (allowed but not
+ required for <code class="computeroutput"><span class="keyword">operator</span> <span class="keyword">new</span></code>, <code class="computeroutput"><span class="keyword">operator</span>
+ <span class="keyword">delete</span></code>, and implicit type
+ conversion operators for fundamental types with no symbol). Always
+ use <code class="computeroutput"><span class="keyword">operator</span> <span class="keyword">comma</span></code>
+ for comma operator. Memory member operators must always be explicitly
+ declared <code class="computeroutput"><span class="keyword">static</span></code>.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ 4
+ </p>
+ </td>
+<td>
+ <p>
+ Base Classes
+ </p>
+ </td>
+<td>
+ <p>
+ Use <code class="computeroutput"><span class="keyword">extends</span><span class="special">(</span>
+ </code><code class="literal"><span class="emphasis"><em>base-classes</em></span></code><code class="computeroutput">
+ <span class="special">)</span></code> instead of the column
+ symbol <code class="computeroutput"><span class="special">:</span> </code><code class="literal"><span class="emphasis"><em>base-classes</em></span></code>
+ to inherit from base classes.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ 5
+ </p>
+ </td>
+<td>
+ <p>
+ Default Parameters
+ </p>
+ </td>
+<td>
+ <p>
+ Use <code class="computeroutput"><span class="keyword">default</span> </code><code class="literal"><span class="emphasis"><em>parameter-default</em></span></code>
+ instead of the assignment symbol <code class="computeroutput"><span class="special">=</span>
+ </code><code class="literal"><span class="emphasis"><em>parameter-default</em></span></code>
+ to specify template and function parameter default values.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ 6
+ </p>
+ </td>
+<td>
+ <p>
+ Member Access Levels
+ </p>
+ </td>
+<td>
+ <p>
+ Always specify the access level <code class="computeroutput"><span class="keyword">public</span></code>,
+ <code class="computeroutput"><span class="keyword">protected</span></code>, or <code class="computeroutput"><span class="keyword">private</span></code> (note no trailing comma
+ <code class="computeroutput"><span class="special">:</span></code>) for every constructor,
+ destructor, member function, and nested class declaration.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ 7
+ </p>
+ </td>
+<td>
+ <p>
+ Result and Parameter Types
+ </p>
+ </td>
+<td>
+ <p>
+ Wrap function result and parameter types within round parenthesis
+ <code class="computeroutput"><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>type</em></span></code><code class="computeroutput"><span class="special">)</span></code>. The wrapping parenthesis are
+ allowed but not required for fundamental types containing only
+ alphanumeric tokens (e.g., both <code class="computeroutput"><span class="special">(</span><span class="keyword">const</span> <span class="keyword">unsigned</span>
+ <span class="keyword">int</span><span class="special">)</span></code>
+ and <code class="computeroutput"><span class="keyword">const</span> <span class="keyword">unsigned</span>
+ <span class="keyword">int</span></code> are allowed, only <code class="computeroutput"><span class="special">(</span><span class="keyword">int</span><span class="special">&)</span></code> and not <code class="computeroutput"><span class="keyword">int</span><span class="special">&</span></code> is allowed because of the
+ non-alphanumeric symbol <code class="computeroutput"><span class="special">&</span></code>,
+ only <code class="computeroutput"><span class="special">(</span><span class="identifier">mytype</span><span class="special">)</span></code> is allowed because <code class="computeroutput"><span class="identifier">mytype</span></code> is not a fundamental type).
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ 8
+ </p>
+ </td>
+<td>
+ <p>
+ Member Initializers
+ </p>
+ </td>
+<td>
+ <p>
+ Use <code class="computeroutput"><span class="keyword">initialize</span><span class="special">(</span>
+ </code><code class="literal"><span class="emphasis"><em>member-initializers</em></span></code><code class="computeroutput">
+ <span class="special">)</span></code> instead of the column
+ symbol <code class="computeroutput"><span class="special">:</span> </code><code class="literal"><span class="emphasis"><em>member-initializers</em></span></code>
+ to specify constructor member initializers.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ 9
+ </p>
+ </td>
+<td>
+ <p>
+ Empty Lists
+ </p>
+ </td>
+<td>
+ <p>
+ Specify empty lists (parameters, exception specifications, template
+ specializations, etc) using <code class="computeroutput"><span class="special">(</span>
+ <span class="keyword">void</span> <span class="special">)</span></code>
+ instead of <code class="computeroutput"><span class="special">(</span> <span class="special">)</span></code>
+ or <code class="computeroutput"><span class="special"><</span> <span class="special">></span></code>.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ 10
+ </p>
+ </td>
+<td>
+ <p>
+ Commas and Leading Symbols
+ </p>
+ </td>
+<td>
+ <p>
+ Syntactic elements containing commas and leading non-alphanumeric
+ symbols must be wrapped within extra round parenthesis <code class="computeroutput"><span class="special">(...)</span></code>. (Note that <code class="computeroutput"><span class="char">'a'</span></code>, <code class="computeroutput"><span class="string">"abc"</span></code>,
+ <code class="computeroutput"><span class="number">1.23</span></code>, etc are not alphanumeric
+ so they need to be wrapped as <code class="computeroutput"><span class="special">(</span><span class="char">'a'</span><span class="special">)</span></code>,
+ <code class="computeroutput"><span class="special">(</span><span class="string">"abc"</span><span class="special">)</span></code>, <code class="computeroutput"><span class="special">(</span><span class="number">1.23</span><span class="special">)</span></code>,
+ etc when specified as default parameters or similar.)
+ </p>
+ </td>
+</tr>
+</tbody>
+</table></div>
+<div class="important"><table border="0" summary="Important">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../doc/src/images/important.png"></td>
+<th align="left">Important</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ In general, every token which is not a known keyword (<code class="computeroutput"><span class="keyword">int</span></code>
+ is a known keyword but the function name is not) or that contains a non-alphanumeric
+ symbol (e.g., <code class="computeroutput"><span class="keyword">int</span><span class="special">&</span></code>)
+ must be wrapped within round parenthesis <code class="computeroutput"><span class="special">(...)</span></code>
+ unless it is the very last token of a syntactic element (e.g., the function
+ parameter name).
+ </p></td></tr>
+</table></div>
+<p>
+ Sometimes the C++ syntax allows to equivalently specify elements in different
+ orders (e.g., <code class="computeroutput"><span class="keyword">const</span> <span class="keyword">volatile</span></code>
+ and <code class="computeroutput"><span class="keyword">volatile</span> <span class="keyword">const</span></code>
+ are both allowed for member functions and they have the same meaning). The
+ syntax of this library requires instead to specify the elements exactly in
+ the order listed by this grammar (e.g., only <code class="computeroutput"><span class="keyword">const</span>
+ <span class="keyword">volatile</span></code> is allowed for member functions).
+ <sup>[<a name="contract__.grammar.differences_with_c___syntax.f0" href="#ftn.contract__.grammar.differences_with_c___syntax.f0" class="footnote">72</a>]</sup>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.grammar.macro_interface"></a><a class="link" href="grammar.html#contract__.grammar.macro_interface" title="Macro Interface">Macro Interface</a>
+</h3></div></div></div>
+<p>
+ This library uses the following macros.
+ </p>
+<pre class="programlisting"><code class="computeroutput"><a class="link" href="../CONTRACT_CLASS.html" title="Macro CONTRACT_CLASS">CONTRACT_CLASS</a></code><span class="special">(</span><a class="link" href="grammar.html#class_declaration_anchor"><code class="literal"><span class="emphasis"><em>class-declaration</em></span></code></a><span class="special">)</span>
+<code class="computeroutput"><a class="link" href="../CONTRACT_CLASS_TPL.html" title="Macro CONTRACT_CLASS_TPL">CONTRACT_CLASS_TPL</a></code><span class="special">(</span><a class="link" href="grammar.html#class_declaration_anchor"><code class="literal"><span class="emphasis"><em>class-declaration</em></span></code></a><span class="special">)</span>
+
+<code class="computeroutput"><a class="link" href="../CONTRACT_CLASS_INVARIANT.html" title="Macro CONTRACT_CLASS_INVARIANT">CONTRACT_CLASS_INVARIANT</a></code><span class="special">(</span><a class="link" href="grammar.html#class_invariants_anchor"><code class="literal"><span class="emphasis"><em>class-invariants</em></span></code></a><span class="special">)</span>
+<code class="computeroutput"><a class="link" href="../CONTRACT_CLASS_INVARIANT_TPL.html" title="Macro CONTRACT_CLASS_INVARIANT_TPL">CONTRACT_CLASS_INVARIANT_TPL</a></code><span class="special">(</span><a class="link" href="grammar.html#class_invariants_anchor"><code class="literal"><span class="emphasis"><em>class-invariants</em></span></code></a><span class="special">)</span>
+
+<code class="computeroutput"><a class="link" href="../CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code><span class="special">(</span><a class="link" href="grammar.html#function_declaration_anchor"><code class="literal"><span class="emphasis"><em>function-declaration</em></span></code></a><span class="special">)</span>
+<code class="computeroutput"><a class="link" href="../CONTRACT_FUNCTION_TPL.html" title="Macro CONTRACT_FUNCTION_TPL">CONTRACT_FUNCTION_TPL</a></code><span class="special">(</span><a class="link" href="grammar.html#function_declaration_anchor"><code class="literal"><span class="emphasis"><em>function-declaration</em></span></code></a><span class="special">)</span>
+<code class="computeroutput"><a class="link" href="../CONTRACT_CONSTRUCTOR.html" title="Macro CONTRACT_CONSTRUCTOR">CONTRACT_CONSTRUCTOR</a></code><span class="special">(</span><a class="link" href="grammar.html#function_declaration_anchor"><code class="literal"><span class="emphasis"><em>function-declaration</em></span></code></a><span class="special">)</span>
+<code class="computeroutput"><a class="link" href="../CONTRACT_CONSTRUCTOR_TPL.html" title="Macro CONTRACT_CONSTRUCTOR_TPL">CONTRACT_CONSTRUCTOR_TPL</a></code><span class="special">(</span><a class="link" href="grammar.html#function_declaration_anchor"><code class="literal"><span class="emphasis"><em>function-declaration</em></span></code></a><span class="special">)</span>
+<code class="computeroutput"><a class="link" href="../CONTRACT_DESTRUCTOR.html" title="Macro CONTRACT_DESTRUCTOR">CONTRACT_DESTRUCTOR</a></code><span class="special">(</span><a class="link" href="grammar.html#function_declaration_anchor"><code class="literal"><span class="emphasis"><em>function-declaration</em></span></code></a><span class="special">)</span>
+<code class="computeroutput"><a class="link" href="../CONTRACT_DESTRUCTOR_TPL.html" title="Macro CONTRACT_DESTRUCTOR_TPL">CONTRACT_DESTRUCTOR_TPL</a></code><span class="special">(</span><a class="link" href="grammar.html#function_declaration_anchor"><code class="literal"><span class="emphasis"><em>function-declaration</em></span></code></a><span class="special">)</span>
+
+<code class="computeroutput"><a class="link" href="../CONTRACT_FREE_BODY.html" title="Macro CONTRACT_FREE_BODY">CONTRACT_FREE_BODY</a></code><span class="special">(</span><a class="link" href="grammar.html#function_name_anchor"><code class="literal"><span class="emphasis"><em>function-name</em></span></code></a><span class="special">)</span>
+<code class="computeroutput"><a class="link" href="../CONTRACT_MEMBER_BODY.html" title="Macro CONTRACT_MEMBER_BODY">CONTRACT_MEMBER_BODY</a></code><span class="special">(</span><a class="link" href="grammar.html#function_name_anchor"><code class="literal"><span class="emphasis"><em>function-name</em></span></code></a><span class="special">)</span>
+<code class="computeroutput"><a class="link" href="../CONTRACT_CONSTRUCTOR_BODY.html" title="Macro CONTRACT_CONSTRUCTOR_BODY">CONTRACT_CONSTRUCTOR_BODY</a></code><span class="special">(</span><a class="link" href="grammar.html#class_type_anchor"><code class="literal"><span class="bold"><strong>class-type</strong></span></code></a><span class="special">,</span> <a class="link" href="grammar.html#class_name_anchor"><code class="literal"><span class="bold"><strong>class-name</strong></span></code></a><span class="special">)</span>
+<code class="computeroutput"><a class="link" href="../CONTRACT_DESTRUCTOR_BODY.html" title="Macro CONTRACT_DESTRUCTOR_BODY">CONTRACT_DESTRUCTOR_BODY</a></code><span class="special">(</span><a class="link" href="grammar.html#class_type_anchor"><code class="literal"><span class="bold"><strong>class-type</strong></span></code></a><span class="special">,</span> <span class="special">~</span><a class="link" href="grammar.html#class_name_anchor"><code class="literal"><span class="bold"><strong>class-name</strong></span></code></a><span class="special">)</span>
+
+<code class="computeroutput"><a class="link" href="../CONTRACT_BLOCK_INVARIANT.html" title="Macro CONTRACT_BLOCK_INVARIANT">CONTRACT_BLOCK_INVARIANT</a></code><span class="special">(</span><a class="link" href="grammar.html#assertions_anchor"><code class="literal"><span class="emphasis"><em>assertions</em></span></code></a><span class="special">)</span>
+<code class="computeroutput"><a class="link" href="../CONTRACT_BLOCK_INVARIANT_TPL.html" title="Macro CONTRACT_BLOCK_INVARIANT_TPL">CONTRACT_BLOCK_INVARIANT_TPL</a></code><span class="special">(</span><a class="link" href="grammar.html#assertions_anchor"><code class="literal"><span class="emphasis"><em>assertions</em></span></code></a><span class="special">)</span>
+
+<code class="computeroutput"><a class="link" href="../CONTRACT_LOOP.html" title="Macro CONTRACT_LOOP">CONTRACT_LOOP</a></code><span class="special">(</span><a class="link" href="grammar.html#loop_declaration_anchor"><code class="literal"><span class="bold"><strong>loop-declaration</strong></span></code></a><span class="special">)</span>
+<code class="computeroutput"><a class="link" href="../CONTRACT_LOOP_VARIANT.html" title="Macro CONTRACT_LOOP_VARIANT">CONTRACT_LOOP_VARIANT</a></code><span class="special">(</span><a class="link" href="grammar.html#loop_variant_anchor"><code class="literal"><span class="emphasis"><em>loop-variant</em></span></code></a><span class="special">)</span>
+<code class="computeroutput"><a class="link" href="../CONTRACT_LOOP_VARIANT_TPL.html" title="Macro CONTRACT_LOOP_VARIANT_TPL">CONTRACT_LOOP_VARIANT_TPL</a></code><span class="special">(</span><a class="link" href="grammar.html#loop_variant_anchor"><code class="literal"><span class="emphasis"><em>loop-variant</em></span></code></a><span class="special">)</span>
+
+<code class="computeroutput"><a class="link" href="../CONTRACT_CONSTRUCTOR_ARG.html" title="Macro CONTRACT_CONSTRUCTOR_ARG">CONTRACT_CONSTRUCTOR_ARG</a></code><span class="special">(</span><a class="link" href="grammar.html#parameter_name_anchor"><code class="literal"><span class="bold"><strong>parameter-name</strong></span></code></a><span class="special">)</span>
+<code class="computeroutput"><a class="link" href="../CONTRACT_PARAMETER_TYPEOF.html" title="Macro CONTRACT_PARAMETER_TYPEOF">CONTRACT_PARAMETER_TYPEOF</a></code><span class="special">(</span><a class="link" href="grammar.html#parameter_name_anchor"><code class="literal"><span class="bold"><strong>parameter-name</strong></span></code></a><span class="special">)</span>
+<code class="computeroutput"><a class="link" href="../CONTRACT_PARAMETER.html" title="Macro CONTRACT_PARAMETER">CONTRACT_PARAMETER</a></code><span class="special">(</span><a class="link" href="grammar.html#named_parameter_declaration_anchor"><code class="literal"><span class="emphasis"><em>named-parameter-declaration</em></span></code></a><span class="special">)</span>
+<code class="computeroutput"><a class="link" href="../CONTRACT_TEMPLATE_PARAMETER.html" title="Macro CONTRACT_TEMPLATE_PARAMETER">CONTRACT_TEMPLATE_PARAMETER</a></code><span class="special">(</span><a class="link" href="grammar.html#named_parameter_declaration_anchor"><code class="literal"><span class="emphasis"><em>named-parameter-declaration</em></span></code></a><span class="special">)</span>
+<code class="computeroutput"><a class="link" href="../CONTRACT_PARAMETER_BODY.html" title="Macro CONTRACT_PARAMETER_BODY">CONTRACT_PARAMETER_BODY</a></code><span class="special">(</span><a class="link" href="grammar.html#function_name_anchor"><code class="literal"><span class="emphasis"><em>function-name</em></span></code></a><span class="special">)</span>
+</pre>
+<p>
+ The macros with the trailing <code class="computeroutput"><span class="identifier">_TPL</span></code>
+ must be used when the enclosing scope is type-dependent (e.g., within templates).
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.grammar.lexical_conventions"></a><a class="link" href="grammar.html#contract__.grammar.lexical_conventions" title="Lexical Conventions">Lexical Conventions</a>
+</h3></div></div></div>
+<p>
+ The following conventions are used to express this grammar.
+ </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>
+ <p>
+ Lexical Expression
+ </p>
+ </th>
+<th>
+ <p>
+ Meaning
+ </p>
+ </th>
+</tr></thead>
+<tbody>
+<tr>
+<td>
+ <p>
+ <code class="literal"><span class="emphasis"><em>[</em></span>tokens<span class="emphasis"><em>]</em></span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ Either <code class="computeroutput"><span class="identifier">tokens</span></code> or
+ nothing (optional tokens).
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="literal"><span class="emphasis"><em>{</em></span>expression<span class="emphasis"><em>}</em></span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ The result of the enclosed expression <code class="computeroutput"><span class="identifier">expression</span></code>
+ (evaluation order).
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="literal">tokens1 <span class="emphasis"><em>|</em></span> tokens2</code>
+ </p>
+ </td>
+<td>
+ <p>
+ Either <code class="computeroutput"><span class="identifier">tokens1</span></code>
+ or <code class="computeroutput"><span class="identifier">tokens2</span></code> (<span class="quote">“<span class="quote">or</span>”</span>
+ operation).
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="literal">tokens<span class="emphasis"><em>*</em></span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">tokens</span></code> repeated
+ zero or more times (repetition starting from zero).
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="literal">tokens<span class="emphasis"><em>+</em></span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ <code class="computeroutput"><span class="identifier">tokens</span></code> repeated
+ one or more times (repetition starting from one).
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="literal">token, ...</code>
+ </p>
+ </td>
+<td>
+ <p>
+ A comma separated list of tokens that could also have one single
+ element (i.e., <code class="computeroutput"><span class="identifier">token</span></code>
+ or <code class="computeroutput"><span class="identifier">token1</span><span class="special">,</span>
+ <span class="identifier">token2</span></code> or <code class="computeroutput"><span class="identifier">token1</span><span class="special">,</span>
+ <span class="identifier">token2</span><span class="special">,</span>
+ <span class="identifier">token3</span></code>). See the <a class="link" href="no_variadic_macros.html" title="No Variadic Macros">No Variadic Macros</a>
+ section for compilers that do not support variadic macros.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="literal"><span class="bold"><strong>tokens</strong></span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ Terminal symbols (in bold font).
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <code class="literal"><span class="emphasis"><em>tokens</em></span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ Non-terminal symbols (in italic font).
+ </p>
+ </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.grammar.class_declarations"></a><a class="link" href="grammar.html#contract__.grammar.class_declarations" title="Class Declarations">Class Declarations</a>
+</h3></div></div></div>
+<pre class="programlisting"><a class="link" href="grammar.html#class_declaration_anchor"><code class="literal"><span class="emphasis"><em>class-declaration</em></span></code></a>: <a name="class_declaration_anchor"></a>
+ <span class="emphasis"><em>[</em></span><span class="emphasis"><em>[</em></span><span class="keyword">export</span><span class="emphasis"><em>]</em></span> <span class="keyword">template</span><span class="special">(</span> <a class="link" href="grammar.html#template_parameters_anchor"><code class="literal"><span class="emphasis"><em>template-parameters</em></span></code></a> <span class="special">)</span> <span class="emphasis"><em>[</em></span><span class="keyword">requires</span><span class="special">(</span> <a class="link" href="grammar.html#concepts_anchor"><code class="literal"><span class="emphasis"><em>concepts</em></span></code></a> <span class="special">)</span><span class="emphasis"><em>]</em></span><span class="emphasis"><em>]</em></span>
+ <span class="emphasis"><em>[</em></span><span class="keyword">friend</span><span class="emphasis"><em>]</em></span> <span class="emphasis"><em>{</em></span><span class="keyword">class</span> <span class="emphasis"><em>|</em></span> <span class="keyword">struct</span><span class="emphasis"><em>}</em></span> <span class="special">(</span><a class="link" href="grammar.html#class_name_anchor"><code class="literal"><span class="bold"><strong>class-name</strong></span></code></a><span class="special">)</span><span class="emphasis"><em>[</em></span><span class="special">(</span> <a class="link" href="grammar.html#template_specializations_anchor"><code class="literal"><span class="emphasis"><em>template-specializations</em></span></code></a> <span class="special">)</span><span class="emphasis"><em>]</em></span> <span class="emphasis"><em>[</em></span><span class="keyword">final</span><span class="emphasis"><em>]</em></span>
+ <span class="emphasis"><em>[</em></span><span class="keyword">extends</span><span class="special">(</span> <a class="link" href="grammar.html#base_classes_anchor"><code class="literal"><span class="emphasis"><em>base-classes</em></span></code></a> <span class="special">)</span><span class="emphasis"><em>]</em></span>
+</pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.grammar.base_classes"></a><a class="link" href="grammar.html#contract__.grammar.base_classes" title="Base Classes">Base Classes</a>
+</h3></div></div></div>
+<pre class="programlisting"><a class="link" href="grammar.html#base_classes_anchor"><code class="literal"><span class="emphasis"><em>base-classes</em></span></code></a>: <a name="base_classes_anchor"></a>
+ <span class="emphasis"><em>[</em></span><span class="keyword">public</span> <span class="emphasis"><em>|</em></span> <span class="keyword">protected</span> <span class="emphasis"><em>|</em></span> <span class="keyword">private</span><span class="emphasis"><em>]</em></span> <span class="emphasis"><em>[</em></span><span class="keyword">virtual</span><span class="emphasis"><em>]</em></span> <a class="link" href="grammar.html#class_type_anchor"><code class="literal"><span class="bold"><strong>class-type</strong></span></code></a><span class="special">,</span> <span class="special">...</span>
+</pre>
+<p>
+ Note that when specified, <code class="computeroutput"><span class="keyword">virtual</span></code>
+ must appear after the inheritance access level for a base class.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.grammar.template_specializations"></a><a class="link" href="grammar.html#contract__.grammar.template_specializations" title="Template Specializations">Template
+ Specializations</a>
+</h3></div></div></div>
+<pre class="programlisting"><a class="link" href="grammar.html#template_specializations_anchor"><code class="literal"><span class="emphasis"><em>template-specializations</em></span></code></a>: <a name="template_specializations_anchor"></a>
+ <a class="link" href="grammar.html#template_specialization_anchor"><code class="literal"><span class="bold"><strong>template-specialization</strong></span></code></a><span class="special">,</span> <span class="special">...</span>
+</pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.grammar.template_parameters"></a><a class="link" href="grammar.html#contract__.grammar.template_parameters" title="Template Parameters">Template Parameters</a>
+</h3></div></div></div>
+<pre class="programlisting"><a class="link" href="grammar.html#template_parameters_anchor"><code class="literal"><span class="emphasis"><em>template-parameters</em></span></code></a>: <a name="template_parameters_anchor"></a>
+ <span class="keyword">void</span> <span class="emphasis"><em>|</em></span>
+ <a class="link" href="grammar.html#positional_template_parameters_anchor"><code class="literal"><span class="emphasis"><em>positional-template-parameters</em></span></code></a> <span class="emphasis"><em>|</em></span>
+ <a class="link" href="grammar.html#named_template_parameters_anchor"><code class="literal"><span class="emphasis"><em>named-template-parameters</em></span></code></a>
+
+<a class="link" href="grammar.html#positional_template_parameters_anchor"><code class="literal"><span class="emphasis"><em>positional-template-parameters</em></span></code></a>: <a name="positional_template_parameters_anchor"></a>
+ <a class="link" href="grammar.html#positional_template_parameter_anchor"><code class="literal"><span class="emphasis"><em>positional-template-parameter</em></span></code></a><span class="special">,</span> <span class="special">...</span>
+<a class="link" href="grammar.html#positional_template_parameter_anchor"><code class="literal"><span class="emphasis"><em>positional-template-parameter</em></span></code></a>: <a name="positional_template_parameter_anchor"></a>
+ <a class="link" href="grammar.html#positional_type_template_parameter_anchor"><code class="literal"><span class="emphasis"><em>positional-type-template-parameter</em></span></code></a> <span class="emphasis"><em>|</em></span>
+ <a class="link" href="grammar.html#positional_value_template_parameter_anchor"><code class="literal"><span class="emphasis"><em>positional-value-template-parameter</em></span></code></a> <span class="emphasis"><em>|</em></span>
+ <a class="link" href="grammar.html#positional_template_template_parameter_anchor"><code class="literal"><span class="emphasis"><em>positional-template-template-parameter</em></span></code></a>
+<a class="link" href="grammar.html#positional_type_template_parameter_anchor"><code class="literal"><span class="emphasis"><em>positional-type-template-parameter</em></span></code></a>: <a name="positional_type_template_parameter_anchor"></a>
+ <span class="emphasis"><em>{</em></span><span class="keyword">class</span> <span class="emphasis"><em>|</em></span> <span class="keyword">typename</span><span class="emphasis"><em>}</em></span> <a class="link" href="grammar.html#parameter_name_anchor"><code class="literal"><span class="bold"><strong>parameter-name</strong></span></code></a>
+ <span class="emphasis"><em>[</em></span><span class="special">,</span> <span class="keyword">default</span> <a class="link" href="grammar.html#parameter_default_anchor"><code class="literal"><span class="bold"><strong>parameter-default</strong></span></code></a><span class="emphasis"><em>]</em></span>
+<a class="link" href="grammar.html#positional_value_template_parameter_anchor"><code class="literal"><span class="emphasis"><em>positional-value-template-parameter</em></span></code></a>: <a name="positional_value_template_parameter_anchor"></a>
+ <a class="link" href="grammar.html#wrapped_type_anchor"><code class="literal"><span class="emphasis"><em>wrapped-type</em></span></code></a> <a class="link" href="grammar.html#parameter_name_anchor"><code class="literal"><span class="bold"><strong>parameter-name</strong></span></code></a>
+ <span class="emphasis"><em>[</em></span><span class="special">,</span> <span class="keyword">default</span> <a class="link" href="grammar.html#parameter_default_anchor"><code class="literal"><span class="bold"><strong>parameter-default</strong></span></code></a><span class="emphasis"><em>]</em></span>
+<a class="link" href="grammar.html#positional_template_template_parameter_anchor"><code class="literal"><span class="emphasis"><em>positional-template-template-parameter</em></span></code></a>: <a name="positional_template_template_parameter_anchor"></a>
+ <span class="keyword">template</span><span class="special">(</span> <a class="link" href="grammar.html#template_parameter_anchor"><code class="literal"><span class="bold"><strong>template-parameter</strong></span></code></a><span class="special">,</span> <span class="special">...</span> <span class="special">)</span> <span class="keyword">class</span> <a class="link" href="grammar.html#parameter_name_anchor"><code class="literal"><span class="bold"><strong>parameter-name</strong></span></code></a>
+ <span class="emphasis"><em>[</em></span><span class="special">,</span> <span class="keyword">default</span> <a class="link" href="grammar.html#parameter_default_anchor"><code class="literal"><span class="bold"><strong>parameter-default</strong></span></code></a><span class="emphasis"><em>]</em></span>
+
+<a class="link" href="grammar.html#named_template_parameters_anchor"><code class="literal"><span class="emphasis"><em>named-template-parameters</em></span></code></a>: <a name="named_template_parameters_anchor"></a>
+ <span class="emphasis"><em>[</em></span><span class="keyword">using</span> <span class="keyword">namespace</span> <a class="link" href="grammar.html#named_parameter_identifier_namespace_anchor"><code class="literal"><span class="bold"><strong>named-parameter-identifier-namespace</strong></span></code></a><span class="special">,</span><span class="emphasis"><em>]</em></span>
+ <a class="link" href="grammar.html#named_type_template_parameter_anchor"><code class="literal"><span class="emphasis"><em>named-type-template-parameter</em></span></code></a><span class="special">,</span> <span class="special">...</span>
+<a class="link" href="grammar.html#named_type_template_parameter_anchor"><code class="literal"><span class="emphasis"><em>named-type-template-parameter</em></span></code></a>: <a name="named_type_template_parameter_anchor"></a>
+ <span class="emphasis"><em>[</em></span><span class="keyword">deduce</span><span class="emphasis"><em>]</em></span> <span class="keyword">in</span> <span class="emphasis"><em>{</em></span><span class="keyword">class</span> <span class="emphasis"><em>|</em></span> <span class="keyword">typename</span><span class="emphasis"><em>}</em></span>
+ <span class="emphasis"><em>[</em></span><span class="keyword">requires</span><span class="special">(</span><a class="link" href="grammar.html#unary_boolean_metafunction_anchor"><code class="literal"><span class="bold"><strong>unary-boolean-metafunction</strong></span></code></a><span class="special">)</span><span class="emphasis"><em>]</em></span> <a class="link" href="grammar.html#parameter_name_anchor"><code class="literal"><span class="bold"><strong>parameter-name</strong></span></code></a>
+ <span class="emphasis"><em>[</em></span><span class="special">,</span> <span class="keyword">default</span> <a class="link" href="grammar.html#parameter_default_anchor"><code class="literal"><span class="bold"><strong>parameter-default</strong></span></code></a><span class="emphasis"><em>]</em></span>
+</pre>
+<p>
+ Note that if <code class="computeroutput"><span class="keyword">typename</span></code> appears
+ within <a class="link" href="grammar.html#wrapped_type_anchor"><code class="literal"><span class="emphasis"><em>wrapped-type</em></span></code></a>
+ for a value template parameter then it will be wrapped within parenthesis
+ <code class="computeroutput"><span class="special">(</span><span class="keyword">typename</span>
+ <span class="special">...)</span></code> so it is syntactically distinguishable
+ from the <code class="computeroutput"><span class="keyword">typename</span></code> leading a
+ type template parameter.
+ </p>
+<p>
+ Unfortunately, named template parameters only support type template parameters.
+ Named value template parameters and named template template parameters are
+ not supported because they are not supported by Boost.Parameter
+ but if they were ever supported, they could follow this syntax:
+ </p>
+<pre class="programlisting"><a class="link" href="grammar.html#named_template_parameters_anchor"><code class="literal"><span class="emphasis"><em>named-template-parameters</em></span></code></a>:
+ <a class="link" href="grammar.html#named_template_parameter_anchor"><code class="literal"><span class="emphasis"><em>named-template-parameter</em></span></code></a><span class="special">,</span> <span class="special">...</span>
+<a class="link" href="grammar.html#named_template_parameter_anchor"><code class="literal"><span class="emphasis"><em>named-template-parameter</em></span></code></a>: <a name="named_template_parameter_anchor"></a>
+ <a class="link" href="grammar.html#named_type_template_parameter_anchor"><code class="literal"><span class="emphasis"><em>named-type-template-parameter</em></span></code></a> <span class="emphasis"><em>|</em></span>
+ <a class="link" href="grammar.html#named_value_template_parameter_anchor"><code class="literal"><span class="emphasis"><em>named-value-template-parameter</em></span></code></a> <span class="emphasis"><em>|</em></span>
+ <a class="link" href="grammar.html#named_template_template_parameter_anchor"><code class="literal"><span class="emphasis"><em>named-template-template-parameter</em></span></code></a>
+<a class="link" href="grammar.html#named_value_template_parameter_anchor"><code class="literal"><span class="emphasis"><em>named-value-template-parameter</em></span></code></a>: <a name="named_value_template_parameter_anchor"></a><span class="comment">// Not supported.</span>
+ <span class="emphasis"><em>[</em></span><span class="keyword">deduce</span><span class="emphasis"><em>]</em></span> <span class="keyword">in</span>
+ <span class="emphasis"><em>{</em></span><a class="link" href="grammar.html#wrapped_type_anchor"><code class="literal"><span class="emphasis"><em>wrapped-type</em></span></code></a> <span class="emphasis"><em>|</em></span> <span class="keyword">auto</span> <span class="emphasis"><em>|</em></span> <span class="keyword">requires</span><span class="special">(</span><a class="link" href="grammar.html#unary_boolean_metafunction_anchor"><code class="literal"><span class="bold"><strong>unary-boolean-metafunction</strong></span></code></a><span class="special">)</span><span class="emphasis"><em>}</em></span> <a class="link" href="grammar.html#parameter_name_anchor"><code class="literal"><span class="bold"><strong>parameter-name</strong></span></code></a>
+ <span class="emphasis"><em>[</em></span><span class="special">,</span> <span class="keyword">default</span> <a class="link" href="grammar.html#parameter_default_anchor"><code class="literal"><span class="bold"><strong>parameter-default</strong></span></code></a><span class="emphasis"><em>]</em></span>
+<a class="link" href="grammar.html#named_template_template_parameter_anchor"><code class="literal"><span class="emphasis"><em>named-template-template-parameter</em></span></code></a>: <a name="named_template_template_parameter_anchor"></a><span class="comment">// Not supported.</span>
+ <span class="emphasis"><em>[</em></span><span class="keyword">deduce</span><span class="emphasis"><em>]</em></span> <span class="keyword">in</span> <span class="keyword">template</span><span class="special">(</span> <a class="link" href="grammar.html#positional_template_parameter_anchor"><code class="literal"><span class="emphasis"><em>positional-template-parameter</em></span></code></a><span class="special">,</span> <span class="special">...</span> <span class="special">)</span> <span class="keyword">class</span>
+ <span class="emphasis"><em>[</em></span><span class="keyword">requires</span><span class="special">(</span><a class="link" href="grammar.html#unary_boolean_metafunction_anchor"><code class="literal"><span class="bold"><strong>unary-boolean-metafunction</strong></span></code></a><span class="special">)</span><span class="emphasis"><em>]</em></span> <a class="link" href="grammar.html#parameter_name_anchor"><code class="literal"><span class="bold"><strong>parameter-name</strong></span></code></a>
+ <span class="emphasis"><em>[</em></span><span class="special">,</span> <span class="keyword">default</span> <a class="link" href="grammar.html#parameter_default_anchor"><code class="literal"><span class="bold"><strong>parameter-default</strong></span></code></a><span class="emphasis"><em>]</em></span>
+
+<span class="keyword">template</span><span class="special">(</span> <span class="comment">// For example...</span>
+ <span class="comment">// Named type template parameter (supported).</span>
+ <span class="keyword">in</span> <span class="keyword">typename</span> <span class="keyword">requires</span><span class="special">(</span><span class="identifier">is_const</span><span class="special"><</span><span class="identifier">_</span><span class="special">>)</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">default</span> <span class="keyword">int</span>
+ <span class="comment">// Named value template parameter (not supported).</span>
+ <span class="special">,</span> <span class="keyword">in</span> <span class="keyword">requires</span><span class="special">(</span><span class="identifier">is_converible</span><span class="special"><</span><span class="identifier">_</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>)</span> <span class="identifier">val</span><span class="special">,</span> <span class="keyword">default</span> <span class="number">0</span>
+ <span class="comment">// Named template template parameter (not supported).</span>
+ <span class="special">,</span> <span class="keyword">in</span> <span class="keyword">template</span><span class="special">(</span>
+ <span class="keyword">typename</span> <span class="identifier">A</span>
+ <span class="special">,</span> <span class="keyword">template</span><span class="special">(</span>
+ <span class="keyword">typename</span> <span class="identifier">X</span>
+ <span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Y</span><span class="special">,</span> <span class="keyword">default</span> <span class="keyword">int</span>
+ <span class="special">)</span> <span class="keyword">class</span> <span class="identifier">B</span><span class="special">,</span> <span class="keyword">default</span> <span class="identifier">b</span>
+ <span class="special">)</span> <span class="keyword">class</span> <span class="keyword">requires</span><span class="special">(</span><span class="identifier">pred1</span><span class="special"><</span> <span class="identifier">_</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">>)</span> <span class="identifier">Tpl</span><span class="special">,</span> <span class="keyword">default</span> <span class="identifier">tpl</span>
+<span class="special">)</span>
+</pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.grammar.concepts"></a><a class="link" href="grammar.html#contract__.grammar.concepts" title="Concepts">Concepts</a>
+</h3></div></div></div>
+<pre class="programlisting"><a class="link" href="grammar.html#concepts_anchor"><code class="literal"><span class="emphasis"><em>concepts</em></span></code></a>: <a name="concepts_anchor"></a>
+ <a class="link" href="grammar.html#boost_concept_anchor"><code class="literal"><span class="bold"><strong>boost-concept</strong></span></code></a><span class="special">,</span> <span class="special">...</span>
+</pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.grammar.types"></a><a class="link" href="grammar.html#contract__.grammar.types" title="Types">Types</a>
+</h3></div></div></div>
+<pre class="programlisting"><a class="link" href="grammar.html#wrapped_type_anchor"><code class="literal"><span class="emphasis"><em>wrapped-type</em></span></code></a>: <a name="wrapped_type_anchor"></a>
+ <a class="link" href="grammar.html#fundamental_type_anchor"><code class="literal"><span class="emphasis"><em>fundamental-type</em></span></code></a> <span class="emphasis"><em>|</em></span> <span class="special">(</span><a class="link" href="grammar.html#fundamental_type_anchor"><code class="literal"><span class="emphasis"><em>fundamental-type</em></span></code></a><span class="special">)</span> <span class="emphasis"><em>|</em></span> <span class="special">(</span><a class="link" href="grammar.html#type_anchor"><code class="literal"><span class="bold"><strong>type</strong></span></code></a><span class="special">)</span>
+
+<a class="link" href="grammar.html#fundamental_type_anchor"><code class="literal"><span class="emphasis"><em>fundamental-type</em></span></code></a>: <a name="fundamental_type_anchor"></a>
+ <a class="link" href="grammar.html#type_qualifier_anchor"><code class="literal"><span class="emphasis"><em>type-qualifier</em></span></code></a><span class="emphasis"><em>*</em></span> <a class="link" href="grammar.html#type_keyword_anchor"><code class="literal"><span class="emphasis"><em>type-keyword</em></span></code></a> <a class="link" href="grammar.html#type_qualifier_anchor"><code class="literal"><span class="emphasis"><em>type-qualifier</em></span></code></a><span class="emphasis"><em>*</em></span>
+<a class="link" href="grammar.html#type_qualifier_anchor"><code class="literal"><span class="emphasis"><em>type-qualifier</em></span></code></a>: <a name="type_qualifier_anchor"></a>
+ <span class="keyword">const</span> <span class="emphasis"><em>|</em></span> <span class="keyword">volatile</span> <span class="emphasis"><em>|</em></span> <span class="keyword">long</span> <span class="emphasis"><em>|</em></span> <span class="keyword">short</span> <span class="emphasis"><em>|</em></span> <span class="keyword">signed</span> <span class="emphasis"><em>|</em></span> <span class="keyword">unsigned</span>
+<a class="link" href="grammar.html#type_keyword_anchor"><code class="literal"><span class="emphasis"><em>type-keyword</em></span></code></a>: <a name="type_keyword_anchor"></a>
+ <span class="keyword">void</span> <span class="emphasis"><em>|</em></span> <span class="keyword">bool</span> <span class="emphasis"><em>|</em></span> <span class="keyword">char</span> <span class="emphasis"><em>|</em></span> <span class="keyword">double</span> <span class="emphasis"><em>|</em></span> <span class="keyword">float</span> <span class="emphasis"><em>|</em></span> <span class="keyword">int</span> <span class="emphasis"><em>|</em></span> <span class="keyword">wchar_t</span> <span class="emphasis"><em>|</em></span> <span class="keyword">size_t</span> <span class="emphasis"><em>|</em></span> <span class="keyword">ptrdiff_t</span>
+</pre>
+<p>
+ This is the syntax used to specify the function result type, the function
+ parameter types, the types of value template parameters, etc. As indicated
+ by the syntax, extra parenthesis around the specified type are always allowed
+ but they are required only for user-defined types <code class="computeroutput"><span class="special">(</span><span class="identifier">mytype</span><span class="special">)</span></code>
+ and types containing non-alphanumeric symbols <code class="computeroutput"><span class="special">(</span><span class="keyword">int</span><span class="special">&)</span></code>
+ while the parenthesis are optional for fundamental types containing no symbol
+ <code class="computeroutput"><span class="keyword">unsigned</span> <span class="keyword">long</span>
+ <span class="keyword">int</span> <span class="keyword">const</span></code>
+ (or equivalently <code class="computeroutput"><span class="special">(</span><span class="keyword">unsigned</span>
+ <span class="keyword">long</span> <span class="keyword">int</span>
+ <span class="keyword">const</span><span class="special">)</span></code>).
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.grammar.function_declarations"></a><a class="link" href="grammar.html#contract__.grammar.function_declarations" title="Function Declarations">Function Declarations</a>
+</h3></div></div></div>
+<pre class="programlisting"><a class="link" href="grammar.html#function_declaration_anchor"><code class="literal"><span class="emphasis"><em>function-declaration</em></span></code></a>: <a name="function_declaration_anchor"></a>
+ <span class="emphasis"><em>[</em></span><span class="keyword">public</span> <span class="emphasis"><em>|</em></span> <span class="keyword">protected</span> <span class="emphasis"><em>|</em></span> <span class="keyword">private</span><span class="emphasis"><em>]</em></span>
+ <span class="emphasis"><em>[</em></span><span class="emphasis"><em>[</em></span><span class="keyword">export</span><span class="emphasis"><em>]</em></span> <span class="emphasis"><em>[</em></span><span class="keyword">template</span><span class="special">(</span> <a class="link" href="grammar.html#template_parameters_anchor"><code class="literal"><span class="emphasis"><em>template-parameters</em></span></code></a> <span class="special">)</span> <span class="emphasis"><em>[</em></span><span class="keyword">requires</span><span class="special">(</span> <a class="link" href="grammar.html#concepts_anchor"><code class="literal"><span class="emphasis"><em>concepts</em></span></code></a> <span class="special">)</span><span class="emphasis"><em>]</em></span><span class="emphasis"><em>]</em></span>
+ <span class="emphasis"><em>[</em></span><span class="keyword">explicit</span><span class="emphasis"><em>]</em></span> <span class="emphasis"><em>[</em></span><span class="keyword">inline</span><span class="emphasis"><em>]</em></span> <span class="emphasis"><em>[</em></span><span class="keyword">extern</span><span class="emphasis"><em>]</em></span> <span class="emphasis"><em>[</em></span><span class="keyword">static</span><span class="emphasis"><em>]</em></span> <span class="emphasis"><em>[</em></span><span class="keyword">virtual</span><span class="emphasis"><em>]</em></span> <span class="emphasis"><em>[</em></span><span class="keyword">friend</span><span class="emphasis"><em>]</em></span>
+ <span class="emphasis"><em>[</em></span><a class="link" href="grammar.html#result_type_anchor"><code class="literal"><span class="emphasis"><em>result-type</em></span></code></a><span class="emphasis"><em>]</em></span> <a class="link" href="grammar.html#function_name_anchor"><code class="literal"><span class="emphasis"><em>function-name</em></span></code></a> <span class="special">(</span> <a class="link" href="grammar.html#function_parameters_anchor"><code class="literal"><span class="emphasis"><em>function-parameters</em></span></code></a> <span class="special">)</span>
+ <span class="emphasis"><em>[</em></span><span class="keyword">requires</span><span class="special">(</span> <a class="link" href="grammar.html#concepts_anchor"><code class="literal"><span class="emphasis"><em>concepts</em></span></code></a> <span class="special">)</span><span class="emphasis"><em>]</em></span>
+ <span class="emphasis"><em>[</em></span><span class="keyword">const</span><span class="emphasis"><em>]</em></span> <span class="emphasis"><em>[</em></span><span class="keyword">volatile</span><span class="emphasis"><em>]</em></span> <span class="emphasis"><em>[</em></span><span class="keyword">override</span> <span class="emphasis"><em>|</em></span> <span class="keyword">new</span><span class="emphasis"><em>]</em></span> <span class="emphasis"><em>[</em></span><span class="keyword">final</span><span class="emphasis"><em>]</em></span>
+ <span class="emphasis"><em>[</em></span><span class="keyword">throw</span><span class="special">(</span> <a class="link" href="grammar.html#exception_specifications_anchor"><code class="literal"><span class="emphasis"><em>exception-specifications</em></span></code></a> <span class="special">)</span><span class="emphasis"><em>]</em></span>
+ <span class="emphasis"><em>[</em></span><span class="keyword">precondition</span><span class="special">(</span> <a class="link" href="grammar.html#assertions_anchor"><code class="literal"><span class="emphasis"><em>assertions</em></span></code></a> <span class="special">)</span><span class="emphasis"><em>]</em></span>
+ <span class="emphasis"><em>[</em></span><span class="keyword">postcondition</span><span class="special">(</span> <a class="link" href="grammar.html#result_oldof_assertions_anchor"><code class="literal"><span class="emphasis"><em>result-oldof-assertions</em></span></code></a> <span class="special">)</span><span class="emphasis"><em>]</em></span>
+ <span class="emphasis"><em>[</em></span><a class="link" href="grammar.html#member_initializers_anchor"><code class="literal"><span class="emphasis"><em>member-initializers</em></span></code></a><span class="emphasis"><em>]</em></span>
+</pre>
+<p>
+ This is the syntax used to declare all functions: Free functions, member
+ functions, constructors, destructors, and operators. The usual constraints
+ of C++ function declarations apply: It is not possible to declare a static
+ virtual member function, only constructors can use the class name as the
+ function name, constructors and destructors have no result type, etc. The
+ <code class="computeroutput"><span class="keyword">static</span></code> specifier can only be
+ used for member functions (because it was deprecated for free functions from
+ C to C++03). The
+ <code class="computeroutput"><span class="keyword">volatile</span></code> specifier must always
+ appear after <code class="computeroutput"><span class="keyword">const</span></code> when they
+ are both specified.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.grammar.result_type"></a><a class="link" href="grammar.html#contract__.grammar.result_type" title="Result Type">Result Type</a>
+</h3></div></div></div>
+<pre class="programlisting"><a class="link" href="grammar.html#result_type_anchor"><code class="literal"><span class="emphasis"><em>result-type</em></span></code></a>: <a name="result_type_anchor"></a>
+ <a class="link" href="grammar.html#wrapped_type_anchor"><code class="literal"><span class="emphasis"><em>wrapped-type</em></span></code></a>
+</pre>
+<p>
+ Note that fundamental types containing no symbol can be specified without
+ extra parenthesis: <code class="computeroutput"><span class="keyword">void</span></code>, <code class="computeroutput"><span class="keyword">bool</span></code>, <code class="computeroutput"><span class="keyword">int</span></code>,
+ <code class="computeroutput"><span class="keyword">unsigned</span> <span class="keyword">long</span>
+ <span class="keyword">const</span></code>, etc.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.grammar.function_and_operator_names"></a><a class="link" href="grammar.html#contract__.grammar.function_and_operator_names" title="Function and Operator Names">Function
+ and Operator Names</a>
+</h3></div></div></div>
+<pre class="programlisting"><a class="link" href="grammar.html#function_name_anchor"><code class="literal"><span class="emphasis"><em>function-name</em></span></code></a>: <a name="function_name_anchor"></a>
+ <span class="special">(</span><a class="link" href="grammar.html#function_identifier_anchor"><code class="literal"><span class="bold"><strong>function-identifier</strong></span></code></a><span class="special">)</span> <span class="emphasis"><em>|</em></span> <span class="special">(</span><a class="link" href="grammar.html#class_name_anchor"><code class="literal"><span class="bold"><strong>class-name</strong></span></code></a><span class="special">)</span> <span class="emphasis"><em>|</em></span> <span class="special">(~</span><a class="link" href="grammar.html#class_name_anchor"><code class="literal"><span class="bold"><strong>class-name</strong></span></code></a><span class="special">)</span> <span class="emphasis"><em>|</em></span> <a class="link" href="grammar.html#operator_name_anchor"><code class="literal"><span class="emphasis"><em>operator-name</em></span></code></a>
+
+<a class="link" href="grammar.html#operator_name_anchor"><code class="literal"><span class="emphasis"><em>operator-name</em></span></code></a>: <a name="operator_name_anchor"></a>
+ <span class="keyword">operator</span><span class="special">(</span><a class="link" href="grammar.html#operator_symbol_anchor"><code class="literal"><span class="bold"><strong>operator-symbol</strong></span></code></a><span class="special">)(</span><a class="link" href="grammar.html#operator_identifier_anchor"><code class="literal"><span class="bold"><strong>operator-identifier</strong></span></code></a><span class="special">)</span> <span class="emphasis"><em>|</em></span> <span class="keyword">operator</span> <a class="link" href="grammar.html#fundamental_type_anchor"><code class="literal"><span class="emphasis"><em>fundamental-type</em></span></code></a> <span class="emphasis"><em>|</em></span>
+ <span class="keyword">operator</span> <span class="keyword">new</span> <span class="emphasis"><em>|</em></span> <span class="keyword">operator</span> <span class="keyword">delete</span> <span class="emphasis"><em>|</em></span> <span class="keyword">operator</span> <span class="keyword">comma</span>
+</pre>
+<p>
+ Names for free functions, member functions, constructors, and destructors
+ are specified as usual but wrapped within parenthesis.
+ </p>
+<p>
+ Operator names are specified wrapping within parenthesis the usual operator
+ symbol followed by an arbitrary but alphanumeric identifier:
+ </p>
+<pre class="programlisting"><span class="keyword">operator</span><span class="special">([])(</span><span class="identifier">at</span><span class="special">)</span>
+<span class="keyword">operator</span><span class="special">(+)(</span><span class="identifier">plus</span><span class="special">)</span>
+<span class="keyword">operator</span><span class="special">(())(</span><span class="identifier">call</span><span class="special">)</span>
+<span class="keyword">operator</span><span class="special">(</span><span class="keyword">new</span><span class="special">[])(</span><span class="identifier">new_array</span><span class="special">)</span>
+<span class="keyword">operator</span><span class="special">(</span><span class="keyword">delete</span><span class="special">[])(</span><span class="identifier">delete_array</span><span class="special">)</span>
+</pre>
+<p>
+ Implicit type conversion operators use the same syntax:
+ </p>
+<pre class="programlisting"><span class="keyword">operator</span><span class="special">(</span><span class="keyword">int</span><span class="special">*)(</span><span class="identifier">int_ptr</span><span class="special">)</span>
+<span class="keyword">operator</span><span class="special">(</span><span class="identifier">mytype</span> <span class="keyword">const</span><span class="special">&)(</span><span class="identifier">mytype_const_ref</span><span class="special">)</span>
+<span class="keyword">operator</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special"><</span><span class="keyword">char</span><span class="special">,</span> <span class="keyword">int</span><span class="special">>)(</span><span class="identifier">std_map</span><span class="special">)</span>
+</pre>
+<p>
+ However, if the type is a fundamental type containing no symbol, the identifier
+ is optional:
+ </p>
+<pre class="programlisting"><span class="keyword">operator</span><span class="special">(</span><span class="keyword">const</span> <span class="keyword">int</span><span class="special">)(</span><span class="identifier">const_int</span><span class="special">)</span> <span class="comment">// Allowed but...</span>
+<span class="keyword">operator</span> <span class="keyword">const</span> <span class="keyword">int</span> <span class="comment">// ... more readable.</span>
+</pre>
+<p>
+ Similarly, the parenthesis and identifier are optional for the <code class="computeroutput"><span class="keyword">new</span></code> and <code class="computeroutput"><span class="keyword">delete</span></code>
+ operators:
+ </p>
+<pre class="programlisting"><span class="keyword">operator</span><span class="special">(</span><span class="keyword">new</span><span class="special">)(</span><span class="identifier">new_ptr</span><span class="special">)</span> <span class="comment">// Allowed but...</span>
+<span class="keyword">operator</span> <span class="keyword">new</span> <span class="comment">// ... more readable.</span>
+
+<span class="keyword">operator</span><span class="special">(</span><span class="keyword">delete</span><span class="special">)(</span><span class="identifier">delete_ptr</span><span class="special">)</span> <span class="comment">// Allowed but...</span>
+<span class="keyword">operator</span> <span class="keyword">delete</span> <span class="comment">// ... more readable.</span>
+</pre>
+<p>
+ Finally, the comma symbol <code class="computeroutput"><span class="special">,</span></code>
+ cannot be used to specify the comma operator <sup>[<a name="contract__.grammar.function_and_operator_names.f0" href="#ftn.contract__.grammar.function_and_operator_names.f0" class="footnote">73</a>]</sup> so the specifier <code class="computeroutput"><span class="keyword">comma</span></code>
+ must always be used to name the comma operator:
+ </p>
+<pre class="programlisting"><span class="keyword">operator</span> <span class="keyword">comma</span> <span class="comment">// OK.</span>
+<span class="keyword">operator</span><span class="special">(,)(</span><span class="keyword">comma</span><span class="special">)</span> <span class="comment">// Error.</span>
+</pre>
+<p>
+ C++ automatically promotes the memory member operators <code class="computeroutput"><span class="keyword">operator</span>
+ <span class="keyword">new</span></code>, <code class="computeroutput"><span class="keyword">operator</span>
+ <span class="keyword">delete</span></code>, <code class="computeroutput"><span class="keyword">operator</span>
+ <span class="keyword">new</span><span class="special">[]</span></code>,
+ and <code class="computeroutput"><span class="keyword">operator</span> <span class="keyword">delete</span><span class="special">[]</span></code> to be static members so the <code class="computeroutput"><span class="keyword">static</span></code> specifier is allowed but optional for
+ these member operators. This library cannot automatically perform such a
+ promotion so the <code class="computeroutput"><span class="keyword">static</span></code> specifier
+ is always required by this library for the memory member operators.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.grammar.exception_specifications"></a><a class="link" href="grammar.html#contract__.grammar.exception_specifications" title="Exception Specifications">Exception
+ Specifications</a>
+</h3></div></div></div>
+<pre class="programlisting"><a class="link" href="grammar.html#exception_specifications_anchor"><code class="literal"><span class="emphasis"><em>exception-specifications</em></span></code></a>: <a name="exception_specifications_anchor"></a>
+ <span class="keyword">void</span> <span class="special">|</span> <a class="link" href="grammar.html#exception_type_anchor"><code class="literal"><span class="bold"><strong>exception-type</strong></span></code></a><span class="special">,</span> <span class="special">...</span>
+</pre>
+<p>
+ Note that the syntax <code class="computeroutput"><span class="keyword">throw</span><span class="special">(</span>
+ <span class="keyword">void</span> <span class="special">)</span></code>
+ is used instead of <code class="computeroutput"><span class="keyword">throw</span><span class="special">(</span>
+ <span class="special">)</span></code> for no-throw specifications.
+ </p>
+<p>
+ Exception specifications apply only to exceptions thrown by the function
+ body and not to exceptions thrown by the contracts themselves (if any) and
+ by the contract checking code generated by this library macros.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.grammar.member_initializers"></a><a class="link" href="grammar.html#contract__.grammar.member_initializers" title="Member Initializers">Member Initializers</a>
+</h3></div></div></div>
+<pre class="programlisting"><a class="link" href="grammar.html#member_initializers_anchor"><code class="literal"><span class="emphasis"><em>member-initializers</em></span></code></a>: <a name="member_initializers_anchor"></a>
+ <span class="emphasis"><em>[</em></span><span class="keyword">try</span><span class="emphasis"><em>]</em></span> <span class="keyword">initialize</span><span class="special">(</span> <a class="link" href="grammar.html#member_initializer_anchor"><code class="literal"><span class="bold"><strong>member-initializer</strong></span></code></a><span class="special">,</span> <span class="special">...</span> <span class="special">)</span>
+ <span class="emphasis"><em>{</em></span><span class="keyword">catch</span><span class="special">(</span><a class="link" href="grammar.html#catch_declaration_anchor"><code class="literal"><span class="bold"><strong>catch-declaration</strong></span></code></a><span class="special">)</span> <span class="special">(</span> <a class="link" href="grammar.html#catch_instructions_anchor"><code class="literal"><span class="bold"><strong>catch-instructions</strong></span></code></a> <span class="special">)</span><span class="emphasis"><em>}*</em></span>
+</pre>
+<p>
+ As indicated by this syntax, it is possible to specify function-try blocks
+ for constructor member initializers:
+ </p>
+<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">vector_error</span> <span class="special">{</span> <span class="special">...</span> <span class="special">};</span>
+
+<span class="identifier">CONTRACT_CONSTRUCTOR</span><span class="special">(</span> <span class="comment">// Constructor with member initializers.</span>
+<span class="keyword">explicit</span> <span class="special">(</span><span class="identifier">vector</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">count</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">count</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span> <span class="special">)</span>
+
+ <span class="keyword">try</span> <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">ptr_</span><span class="special">(</span><span class="keyword">new</span> <span class="identifier">T</span><span class="special">[</span><span class="identifier">count</span><span class="special">])</span> <span class="special">)</span>
+ <span class="keyword">catch</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">bad_alloc</span><span class="special">&</span> <span class="identifier">ex</span><span class="special">)</span> <span class="special">(</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span> <span class="special"><<</span> <span class="string">"not enough memory for "</span> <span class="special"><<</span> <span class="identifier">count</span> <span class="special"><<</span> <span class="string">" elements vector: "</span> <span class="special"><<</span> <span class="identifier">ex</span><span class="special">.</span><span class="identifier">what</span><span class="special">()</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
+ <span class="keyword">throw</span> <span class="identifier">vector_error</span><span class="special">(</span><span class="number">1</span><span class="special">);</span>
+ <span class="special">)</span> <span class="keyword">catch</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">exception</span><span class="special">&</span> <span class="identifier">ex</span><span class="special">)</span> <span class="special">(</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span> <span class="special"><<</span> <span class="string">"error for "</span> <span class="special"><<</span> <span class="identifier">count</span> <span class="special"><<</span> <span class="string">" elements vector: "</span> <span class="special"><<</span> <span class="identifier">ex</span><span class="special">.</span><span class="identifier">what</span><span class="special">()</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
+ <span class="keyword">throw</span> <span class="identifier">vector_error</span><span class="special">(</span><span class="number">2</span><span class="special">);</span>
+ <span class="special">)</span> <span class="keyword">catch</span><span class="special">(...)</span> <span class="special">(</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span> <span class="special"><<</span> <span class="string">"unknown error for "</span> <span class="special"><<</span> <span class="identifier">count</span> <span class="special"><<</span> <span class="string">" elements vector"</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
+ <span class="keyword">throw</span> <span class="identifier">vector_error</span><span class="special">(</span><span class="number">3</span><span class="special">);</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span> <span class="comment">// Above function-try block only applies to exceptions thrown by the body (and not by the contracts).</span>
+ <span class="special">...</span>
+<span class="special">}</span>
+</pre>
+<p>
+ For functions other than constructors and for constructors without member
+ initializers, function-try blocks are programmed outside the macros and around
+ the body definition as usual. As specified by <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a>,
+ function-try blocks apply only to exceptions thrown by the function body
+ and not to exceptions thrown by the contracts themselves (if any) and by
+ the contract checking code generated by the library macros.
+ </p>
+<p>
+ Member initializers (and their function-try blocks) are part of the constructor
+ definition and not of the constructor declaration. However, C++03
+ lack of delegating constructors requires member initializers (and their function-try
+ blocks) to be specified within this library macros and constructors must
+ be defined together with their declarations when they use member initializers.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.grammar.function_parameters"></a><a class="link" href="grammar.html#contract__.grammar.function_parameters" title="Function Parameters">Function Parameters</a>
+</h3></div></div></div>
+<pre class="programlisting"><a class="link" href="grammar.html#function_parameters_anchor"><code class="literal"><span class="emphasis"><em>function-parameters</em></span></code></a>: <a name="function_parameters_anchor"></a>
+ <span class="keyword">void</span> <span class="emphasis"><em>|</em></span>
+ <a class="link" href="grammar.html#positional_function_parameters_anchor"><code class="literal"><span class="emphasis"><em>positional-function-parameters</em></span></code></a> <span class="emphasis"><em>|</em></span>
+ <a class="link" href="grammar.html#named_function_parameters_anchor"><code class="literal"><span class="emphasis"><em>named-function-parameters</em></span></code></a>
+
+<a class="link" href="grammar.html#positional_function_parameters_anchor"><code class="literal"><span class="emphasis"><em>positional-function-parameters</em></span></code></a>: <a name="positional_function_parameters_anchor"></a>
+ <a class="link" href="grammar.html#positional_function_parameter_anchor"><code class="literal"><span class="emphasis"><em>positional-function-parameter</em></span></code></a><span class="special">,</span> <span class="special">...</span>
+<a class="link" href="grammar.html#positional_function_parameter_anchor"><code class="literal"><span class="emphasis"><em>positional-function-parameter</em></span></code></a>: <a name="positional_function_parameter_anchor"></a>
+ <span class="emphasis"><em>[</em></span><span class="keyword">auto</span> <span class="emphasis"><em>|</em></span> <span class="keyword">register</span><span class="emphasis"><em>]</em></span> <a class="link" href="grammar.html#wrapped_type_anchor"><code class="literal"><span class="emphasis"><em>wrapped-type</em></span></code></a> <a class="link" href="grammar.html#parameter_name_anchor"><code class="literal"><span class="bold"><strong>parameter-name</strong></span></code></a>
+ <span class="emphasis"><em>[</em></span><span class="special">,</span> <span class="keyword">default</span> <a class="link" href="grammar.html#parameter_default_anchor"><code class="literal"><span class="bold"><strong>parameter-default</strong></span></code></a><span class="emphasis"><em>]</em></span>
+
+<a class="link" href="grammar.html#named_function_parameters_anchor"><code class="literal"><span class="emphasis"><em>named-function-parameters</em></span></code></a>: <a name="named_function_parameters_anchor"></a>
+ <span class="emphasis"><em>[</em></span><span class="keyword">using</span> <span class="keyword">namespace</span> <a class="link" href="grammar.html#named_parameter_identifier_namespace_anchor"><code class="literal"><span class="bold"><strong>named-parameter-identifier-namespace</strong></span></code></a><span class="special">,</span><span class="emphasis"><em>]</em></span>
+ <a class="link" href="grammar.html#named_function_parameter_anchor"><code class="literal"><span class="emphasis"><em>named-function-parameter</em></span></code></a><span class="special">,</span> <span class="special">...</span>
+<a class="link" href="grammar.html#named_function_parameter_anchor"><code class="literal"><span class="emphasis"><em>named-function-parameter</em></span></code></a>: <a name="named_function_parameter_anchor"></a>
+ <span class="emphasis"><em>[</em></span><span class="keyword">deduce</span><span class="emphasis"><em>]</em></span> <span class="emphasis"><em>{</em></span><span class="keyword">in</span> <span class="emphasis"><em>|</em></span> <span class="keyword">out</span> <span class="emphasis"><em>|</em></span> <span class="keyword">in</span> <span class="keyword">out</span><span class="emphasis"><em>}</em></span>
+ <span class="emphasis"><em>{</em></span><a class="link" href="grammar.html#wrapped_type_anchor"><code class="literal"><span class="emphasis"><em>wrapped-type</em></span></code></a> <span class="emphasis"><em>|</em></span> <span class="keyword">auto</span> <span class="emphasis"><em>|</em></span> <span class="keyword">requires</span><span class="special">(</span><a class="link" href="grammar.html#unary_boolean_metafunction_anchor"><code class="literal"><span class="bold"><strong>unary-boolean-metafunction</strong></span></code></a><span class="special">)</span><span class="emphasis"><em>}</em></span> <a class="link" href="grammar.html#parameter_name_anchor"><code class="literal"><span class="bold"><strong>parameter-name</strong></span></code></a>
+ <span class="emphasis"><em>[</em></span><span class="special">,</span> <span class="keyword">default</span> <a class="link" href="grammar.html#parameter_default_anchor"><code class="literal"><span class="bold"><strong>parameter-default</strong></span></code></a><span class="emphasis"><em>]</em></span>
+</pre>
+<p>
+ Note that the positional parameter storage classifier <code class="computeroutput"><span class="keyword">auto</span></code>
+ is supported by this library because it is part of C++03
+ (but the <code class="computeroutput"><span class="keyword">auto</span></code> keyword changed
+ meaning in C++11
+ so use it with the usual care when writing code portable to C++11).
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.grammar.result_and_old_values"></a><a class="link" href="grammar.html#contract__.grammar.result_and_old_values" title="Result and Old Values">Result and
+ Old Values</a>
+</h3></div></div></div>
+<pre class="programlisting"><a class="link" href="grammar.html#result_oldof_assertions_anchor"><code class="literal"><span class="emphasis"><em>result-oldof-assertions</em></span></code></a>: <a name="result_oldof_assertions_anchor"></a>
+ <span class="emphasis"><em>[</em></span><span class="keyword">auto</span> <a class="link" href="grammar.html#variable_name_anchor"><code class="literal"><span class="bold"><strong>variable-name</strong></span></code></a> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span><span class="emphasis"><em>]</em></span>
+ <span class="emphasis"><em>[</em></span><a class="link" href="grammar.html#oldof_declaration_anchor"><code class="literal"><span class="emphasis"><em>oldof-declaration</em></span></code></a><span class="special">,</span> <span class="special">...</span><span class="emphasis"><em>]</em></span>
+ <a class="link" href="grammar.html#assertion_anchor"><code class="literal"><span class="emphasis"><em>assertion</em></span></code></a><span class="special">,</span> <span class="special">...</span>
+
+<a class="link" href="grammar.html#oldof_declaration_anchor"><code class="literal"><span class="emphasis"><em>oldof-declaration</em></span></code></a>: <a name="oldof_declaration_anchor"></a>
+ <span class="emphasis"><em>{</em></span><span class="keyword">auto</span> <span class="emphasis"><em>|</em></span> <a class="link" href="grammar.html#wrapped_type_anchor"><code class="literal"><span class="emphasis"><em>wrapped-type</em></span></code></a><span class="emphasis"><em>}</em></span> <a class="link" href="grammar.html#variable_name_anchor"><code class="literal"><span class="bold"><strong>variable-name</strong></span></code></a> <span class="special">=</span> <code class="computeroutput"><a class="link" href="../CONTRACT_OLDOF.html" title="Macro CONTRACT_OLDOF">CONTRACT_OLDOF</a></code> <a class="link" href="grammar.html#oldof_expression_anchor"><code class="literal"><span class="bold"><strong>oldof-expression</strong></span></code></a>
+</pre>
+<p>
+ If present, result and old-of declarations should appear at the very beginning
+ of the postconditions because they will always be visible to all assertions
+ plus these declarations cannot be nested (within select-assertions, etc).
+ </p>
+<p>
+ The result declaration type is always <code class="computeroutput"><span class="keyword">auto</span></code>
+ because the function result type is know and already specified by the function
+ declaration (so no result type deduction is ever needed). The old-of declaration
+ type is automatically deduced (using Boost.Typeof)
+ when its type is specified <code class="computeroutput"><span class="keyword">auto</span></code>
+ instead of <a class="link" href="grammar.html#wrapped_type_anchor"><code class="literal"><span class="emphasis"><em>wrapped-type</em></span></code></a>.
+ The macro <code class="computeroutput"><span class="identifier">CONTRACT_OLDOF</span></code>
+ does not require but allows parenthesis around the value expression <a class="link" href="grammar.html#oldof_expression_anchor"><code class="literal"><span class="bold"><strong>oldof-expression</strong></span></code></a>
+ (this is as specified for the <code class="computeroutput"><span class="keyword">oldof</span></code>
+ operator in <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a> and similar to the
+ <code class="computeroutput"><span class="keyword">sizeof</span></code> operator which requires
+ parenthesis when applied to a type expression <code class="computeroutput"><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">size_type</span><span class="special">)</span></code> but not when applied to a value expression
+ <code class="computeroutput"><span class="keyword">sizeof</span> <span class="identifier">size</span><span class="special">()</span></code>). For example, all the followings are valid:
+ </p>
+<pre class="programlisting"><span class="keyword">auto</span> <span class="identifier">old_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">size</span><span class="special">()</span>
+<span class="keyword">auto</span> <span class="identifier">old_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">size</span><span class="special">())</span> <span class="comment">// Extra parenthesis around expression (optional).</span>
+<span class="special">(</span><span class="identifier">size_type</span><span class="special">)</span> <span class="identifier">old_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">size</span><span class="special">()</span> <span class="comment">// Do not use Boost.Typeof.</span>
+<span class="special">(</span><span class="identifier">size_type</span><span class="special">)</span> <span class="identifier">old_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">size</span><span class="special">())</span> <span class="comment">// No Boost.Typeof and extra parenthesis.</span>
+</pre>
+<p>
+ If an old-of copy is performed on a type that is not <a class="link" href="advanced_topics.html#contract__.advanced_topics.old_and_result_value_copies" title="Old and Result Value Copies"><code class="literal">ConstantCopyConstructible</code></a>,
+ the old-of declaration itself will not fail compilation but it will produce
+ an old variable that will cause a compiler-error as soon as it is used in
+ an assertion (unless the assertion specifies a requirement using a properly
+ specialized <code class="computeroutput"><a class="link" href="../contract/has_oldof.html" title="Struct template has_oldof">contract::has_oldof</a></code>
+ trait).
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.grammar.class_invariants"></a><a class="link" href="grammar.html#contract__.grammar.class_invariants" title="Class Invariants">Class Invariants</a>
+</h3></div></div></div>
+<pre class="programlisting"><a class="link" href="grammar.html#class_invariants_anchor"><code class="literal"><span class="emphasis"><em>class-invariants</em></span></code></a>: <a name="class_invariants_anchor"></a>
+ <span class="keyword">void</span> <span class="emphasis"><em>|</em></span> <a class="link" href="grammar.html#class_invariant_anchor"><code class="literal"><span class="emphasis"><em>class-invariant</em></span></code></a><span class="special">,</span> <span class="special">...</span>
+
+<a class="link" href="grammar.html#class_invariant_anchor"><code class="literal"><span class="emphasis"><em>class-invariant</em></span></code></a>: <a name="class_invariant_anchor"></a>
+ <a class="link" href="grammar.html#assertion_anchor"><code class="literal"><span class="emphasis"><em>assertion</em></span></code></a> <span class="emphasis"><em>|</em></span>
+ <span class="keyword">static</span> <span class="keyword">class</span><span class="special">(</span> <span class="keyword">void</span> <span class="emphasis"><em>|</em></span> <a class="link" href="grammar.html#assertion_anchor"><code class="literal"><span class="emphasis"><em>assertion</em></span></code></a><span class="special">,</span> <span class="special">...</span> <span class="special">)</span> <span class="emphasis"><em>|</em></span>
+ <span class="keyword">volatile</span> <span class="keyword">class</span><span class="special">(</span> <span class="keyword">void</span> <span class="emphasis"><em>|</em></span> <a class="link" href="grammar.html#assertion_anchor"><code class="literal"><span class="emphasis"><em>assertion</em></span></code></a><span class="special">,</span> <span class="special">...</span> <span class="special">)</span>
+</pre>
+<p>
+ Volatile class invariants are assumed to have the same assertions as non-volatile
+ class invariants unless they are explicitly specified. Static class invariants
+ are assumed to assert nothing unless they are explicitly specified.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.grammar.assertions"></a><a class="link" href="grammar.html#contract__.grammar.assertions" title="Assertions">Assertions</a>
+</h3></div></div></div>
+<pre class="programlisting"><a class="link" href="grammar.html#assertions_anchor"><code class="literal"><span class="emphasis"><em>assertions</em></span></code></a>: <a name="assertions_anchor"></a>
+ <a class="link" href="grammar.html#assertion_anchor"><code class="literal"><span class="emphasis"><em>assertion</em></span></code></a><span class="special">,</span> <span class="special">...</span>
+<a class="link" href="grammar.html#assertion_anchor"><code class="literal"><span class="emphasis"><em>assertion</em></span></code></a>: <a name="assertion_anchor"></a>
+ <span class="keyword">using</span> <a class="link" href="grammar.html#using_directive_anchor"><code class="literal"><span class="bold"><strong>using-directive</strong></span></code></a> <span class="emphasis"><em>|</em></span>
+ <span class="keyword">namespace</span> <a class="link" href="grammar.html#namespace_alias_anchor"><code class="literal"><span class="bold"><strong>namespace-alias</strong></span></code></a> <span class="emphasis"><em>|</em></span>
+ <span class="keyword">typedef</span> <a class="link" href="grammar.html#typedef_type_anchor"><code class="literal"><span class="bold"><strong>typedef-type</strong></span></code></a> <a class="link" href="grammar.html#new_type_name_anchor"><code class="literal"><span class="bold"><strong>new-type-name</strong></span></code></a> <span class="emphasis"><em>|</em></span>
+ <a class="link" href="grammar.html#assertion_condition_anchor"><code class="literal"><span class="emphasis"><em>assertion-condition</em></span></code></a>
+
+<a class="link" href="grammar.html#assertion_condition_anchor"><code class="literal"><span class="emphasis"><em>assertion-condition</em></span></code></a>: <a name="assertion_condition_anchor"></a>
+ <a class="link" href="grammar.html#assertion_expression_anchor"><code class="literal"><span class="emphasis"><em>assertion-expression</em></span></code></a> <span class="emphasis"><em>|</em></span>
+ <a class="link" href="grammar.html#select_assertion_anchor"><code class="literal"><span class="emphasis"><em>select-assertion</em></span></code></a>
+<a class="link" href="grammar.html#assertion_expression_anchor"><code class="literal"><span class="emphasis"><em>assertion-expression</em></span></code></a>: <a name="assertion_expression_anchor"></a>
+ <a class="link" href="grammar.html#boolean_condition_anchor"><code class="literal"><span class="emphasis"><em>boolean-condition</em></span></code></a> <span class="emphasis"><em>|</em></span>
+ <span class="keyword">static_assert</span><span class="special">(</span><a class="link" href="grammar.html#constant_boolean_expression_anchor"><code class="literal"><span class="bold"><strong>constant-boolean-expression</strong></span></code></a><span class="special">,</span> <a class="link" href="grammar.html#constant_string_literal_anchor"><code class="literal"><span class="bold"><strong>constant-string-literal</strong></span></code></a><span class="special">)</span>
+ <span class="emphasis"><em>[</em></span><span class="special">,</span> <span class="keyword">requires</span> <a class="link" href="grammar.html#constant_boolean_expression_anchor"><code class="literal"><span class="bold"><strong>constant-boolean-expression</strong></span></code></a><span class="emphasis"><em>]</em></span>
+<a class="link" href="grammar.html#select_assertion_anchor"><code class="literal"><span class="emphasis"><em>select-assertion</em></span></code></a>: <a name="select_assertion_anchor"></a>
+ <span class="keyword">if</span><span class="special">(</span><a class="link" href="grammar.html#boolean_condition_anchor"><code class="literal"><span class="emphasis"><em>boolean-condition</em></span></code></a><span class="special">)</span> <span class="special">(</span> <a class="link" href="grammar.html#assertion_condition_anchor"><code class="literal"><span class="emphasis"><em>assertion-condition</em></span></code></a><span class="special">,</span> <span class="special">...</span> <span class="special">)</span>
+ <span class="emphasis"><em>[</em></span><span class="keyword">else</span> <span class="special">(</span> <a class="link" href="grammar.html#assertion_condition_anchor"><code class="literal"><span class="emphasis"><em>assertion-condition</em></span></code></a><span class="special">,</span> <span class="special">...</span> <span class="special">)</span><span class="emphasis"><em>]</em></span>
+
+<a class="link" href="grammar.html#boolean_condition_anchor"><code class="literal"><span class="emphasis"><em>boolean-condition</em></span></code></a>: <a name="boolean_condition_anchor"></a>
+ <a class="link" href="grammar.html#boolean_expression_anchor"><code class="literal"><span class="bold"><strong>boolean-expression</strong></span></code></a> <span class="emphasis"><em>|</em></span>
+ <span class="keyword">const</span><span class="special">(</span> <a class="link" href="grammar.html#inscope_variables_anchor"><code class="literal"><span class="emphasis"><em>inscope-variables</em></span></code></a> <span class="special">)</span> <a class="link" href="grammar.html#boolean_expression_using_inscope_variables_anchor"><code class="literal"><span class="bold"><strong>boolean-expression-using-inscope-variables</strong></span></code></a>
+<a class="link" href="grammar.html#inscope_variables_anchor"><code class="literal"><span class="emphasis"><em>inscope-variables</em></span></code></a>: <a name="inscope_variables_anchor"></a>
+ <span class="emphasis"><em>[</em></span><a class="link" href="grammar.html#wrapped_type_anchor"><code class="literal"><span class="emphasis"><em>wrapped-type</em></span></code></a><span class="emphasis"><em>]</em></span> <a class="link" href="grammar.html#inscope_variable_anchor"><code class="literal"><span class="bold"><strong>inscope-variable</strong></span></code></a><span class="special">,</span> <span class="special">...</span>
+</pre>
+<p>
+ Some basic name manipulations are allowed at the local scope where the assertions
+ are being declared in case they are ever needed to simplify the assertion
+ expressions. Specifically, using-directives, namespace-aliases, and type-definitions
+ are allowed (these will always affect all assertions within the given preconditions,
+ postconditions, etc so it is recommended to always use these statement at
+ the very beginning before the actual assertion conditions). Note that these
+ name manipulations have no effect on the program run-time state and therefore
+ they do not compromise the contract constant-correctness requirement.
+ </p>
+<p>
+ As indicated by the grammar above, it is not possible to specify assertion
+ requirements (using <code class="computeroutput"><span class="keyword">requires</span></code>)
+ for the entire select assertion if-then-else expression. Eventual assertion
+ requirements must be specified for the single assertions within the select
+ assertion if-then-else statement and they will never disable compilation
+ and checking of the select assertion if-condition. Programmers can use the
+ ternary operator <code class="computeroutput"><span class="special">?:</span></code> instead
+ of a select assertion if they need to specify a guarded assertion with a
+ condition that is also disabled by the assertion requirements:
+ </p>
+<pre class="programlisting"><span class="emphasis"><em>boolean-guard</em></span> <span class="special">?</span> <a class="link" href="grammar.html#boolean_expression_anchor"><code class="literal"><span class="bold"><strong>boolean-expression</strong></span></code></a> <span class="special">:</span> <span class="keyword">true</span><span class="special">,</span> <span class="keyword">requires</span> <a class="link" href="grammar.html#constant_boolean_expression_anchor"><code class="literal"><span class="bold"><strong>constant-boolean-expression</strong></span></code></a>
+</pre>
+<p>
+ Constant expressions <code class="computeroutput"><span class="keyword">const</span><span class="special">(</span>
+ <span class="special">...</span> <span class="special">)</span> </code><code class="literal"><span class="emphasis"><em>expression</em></span></code>
+ can be used to assert conditions and to check the select assertion if-condition
+ so to fully enforce the assertion constant-correctness requirement. However,
+ function arguments, result value, old-of values, and the object <code class="computeroutput"><span class="keyword">this</span></code> are automatically made constant by this
+ library so constant expressions only need to be used to assert conditions
+ on global variables, static variables, etc. The type of the in-scope variable
+ <a class="link" href="grammar.html#inscope_variable_anchor"><code class="literal"><span class="bold"><strong>inscope-variable</strong></span></code></a>
+ is optional and it is automatically deduced using Boost.Typeof
+ when it is not specified.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.grammar.loop_variants"></a><a class="link" href="grammar.html#contract__.grammar.loop_variants" title="Loop Variants">Loop Variants</a>
+</h3></div></div></div>
+<pre class="programlisting"><a class="link" href="grammar.html#loop_variant_anchor"><code class="literal"><span class="emphasis"><em>loop-variant</em></span></code></a>: <a name="loop_variant_anchor"></a>
+ <a class="link" href="grammar.html#natural_expression_anchor"><code class="literal"><span class="bold"><strong>natural-expression</strong></span></code></a> <span class="emphasis"><em>|</em></span>
+ <span class="keyword">const</span><span class="special">(</span> <a class="link" href="grammar.html#inscope_variables_anchor"><code class="literal"><span class="emphasis"><em>inscope-variables</em></span></code></a> <span class="special">)</span> <a class="link" href="grammar.html#natural_expression_using_inscope_variables_anchor"><code class="literal"><span class="bold"><strong>natural-expression-using-inscope-variables</strong></span></code></a>
+</pre>
+<p>
+ A loop variant must specify a non-negative integral expression that monotonically
+ decreases at each subsequent loop iteration (the library will automatically
+ check these two conditions at each loop iteration and terminate the loop
+ if they are not met by calling the loop variant broken handler). The loop
+ variant can be specified using a constant-expression <code class="computeroutput"><span class="keyword">const</span><span class="special">(</span> <span class="special">...</span> <span class="special">)</span>
+ </code><code class="literal"><span class="emphasis"><em>expression</em></span></code> so to fully enforce
+ the contract constant-correctness requirement.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.grammar.named_parameter_declarations"></a><a class="link" href="grammar.html#contract__.grammar.named_parameter_declarations" title="Named Parameter Declarations">Named
+ Parameter Declarations</a>
+</h3></div></div></div>
+<pre class="programlisting"><a class="link" href="grammar.html#named_parameter_declaration_anchor"><code class="literal"><span class="emphasis"><em>named-parameter-declaration</em></span></code></a>: <a name="named_parameter_declaration_anchor"></a>
+ <span class="emphasis"><em>[</em></span><span class="keyword">namespace</span><span class="special">(</span><a class="link" href="grammar.html#named_parameter_identifier_namespace_anchor"><code class="literal"><span class="bold"><strong>named-parameter-identifier-namespace</strong></span></code></a><span class="special">)</span><span class="emphasis"><em>]</em></span>
+ <span class="emphasis"><em>[</em></span><span class="special">(</span><a class="link" href="grammar.html#named_argument_identifier_anchor"><code class="literal"><span class="bold"><strong>named-argument-identifier</strong></span></code></a><span class="special">)</span><span class="emphasis"><em>]</em></span> <a class="link" href="grammar.html#parameter_name_anchor"><code class="literal"><span class="bold"><strong>parameter-name</strong></span></code></a>
+</pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.grammar.terminals"></a><a class="link" href="grammar.html#contract__.grammar.terminals" title="Terminals">Terminals</a>
+</h3></div></div></div>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>
+ <p>
+ Terminal
+ </p>
+ </th>
+<th>
+ <p>
+ Description
+ </p>
+ </th>
+<th>
+ <p>
+ If terminal contains unwrapped commas or leading symbols
+ </p>
+ </th>
+</tr></thead>
+<tbody>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#boolean_expression_anchor"><code class="literal"><span class="bold"><strong>boolean-expression</strong></span></code></a><a name="boolean_expression_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ A boolean expression: <code class="computeroutput"><span class="identifier">x</span>
+ <span class="special">==</span> <span class="number">1</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Wrap value within parenthesis: <code class="computeroutput"><span class="special">(</span><span class="identifier">vey_sizeof</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span>
+ <span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span><span class="special">)</span></code>.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#boolean_expression_using_inscope_variables_anchor"><code class="literal"><span class="bold"><strong>boolean-expression-using-inscope-variables</strong></span></code></a><a name="boolean_expression_using_inscope_variables_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ A boolean expression that only uses in-scope variables captured
+ as constants by a constant expression <code class="computeroutput"><span class="keyword">const</span><span class="special">(</span> <span class="special">...</span>
+ <span class="special">)</span> </code><code class="literal"><span class="emphasis"><em>expression</em></span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Wrap value within parenthesis: <code class="computeroutput"><span class="special">(</span><span class="identifier">key_sizeof</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span>
+ <span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span> <span class="special">+</span>
+ <span class="identifier">x</span><span class="special">)</span></code>.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#boost_concept_anchor"><code class="literal"><span class="bold"><strong>boost-concept</strong></span></code></a><a name="boost_concept_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ A concept class defined using Boost.ConceptCheck:
+ <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">CopyConstructible</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Wrap type within parenthesis: <code class="computeroutput"><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">Convertible</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span>
+ <span class="keyword">int</span><span class="special">>)</span></code>.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#catch_declaration_anchor"><code class="literal"><span class="bold"><strong>catch-declaration</strong></span></code></a><a name="catch_declaration_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ The declaration of an exception for a <code class="computeroutput"><span class="keyword">catch</span></code>
+ statement: <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">runtime_error</span><span class="special">&</span> <span class="identifier">error</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Wrap type using Boost.Utility/IdentityType:
+ <code class="computeroutput"><span class="identifier">BOOST_IDENTITY_TYPE</span><span class="special">((</span><span class="identifier">map</span><span class="special"><</span><span class="keyword">char</span><span class="special">,</span> <span class="keyword">int</span><span class="special">>::</span><span class="identifier">exception</span><span class="special">&))</span> <span class="identifier">error</span></code>.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#catch_instructions_anchor"><code class="literal"><span class="bold"><strong>catch-instructions</strong></span></code></a><a name="catch_instructions_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ The instructions of a <code class="computeroutput"><span class="keyword">catch</span></code>
+ statement terminated by semicolons <code class="computeroutput"><span class="special">;</span></code>:
+ <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span>
+ <span class="string">"error"</span> <span class="special"><<</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span>
+ <span class="identifier">exit</span><span class="special">(</span><span class="number">255</span><span class="special">);</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Wrap types using Boost.Utility/IdentityType
+ and values within parenthesis: <code class="computeroutput"><span class="keyword">typedef</span>
+ <span class="identifier">BOOST_UTILITY_TYPE</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special"><</span><span class="keyword">char</span><span class="special">,</span>
+ <span class="keyword">int</span><span class="special">>)</span>
+ <span class="identifier">mtype</span><span class="special">;</span>
+ <span class="special">(</span><span class="identifier">mtype</span>
+ <span class="identifier">m</span><span class="special">,</span>
+ <span class="identifier">m</span><span class="special">[</span><span class="char">'a'</span><span class="special">]</span> <span class="special">=</span> <span class="number">1</span><span class="special">);</span></code>.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#class_name_anchor"><code class="literal"><span class="bold"><strong>class-name</strong></span></code></a><a name="class_name_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ The class name: <code class="computeroutput"><span class="identifier">myclass</span></code>.
+ For class templates this must not include the template instantiation
+ parameters: <code class="computeroutput"><span class="identifier">vector</span></code>.
+ (For non-template classes, the class type and name are the same.)
+ </p>
+ </td>
+<td>
+ <p>
+ Never the case.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#class_type_anchor"><code class="literal"><span class="bold"><strong>class-type</strong></span></code></a><a name="class_type_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ The class type, for class templates this must include the template
+ instantiation parameters: <code class="computeroutput"><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Wrap type within parenthesis: <code class="computeroutput"><span class="special">(</span><span class="identifier">map</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span>
+ <span class="identifier">T</span><span class="special">>)</span></code>.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#constant_boolean_expression_anchor"><code class="literal"><span class="bold"><strong>constant-boolean-expression</strong></span></code></a><a name="constant_boolean_expression_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ A compile-time constant boolean expression: <code class="computeroutput"><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="special">>=</span>
+ <span class="keyword">sizeof</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Wrap value within parenthesis: <code class="computeroutput"><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_convertible</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span>
+ <span class="keyword">int</span><span class="special">>::</span><span class="identifier">value</span><span class="special">)</span></code>.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#constant_string_literal_anchor"><code class="literal"><span class="bold"><strong>constant-string-literal</strong></span></code></a><a name="constant_string_literal_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ A compile-time constant string literal: <code class="computeroutput"><span class="string">"abc"</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Do nothing: <code class="computeroutput"><span class="string">"abc"</span></code>.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#exception_type_anchor"><code class="literal"><span class="bold"><strong>exception-type</strong></span></code></a><a name="exception_type_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ A type: <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">exception</span></code>, <code class="computeroutput"><span class="keyword">int</span></code>,
+ <code class="computeroutput"><span class="identifier">mytype</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Wrap type within parenthesis: <code class="computeroutput"><span class="special">(</span><span class="identifier">map</span><span class="special"><</span><span class="keyword">char</span><span class="special">,</span>
+ <span class="keyword">int</span><span class="special">>::</span><span class="identifier">exception</span><span class="special">)</span></code>.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#function_identifier_anchor"><code class="literal"><span class="bold"><strong>function-identifier</strong></span></code></a><a name="function_identifier_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ A valid function name identifier (C++ requires it to be alphanumeric):
+ <code class="computeroutput"><span class="identifier">f</span></code>, <code class="computeroutput"><span class="identifier">push_back</span></code>, <code class="computeroutput"><span class="identifier">myfunc</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Never the case.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#inscope_variable_anchor"><code class="literal"><span class="bold"><strong>inscope-variable</strong></span></code></a><a name="inscope_variable_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ A variable in-scope.
+ </p>
+ </td>
+<td>
+ <p>
+ Never the case.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#loop_declaration_anchor"><code class="literal"><span class="bold"><strong>loop-declaration</strong></span></code></a><a name="loop_declaration_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ A loop declaration: <code class="computeroutput"><span class="keyword">for</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span>
+ <span class="number">0</span><span class="special">;</span>
+ <span class="identifier">i</span> <span class="special"><</span>
+ <span class="number">10</span><span class="special">;</span>
+ <span class="special">++</span><span class="identifier">i</span><span class="special">)</span></code>, <code class="computeroutput"><span class="keyword">while</span><span class="special">(</span><span class="identifier">i</span>
+ <span class="special"><</span> <span class="number">10</span><span class="special">)</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Never the case.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#member_initializer_anchor"><code class="literal"><span class="bold"><strong>member-initializer</strong></span></code></a><a name="member_initializer_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ A member initialization expression: <code class="computeroutput"><span class="identifier">vector_</span><span class="special">(</span><span class="identifier">count</span><span class="special">)</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Wrap object initializations within parenthesis: <code class="computeroutput"><span class="special">(</span><span class="identifier">base_map</span><span class="special"><</span><span class="keyword">char</span><span class="special">,</span>
+ <span class="keyword">int</span><span class="special">>())</span></code>.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#named_argument_identifier_anchor"><code class="literal"><span class="bold"><strong>named-argument-identifier</strong></span></code></a><a name="named_argument_identifier_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ The argument name to use at the calling site to pass named and
+ deduced parameter values: <code class="computeroutput"><span class="identifier">value_arg</span></code>,
+ <code class="computeroutput"><span class="identifier">NumberArg</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Never the case.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#named_parameter_identifier_namespace_anchor"><code class="literal"><span class="bold"><strong>named-parameter-identifier-namespace</strong></span></code></a><a name="named_parameter_identifier_namespace_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ The internal namespace for named and deduced parameter identifiers:
+ <code class="computeroutput"><span class="identifier">params</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Never the case.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#namespace_alias_anchor"><code class="literal"><span class="bold"><strong>namespace-alias</strong></span></code></a><a name="namespace_alias_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ The argument to pass to namespace aliasing: <code class="computeroutput"><span class="identifier">mpl</span>
+ <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Never the case.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#natural_expression_anchor"><code class="literal"><span class="bold"><strong>natural-expression</strong></span></code></a><a name="natural_expression_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ A natural (i.e., non-negative integral) expression: <code class="computeroutput"><span class="number">2</span> <span class="special">-</span> <span class="number">1</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Wrap value within parenthesis: <code class="computeroutput"><span class="special">(</span><span class="identifier">key_sizeof</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span>
+ <span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span><span class="special">)</span></code>.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#natural_expression_using_inscope_variables_anchor"><code class="literal"><span class="bold"><strong>natural-expression-using-inscope-variables</strong></span></code></a><a name="natural_expression_using_inscope_variables_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ A natural (i.e., non-negative integral) expression that only uses
+ in-scope variables captured as constant by a constant-expression:
+ <code class="computeroutput"><span class="identifier">x</span> <span class="special">+</span>
+ <span class="number">10</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Wrap value within parenthesis: <code class="computeroutput"><span class="special">(</span><span class="identifier">key_sizeof</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span>
+ <span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span> <span class="special">+</span>
+ <span class="identifier">x</span><span class="special">)</span></code>.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#new_type_name_anchor"><code class="literal"><span class="bold"><strong>new-type-name</strong></span></code></a><a name="new_type_name_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ A new type name for <code class="computeroutput"><span class="keyword">typedef</span></code>
+ statement: <code class="computeroutput"><span class="identifier">myint</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Never the case.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#oldof_expression_anchor"><code class="literal"><span class="bold"><strong>oldof-expression</strong></span></code></a><a name="oldof_expression_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ A expression of type <a class="link" href="advanced_topics.html#contract__.advanced_topics.old_and_result_value_copies" title="Old and Result Value Copies"><code class="literal">ConstantCopyConstructible</code></a>
+ to pass to the <code class="computeroutput"><a class="link" href="../CONTRACT_OLDOF.html" title="Macro CONTRACT_OLDOF">CONTRACT_OLDOF</a></code>
+ macro: <code class="computeroutput"><span class="identifier">value</span></code>,
+ <code class="computeroutput"><span class="identifier">size</span><span class="special">()</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Wrap value within parenthesis: <code class="computeroutput"><span class="special">(</span><span class="identifier">x</span><span class="special">,</span>
+ <span class="identifier">y</span><span class="special">)</span></code>.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#operator_identifier_anchor"><code class="literal"><span class="bold"><strong>operator-identifier</strong></span></code></a><a name="operator_identifier_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ An arbitrary but alphanumeric identifier: <code class="computeroutput"><span class="identifier">equal</span></code>,
+ <code class="computeroutput"><span class="identifier">less</span></code>, <code class="computeroutput"><span class="identifier">call</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Never the case.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#operator_symbol_anchor"><code class="literal"><span class="bold"><strong>operator-symbol</strong></span></code></a><a name="operator_symbol_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ The usual operator symbols: <code class="computeroutput"><span class="special">==</span></code>,
+ <code class="computeroutput"><span class="special"><=</span></code>, <code class="computeroutput"><span class="special">()</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Do nothing: <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special"><</span><span class="keyword">char</span><span class="special">,</span> <span class="keyword">int</span><span class="special">></span></code>.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#parameter_default_anchor"><code class="literal"><span class="bold"><strong>parameter-default</strong></span></code></a><a name="parameter_default_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ A function or template parameter default value (either a value,
+ a type, or a template depending on the kind of parameter): <code class="computeroutput"><span class="number">123</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Wrap value within parenthesis: <code class="computeroutput"><span class="special">(</span><span class="string">"abc"</span><span class="special">)</span></code>,
+ <code class="computeroutput"><span class="special">(</span><span class="char">'a'</span><span class="special">)</span></code>, <code class="computeroutput"><span class="special">(-</span><span class="number">123</span><span class="special">)</span></code>,
+ <code class="computeroutput"><span class="special">(</span><span class="number">1.23</span><span class="special">)</span></code>.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#parameter_name_anchor"><code class="literal"><span class="bold"><strong>parameter-name</strong></span></code></a><a name="parameter_name_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ A function or template parameter name: <code class="computeroutput"><span class="identifier">value</span></code>,
+ <code class="computeroutput"><span class="identifier">T</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Never the case.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#template_parameter_anchor"><code class="literal"><span class="bold"><strong>template-parameter</strong></span></code></a><a name="template_parameter_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ A usual C++ type template parameter, value template parameter,
+ or template template parameter): <code class="computeroutput"><span class="keyword">typename</span>
+ <span class="identifier">T</span></code>, <code class="computeroutput"><span class="keyword">class</span>
+ <span class="identifier">U</span></code>, <code class="computeroutput"><span class="keyword">int</span>
+ <span class="identifier">Number</span></code>, <code class="computeroutput"><span class="identifier">T</span> <span class="identifier">Value</span></code>,
+ <code class="computeroutput"><span class="keyword">template</span><span class="special"><</span>
+ <span class="keyword">typename</span> <span class="identifier">X</span><span class="special">,</span> <span class="keyword">class</span>
+ <span class="identifier">Y</span> <span class="special">></span>
+ <span class="keyword">class</span> <span class="identifier">Template</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Do nothing: <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span> <span class="identifier">T</span><span class="special">></span> <span class="identifier">Default</span></code>,
+ <code class="computeroutput"><span class="keyword">template</span><span class="special"><</span>
+ <span class="keyword">typename</span> <span class="identifier">X</span><span class="special">,</span> <span class="keyword">class</span>
+ <span class="identifier">Y</span> <span class="special">></span>
+ <span class="keyword">class</span> <span class="identifier">Template</span></code>.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#template_specialization_anchor"><code class="literal"><span class="bold"><strong>template-specialization</strong></span></code></a><a name="template_specialization_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ A template specialization argument (type, value, etc) that follow
+ the class name in the declaration to specialize a template: <code class="computeroutput"><span class="keyword">void</span> <span class="special">(</span><span class="keyword">int</span><span class="special">,</span> <span class="identifier">T</span><span class="special">)</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Wrap types within parenthesis: <code class="computeroutput"><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special"><</span><span class="keyword">char</span><span class="special">,</span>
+ <span class="keyword">int</span><span class="special">>)</span></code>.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#type_anchor"><code class="literal"><span class="bold"><strong>type</strong></span></code></a><a name="type_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ A type: <code class="computeroutput"><span class="keyword">int</span></code>, <code class="computeroutput"><span class="keyword">int</span> <span class="keyword">const</span><span class="special">&</span></code>, <code class="computeroutput"><span class="identifier">mytype</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Do nothing: <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special"><</span><span class="keyword">char</span><span class="special">,</span> <span class="keyword">int</span><span class="special">></span></code>.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#typedef_type_anchor"><code class="literal"><span class="bold"><strong>typedef-type</strong></span></code></a><a name="typedef_type_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ A type: <code class="computeroutput"><span class="keyword">int</span></code>, <code class="computeroutput"><span class="identifier">mytype</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Wrap type using Boost.Utility/IdentityType:
+ <code class="computeroutput"><span class="identifier">BOOST_IDENTITY_TYPE</span><span class="special">((</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special"><</span><span class="keyword">char</span><span class="special">,</span> <span class="keyword">int</span><span class="special">>))</span></code>.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#unary_boolean_metafunction_anchor"><code class="literal"><span class="bold"><strong>unary-boolean-metafunction</strong></span></code></a><a name="unary_boolean_metafunction_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ A boolean meta-function that takes one parameter: <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_class</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_</span><span class="special">></span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Do nothing: <code class="computeroutput"><span class="identifier">boost</span><span class="special">:</span><span class="identifier">is_convertible</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_</span><span class="special">,</span> <span class="keyword">int</span><span class="special">></span></code>.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#using_directive_anchor"><code class="literal"><span class="bold"><strong>using-directive</strong></span></code></a><a name="using_directive_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ The argument to pass to a using directive: <code class="computeroutput"><span class="keyword">namespace</span>
+ <span class="identifier">std</span></code>, <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Never the case.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+ <a class="link" href="grammar.html#variable_name_anchor"><code class="literal"><span class="bold"><strong>variable-name</strong></span></code></a><a name="variable_name_anchor"></a>
+ </p>
+ </td>
+<td>
+ <p>
+ A valid name to use to declare a variable: <code class="computeroutput"><span class="identifier">result</span></code>,
+ <code class="computeroutput"><span class="identifier">old_size</span></code>.
+ </p>
+ </td>
+<td>
+ <p>
+ Never the case.
+ </p>
+ </td>
+</tr>
+</tbody>
+</table></div>
+<p>
+ If terminals contain commas not already wrapped by round parenthesis or if
+ they start with a non-alphanumeric symbol (including tokens like <code class="computeroutput"><span class="char">'a'</span></code>, <code class="computeroutput"><span class="string">"abc"</span></code>,
+ <code class="computeroutput"><span class="special">-</span><span class="number">123</span></code>,
+ and <code class="computeroutput"><span class="number">1.23</span></code>), <sup>[<a name="contract__.grammar.terminals.f0" href="#ftn.contract__.grammar.terminals.f0" class="footnote">74</a>]</sup> they need to be wrapped by extra round parenthesis <code class="computeroutput"><span class="special">(...)</span></code> or by the Boost.Utility/IdentityType
+ <code class="computeroutput"><span class="identifier">BOOST_IDENTITY_TYPE</span><span class="special">((...))</span></code>
+ macro. Value expressions can always be wrapped within extra around parenthesis
+ in C++. Type expressions can always be wrapped using Boost.Utility/IdentityType
+ but that will make the syntax less readable (and it prevents C++ from automatically
+ deducing function template parameters) so this syntax allows to wrap type
+ expressions within extra round parenthesis <code class="computeroutput"><span class="special">(...)</span></code>
+ for most terminals, including types, as indicated by the table above.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.grammar.alternative_assertion_syntax__not_implemented_"></a><a class="link" href="grammar.html#contract__.grammar.alternative_assertion_syntax__not_implemented_" title="Alternative Assertion Syntax (Not Implemented)">Alternative
+ Assertion Syntax (Not Implemented)</a>
+</h3></div></div></div>
+<p>
+ The following alternative syntax could have been implemented to program the
+ contract assertions:
+ </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>
+ <p>
+ This Library Syntax
+ </p>
+ </th>
+<th>
+ <p>
+ Alternative Syntax (not implemented)
+ </p>
+ </th>
+</tr></thead>
+<tbody><tr>
+<td>
+ <p>
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">vector</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="special">...</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">iterator</span><span class="special">)</span> <span class="special">(</span><span class="identifier">erase</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">iterator</span><span class="special">)</span> <span class="identifier">where</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span>
+ <span class="keyword">not</span> <span class="identifier">empty</span><span class="special">(),</span>
+ <span class="identifier">where</span> <span class="special">!=</span> <span class="identifier">end</span><span class="special">(),</span>
+ <span class="keyword">static_assert</span><span class="special">(</span><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="special">>=</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="keyword">int</span><span class="special">),</span> <span class="string">"large enough"</span><span class="special">)</span>
+ <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="keyword">auto</span> <span class="identifier">old_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">size</span><span class="special">(),</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_size</span> <span class="special">-</span> <span class="number">1</span><span class="special">,</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="keyword">const</span><span class="special">(</span> <span class="keyword">this</span> <span class="special">)</span> <span class="keyword">this</span><span class="special">-></span><span class="identifier">empty</span><span class="special">())</span> <span class="special">(</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">end</span><span class="special">()</span>
+ <span class="special">)</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">where</span><span class="special">);</span>
+ <span class="special">}</span>
+<span class="special">};</span>
+</pre>
+<p>
+ </p>
+ </td>
+<td>
+ <p>
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">vector</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="special">...</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">iterator</span><span class="special">)</span> <span class="special">(</span><span class="identifier">erase</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">iterator</span><span class="special">)</span> <span class="identifier">where</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span>
+ <span class="identifier">assert</span><span class="special">(</span><span class="keyword">not</span> <span class="identifier">empty</span><span class="special">())</span>
+ <span class="identifier">assert</span><span class="special">(</span><span class="identifier">where</span> <span class="special">!=</span> <span class="identifier">end</span><span class="special">())</span>
+ <span class="keyword">static_assert</span><span class="special">(</span><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="special">>=</span> <span class="keyword">sizeof</span><span class="special">(</span><span class="keyword">int</span><span class="special">),</span> <span class="string">"large enough"</span><span class="special">)</span>
+ <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="identifier">decl</span><span class="special">(</span><span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">)</span>
+ <span class="identifier">decl</span><span class="special">(</span><span class="keyword">auto</span> <span class="identifier">old_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">size</span><span class="special">())</span>
+ <span class="identifier">assert</span><span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_size</span> <span class="special">-</span> <span class="number">1</span><span class="special">)</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="keyword">const</span><span class="special">(</span><span class="keyword">this</span><span class="special">,</span> <span class="keyword">this</span><span class="special">-></span><span class="identifier">empty</span><span class="special">()))</span> <span class="special">(</span>
+ <span class="identifier">assert</span><span class="special">(</span><span class="identifier">result</span> <span class="special">==</span> <span class="identifier">end</span><span class="special">())</span>
+ <span class="special">)</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">erase</span><span class="special">(</span><span class="identifier">where</span><span class="special">);</span>
+ <span class="special">}</span>
+<span class="special">};</span>
+</pre>
+<p>
+ </p>
+ </td>
+</tr></tbody>
+</table></div>
+<p>
+ An advantage of this alternative syntax is that it does not require commas
+ at the end of each assertion. However, when compared with this library syntax,
+ the alternative syntax is overall more verbose, it uses more parenthesis,
+ it deviates more from <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a> and Eiffel
+ (even if it is more similar to D),
+ and it looks less readable at least because of <code class="computeroutput"><span class="identifier">decl</span><span class="special">(...)</span></code> (in many ways this alternative syntax
+ is equivalent to the already supported sequencing syntax from the <a class="link" href="no_variadic_macros.html" title="No Variadic Macros">No
+ Variadic Macros</a> section with the addition of <span class="quote">“<span class="quote">decoration identifiers</span>”</span>
+ like <code class="computeroutput"><span class="identifier">assert</span></code> which might make
+ the code more readable but are not needed syntactically). Therefore, the
+ authors opted for implementing the syntax on the left hand side.
+ </p>
+</div>
+<div class="footnotes">
+<br><hr width="100" align="left">
+<div class="footnote"><p><sup>[<a id="ftn.contract__.grammar.f0" href="#contract__.grammar.f0" class="para">70</a>] </sup>
+ Usually, the complexity of C++ definitions is greater than the complexity
+ of C++ declaration and the fact that this library macros only affect declarations
+ would help by preserving the usefulness of the compiler error messages
+ for the definition code. However, this library aims to make declarations
+ more complex by adding program specifications to them (preconditions, postconditions,
+ etc). Therefore, it can no longer be argued that declarations are significantly
+ simpler than definitions and it would be rather helpful to have sensible
+ compiler error messages at least for the declarations with contracts.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.grammar.preprocessor_dsel.f0" href="#contract__.grammar.preprocessor_dsel.f0" class="para">71</a>] </sup>
+ Using C++11,
+ it <span class="emphasis"><em>might</em></span> be possible to implement the <code class="computeroutput"><span class="identifier">is_public</span></code> template because SFINAE
+ was extended to support access level (but to the authors' knowledge such
+ a meta-function has not been implemented yet so the authors cannot be sure
+ that <code class="computeroutput"><span class="identifier">is_public</span></code> can be properly
+ implemented even using C++11
+ SFINAE).
+ Even if that were possible in C++11,
+ this library still needs declaration traits other than <code class="computeroutput"><span class="keyword">public</span></code>
+ in oder to properly implement Contract Programming (e.g., if a function
+ is <code class="computeroutput"><span class="keyword">virtual</span></code> or not in order
+ to implement subcontracting, and there are examples like that). Therefore,
+ the arguments made here for the need to use a preprocessor DSEL in oder
+ to properly implement Contract Programming in C++ hold even if <code class="computeroutput"><span class="identifier">is_public</span></code> could be implemented in C++11.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.grammar.differences_with_c___syntax.f0" href="#contract__.grammar.differences_with_c___syntax.f0" class="para">72</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> This library macros could be
+ implemented to allow to specify syntactic elements in different orders
+ but that would complicate the macro implementation and this grammar with
+ no additional feature for the user.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.grammar.function_and_operator_names.f0" href="#contract__.grammar.function_and_operator_names.f0" class="para">73</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> Within macros a comma <code class="computeroutput"><span class="special">,</span></code> has the special meaning of separating
+ the macro parameters so it cannot be used to indicate the comma operator
+ otherwise <code class="computeroutput"><span class="keyword">operator</span><span class="special">(,)(</span><span class="identifier">mycomma</span><span class="special">)</span></code>
+ and <code class="computeroutput"><span class="keyword">operator</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special"><</span><span class="keyword">char</span><span class="special">,</span> <span class="keyword">int</span><span class="special">>)(</span><span class="identifier">stdmap</span><span class="special">)</span></code> could not be distinguished from one another
+ by the preprocessor.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.grammar.terminals.f0" href="#contract__.grammar.terminals.f0" class="para">74</a>] </sup>
+ The C++ preprocessor cannot concatenate <code class="computeroutput"><span class="number">1.23</span></code>
+ because it contains the <code class="computeroutput"><span class="special">.</span></code>
+ symbol (even if that symbol is technically not the leading symbol). The
+ precise preprocessor requirement is that the concatenated symbol must be
+ a valid macro identifier and concatenating <code class="computeroutput"><span class="number">1.23</span></code>
+ with any token will never give a valid macro identifier because of the
+ presence of the dot symbol <code class="computeroutput"><span class="special">.</span></code>
+ (e.g., <code class="computeroutput"><span class="identifier">BOOST_PP_CAT</span><span class="special">(</span><span class="identifier">XYZ</span><span class="special">,</span> <span class="number">1.23</span><span class="special">)</span></code> gives
+ <code class="computeroutput"><span class="identifier">XYZ1</span><span class="special">.</span><span class="number">23</span></code> which is not a valid macro identifier).
+ </p></div>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="examples.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="no_variadic_macros.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/contract__/named_parameters.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/contract__/named_parameters.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,1165 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Named Parameters</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="prev" href="concepts.html" title="Concepts">
+<link rel="next" href="examples.html" title="Examples">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="concepts.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="examples.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="contract__.named_parameters"></a><a class="link" href="named_parameters.html" title="Named Parameters">Named Parameters</a>
+</h2></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section">Overview</span></dt>
+<dt><span class="section"><a href="named_parameters.html#contract__.named_parameters.named_function_parameters">Named
+ Function Parameters</a></span></dt>
+<dt><span class="section"><a href="named_parameters.html#contract__.named_parameters.deduced_function_parameters">Deduced
+ Function Parameters</a></span></dt>
+<dt><span class="section"><a href="named_parameters.html#contract__.named_parameters.member_function_parameters">Member
+ Function Parameters</a></span></dt>
+<dt><span class="section"><a href="named_parameters.html#contract__.named_parameters.constructor_parameters">Constructor
+ Parameters</a></span></dt>
+<dt><span class="section"><a href="named_parameters.html#contract__.named_parameters.class_template_parameters">Class
+ Template Parameters</a></span></dt>
+<dt><span class="section">Concepts</span></dt>
+<dt><span class="section"><a href="named_parameters.html#contract__.named_parameters.parameter_identifiers">Parameter
+ Identifiers</a></span></dt>
+</dl></div>
+<p>
+ This section explains how to use this library to program named parameters and
+ deduced named parameters which are used instead of C++ usual positional parameters
+ to specify arguments to function calls. Parameter names are part of the program
+ specifications and therefore named parameters are within the scope of this
+ library.
+ </p>
+<p>
+ This library internally uses Boost.Parameter
+ to implement named parameters. This library only offers an easier syntax for
+ constructor and class template named parameters with respect the functionality
+ already provided by Boost.Parameter,
+ but this library allows to specify named parameters, concepts, and contracts
+ all together within a unified syntax.
+ </p>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.named_parameters.overview"></a><a class="link" href="named_parameters.html#contract__.named_parameters.overview" title="Overview">Overview</a>
+</h3></div></div></div>
+<p>
+ In C++, parameters are identified with respect to their declaration position
+ within the parameter list: The first call <span class="emphasis"><em>argument</em></span> (i.e.,
+ the specific value assigned to the formal parameter at the call site) maps
+ to the first declared parameter, the second call argument maps to the second
+ declared parameter, etc. For example:
+ </p>
+<pre class="programlisting"><span class="identifier">window</span><span class="special">*</span> <span class="identifier">make_window</span> <span class="special">(</span>
+ <span class="keyword">char</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">name</span><span class="special">,</span>
+ <span class="keyword">size_t</span> <span class="identifier">width</span> <span class="special">=</span> <span class="number">10</span><span class="special">,</span>
+ <span class="keyword">bool</span> <span class="identifier">moveable</span> <span class="special">=</span> <span class="keyword">true</span><span class="special">,</span>
+ <span class="keyword">bool</span> <span class="identifier">visible</span> <span class="special">=</span> <span class="keyword">true</span>
+ <span class="special">)</span>
+<span class="special">;</span>
+</pre>
+<p>
+ This protocol is sufficient when there is at most one parameter with a useful
+ default value but when there are even a few useful default parameters the
+ positional interface becomes difficult to use at the calling site. For example,
+ in the following call we need to repeat the default parameter value <code class="computeroutput"><span class="number">10</span></code>:
+ </p>
+<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">const</span> <span class="identifier">unmoveable</span> <span class="special">=</span> <span class="keyword">false</span><span class="special">;</span>
+<span class="identifier">make_window</span><span class="special">(</span><span class="string">"warning"</span><span class="special">,</span> <span class="number">10</span><span class="special">,</span> <span class="identifier">unmoveable</span><span class="special">);</span> <span class="comment">// Positional (usual).</span>
+</pre>
+<p>
+ Furthermore, it would be easier to understand the meaning of the arguments
+ at the calling site if the parameters could be referred by their names. For
+ example, in order to understand if the following window is moveable and invisible,
+ or unmoveable and visible, programmers at the calling site need to remember
+ the order of the parameter declarations:
+ </p>
+<pre class="programlisting"><span class="identifier">make_window</span><span class="special">(</span><span class="string">"note"</span><span class="special">,</span> <span class="number">10</span><span class="special">,</span> <span class="keyword">true</span><span class="special">,</span> <span class="keyword">false</span><span class="special">);</span> <span class="comment">// Positional (usual).</span>
+</pre>
+<p>
+ These issues would be solved if the parameter names could be referred at
+ the calling site and that is what <a href="http://en.wikipedia.org/wiki/Named_parameter" target="_top"><span class="emphasis"><em>named
+ parameters</em></span></a> allow to do:
+ </p>
+<pre class="programlisting"><span class="identifier">make_window</span><span class="special">(</span><span class="string">"warning"</span><span class="special">,</span> <span class="identifier">moveable</span> <span class="special">=</span> <span class="keyword">false</span><span class="special">);</span> <span class="comment">// Named.</span>
+<span class="identifier">make_widnow</span><span class="special">(</span><span class="string">"note"</span><span class="special">,</span> <span class="identifier">visible</span> <span class="special">=</span> <span class="keyword">false</span><span class="special">);</span>
+</pre>
+<p>
+ Named parameters were proposed for addition to early versions of C++ but
+ the proposal was never accepted (see <span class="quote">“<span class="quote">keyword arguments</span>”</span> in
+ <a class="link" href="bibliography.html#Stroustrup94_anchor">[Stroustrup94]</a>). Other programming
+ languages support named parameters (Ada,
+ Python, etc).
+ </p>
+<p>
+ Furthermore, <span class="emphasis"><em>deduced named parameters</em></span> are named parameters
+ that can be passed in any position and without supplying their names. These
+ are useful when functions have parameters that can be uniquely identified
+ (or <span class="emphasis"><em>deduced</em></span>) based on the argument types of the function
+ call. For example, the <code class="computeroutput"><span class="identifier">name</span></code>
+ parameter is such a parameter, it can be deduced because no other argument,
+ if valid, can be reasonably converted into a <code class="computeroutput"><span class="keyword">char</span>
+ <span class="keyword">const</span><span class="special">*</span></code>.
+ Therefore, with a deduced parameter interface, we could pass the window name
+ in any position without causing any ambiguity (with an appropriately designed
+ deduced parameter interface, the caller might not even have to remember the
+ actual parameter names):
+ </p>
+<pre class="programlisting"><span class="identifier">make_window</span><span class="special">(</span><span class="identifier">moveable</span> <span class="special">=</span> <span class="keyword">false</span><span class="special">,</span> <span class="string">"warning"</span><span class="special">);</span> <span class="comment">// Deduced.</span>
+<span class="identifier">make_window</span><span class="special">(</span><span class="string">"note"</span><span class="special">,</span> <span class="identifier">visible</span> <span class="special">=</span> <span class="keyword">false</span><span class="special">);</span>
+</pre>
+<p>
+ The same reasoning applies to named template parameters and deduced named
+ template parameters:
+ </p>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">,</span> <span class="keyword">bool</span> <span class="identifier">Shared</span> <span class="special">=</span> <span class="keyword">true</span> <span class="special">></span>
+<span class="keyword">class</span> <span class="identifier">smart_ptr</span> <span class="special">;</span>
+
+<span class="identifier">smart_ptr</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">,</span> <span class="keyword">false</span><span class="special">></span> <span class="identifier">p1</span><span class="special">;</span> <span class="comment">// Positional (usual).</span>
+<span class="identifier">smart_ptr</span><span class="special"><</span><span class="keyword">false</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">></span> <span class="identifier">p2</span><span class="special">;</span> <span class="comment">// Deduced.</span>
+<span class="identifier">smart_ptr</span><span class="special"><</span><span class="identifier">Shared</span> <span class="special">=</span> <span class="keyword">false</span><span class="special">,</span> <span class="identifier">ValueType</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">></span> <span class="identifier">p3</span><span class="special">;</span> <span class="comment">// Named.</span>
+</pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.named_parameters.named_function_parameters"></a><a class="link" href="named_parameters.html#contract__.named_parameters.named_function_parameters" title="Named Function Parameters">Named
+ Function Parameters</a>
+</h3></div></div></div>
+<p>
+ To show how to program named parameters, we will program a named parameter
+ interface for the <a href="http://www.boost.org/doc/libs/1_49_0/libs/graph/doc/depth_first_search.html" target="_top">Depth
+ First Search (DFS)</a> algorithm of the Boost.Graph
+ library:
+ </p>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span>
+ <span class="keyword">class</span> <span class="identifier">Graph</span><span class="special">,</span>
+ <span class="keyword">class</span> <span class="identifier">Visitor</span><span class="special">,</span>
+ <span class="keyword">class</span> <span class="identifier">IndexMap</span><span class="special">,</span>
+ <span class="keyword">class</span> <span class="identifier">ColorMap</span>
+<span class="special">></span> <span class="keyword">requires</span>
+ <span class="identifier">is_incidence_and_vertex_list_graph</span><span class="special"><</span><span class="identifier">Graph</span><span class="special">>,</span>
+ <span class="identifier">is_integral_property_map_of_key</span><span class="special"><</span><span class="identifier">IndexMap</span><span class="special">,</span> <span class="identifier">vertext_descriptor</span><span class="special"><</span><span class="identifier">Graph</span><span class="special">></span> <span class="special">>,</span>
+ <span class="identifier">is_property_map_of_key</span><span class="special"><</span><span class="identifier">ColorMap</span><span class="special">,</span> <span class="identifier">vertex_descriptor</span><span class="special"><</span><span class="identifier">Graph</span><span class="special">></span> <span class="special">></span>
+<span class="keyword">void</span> <span class="identifier">depth_first_search</span> <span class="special">(</span>
+ <span class="identifier">Graph</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">graph</span><span class="special">,</span>
+ <span class="identifier">Visitor</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">visitor</span> <span class="special">=</span> <span class="identifier">dfs_visitor</span><span class="special"><>(),</span>
+ <span class="identifier">vertex_descriptor</span><span class="special"><</span><span class="identifier">Graph</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">root_vertex</span> <span class="special">=</span>
+ <span class="special">*</span><span class="identifier">vertices</span><span class="special">(</span><span class="identifier">graph</span><span class="special">).</span><span class="identifier">first</span><span class="special">,</span>
+ <span class="identifier">IndexMap</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">index_map</span> <span class="special">=</span> <span class="identifier">get</span><span class="special">(</span><span class="identifier">vertex_index</span><span class="special">,</span> <span class="identifier">graph</span><span class="special">),</span>
+ <span class="identifier">ColorMap</span><span class="special">&</span> <span class="identifier">color_map</span> <span class="special">=</span>
+ <span class="identifier">default_color_map</span><span class="special">(</span><span class="identifier">num_vertices</span><span class="special">(</span><span class="identifier">graph</span><span class="special">),</span> <span class="identifier">index_map</span><span class="special">)</span>
+ <span class="special">)</span>
+<span class="special">;</span>
+</pre>
+<p>
+ This is non-valid C++ code but it can be considered pseudo-code to illustrate
+ the function interface that we need to program. The concept syntax <code class="computeroutput"><span class="keyword">requires</span></code> was <span class="quote">“<span class="quote">borrowed</span>”</span> here
+ to express parameter type requirements but a failure to satisfy such requirements
+ is intended to fail the function call resolution and not to cause a concept
+ error as usual.
+ </p>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term"><code class="literal">graph</code></span></dt>
+<dd><p>
+ This is an input parameter (<code class="computeroutput"><span class="keyword">const</span><span class="special">&</span></code>), its type must match a model
+ of both <code class="computeroutput"><span class="identifier">IndicenceGraph</span></code>
+ and <code class="computeroutput"><span class="identifier">VertexListGraph</span></code>,
+ and it has no default value (required parameter).
+ </p></dd>
+<dt><span class="term"><code class="literal">visitor</code></span></dt>
+<dd><p>
+ This is an input parameter (<code class="computeroutput"><span class="keyword">const</span><span class="special">&</span></code>), its type has no requirement,
+ and its value defaults to a DFS visitor (optional parameter).
+ </p></dd>
+<dt><span class="term"><code class="literal">root_vertex</code></span></dt>
+<dd><p>
+ This is an input parameter (<code class="computeroutput"><span class="keyword">const</span><span class="special">&</span></code>), its type must be <code class="computeroutput"><span class="identifier">vertex_descriptor</span><span class="special"><</span><span class="identifier">Graph</span><span class="special">></span></code>,
+ and its value defaults to the first vertex of the specified graph (optional
+ parameter).
+ </p></dd>
+<dt><span class="term"><code class="literal">index_map</code></span></dt>
+<dd><p>
+ This is an input parameter (<code class="computeroutput"><span class="keyword">const</span><span class="special">&</span></code>), its type must match a model
+ of <code class="computeroutput"><span class="identifier">IntegralPropertyMap</span></code>
+ with key type <code class="computeroutput"><span class="identifier">vertex_descriptor</span><span class="special"><</span><span class="identifier">Graph</span><span class="special">></span></code>, its value defaults to the vertex
+ index of the specified graph (optional parameter).
+ </p></dd>
+<dt><span class="term"><code class="literal">color_map</code></span></dt>
+<dd><p>
+ This is an input and output parameter (non-constant reference <code class="computeroutput"><span class="special">&</span></code>), its type must match a model
+ of <code class="computeroutput"><span class="identifier">PropertyMap</span></code> with
+ key type <code class="computeroutput"><span class="identifier">vertex_descriptor</span><span class="special"><</span><span class="identifier">Graph</span><span class="special">></span></code>, its value defaults to a map with
+ size equal to the number of vertices of the specified graph and created
+ from the specified <code class="computeroutput"><span class="identifier">index_map</span></code>
+ (optional parameter).
+ </p></dd>
+</dl>
+</div>
+<p>
+ <span class="bold"><strong>Parameter Identifiers</strong></span>
+ </p>
+<p>
+ First of all, it is necessary to declare special elements that will serve
+ as the parameter and argument identifiers (see also named_params_dfs.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">graphs</span> <span class="special">{</span>
+
+<span class="identifier">CONTRACT_PARAMETER</span><span class="special">(</span><span class="identifier">graph</span><span class="special">)</span>
+<span class="identifier">CONTRACT_PARAMETER</span><span class="special">(</span><span class="identifier">visitor</span><span class="special">)</span>
+<span class="identifier">CONTRACT_PARAMETER</span><span class="special">(</span><span class="identifier">root_vertex</span><span class="special">)</span>
+<span class="identifier">CONTRACT_PARAMETER</span><span class="special">(</span><span class="identifier">index_map</span><span class="special">)</span>
+<span class="identifier">CONTRACT_PARAMETER</span><span class="special">(</span><span class="identifier">color_map</span><span class="special">)</span>
+
+<span class="special">}</span> <span class="comment">// namespace</span>
+</pre>
+<p>
+ </p>
+<p>
+ For example, the first <code class="computeroutput"><a class="link" href="../CONTRACT_PARAMETER.html" title="Macro CONTRACT_PARAMETER">CONTRACT_PARAMETER</a></code>
+ macro declares an identifier <code class="computeroutput"><span class="identifier">graph</span></code>
+ that is used as the parameter name in the function declaration and also an
+ identifier <code class="computeroutput"><span class="identifier">graph_</span></code> (note the
+ trailing underscore <code class="computeroutput"><span class="identifier">_</span></code>) that
+ is used to name the argument at the call site.
+ </p>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ By default, argument identifiers are differentiated from parameter identifiers
+ using a trailing underscore <code class="computeroutput"><span class="identifier">_</span></code>
+ to avoid name clashes (see also the <a class="link" href="named_parameters.html#contract__.named_parameters.parameter_identifiers" title="Parameter Identifiers">Parameter
+ Identifiers</a> section). Furthermore, it is recommended to always declare
+ these identifiers within a namespace to avoid name clashes (because different
+ functions in different sections of the code might very well use the same
+ parameter names so namespaces can be used to control overlapping names).
+ </p></td></tr>
+</table></div>
+<p>
+ For example, for a library named Graphs, all named parameter identifiers
+ could be declared under the <code class="computeroutput"><span class="identifier">graphs</span></code>
+ namespace and maybe in a single header <code class="literal">graphs_params.hpp</code>.
+ Many different functions within <code class="computeroutput"><span class="identifier">graphs</span></code>
+ (for example <code class="computeroutput"><span class="identifier">graphs</span><span class="special">::</span><span class="identifier">depth_first_search</span></code> and <code class="computeroutput"><span class="identifier">graphs</span><span class="special">::</span><span class="identifier">breadth_first_search</span></code>)
+ will share a number of common parameter names (for example a parameter named
+ <code class="computeroutput"><span class="identifier">graph</span></code> with parameter identifier
+ <code class="computeroutput"><span class="identifier">graphs</span><span class="special">::</span><span class="identifier">graph</span></code> and argument identifier <code class="computeroutput"><span class="identifier">graphs</span><span class="special">::</span><span class="identifier">graph_</span></code>). All these named parameters will
+ be defined in one places in <code class="literal">graphs_params.hpp</code> and within
+ the <code class="computeroutput"><span class="identifier">graphs</span></code> namespace so programmers
+ can conveniently control and avoid named clashes.
+ </p>
+<p>
+ <span class="bold"><strong>Function Declaration</strong></span>
+ </p>
+<p>
+ The function is declared using the following syntax (see also named_params_dfs.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">graphs</span> <span class="special">{</span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">void</span> <span class="special">(</span><span class="identifier">depth_first_search</span><span class="special">)</span> <span class="special">(</span>
+ <span class="comment">// Required parameter (no default value) with requirement predicate.</span>
+ <span class="keyword">in</span> <span class="keyword">requires</span><span class="special">(</span><span class="identifier">is_incidence_and_vertex_list_graph</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_</span><span class="special">>)</span>
+ <span class="identifier">graph</span><span class="special">,</span>
+ <span class="comment">// Optional (default value) of any type (auto).</span>
+ <span class="keyword">in</span> <span class="keyword">auto</span> <span class="identifier">visitor</span><span class="special">,</span> <span class="keyword">default</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">dfs_visitor</span><span class="special"><>(),</span>
+ <span class="comment">// Exact type specified.</span>
+ <span class="keyword">in</span> <span class="special">(</span><span class="identifier">vertex_descriptor</span><span class="special"><</span><span class="identifier">CONTRACT_PARAMETER_TYPEOF</span><span class="special">(</span><span class="identifier">graph</span><span class="special">)>)</span>
+ <span class="identifier">root_vertex</span><span class="special">,</span> <span class="keyword">default</span> <span class="special">(*</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">vertices</span><span class="special">(</span><span class="identifier">graph</span><span class="special">).</span><span class="identifier">first</span><span class="special">),</span>
+ <span class="comment">// Any type matching requirement predicate (unary meta-function).</span>
+ <span class="keyword">in</span> <span class="keyword">requires</span><span class="special">(</span>
+ <span class="identifier">is_integral_property_map_of_key</span><span class="special"><</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_</span>
+ <span class="special">,</span> <span class="identifier">vertex_descriptor</span><span class="special"><</span><span class="identifier">CONTRACT_PARAMETER_TYPEOF</span><span class="special">(</span><span class="identifier">graph</span><span class="special">)></span>
+ <span class="special">></span>
+ <span class="special">)</span> <span class="identifier">index_map</span><span class="special">,</span> <span class="keyword">default</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">get</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">vertex_index</span><span class="special">,</span> <span class="identifier">graph</span><span class="special">),</span>
+ <span class="comment">// In-out parameter.</span>
+ <span class="keyword">in</span> <span class="keyword">out</span> <span class="keyword">requires</span><span class="special">(</span>
+ <span class="identifier">is_property_map_of_key</span><span class="special"><</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_</span>
+ <span class="special">,</span> <span class="identifier">vertex_descriptor</span><span class="special"><</span><span class="identifier">CONTRACT_PARAMETER_TYPEOF</span><span class="special">(</span><span class="identifier">graph</span><span class="special">)></span>
+ <span class="special">></span>
+ <span class="special">)</span> <span class="identifier">color_map</span><span class="special">,</span> <span class="keyword">default</span> <span class="identifier">default_color_map</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">num_vertices</span><span class="special">(</span><span class="identifier">graph</span><span class="special">),</span>
+ <span class="identifier">index_map</span><span class="special">)</span>
+ <span class="special">)</span>
+ <span class="comment">// No `precondition(...)` or `postcondition(...)` in this example.</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// Also function definition can use `PARAMETER_TYPEOF`.</span>
+ <span class="keyword">typedef</span> <span class="identifier">CONTRACT_PARAMETER_TYPEOF</span><span class="special">(</span><span class="identifier">graph</span><span class="special">)&</span> <span class="identifier">graph_ref</span><span class="special">;</span> <span class="comment">// Unused by example.</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">depth_first_search</span><span class="special">(</span><span class="identifier">graph</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">visitor</span><span class="special">(</span><span class="identifier">visitor</span><span class="special">).</span>
+ <span class="identifier">color_map</span><span class="special">(</span><span class="identifier">color_map</span><span class="special">).</span><span class="identifier">root_vertex</span><span class="special">(</span><span class="identifier">root_vertex</span><span class="special">).</span>
+ <span class="identifier">vertex_index_map</span><span class="special">(</span><span class="identifier">index_map</span><span class="special">));</span>
+<span class="special">}</span>
+
+<span class="special">}</span> <span class="comment">// namespace</span>
+</pre>
+<p>
+ </p>
+<p>
+ This example required no preconditions and no postconditions.
+ </p>
+<p>
+ <span class="bold"><strong>In, In Out, and Out Parameters</strong></span>
+ </p>
+<p>
+ Input parameters (i.e., constant references <code class="computeroutput"><span class="keyword">const</span><span class="special">&</span></code>) are prefixed by the specifier <code class="computeroutput"><span class="keyword">in</span></code> (see also the <a class="link" href="grammar.html" title="Grammar">Grammar</a>
+ section):
+ </p>
+<pre class="programlisting"><span class="keyword">in</span> <span class="special">...</span> <span class="identifier">graph</span> <span class="comment">// Input parameter.</span>
+</pre>
+<p>
+ Input and output parameters (i.e., non-constant reference <code class="computeroutput"><span class="special">&</span></code>)
+ are prefixed by both specifiers <code class="computeroutput"><span class="keyword">in</span>
+ <span class="keyword">out</span></code> (in this order, see also the
+ <a class="link" href="grammar.html" title="Grammar">Grammar</a> section):
+ </p>
+<pre class="programlisting"><span class="keyword">in</span> <span class="keyword">out</span> <span class="special">...</span> <span class="identifier">color_map</span> <span class="comment">// Input-output parameter.</span>
+</pre>
+<p>
+ Output parameters can be prefixed just by the specifier <code class="computeroutput"><span class="keyword">out</span></code>
+ but their implementation is equivalent to using the specifiers <code class="computeroutput"><span class="keyword">in</span> <span class="keyword">out</span></code> (i.e.,
+ non-constant reference <code class="computeroutput"><span class="special">&</span></code>).
+ <sup>[<a name="contract__.named_parameters.named_function_parameters.f0" href="#ftn.contract__.named_parameters.named_function_parameters.f0" class="footnote">60</a>]</sup> Note that a named parameter must always be specified either
+ <code class="computeroutput"><span class="keyword">in</span></code>, <code class="computeroutput"><span class="keyword">in</span>
+ <span class="keyword">out</span></code>, or <code class="computeroutput"><span class="keyword">out</span></code>
+ (and that is what distinguish syntactically a named parameter from a positional
+ parameter; this use of <code class="computeroutput"><span class="keyword">in</span></code>,
+ <code class="computeroutput"><span class="keyword">in</span> <span class="keyword">out</span></code>,
+ and <code class="computeroutput"><span class="keyword">out</span></code> resembles Ada's
+ syntax). Named and positional parameters cannot be used together in the same
+ function declaration.
+ </p>
+<p>
+ <span class="bold"><strong>Parameter Types</strong></span>
+ </p>
+<p>
+ Exact parameter types are specified just before the parameter name and within
+ parenthesis (unless they are fundamental types containing no symbol, see
+ also the <a class="link" href="grammar.html" title="Grammar">Grammar</a> section):
+ </p>
+<pre class="programlisting"><span class="keyword">in</span> <span class="special">(</span><span class="identifier">vertex_descriptor</span><span class="special"><</span><span class="identifier">CONTRACT_PARAMETER_TYPEOF</span><span class="special">(</span><span class="identifier">graph</span><span class="special">)>)</span> <span class="identifier">root_vertex</span> <span class="comment">// Exact parameter type requirement.</span>
+</pre>
+<p>
+ Generic parameter types (i.e., parameter types with no requirement, same
+ as usual type template parameters) are specified using <code class="computeroutput"><span class="keyword">auto</span></code>
+ instead of the parameter type (see also the <a class="link" href="grammar.html" title="Grammar">Grammar</a>
+ section):
+ </p>
+<pre class="programlisting"><span class="keyword">in</span> <span class="keyword">auto</span> <span class="identifier">visitor</span> <span class="comment">// No parameter type requirement.</span>
+</pre>
+<p>
+ Predicate parameter type requirements are specified using <code class="computeroutput"><span class="keyword">requires</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>unary-boolean-metafunction</em></span></code><code class="computeroutput"><span class="special">)</span></code> instead of the parameter type, the type
+ of the argument specified by the function call will be required to match
+ the specified unary boolean meta-function in order for the call to be resolved
+ (see also the <a class="link" href="grammar.html" title="Grammar">Grammar</a> section):
+ </p>
+<pre class="programlisting"><span class="keyword">in</span> <span class="keyword">requires</span><span class="special">(</span><span class="identifier">is_incidence_and_vertex_list_graph</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_</span><span class="special">>)</span> <span class="identifier">graph</span> <span class="comment">// Predicate parameter type requirement.</span>
+</pre>
+<p>
+ The placeholder <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_</span></code>
+ makes this expression a unary meta-function (see Boost.MPL)
+ and the library will substitute such a placeholder with the argument type
+ specified at the call site when resolving the function call.
+ </p>
+<p>
+ <span class="bold"><strong>Default Parameter Values</strong></span>
+ </p>
+<p>
+ Default parameter values are specified using <code class="computeroutput"><span class="special">,</span>
+ <span class="keyword">default</span> </code><code class="literal"><span class="emphasis"><em>default-parameter-value</em></span></code>
+ right after the parameter declaration (see also the <a class="link" href="grammar.html" title="Grammar">Grammar</a>
+ section):
+ </p>
+<pre class="programlisting"><span class="keyword">in</span> <span class="keyword">auto</span> <span class="identifier">visitor</span><span class="special">,</span> <span class="keyword">default</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">dfs_visitor</span><span class="special"><>()</span>
+</pre>
+<p>
+ Default parameter values are not evaluated and their types are not even instantiated
+ if an actual argument is specified by the function call.
+ </p>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ The type and value of a parameters can be used within the declaration of
+ other parameters. The type of a named parameter can be accessed using the
+ <code class="computeroutput"><a class="link" href="../CONTRACT_PARAMETER_TYPEOF.html" title="Macro CONTRACT_PARAMETER_TYPEOF">CONTRACT_PARAMETER_TYPEOF</a></code>
+ macro (this is especially useful for generic parameter types and for parameter
+ types with predicate requirements because these types are not known until
+ the function call is resolved).
+ </p></td></tr>
+</table></div>
+<p>
+ <span class="bold"><strong>Function Call</strong></span>
+ </p>
+<p>
+ The <code class="computeroutput"><span class="identifier">graphs</span><span class="special">::</span><span class="identifier">depth_first_search</span></code> function can be called
+ using argument identifiers to name its parameters (see also named_params_dfs.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">graphs</span><span class="special">::</span><span class="identifier">depth_first_search</span><span class="special">(</span><span class="identifier">graphs</span><span class="special">::</span><span class="identifier">visitor_</span> <span class="special">=</span> <span class="identifier">vis</span><span class="special">,</span> <span class="identifier">graphs</span><span class="special">::</span><span class="identifier">graph_</span> <span class="special">=</span> <span class="identifier">g</span><span class="special">);</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.named_parameters.deduced_function_parameters"></a><a class="link" href="named_parameters.html#contract__.named_parameters.deduced_function_parameters" title="Deduced Function Parameters">Deduced
+ Function Parameters</a>
+</h3></div></div></div>
+<p>
+ To show how to program deduced named parameters, we program the parameter
+ interface for the def
function of the Boost.Python
+ library (see also deduced_params_pydef.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">py</span> <span class="special">{</span>
+
+<span class="identifier">CONTRACT_PARAMETER</span><span class="special">(</span><span class="identifier">name</span><span class="special">)</span>
+<span class="identifier">CONTRACT_PARAMETER</span><span class="special">(</span><span class="identifier">func</span><span class="special">)</span>
+<span class="identifier">CONTRACT_PARAMETER</span><span class="special">(</span><span class="identifier">docstring</span><span class="special">)</span>
+<span class="identifier">CONTRACT_PARAMETER</span><span class="special">(</span><span class="identifier">keywords</span><span class="special">)</span>
+<span class="identifier">CONTRACT_PARAMETER</span><span class="special">(</span><span class="identifier">policies</span><span class="special">)</span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">void</span> <span class="special">(</span><span class="identifier">def</span><span class="special">)</span> <span class="special">(</span>
+ <span class="comment">// Non-deduced (and also required) named parameters.</span>
+ <span class="keyword">in</span> <span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*)</span> <span class="identifier">name</span><span class="special">,</span>
+ <span class="keyword">in</span> <span class="keyword">auto</span> <span class="identifier">func</span><span class="special">,</span>
+ <span class="comment">// Deduced (and also optional) named parameters.</span>
+ <span class="keyword">deduce</span> <span class="keyword">in</span> <span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*)</span> <span class="identifier">docstring</span><span class="special">,</span> <span class="keyword">default</span> <span class="special">(</span><span class="string">""</span><span class="special">),</span>
+ <span class="keyword">deduce</span> <span class="keyword">in</span> <span class="keyword">requires</span><span class="special">(</span><span class="identifier">is_keyword_expression</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_</span><span class="special">>)</span> <span class="identifier">keywords</span><span class="special">,</span>
+ <span class="keyword">default</span> <span class="identifier">no_keywords</span><span class="special">(),</span>
+ <span class="comment">// Type requirements also used to uniquely deduce parameters.</span>
+ <span class="keyword">deduce</span> <span class="keyword">in</span> <span class="keyword">requires</span><span class="special">(</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">not_</span><span class="special"><</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">or_</span><span class="special"><</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_convertible</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_</span><span class="special">,</span> <span class="keyword">char</span> <span class="keyword">const</span><span class="special">*></span>
+ <span class="special">,</span> <span class="identifier">is_keyword_expression</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_</span><span class="special">></span>
+ <span class="special">></span>
+ <span class="special">></span>
+ <span class="special">)</span> <span class="identifier">policies</span><span class="special">,</span> <span class="keyword">default</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">python</span><span class="special">::</span><span class="identifier">default_call_policies</span><span class="special">()</span>
+ <span class="comment">// Concepts for named parameters.</span>
+ <span class="special">)</span> <span class="keyword">requires</span><span class="special">(</span> <span class="identifier">CallPolicies</span><span class="special"><</span><span class="identifier">CONTRACT_PARAMETER_TYPEOF</span><span class="special">(</span><span class="identifier">policies</span><span class="special">)></span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">is_identifier</span><span class="special">(</span><span class="identifier">name</span><span class="special">)</span> <span class="special">)</span> <span class="comment">// Contracts.</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">python</span><span class="special">::</span><span class="identifier">def</span><span class="special">(</span><span class="identifier">name</span><span class="special">,</span> <span class="identifier">func</span><span class="special">,</span> <span class="identifier">docstring</span><span class="special">,</span> <span class="identifier">keywords</span><span class="special">,</span> <span class="identifier">policies</span><span class="special">);</span>
+<span class="special">}</span>
+
+<span class="special">}</span> <span class="comment">// namespace</span>
+</pre>
+<p>
+ </p>
+<p>
+ Also a precondition was specified in this example. (Concepts for named parameters
+ are explained later in this section.)
+ </p>
+<p>
+ Deduced parameters are named parameter that are prefixed by the <code class="computeroutput"><span class="keyword">deduce</span></code> specifier (see also the <a class="link" href="grammar.html" title="Grammar">Grammar</a>
+ section):
+ </p>
+<pre class="programlisting"><span class="keyword">deduce</span> <span class="keyword">in</span> <span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*)</span> <span class="identifier">docstring</span> <span class="comment">// Deduced input parameter.</span>
+</pre>
+<p>
+ When calling the function <code class="computeroutput"><span class="identifier">py</span><span class="special">::</span><span class="identifier">def</span></code> only
+ two arguments are required <code class="computeroutput"><span class="identifier">name</span></code>
+ and <code class="computeroutput"><span class="identifier">func</span></code>. The association
+ between any addition argument and its parameter can be deduced based on the
+ types of the arguments specified by the function call (so the caller is neither
+ required to remember the parameter positions nor to explicitly specify the
+ parameter names for these arguments).
+ </p>
+<p>
+ For example, the first two calls below are equivalent and if programmers
+ need to pass a <code class="computeroutput"><span class="identifier">policy</span></code> argument
+ that is also, for some reason, convertible to <code class="computeroutput"><span class="keyword">char</span>
+ <span class="keyword">const</span><span class="special">*</span></code>,
+ they can always specify the parameter name as in the third call below (see
+ also deduced_params_pydef.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">py</span><span class="special">::</span><span class="identifier">def</span><span class="special">(</span><span class="string">"f"</span><span class="special">,</span> <span class="identifier">print</span><span class="special"><</span><span class="char">'f'</span><span class="special">>,</span> <span class="identifier">nonstring_policies</span><span class="special">,</span> <span class="string">"Documentation for f"</span><span class="special">);</span>
+<span class="identifier">py</span><span class="special">::</span><span class="identifier">def</span><span class="special">(</span><span class="string">"g"</span><span class="special">,</span> <span class="identifier">print</span><span class="special"><</span><span class="char">'g'</span><span class="special">>,</span> <span class="string">"Documentation for g"</span><span class="special">,</span> <span class="identifier">nonstring_policies</span><span class="special">);</span>
+<span class="identifier">py</span><span class="special">::</span><span class="identifier">def</span><span class="special">(</span><span class="string">"h"</span><span class="special">,</span> <span class="identifier">print</span><span class="special"><</span><span class="char">'h'</span><span class="special">>,</span> <span class="identifier">py</span><span class="special">::</span><span class="identifier">policies_</span> <span class="special">=</span> <span class="identifier">string_policies</span><span class="special">,</span>
+ <span class="string">"Documentation for h"</span><span class="special">);</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.named_parameters.member_function_parameters"></a><a class="link" href="named_parameters.html#contract__.named_parameters.member_function_parameters" title="Member Function Parameters">Member
+ Function Parameters</a>
+</h3></div></div></div>
+<p>
+ The same syntax is used to specify named and deduced parameters for member
+ functions (see also member_named_params_callable2.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">calls</span> <span class="special">{</span>
+
+<span class="identifier">CONTRACT_PARAMETER</span><span class="special">(</span><span class="identifier">arg1</span><span class="special">)</span>
+<span class="identifier">CONTRACT_PARAMETER</span><span class="special">(</span><span class="identifier">arg2</span><span class="special">)</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">struct</span> <span class="special">(</span><span class="identifier">callable2</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Member function with named parameters.</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">call</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">in</span> <span class="keyword">int</span> <span class="identifier">arg1</span><span class="special">,</span> <span class="keyword">in</span> <span class="keyword">int</span> <span class="identifier">arg2</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span> <span class="comment">// Body definition can be separated...</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Constant member with named parameters.</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">call</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">in</span> <span class="keyword">int</span> <span class="identifier">arg1</span><span class="special">,</span> <span class="keyword">in</span> <span class="keyword">int</span> <span class="identifier">arg2</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">total</span> <span class="special">=</span> <span class="identifier">arg1</span> <span class="special">+</span> <span class="identifier">arg2</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Static member with named parameters.</span>
+ <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">static_call</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">in</span> <span class="keyword">int</span> <span class="identifier">arg1</span><span class="special">,</span> <span class="keyword">in</span> <span class="keyword">int</span> <span class="identifier">arg2</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">total</span> <span class="special">=</span> <span class="identifier">arg1</span> <span class="special">+</span> <span class="identifier">arg2</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="keyword">static</span> <span class="keyword">int</span> <span class="identifier">total</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="comment">// ... but body definition uses template parameters and special `BODY` macro.</span>
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">Arg1</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Arg2</span> <span class="special">></span>
+<span class="keyword">void</span> <span class="identifier">callable2</span><span class="special">::</span><span class="identifier">CONTRACT_PARAMETER_BODY</span><span class="special">(</span><span class="identifier">call</span><span class="special">)(</span> <span class="identifier">Arg1</span> <span class="identifier">arg1</span><span class="special">,</span> <span class="identifier">Arg2</span> <span class="identifier">arg2</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">total</span> <span class="special">=</span> <span class="identifier">arg1</span> <span class="special">+</span> <span class="identifier">arg2</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="keyword">int</span> <span class="identifier">callable2</span><span class="special">::</span><span class="identifier">total</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
+
+<span class="special">}</span> <span class="comment">// namespace</span>
+</pre>
+<p>
+ </p>
+<p>
+ No contracts were specified in this example.
+ </p>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ When the body definition of a function with named parameters is deferred
+ from the function declaration, the body must be declared as a template
+ function when it is defined and the special macro <code class="computeroutput"><a class="link" href="../CONTRACT_PARAMETER_BODY.html" title="Macro CONTRACT_PARAMETER_BODY">CONTRACT_PARAMETER_BODY</a></code>
+ must be used to name the function.
+ </p></td></tr>
+</table></div>
+<p>
+ The same macro is used to name both free and member body functions because
+ the class type is specified outside this macro. The constructor body definition
+ cannot be deferred from the constructor declaration (because of the lack
+ of delegating constructors in C++03).
+ Destructors have no named parameters (because they have no parameter). Named
+ parameters are not supported for operators (because of a Boost.Parameter
+ bug). <sup>[<a name="contract__.named_parameters.member_function_parameters.f0" href="#ftn.contract__.named_parameters.member_function_parameters.f0" class="footnote">61</a>]</sup> Therefore the <code class="computeroutput"><a class="link" href="../CONTRACT_PARAMETER_BODY.html" title="Macro CONTRACT_PARAMETER_BODY">CONTRACT_PARAMETER_BODY</a></code>
+ macro is used only with free and member functions that are not operators.
+ <sup>[<a name="contract__.named_parameters.member_function_parameters.f1" href="#ftn.contract__.named_parameters.member_function_parameters.f1" class="footnote">62</a>]</sup>
+ </p>
+<p>
+ In this example, named parameters were specified for all <code class="computeroutput"><span class="identifier">callable2</span><span class="special">::</span><span class="identifier">call</span></code>
+ overloads and for the <code class="computeroutput"><span class="keyword">static</span></code>
+ member function <code class="computeroutput"><span class="identifier">callable2</span><span class="special">:</span><span class="identifier">static_call</span></code>:
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">calls</span><span class="special">::</span><span class="identifier">callable2</span><span class="special">::</span><span class="identifier">static_call</span><span class="special">(</span><span class="identifier">calls</span><span class="special">::</span><span class="identifier">arg2_</span> <span class="special">=</span> <span class="number">2</span><span class="special">,</span> <span class="identifier">calls</span><span class="special">::</span><span class="identifier">arg1_</span> <span class="special">=</span> <span class="number">1</span><span class="special">);</span>
+<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">calls</span><span class="special">::</span><span class="identifier">callable2</span><span class="special">::</span><span class="identifier">total</span> <span class="special">==</span> <span class="number">3</span><span class="special">);</span>
+
+<span class="identifier">calls</span><span class="special">::</span><span class="identifier">callable2</span> <span class="identifier">c</span><span class="special">;</span>
+<span class="identifier">c</span><span class="special">.</span><span class="identifier">call</span><span class="special">(</span><span class="identifier">calls</span><span class="special">::</span><span class="identifier">arg2_</span> <span class="special">=</span> <span class="number">3</span><span class="special">,</span> <span class="identifier">calls</span><span class="special">::</span><span class="identifier">arg1_</span> <span class="special">=</span> <span class="number">4</span><span class="special">);</span>
+<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">calls</span><span class="special">::</span><span class="identifier">callable2</span><span class="special">::</span><span class="identifier">total</span> <span class="special">==</span> <span class="number">7</span><span class="special">);</span>
+
+<span class="identifier">calls</span><span class="special">::</span><span class="identifier">callable2</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">cc</span> <span class="special">=</span> <span class="identifier">c</span><span class="special">;</span>
+<span class="identifier">cc</span><span class="special">.</span><span class="identifier">call</span><span class="special">(</span><span class="identifier">calls</span><span class="special">::</span><span class="identifier">arg2_</span> <span class="special">=</span> <span class="number">5</span><span class="special">,</span> <span class="identifier">calls</span><span class="special">::</span><span class="identifier">arg1_</span> <span class="special">=</span> <span class="number">6</span><span class="special">);</span>
+<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">calls</span><span class="special">::</span><span class="identifier">callable2</span><span class="special">::</span><span class="identifier">total</span> <span class="special">==</span> <span class="number">11</span><span class="special">);</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.named_parameters.constructor_parameters"></a><a class="link" href="named_parameters.html#contract__.named_parameters.constructor_parameters" title="Constructor Parameters">Constructor
+ Parameters</a>
+</h3></div></div></div>
+<p>
+ The same syntax is used to specify named and deduced parameters for constructors
+ (see also constructor_named_params_family.cpp
):
+ <sup>[<a name="contract__.named_parameters.constructor_parameters.f0" href="#ftn.contract__.named_parameters.constructor_parameters.f0" class="footnote">63</a>]</sup>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">family</span> <span class="special">{</span>
+
+<span class="identifier">CONTRACT_PARAMETER</span><span class="special">(</span><span class="identifier">name</span><span class="special">)</span>
+<span class="identifier">CONTRACT_PARAMETER</span><span class="special">(</span><span class="identifier">age</span><span class="special">)</span>
+<span class="identifier">CONTRACT_PARAMETER</span><span class="special">(</span><span class="identifier">relatives</span><span class="special">)</span>
+<span class="identifier">CONTRACT_PARAMETER</span><span class="special">(</span><span class="identifier">weight</span><span class="special">)</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">struct</span> <span class="special">(</span><span class="keyword">member</span><span class="special">)</span> <span class="keyword">extends</span><span class="special">(</span> <span class="keyword">public</span> <span class="identifier">person</span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="keyword">member</span><span class="special">)</span> <span class="special">(</span>
+ <span class="keyword">in</span> <span class="keyword">auto</span> <span class="identifier">name</span><span class="special">,</span>
+ <span class="keyword">in</span> <span class="keyword">out</span> <span class="keyword">auto</span> <span class="identifier">age</span><span class="special">,</span> <span class="comment">//default 32,</span>
+ <span class="keyword">deduce</span> <span class="keyword">out</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">person</span><span class="special">>)</span> <span class="identifier">relatives</span><span class="special">,</span>
+ <span class="keyword">deduce</span> <span class="keyword">in</span> <span class="keyword">requires</span><span class="special">(</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_convertible</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_</span><span class="special">,</span> <span class="keyword">double</span><span class="special">></span>
+ <span class="special">)</span> <span class="identifier">weight</span> <span class="comment">//, default(75.0)</span>
+ <span class="special">)</span> <span class="comment">// Preconditions, body, etc access arguments as usual...</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">(</span><span class="identifier">name</span><span class="special">)</span> <span class="special">!=</span> <span class="string">""</span><span class="special">,</span> <span class="identifier">age</span> <span class="special">>=</span> <span class="number">0</span><span class="special">,</span> <span class="identifier">weight</span> <span class="special">>=</span> <span class="number">0.0</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_relatives_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">relatives</span><span class="special">.</span><span class="identifier">size</span><span class="special">(),</span>
+ <span class="identifier">relatives</span><span class="special">.</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_relatives_size</span> <span class="special">+</span> <span class="number">1</span>
+ <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="comment">// ... but initializers must use the `..._ARG` macro.</span>
+ <span class="identifier">person</span><span class="special">(</span><span class="identifier">CONTRACT_CONSTRUCTOR_ARG</span><span class="special">(</span><span class="identifier">name</span><span class="special">),</span>
+ <span class="identifier">CONTRACT_CONSTRUCTOR_ARG</span><span class="special">(</span><span class="identifier">age</span><span class="special">),</span>
+ <span class="identifier">CONTRACT_CONSTRUCTOR_ARG</span><span class="special">(</span><span class="identifier">weight</span><span class="special">)),</span>
+ <span class="identifier">family_</span><span class="special">(</span><span class="identifier">CONTRACT_CONSTRUCTOR_ARG</span><span class="special">(</span><span class="identifier">relatives</span><span class="special">))</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">relatives</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(*</span><span class="keyword">this</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">person</span><span class="special">>&</span> <span class="identifier">family_</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="special">}</span> <span class="comment">// namespace</span>
+</pre>
+<p>
+ </p>
+<p>
+ Both preconditions and postconditions were specified for the constructor.
+ </p>
+<div class="important"><table border="0" summary="Important">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../doc/src/images/important.png"></td>
+<th align="left">Important</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ Member initializers must access named and deduced parameters using the
+ special macro <code class="computeroutput"><a class="link" href="../CONTRACT_CONSTRUCTOR_ARG.html" title="Macro CONTRACT_CONSTRUCTOR_ARG">CONTRACT_CONSTRUCTOR_ARG</a></code>
+ (otherwise the compiler will generate an error). <sup>[<a name="contract__.named_parameters.constructor_parameters.f1" href="#ftn.contract__.named_parameters.constructor_parameters.f1" class="footnote">64</a>]</sup>
+ </p></td></tr>
+</table></div>
+<p>
+ Named and deduced parameters can be used to specify the arguments when constructing
+ the object:
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">family</span><span class="special">::</span><span class="identifier">person</span><span class="special">></span> <span class="identifier">r</span><span class="special">;/*</span>
+<span class="identifier">family</span><span class="special">::</span><span class="keyword">member</span> <span class="identifier">m1</span><span class="special">(</span><span class="identifier">family</span><span class="special">::</span><span class="identifier">name_</span> <span class="special">=</span> <span class="string">"Mary"</span><span class="special">,</span> <span class="identifier">family</span><span class="special">::</span><span class="identifier">relatives_</span> <span class="special">=</span> <span class="identifier">r</span><span class="special">);</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.named_parameters.class_template_parameters"></a><a class="link" href="named_parameters.html#contract__.named_parameters.class_template_parameters" title="Class Template Parameters">Class
+ Template Parameters</a>
+</h3></div></div></div>
+<p>
+ Only class templates are discussed in this section because function templates
+ are effectively always declared when a function uses named or deduced parameters.
+ In fact, a function with named or deduced parameters is always a function
+ template (possibly with fully generic templated types when the named and
+ deduced parameters types are specified <code class="computeroutput"><span class="keyword">auto</span></code>).
+ </p>
+<p>
+ To show how to program named and deduced template parameters, we will program
+ a named parameter interface for the class_
class template of the Boost.Python
+ library:
+ </p>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span>
+ <span class="keyword">class</span> <span class="identifier">ClassType</span><span class="special">,</span>
+ <span class="keyword">class</span> <span class="identifier">Bases</span> <span class="special">=</span> <span class="identifier">bases</span><span class="special"><>,</span>
+ <span class="keyword">typename</span> <span class="identifier">HeldType</span> <span class="special">=</span> <span class="identifier">not_sepcified</span><span class="special">,</span>
+ <span class="keyword">typename</span> <span class="identifier">Copyable</span> <span class="special">=</span> <span class="identifier">not_specified</span>
+<span class="special">></span> <span class="keyword">requires</span>
+ <span class="identifier">is_class</span><span class="special"><</span><span class="identifier">ClassType</span><span class="special">></span>
+<span class="keyword">class</span> <span class="identifier">class_</span> <span class="special">;</span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term">ClassType</span></dt>
+<dd><p>
+ This type parameter must be a class and it has no default value (required
+ parameter).
+ </p></dd>
+<dt><span class="term">Bases</span></dt>
+<dd><p>
+ This type parameter must be a specialization of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">python</span><span class="special">::</span><span class="identifier">bases</span></code>
+ specifying base classes if any (see <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">python</span><span class="special">::</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">specifies_bases</span></code>)
+ and its value defaults to <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">python</span><span class="special">::</span><span class="identifier">bases</span><span class="special"><></span></code>.
+ </p></dd>
+<dt><span class="term">HeldType</span></dt>
+<dd><p>
+ This type parameter has no constraint and it is not specified by default
+ (see <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">python</span><span class="special">::</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">not_specified</span></code>).
+ </p></dd>
+<dt><span class="term">Copyable</span></dt>
+<dd><p>
+ This type parameter must be <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">noncopyable</span></code>
+ if specified and it is not specified by default (see <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">python</span><span class="special">::</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">not_specified</span></code>).
+ </p></dd>
+</dl>
+</div>
+<div class="important"><table border="0" summary="Important">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../doc/src/images/important.png"></td>
+<th align="left">Important</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ Unfortunately, named and deduced template parameters can only handle type
+ template parameters (i.e., value template parameters and template template
+ parameters are not supported). <sup>[<a name="contract__.named_parameters.class_template_parameters.f0" href="#ftn.contract__.named_parameters.class_template_parameters.f0" class="footnote">65</a>]</sup>
+ </p></td></tr>
+</table></div>
+<p>
+ First of all, it is necessary to declare elements that will serve as template
+ parameter and argument identifiers (see also named_template_params_pyclass.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">py</span> <span class="special">{</span>
+
+<span class="identifier">CONTRACT_TEMPLATE_PARAMETER</span><span class="special">(</span><span class="identifier">ClassType</span><span class="special">)</span>
+<span class="identifier">CONTRACT_TEMPLATE_PARAMETER</span><span class="special">(</span><span class="identifier">Bases</span><span class="special">)</span>
+<span class="identifier">CONTRACT_TEMPLATE_PARAMETER</span><span class="special">(</span><span class="identifier">HeldType</span><span class="special">)</span>
+<span class="identifier">CONTRACT_TEMPLATE_PARAMETER</span><span class="special">(</span><span class="identifier">Copyable</span><span class="special">)</span>
+<span class="identifier">CONTRACT_PARAMETER</span><span class="special">(</span><span class="identifier">name</span><span class="special">)</span>
+
+<span class="special">}</span> <span class="comment">// namespace</span>
+</pre>
+<p>
+ </p>
+<p>
+ For example, the first <code class="computeroutput"><a class="link" href="../CONTRACT_TEMPLATE_PARAMETER.html" title="Macro CONTRACT_TEMPLATE_PARAMETER">CONTRACT_TEMPLATE_PARAMETER</a></code>
+ macro declares a specifier <code class="computeroutput"><span class="identifier">ClassType</span></code>
+ that can be used as the parameter name in the class template declaration
+ and a specifier <code class="computeroutput"><span class="identifier">ClassType_</span></code>
+ (note the trailing underscore <code class="computeroutput"><span class="identifier">_</span></code>)
+ that can be used for the template argument at the template instantiation
+ site.
+ </p>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ By default, template argument identifiers are differentiated from template
+ parameter identifiers using a trailing underscore <code class="computeroutput"><span class="identifier">_</span></code>
+ to avoid name clashes (see also the <a class="link" href="named_parameters.html#contract__.named_parameters.parameter_identifiers" title="Parameter Identifiers">Parameter
+ Identifiers</a> section). Furthermore, it is recommended to always declare
+ these identifiers within a namespace to avoid name clashes (because different
+ class templates in different sections of the code might very well use the
+ same template parameter names so namespaces can be used to control overlapping
+ names).
+ </p></td></tr>
+</table></div>
+<p>
+ The class template is declared using a syntax similar to the one we have
+ seen so far for named and deduced function parameters (see also named_template_params_pyclass.cpp
):
+ <sup>[<a name="contract__.named_parameters.class_template_parameters.f1" href="#ftn.contract__.named_parameters.class_template_parameters.f1" class="footnote">66</a>]</sup>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">py</span> <span class="special">{</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span>
+ <span class="comment">// Required named template parameter.</span>
+ <span class="keyword">in</span> <span class="keyword">typename</span> <span class="keyword">requires</span><span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_class</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_</span><span class="special">>)</span> <span class="identifier">ClassType</span><span class="special">,</span>
+ <span class="comment">// Optional deduced named template parameters with requirements.</span>
+ <span class="keyword">deduce</span> <span class="keyword">in</span> <span class="keyword">typename</span> <span class="keyword">requires</span><span class="special">(</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">python</span><span class="special">::</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">specifies_bases</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_</span><span class="special">></span>
+ <span class="special">)</span> <span class="identifier">Bases</span><span class="special">,</span> <span class="keyword">default</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">python</span><span class="special">::</span><span class="identifier">bases</span><span class="special"><>,</span>
+ <span class="keyword">deduce</span> <span class="keyword">in</span> <span class="keyword">typename</span> <span class="keyword">requires</span><span class="special">(</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">not_</span><span class="special"><</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">or_</span><span class="special"><</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">python</span><span class="special">::</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">specifies_bases</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_</span><span class="special">></span>
+ <span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_same</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">noncopyable</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_</span><span class="special">></span>
+ <span class="special">></span>
+ <span class="special">></span>
+ <span class="special">)</span> <span class="identifier">HeldType</span><span class="special">,</span> <span class="keyword">default</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">python</span><span class="special">::</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">not_specified</span><span class="special">,</span>
+ <span class="keyword">deduce</span> <span class="keyword">in</span> <span class="keyword">typename</span> <span class="keyword">requires</span><span class="special">(</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_same</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">noncopyable</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">_</span><span class="special">></span>
+ <span class="special">)</span> <span class="identifier">Copyable</span><span class="special">,</span> <span class="keyword">default</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">python</span><span class="special">::</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">not_specified</span>
+ <span class="comment">// Unfortunately, non-type named template parameters are not supported.</span>
+ <span class="comment">// Concepts named template parameters.</span>
+ <span class="special">)</span> <span class="keyword">requires</span><span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">DefaultConstructible</span><span class="special"><</span><span class="identifier">ClassType</span><span class="special">></span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">class_</span><span class="special">)</span>
+ <span class="keyword">extends</span><span class="special">(</span> <span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">python</span><span class="special">::</span><span class="identifier">class_</span><span class="special"><</span><span class="identifier">ClassType</span><span class="special">,</span> <span class="identifier">Bases</span><span class="special">,</span> <span class="identifier">HeldType</span><span class="special">,</span> <span class="identifier">Copyable</span><span class="special">>)</span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="comment">// Contracts.</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="identifier">ClassType</span> <span class="identifier">class_type</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="identifier">Bases</span> <span class="identifier">bases</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="identifier">HeldType</span> <span class="identifier">held_type</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="identifier">Copyable</span> <span class="identifier">copyable</span><span class="special">;</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">explicit</span> <span class="special">(</span><span class="identifier">class_</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">in</span> <span class="special">(</span><span class="keyword">char</span> <span class="keyword">const</span><span class="special">*)</span> <span class="identifier">name</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">is_identifier</span><span class="special">(</span><span class="identifier">name</span><span class="special">)</span> <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span>
+ <span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">python</span><span class="special">::</span><span class="identifier">class_</span><span class="special"><</span><span class="identifier">ClassType</span><span class="special">,</span> <span class="identifier">Bases</span><span class="special">,</span> <span class="identifier">HeldType</span><span class="special">,</span> <span class="identifier">Copyable</span><span class="special">>(</span>
+ <span class="identifier">CONTRACT_CONSTRUCTOR_ARG</span><span class="special">(</span><span class="identifier">name</span><span class="special">)))</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+<span class="special">};</span>
+
+<span class="special">}</span> <span class="comment">// namespace</span>
+</pre>
+<p>
+ </p>
+<p>
+ Note that template parameters are always specified using <code class="computeroutput"><span class="keyword">in</span></code>
+ because they are always input parameters (they are static types). Furthermore,
+ <code class="computeroutput"><span class="keyword">typename</span></code> or <code class="computeroutput"><span class="keyword">class</span></code>
+ must always follow the <code class="computeroutput"><span class="keyword">in</span></code> specifier
+ for type template parameters. <sup>[<a name="contract__.named_parameters.class_template_parameters.f2" href="#ftn.contract__.named_parameters.class_template_parameters.f2" class="footnote">67</a>]</sup> Predicate type requirements <code class="computeroutput"><span class="keyword">requires</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>unary-boolean-metafunction</em></span></code><code class="computeroutput"><span class="special">)</span></code> are optional and they are specified right
+ after <code class="computeroutput"><span class="keyword">typename</span></code> or <code class="computeroutput"><span class="keyword">class</span></code> if present. Default template parameter
+ values are specified using <code class="computeroutput"><span class="special">,</span> <span class="keyword">default</span> </code><code class="literal"><span class="emphasis"><em>default-parameter-value</em></span></code>
+ as usual. (See also the <a class="link" href="grammar.html" title="Grammar">Grammar</a>
+ section.)
+ </p>
+<p>
+ The class template <code class="computeroutput"><span class="identifier">py</span><span class="special">::</span><span class="identifier">class_</span></code> can be instantiated using the template
+ parameter identifiers to name the arguments (see also named_template_params_pyclass.cpp
):
+ <sup>[<a name="contract__.named_parameters.class_template_parameters.f3" href="#ftn.contract__.named_parameters.class_template_parameters.f3" class="footnote">68</a>]</sup>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// Named parameters.</span>
+<span class="identifier">py</span><span class="special">::</span><span class="identifier">class_</span><span class="special"><</span><span class="identifier">py</span><span class="special">::</span><span class="identifier">ClassType_</span><span class="special"><</span><span class="identifier">bx</span><span class="special">>,</span> <span class="identifier">py</span><span class="special">::</span><span class="identifier">Copyable_</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">noncopyable</span><span class="special">></span> <span class="special">>(</span><span class="string">"bx"</span><span class="special">);</span>
+<span class="identifier">py</span><span class="special">::</span><span class="identifier">class_</span><span class="special"><</span><span class="identifier">x</span><span class="special">,</span> <span class="identifier">py</span><span class="special">::</span><span class="identifier">HeldType_</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_ptr</span><span class="special"><</span><span class="identifier">x</span><span class="special">></span> <span class="special">>,</span>
+ <span class="identifier">py</span><span class="special">::</span><span class="identifier">Bases_</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">python</span><span class="special">::</span><span class="identifier">bases</span><span class="special"><</span><span class="identifier">bx</span><span class="special">></span> <span class="special">></span> <span class="special">>(</span><span class="string">"x"</span><span class="special">);</span>
+<span class="comment">// Deduced parameters.</span>
+<span class="identifier">py</span><span class="special">::</span><span class="identifier">class_</span><span class="special"><</span><span class="identifier">by</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">noncopyable</span><span class="special">>(</span><span class="string">"by"</span><span class="special">);</span>
+<span class="identifier">py</span><span class="special">::</span><span class="identifier">class_</span><span class="special"><</span><span class="identifier">y</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">shared_ptr</span><span class="special"><</span><span class="identifier">y</span><span class="special">>,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">python</span><span class="special">::</span><span class="identifier">bases</span><span class="special"><</span><span class="identifier">by</span><span class="special">></span> <span class="special">>(</span>
+ <span class="identifier">py</span><span class="special">::</span><span class="identifier">name_</span> <span class="special">=</span> <span class="string">"y"</span><span class="special">);</span>
+</pre>
+<p>
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.named_parameters.concepts"></a><a class="link" href="named_parameters.html#contract__.named_parameters.concepts" title="Concepts">Concepts</a>
+</h3></div></div></div>
+<p>
+ As shown in the <code class="computeroutput"><span class="identifier">py</span><span class="special">::</span><span class="identifier">class_</span></code> example above, it is possible to
+ specify concepts for named and deduced template parameters. Concepts are
+ specified using <code class="computeroutput"><span class="keyword">requires</span></code> after
+ the class template parameter declaration:
+ </p>
+<pre class="programlisting"><span class="keyword">template</span><span class="special">(</span> <span class="special">...</span> <span class="special">)</span> <span class="keyword">requires</span><span class="special">(</span> <code class="literal"><span class="emphasis"><em>concept1</em></span></code><span class="special">,</span> <code class="literal"><span class="emphasis"><em>concept2</em></span></code><span class="special">,</span> <span class="special">...</span> <span class="special">)</span>
+<span class="keyword">class</span> <span class="special">(</span><span class="identifier">class_</span><span class="special">)</span> <span class="special">...</span>
+</pre>
+<p>
+ As shown in the <code class="computeroutput"><span class="identifier">py</span><span class="special">::</span><span class="identifier">def</span></code> example earlier in this section, it
+ is also possible to specify concepts for named and deduced function parameters
+ (because named and deduced function parameter can be generic, as function
+ template parameters are, when their types are specified <code class="computeroutput"><span class="keyword">auto</span></code>
+ or via a predicate type requirement). However, in this case concepts are
+ specified using <code class="computeroutput"><span class="keyword">requires</span></code> after
+ the function parameter list (because there is not <code class="computeroutput"><span class="keyword">template</span></code>
+ declaration for functions with named and deduced parameters):
+ </p>
+<pre class="programlisting"><span class="keyword">void</span> <span class="special">(</span><span class="identifier">def</span><span class="special">)</span> <span class="special">(</span> <span class="special">...</span> <span class="special">)</span> <span class="keyword">requires</span><span class="special">(</span> <code class="literal"><span class="emphasis"><em>concept1</em></span></code><span class="special">,</span> <code class="literal"><span class="emphasis"><em>concept2</em></span></code><span class="special">,</span> <span class="special">...</span> <span class="special">)</span>
+</pre>
+<p>
+ Note the following differences between specifying predicate type requirements
+ and concepts for named and deduced parameters:
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem">
+ If predicate type requirements are not met, the function or class template
+ will be taken out from the set of possible function overloads or template
+ specializations in the function call or template instantiation resolution
+ (this might ultimately generate a compiler error but only if there is
+ no other function overload or template specialization that can be used).
+ </li>
+<li class="listitem">
+ If a concept check fails, the compiler will always generate a compiler
+ error.
+ </li>
+</ul></div>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.named_parameters.parameter_identifiers"></a><a class="link" href="named_parameters.html#contract__.named_parameters.parameter_identifiers" title="Parameter Identifiers">Parameter
+ Identifiers</a>
+</h3></div></div></div>
+<p>
+ When using the <code class="computeroutput"><a class="link" href="../CONTRACT_PARAMETER.html" title="Macro CONTRACT_PARAMETER">CONTRACT_PARAMETER</a></code>
+ and <code class="computeroutput"><a class="link" href="../CONTRACT_TEMPLATE_PARAMETER.html" title="Macro CONTRACT_TEMPLATE_PARAMETER">CONTRACT_TEMPLATE_PARAMETER</a></code>
+ macros (see also the <a class="link" href="grammar.html" title="Grammar">Grammar</a> section):
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ It is possible to specify a namespace that will contain the parameter
+ identifiers using <code class="computeroutput"><span class="keyword">namespace</span><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>parameter-identifier-namespace</em></span></code><code class="computeroutput"><span class="special">)</span></code>.
+ </li>
+<li class="listitem">
+ It is also possible to specify the name of the argument identifier instead
+ of using the automatic underscore <code class="computeroutput"><span class="identifier">_</span></code>
+ postfix using <code class="computeroutput"><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>argument-identifier</em></span></code><code class="computeroutput"><span class="special">)</span></code>.
+ </li>
+</ol></div>
+<p>
+ The following example generates parameter identifiers within the <code class="computeroutput"><span class="identifier">params</span></code> namespace, and argument identifiers
+ <code class="computeroutput"><span class="identifier">NumberArg</span></code> and <code class="computeroutput"><span class="identifier">value_arg</span></code> instead of the default <code class="computeroutput"><span class="identifier">Number_</span></code> and <code class="computeroutput"><span class="identifier">value_</span></code>
+ for the <code class="computeroutput"><span class="identifier">Number</span></code> and <code class="computeroutput"><span class="identifier">value</span></code> parameters respectively (see also
+ named_param_identifiers_positive.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_TEMPLATE_PARAMETER</span><span class="special">(</span> <span class="keyword">namespace</span><span class="special">(</span><span class="identifier">params</span><span class="special">)</span> <span class="special">(</span><span class="identifier">NumberArg</span><span class="special">)</span> <span class="identifier">Number</span> <span class="special">)</span>
+<span class="identifier">CONTRACT_PARAMETER</span><span class="special">(</span> <span class="keyword">namespace</span><span class="special">(</span><span class="identifier">params</span><span class="special">)</span> <span class="special">(</span><span class="identifier">value_arg</span><span class="special">)</span> <span class="identifier">value</span> <span class="special">)</span>
+</pre>
+<p>
+ </p>
+<p>
+ When the parameter identifier namespace is specified, it must be repeated
+ in the named and deduced parameter declaration list (see also the <a class="link" href="grammar.html" title="Grammar">Grammar</a>
+ section):
+ </p>
+<pre class="programlisting"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="emphasis"><em>paraemeter-identifier-namespace</em></span><span class="special">,</span> <span class="special">...</span> <span class="comment">// named and deduced parameters follow</span>
+</pre>
+<p>
+ The authors find this syntax confusing so they recommend to never specify
+ the parameter identifier namespace when using the <code class="computeroutput"><a class="link" href="../CONTRACT_PARAMETER.html" title="Macro CONTRACT_PARAMETER">CONTRACT_PARAMETER</a></code>
+ and <code class="computeroutput"><a class="link" href="../CONTRACT_TEMPLATE_PARAMETER.html" title="Macro CONTRACT_TEMPLATE_PARAMETER">CONTRACT_TEMPLATE_PARAMETER</a></code>
+ macros. <sup>[<a name="contract__.named_parameters.parameter_identifiers.f0" href="#ftn.contract__.named_parameters.parameter_identifiers.f0" class="footnote">69</a>]</sup> macro. ] Instead programmers are encouraged to use these macros
+ within an enclosing namespace as done by the rest of the examples in this
+ documentation.
+ </p>
+<p>
+ For example (see also named_param_identifiers_positive.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="comment">// Named template parameters must specify `params` namespace.</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">params</span><span class="special">,</span> <span class="keyword">in</span> <span class="keyword">typename</span> <span class="identifier">Number</span> <span class="special">)</span>
+ <span class="keyword">struct</span> <span class="special">(</span><span class="identifier">positive</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span> <span class="identifier">get</span><span class="special">()</span> <span class="special">></span> <span class="number">0</span> <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="comment">// Named parameters must specify `params` namespace.</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">positive</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">params</span><span class="special">,</span> <span class="keyword">in</span> <span class="special">(</span><span class="identifier">Number</span><span class="special">)</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">value</span> <span class="special">></span> <span class="number">0</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">get</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">value_</span><span class="special">(</span><span class="identifier">CONTRACT_CONSTRUCTOR_ARG</span><span class="special">(</span><span class="identifier">value</span><span class="special">))</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span> <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">Number</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">(</span><span class="identifier">get</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">value_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">Number</span> <span class="identifier">value_</span><span class="special">;</span>
+<span class="special">};</span>
+</pre>
+<p>
+ </p>
+<p>
+ Class invariants, preconditions, and postconditions were also specified in
+ this example.
+ </p>
+<p>
+ At the template instantiation and function call site, the specified argument
+ identifiers <code class="computeroutput"><span class="identifier">NumberArg</span></code> and
+ <code class="computeroutput"><span class="identifier">value_arg</span></code> can be used instead
+ of the usual trailing underscore (see also named_param_identifiers_positive.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">positive</span><span class="special"><</span><span class="identifier">NumberArg</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="special">></span> <span class="identifier">n</span><span class="special">(</span><span class="identifier">value_arg</span> <span class="special">=</span> <span class="number">123</span><span class="special">);</span> <span class="comment">// Use ...Arg and ..._arg.</span>
+</pre>
+<p>
+ </p>
+<p>
+ It is not necessary to specify both the parameter identifier namespace and
+ the argument identifier as they are both and independently optional (see
+ also the <a class="link" href="grammar.html" title="Grammar">Grammar</a> section):
+ </p>
+<pre class="programlisting"><span class="identifier">CONTRACT_TEMPLATE_PARAMETER</span><span class="special">(</span> <span class="special">(</span><span class="identifier">NumberArg</span><span class="special">)</span> <span class="identifier">Number</span> <span class="special">)</span> <span class="comment">// Specify only argument identifier.</span>
+<span class="identifier">CONTRACT_PARAMETER</span><span class="special">(</span> <span class="keyword">namespace</span><span class="special">(</span><span class="identifier">params</span><span class="special">)</span> <span class="identifier">value</span> <span class="special">)</span> <span class="comment">// Specify only parameter identifier namespace.</span>
+</pre>
+<p>
+ It is recommended to never specify the argument identifiers to have the same
+ names as the parameter identifiers in order to avoid the following usually
+ silent bug (see also named_param_identifiers_failure.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_PARAMETER</span><span class="special">(</span> <span class="special">(</span><span class="identifier">name</span><span class="special">)</span> <span class="identifier">name</span> <span class="special">)</span> <span class="comment">// Both parameter and argument </span>
+<span class="identifier">CONTRACT_PARAMETER</span><span class="special">(</span> <span class="special">(</span><span class="identifier">age</span><span class="special">)</span> <span class="identifier">age</span> <span class="special">)</span> <span class="comment">// have same name, but...</span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">void</span> <span class="special">(</span><span class="identifier">print</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">in</span> <span class="keyword">auto</span> <span class="identifier">name</span><span class="special">,</span> <span class="keyword">default</span><span class="special">(</span><span class="string">"bob"</span><span class="special">),</span> <span class="keyword">in</span> <span class="keyword">auto</span> <span class="identifier">age</span><span class="special">,</span> <span class="keyword">default</span> <span class="number">42</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">age</span> <span class="special">></span> <span class="number">0</span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">age</span> <span class="special">>=</span> <span class="number">40</span><span class="special">)</span> <span class="keyword">throw</span> <span class="identifier">too_old</span><span class="special">();</span> <span class="comment">// Will throw because age defaulted to 42.</span>
+<span class="special">}</span>
+
+<span class="keyword">void</span> <span class="identifier">f</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">age</span> <span class="special">)</span> <span class="comment">// Another parameter with the same name.</span>
+<span class="special">{</span>
+ <span class="identifier">print</span><span class="special">(</span><span class="identifier">age</span> <span class="special">=</span> <span class="number">3</span><span class="special">);</span> <span class="comment">// So incorrect call but no compiler-error.</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+ The call <code class="computeroutput"><span class="identifier">print</span><span class="special">(</span><span class="identifier">age</span> <span class="special">=</span> <span class="number">3</span><span class="special">);</span></code> will assign
+ <code class="computeroutput"><span class="number">3</span></code> to <code class="computeroutput"><span class="identifier">f</span></code>'s
+ parameter <code class="computeroutput"><span class="identifier">age</span></code> instead than
+ passing <code class="computeroutput"><span class="number">3</span></code> as the argument of
+ <code class="computeroutput"><span class="identifier">print</span></code>'s parameter <code class="computeroutput"><span class="identifier">age</span></code>. The trailing underscore <code class="computeroutput"><span class="identifier">_</span></code> convention and enclosing the named parameter
+ declaration macros <code class="computeroutput"><a class="link" href="../CONTRACT_PARAMETER.html" title="Macro CONTRACT_PARAMETER">CONTRACT_PARAMETER</a></code>
+ and <code class="computeroutput"><a class="link" href="../CONTRACT_TEMPLATE_PARAMETER.html" title="Macro CONTRACT_TEMPLATE_PARAMETER">CONTRACT_TEMPLATE_PARAMETER</a></code>
+ within a namespace make this type of name clashes unlikely.
+ </p>
+</div>
+<div class="footnotes">
+<br><hr width="100" align="left">
+<div class="footnote"><p><sup>[<a id="ftn.contract__.named_parameters.named_function_parameters.f0" href="#contract__.named_parameters.named_function_parameters.f0" class="para">60</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> C++ cannot express the semantics
+ that an output parameter should be written and never read within a function
+ because references can always be both written and read.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.named_parameters.member_function_parameters.f0" href="#contract__.named_parameters.member_function_parameters.f0" class="para">61</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> This library syntax supports
+ named and deduced parameters for operators. However, Boost.Parameter
+ does not compile when used with operators because of a bug (Boost.Parameter
+ documentation claims support for operators but later revisions of Boost.Parameter
+ no longer compile when operators are used). If Boost.Parameter
+ were to be fixed to work with operators then this library named and deduced
+ parameters should also work with operators.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.named_parameters.member_function_parameters.f1" href="#contract__.named_parameters.member_function_parameters.f1" class="para">62</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> A macro <code class="computeroutput"><a class="link" href="../CONTRACT_PARAMETER_BODY.html" title="Macro CONTRACT_PARAMETER_BODY">CONTRACT_PARAMETER_BODY</a></code>
+ different from <code class="computeroutput"><a class="link" href="../CONTRACT_MEMBER_BODY.html" title="Macro CONTRACT_MEMBER_BODY">CONTRACT_MEMBER_BODY</a></code>
+ and <code class="computeroutput"><a class="link" href="../CONTRACT_FREE_BODY.html" title="Macro CONTRACT_FREE_BODY">CONTRACT_FREE_BODY</a></code>
+ is necessary because named parameters will still be enabled even when contracts
+ are turned off using <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_PRECONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_PRECONDITIONS">CONTRACT_CONFIG_NO_PRECONDITIONS</a></code>,
+ etc.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.named_parameters.constructor_parameters.f0" href="#contract__.named_parameters.constructor_parameters.f0" class="para">63</a>] </sup>
+ Arguably, this library offers a better syntax than Boost.Parameter
+ for constructor named and deduced parameters (because Boost.Parameter
+ requires boiler-plate code and an extra base class in order to handle constructors).
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.named_parameters.constructor_parameters.f1" href="#contract__.named_parameters.constructor_parameters.f1" class="para">64</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> This limitation comes from
+ the lacks of delegating constructors in C++03
+ (as with all other limitations of this library related to member initializers).
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.named_parameters.class_template_parameters.f0" href="#contract__.named_parameters.class_template_parameters.f0" class="para">65</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> This library only supports
+ named and deduced type template parameter because it internally uses
+ Boost.Parameter
+ and Boost.Parameter
+ does not support non-type template parameters. However, this library
+ syntax would support named and deduced value template parameters and
+ template template parameters if these were ever supported by Boost.Parameter
+ (see template parameters within the <a class="link" href="grammar.html" title="Grammar">Grammar</a>
+ section). Named and deduced value template parameters can be emulated
+ by wrapping their values into types (using <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">int_</span></code>,
+ <code class="computeroutput"><span class="identifier">boos</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">bool_</span></code>, etc) at the cost of a somewhat
+ cumbersome syntax.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.named_parameters.class_template_parameters.f1" href="#contract__.named_parameters.class_template_parameters.f1" class="para">66</a>] </sup>
+ Arguably, this library offers a better syntax than Boost.Parameter
+ for named and deduced template parameters (because Boost.Parameter
+ requires boiler-plate code and the additional argument packing types to
+ be programmed manually).
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.named_parameters.class_template_parameters.f2" href="#contract__.named_parameters.class_template_parameters.f2" class="para">67</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> This syntax was designed so
+ it can support non-type template parameters if this library and Boost.Parameter
+ were ever extended to support value template parameters and template template
+ parameters (see template parameters in the <a class="link" href="grammar.html" title="Grammar">Grammar</a>
+ section).
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.named_parameters.class_template_parameters.f3" href="#contract__.named_parameters.class_template_parameters.f3" class="para">68</a>] </sup>
+ This named and deduced parameter syntax is not entirely ideal because it
+ uses angular parenthesis <code class="computeroutput"><span class="identifier">py</span><span class="special">::</span><span class="identifier">ClassType_</span><span class="special"><</span><span class="identifier">bx</span><span class="special">></span></code> instead of the more readable assignment
+ operator <code class="computeroutput"><span class="identifier">py</span><span class="special">::</span><span class="identifier">ClassType_</span> <span class="special">=</span>
+ <span class="identifier">bx</span></code> to name the arguments (but
+ that is how Boost.Parameter
+ is implemented and also this library authors see no way to implement the
+ assignment operator syntax for named and deduced template parameters).
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.named_parameters.parameter_identifiers.f0" href="#contract__.named_parameters.parameter_identifiers.f0" class="para">69</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> The ability to specify the
+ parameter identifier (or tag) namespace is offered because it is offered
+ by Boost.Parameter
+ and it gives programmers greater control. However, it should be rarely
+ if ever needed because this library provides the [macro CONTRACT_PARAMETER_TYPEOF
+ </p></div>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="concepts.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="examples.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/contract__/no_variadic_macros.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/contract__/no_variadic_macros.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,479 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>No Variadic Macros</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="prev" href="grammar.html" title="Grammar">
+<link rel="next" href="../reference.html" title="Reference">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="grammar.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../reference.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="contract__.no_variadic_macros"></a><a class="link" href="no_variadic_macros.html" title="No Variadic Macros">No Variadic Macros</a>
+</h2></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="no_variadic_macros.html#contract__.no_variadic_macros.sequence_syntax">Sequence
+ Syntax</a></span></dt>
+<dt><span class="section"><a href="no_variadic_macros.html#contract__.no_variadic_macros.commas_and_leading_symbols_in_macros">Commas
+ and Leading Symbols in Macros</a></span></dt>
+</dl></div>
+<p>
+ This section illustrates an alternative syntax, the <span class="emphasis"><em>sequence syntax</em></span>,
+ that can be used on compilers that do not support variadic macros. Most modern
+ compilers support <a href="http://en.wikipedia.org/wiki/Variadic_macro" target="_top">variadic
+ macros</a> (notably, these include GCC, MSVC, and all C++11
+ compilers).
+ </p>
+<div class="warning"><table border="0" summary="Warning">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
+<th align="left">Warning</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ The sequence syntax presented in this section has not been fully tested yet.
+ Future revisions of the library are expected to test and support the sequence
+ syntax more thoroughly (see also <a href="https://sourceforge.net/apps/trac/contractpp/ticket/58" target="_top">Ticket
+ 58</a>).
+ </p></td></tr>
+</table></div>
+<p>
+ The sequence syntax uses many extra parenthesis and it is significantly less
+ readable than the comma-separated syntax that we have seen so far. Therefore,
+ it is strongly recommended to not use the sequence syntax unless it is absolutely
+ necessary to program contracts that are portable to compilers that do not support
+ variadic macros.
+ </p>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.no_variadic_macros.sequence_syntax"></a><a class="link" href="no_variadic_macros.html#contract__.no_variadic_macros.sequence_syntax" title="Sequence Syntax">Sequence
+ Syntax</a>
+</h3></div></div></div>
+<p>
+ In the rare case that programmers need to use this library on compliers without
+ variadic macros, this library also allows to specify its macro parameters
+ using a Boost.Preprocessor
+ sequence in which tokens are separated using round parenthesis <code class="computeroutput"><span class="special">()</span></code>:
+ </p>
+<pre class="programlisting"><span class="special">(</span><span class="identifier">token1</span><span class="special">)</span> <span class="special">(</span><span class="identifier">token2</span><span class="special">)</span> <span class="special">...</span> <span class="comment">// All compilers.</span>
+</pre>
+<p>
+ Instead of the comma-separated lists that we have seen so far which require
+ variadic macros:
+ </p>
+<pre class="programlisting"><span class="identifier">token1</span><span class="special">,</span> <span class="identifier">token2</span><span class="special">,</span> <span class="special">...</span> <span class="comment">// Only compilers with variadic macros (preferred).</span>
+</pre>
+<p>
+ This library detects preprocessor support for variadic macros using the
+ Boost.Config
+ macro <code class="computeroutput"><span class="identifier">BOOST_NO_VARIADIC_MACROS</span></code>.
+ Boost.Config
+ defines the <code class="computeroutput"><span class="identifier">BOOST_NO_VARIADIC_MACROS</span></code>
+ only on compilers that do not support variadic macros furthermore programmers
+ can forcefully define this macro also on compilers that support variadic
+ macros. When this macro is not defined, this library macros support both
+ the camma-separated and sequence syntax, otherwise only the sequence syntax
+ is supported.
+ </p>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ The same macros accept both syntaxes on compilers with variadic macros
+ and only the sequence syntax on compilers without variadic macros.
+ </p></td></tr>
+</table></div>
+<p>
+ For example, the syntax on the left hand side works on all compilers with
+ and without variaidic macros (see also class_template_vector_seq.cpp
,
+ pushable_seq.hpp
, class_template_vector.cpp
,
+ and pushable.hpp
):
+ </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>
+ <p>
+ Sequence Syntax (all compilers)
+ </p>
+ </th>
+<th>
+ <p>
+ Comma-Separated Syntax (variadic macros only, preferred)
+ </p>
+ </th>
+</tr></thead>
+<tbody>
+<tr>
+<td>
+ <p>
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="special">(</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">)</span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">pushable</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// Subcontracting: In `and` with derived class invariants.</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span> <span class="special">(</span><span class="keyword">void</span><span class="special">)</span> <span class="special">)</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">const_reference</span> <span class="identifier">const_reference</span><span class="special">;</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">push_back</span><span class="special">)</span> <span class="special">(</span> <span class="special">((</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">value</span><span class="special">)</span> <span class="special">)</span> <span class="keyword">new</span>
+ <span class="comment">// Subcontracting: In `or` with overriding function preconditions.</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="special">(</span><span class="keyword">false</span><span class="special">)</span> <span class="special">)</span> <span class="comment">// Force check to overriding preconditions.</span>
+ <span class="comment">// Subcontracting: In `and` with overriding function postconditions.</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="special">(</span><span class="identifier">back</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">value</span><span class="special">)(</span><span class="keyword">requires</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span><span class="special">)</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="comment">// Contract for pure virtual function.</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">virtual</span> <span class="identifier">const_reference</span> <span class="identifier">back</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
+<span class="special">};</span>
+</pre>
+<p>
+ </p>
+ </td>
+<td>
+ <p>
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">pushable</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// Subcontracting: In `and` with derived class invariants.</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">const_reference</span> <span class="identifier">const_reference</span><span class="special">;</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">push_back</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">value</span> <span class="special">)</span> <span class="keyword">new</span>
+ <span class="comment">// Subcontracting: In `or` with overriding function preconditions.</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="keyword">false</span> <span class="special">)</span> <span class="comment">// Force check to overriding preconditions.</span>
+ <span class="comment">// Subcontracting: In `and` with overriding function postconditions.</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="identifier">back</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">value</span><span class="special">,</span> <span class="keyword">requires</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">has_equal_to</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="comment">// Contract for pure virtual function.</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">virtual</span> <span class="identifier">const_reference</span> <span class="identifier">back</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
+<span class="special">};</span>
+</pre>
+<p>
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor">#include</span> <span class="string">"pushable_seq.hpp"</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="special">(</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">)</span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">vector</span><span class="special">)</span> <span class="keyword">extends</span><span class="special">(</span> <span class="special">(</span><span class="keyword">public</span> <span class="identifier">pushable</span><span class="special"><</span><span class="identifier">T</span><span class="special">>)</span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// Use preprocessor sequences instead of variadic comma-separated lists.</span>
+
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span>
+ <span class="special">(</span><span class="identifier">empty</span><span class="special">()</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">))</span>
+ <span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special"><=</span> <span class="identifier">capacity</span><span class="special">())</span>
+ <span class="special">(</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special"><=</span> <span class="identifier">max_size</span><span class="special">())</span>
+ <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">())</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">size</span><span class="special">()))</span>
+ <span class="special">)</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">size_type</span> <span class="identifier">size_type</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">const_reference</span> <span class="identifier">const_reference</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">const_iterator</span> <span class="identifier">const_iterator</span><span class="special">;</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">explicit</span> <span class="special">(</span><span class="identifier">vector</span><span class="special">)</span> <span class="special">(</span> <span class="special">((</span><span class="identifier">size_type</span><span class="special">)</span> <span class="identifier">count</span><span class="special">)</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="special">(</span><span class="identifier">count</span> <span class="special">>=</span> <span class="number">0</span><span class="special">)</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span><span class="special">)</span>
+ <span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">T</span><span class="special">()))</span>
+ <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="special">(</span><span class="identifier">vector_</span><span class="special">(</span><span class="identifier">count</span><span class="special">))</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">vector</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">push_back</span><span class="special">)</span> <span class="special">(</span> <span class="special">((</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">value</span><span class="special">)</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special"><</span> <span class="identifier">max_size</span><span class="special">())</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="special">(</span><span class="keyword">auto</span> <span class="identifier">old_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">size</span><span class="special">())</span>
+ <span class="special">(</span><span class="keyword">auto</span> <span class="identifier">old_capacity</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">capacity</span><span class="special">())</span>
+ <span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_size</span> <span class="special">+</span> <span class="number">1</span><span class="special">)</span>
+ <span class="special">(</span><span class="identifier">capacity</span><span class="special">()</span> <span class="special">>=</span> <span class="identifier">old_capacity</span><span class="special">)</span>
+ <span class="comment">// Overridden postconditions also check `back() == value`.</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">value</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="comment">// ...</span>
+</pre>
+<p>
+ </p>
+ </td>
+<td>
+ <p>
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor">#include</span> <span class="string">"pushable.hpp"</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">vector</span><span class="special">)</span> <span class="keyword">extends</span><span class="special">(</span> <span class="keyword">public</span> <span class="identifier">pushable</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">)</span> <span class="comment">// Subcontract.</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// Within templates, use contract macros postfixed by `_TPL`.</span>
+
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span>
+ <span class="identifier">empty</span><span class="special">()</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">),</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special"><=</span> <span class="identifier">capacity</span><span class="special">(),</span>
+ <span class="identifier">capacity</span><span class="special">()</span> <span class="special"><=</span> <span class="identifier">max_size</span><span class="special">(),</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">())</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">size</span><span class="special">())</span>
+ <span class="special">)</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">size_type</span> <span class="identifier">size_type</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">const_reference</span> <span class="identifier">const_reference</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">const_iterator</span> <span class="identifier">const_iterator</span><span class="special">;</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">explicit</span> <span class="special">(</span><span class="identifier">vector</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">size_type</span><span class="special">)</span> <span class="identifier">count</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">count</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span><span class="special">,</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">T</span><span class="special">())</span>
+ <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">vector_</span><span class="special">(</span><span class="identifier">count</span><span class="special">)</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">vector</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">push_back</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">size</span><span class="special">()</span> <span class="special"><</span> <span class="identifier">max_size</span><span class="special">()</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">size</span><span class="special">(),</span>
+ <span class="keyword">auto</span> <span class="identifier">old_capacity</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">capacity</span><span class="special">(),</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_size</span> <span class="special">+</span> <span class="number">1</span><span class="special">,</span>
+ <span class="identifier">capacity</span><span class="special">()</span> <span class="special">>=</span> <span class="identifier">old_capacity</span>
+ <span class="comment">// Overridden postconditions also check `back() == value`.</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">value</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="comment">// ...</span>
+</pre>
+<p>
+ </p>
+ </td>
+</tr>
+</tbody>
+</table></div>
+<p>
+ Note the many extra parenthesis around all tokens within the lists: template
+ parameters <code class="computeroutput"><span class="special">(</span><span class="keyword">typename</span>
+ <span class="identifier">T</span><span class="special">)</span></code>,
+ base classes <code class="computeroutput"><span class="special">(</span><span class="keyword">public</span>
+ <span class="identifier">pushable</span><span class="special"><</span><span class="identifier">T</span><span class="special">>)</span></code>,
+ function parameters <code class="computeroutput"><span class="special">(</span><span class="identifier">size_type</span><span class="special">)</span> <span class="identifier">count</span></code>,
+ all assertions, etc. Furthermore, empty lists need to be specified using
+ <code class="computeroutput"><span class="special">(</span><span class="keyword">void</span><span class="special">)</span></code> instead of just <code class="computeroutput"><span class="keyword">void</span></code>.
+ </p>
+<p>
+ When using the sequence syntax, the macro <code class="computeroutput"><a class="link" href="../CONTRACT_LIMIT_OLDOFS.html" title="Macro CONTRACT_LIMIT_OLDOFS">CONTRACT_LIMIT_OLDOFS</a></code>
+ specifies the maximum number of postconditions sequence elements (instead
+ of the maximum possible number of old value declarations as for variadic
+ macros).
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.no_variadic_macros.commas_and_leading_symbols_in_macros"></a><a class="link" href="no_variadic_macros.html#contract__.no_variadic_macros.commas_and_leading_symbols_in_macros" title="Commas and Leading Symbols in Macros">Commas
+ and Leading Symbols in Macros</a>
+</h3></div></div></div>
+<p>
+ As we have seen in the <a class="link" href="advanced_topics.html" title="Advanced Topics">Advanced
+ Topics</a> section, syntactic elements containing unwrapped commas and
+ leading symbols need to be wrapped within extra round parenthesis:
+ </p>
+<pre class="programlisting"><span class="special">(::</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special"><</span><span class="keyword">char</span><span class="special">,</span> <span class="keyword">int</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">less</span><span class="special"><</span><span class="keyword">char</span><span class="special">></span> <span class="special">>)</span> <span class="comment">// With variadic macros.</span>
+</pre>
+<p>
+ However, without variadic macros this is no longer sufficient and the number
+ of commas needs to be explicitly specified using the following syntax: <sup>[<a name="contract__.no_variadic_macros.commas_and_leading_symbols_in_macros.f0" href="#ftn.contract__.no_variadic_macros.commas_and_leading_symbols_in_macros.f0" class="footnote">75</a>]</sup>
+ </p>
+<pre class="programlisting"><span class="keyword">comma</span><span class="special">(</span><span class="number">2</span><span class="special">)(::</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special"><</span><span class="keyword">char</span><span class="special">,</span> <span class="keyword">int</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">less</span><span class="special"><</span><span class="keyword">char</span><span class="special">></span> <span class="special">>)</span> <span class="comment">// Without variadic macros.</span>
+</pre>
+<p>
+ For example (see also macro_commas_symbols_integral_map_seq.cpp
and
+ macro_commas_symbols_integral_map.cpp
):
+ </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>
+ <p>
+ Sequence Syntax (all compilers)
+ </p>
+ </th>
+<th>
+ <p>
+ Comma-Separated Syntax (variadic macros only, preferred)
+ </p>
+ </th>
+</tr></thead>
+<tbody><tr>
+<td>
+ <p>
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span>
+ <span class="special">(</span><span class="keyword">typename</span> <span class="identifier">Key</span><span class="special">)</span>
+ <span class="special">(</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">)</span>
+ <span class="special">(</span><span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">)</span>
+ <span class="special">(</span><span class="keyword">default</span> <span class="keyword">comma</span><span class="special">(</span><span class="number">1</span><span class="special">)(::</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="identifier">Key</span> <span class="keyword">const</span><span class="special">,</span> <span class="identifier">T</span><span class="special">></span> <span class="special">>))</span>
+ <span class="special">(</span><span class="keyword">comma</span><span class="special">(</span><span class="number">1</span><span class="special">)(</span><span class="keyword">typename</span> <span class="special">::</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>::</span><span class="identifier">key_type</span><span class="special">)</span> <span class="identifier">default_key</span><span class="special">)</span>
+ <span class="special">(</span><span class="keyword">default</span> <span class="special">(-</span><span class="number">1</span><span class="special">))</span>
+ <span class="special">)</span> <span class="keyword">requires</span><span class="special">(</span> <span class="special">(</span><span class="keyword">comma</span><span class="special">(</span><span class="number">1</span><span class="special">)(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">Convertible</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span> <span class="keyword">int</span><span class="special">>))</span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">integral_map</span><span class="special">)</span>
+ <span class="keyword">extends</span><span class="special">(</span> <span class="special">(</span><span class="keyword">public</span> <span class="keyword">comma</span><span class="special">(</span><span class="number">1</span><span class="special">)(::</span><span class="identifier">sizeable</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>))</span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span>
+ <span class="special">(((::</span><span class="identifier">sizeable</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>::</span><span class="identifier">max_size</span><span class="special">))</span> <span class="special">>=</span> <span class="identifier">size</span><span class="special">())</span>
+ <span class="special">)</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">less</span><span class="special"><</span><span class="identifier">Key</span><span class="special">>,</span> <span class="identifier">Allocator</span><span class="special">>::</span>
+ <span class="identifier">iterator</span> <span class="identifier">iterator</span><span class="special">;</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">template</span><span class="special">(</span> <span class="special">(</span><span class="keyword">typename</span> <span class="identifier">OtherKey</span><span class="special">)</span> <span class="special">(</span><span class="keyword">typename</span> <span class="identifier">OtherT</span><span class="special">)</span> <span class="special">)</span>
+ <span class="keyword">requires</span><span class="special">(</span>
+ <span class="special">(</span><span class="keyword">comma</span><span class="special">(</span><span class="number">1</span><span class="special">)(::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">Convertible</span><span class="special"><</span><span class="identifier">OtherKey</span><span class="special">,</span> <span class="identifier">Key</span><span class="special">>))</span>
+ <span class="special">(</span><span class="keyword">comma</span><span class="special">(</span><span class="number">1</span><span class="special">)(::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">Convertible</span><span class="special"><</span><span class="identifier">OtherT</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>))</span>
+ <span class="special">)</span>
+ <span class="keyword">comma</span><span class="special">(</span><span class="number">1</span><span class="special">)(::</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="identifier">iterator</span><span class="special">,</span> <span class="keyword">bool</span><span class="special">>)</span> <span class="special">(</span><span class="identifier">insert</span><span class="special">)</span> <span class="special">(</span>
+ <span class="special">(</span><span class="keyword">comma</span><span class="special">(</span><span class="number">1</span><span class="special">)(::</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="identifier">OtherKey</span><span class="special">,</span> <span class="identifier">OtherT</span><span class="special">></span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">other_value</span><span class="special">)</span>
+ <span class="special">(</span><span class="keyword">default</span> <span class="keyword">comma</span><span class="special">(</span><span class="number">1</span><span class="special">)(::</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span><span class="identifier">T</span><span class="special">>(</span><span class="identifier">default_key</span><span class="special">,</span> <span class="identifier">T</span><span class="special">())))</span>
+ <span class="special">)</span> <span class="keyword">throw</span><span class="special">(</span> <span class="special">(</span><span class="keyword">comma</span><span class="special">(</span><span class="number">1</span><span class="special">)(::</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>))</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span>
+ <span class="special">((!</span><span class="identifier">full</span><span class="special">()))</span>
+ <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="special">(</span><span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">)</span>
+ <span class="special">(</span><span class="keyword">comma</span><span class="special">(</span><span class="number">1</span><span class="special">)(</span><span class="keyword">typename</span> <span class="identifier">sizeable</span><span class="special"><</span><span class="identifier">OtherKey</span><span class="special">,</span> <span class="identifier">OtherT</span><span class="special">>::</span><span class="identifier">size_type</span><span class="special">)</span>
+ <span class="identifier">old_other_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span>
+ <span class="special">(</span><span class="identifier">size</span><span class="special"><</span><span class="identifier">OtherKey</span><span class="special">,</span> <span class="identifier">OtherT</span><span class="special">>()))</span>
+ <span class="special">(((::</span><span class="identifier">sizeable</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>::</span><span class="identifier">max_size</span><span class="special">))</span> <span class="special">>=</span> <span class="identifier">size</span><span class="special">())</span>
+ <span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_other_size</span> <span class="special">+</span> <span class="special">(</span><span class="identifier">result</span><span class="special">.</span><span class="identifier">second</span> <span class="special">?</span> <span class="number">1</span> <span class="special">:</span> <span class="number">0</span><span class="special">))</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// ...</span>
+</pre>
+<p>
+ </p>
+ </td>
+<td>
+ <p>
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span>
+ <span class="keyword">typename</span> <span class="identifier">Key</span><span class="special">,</span>
+ <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="comment">// Commas in following template params.</span>
+ <span class="keyword">class</span> <span class="identifier">Allocator</span><span class="special">,</span>
+ <span class="keyword">default</span> <span class="special">(::</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">allocator</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="identifier">Key</span> <span class="keyword">const</span><span class="special">,</span> <span class="identifier">T</span><span class="special">></span> <span class="special">>),</span>
+ <span class="special">(</span><span class="keyword">typename</span> <span class="special">::</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>::</span><span class="identifier">key_type</span><span class="special">)</span> <span class="identifier">default_key</span><span class="special">,</span>
+ <span class="keyword">default</span> <span class="special">(-</span><span class="number">1</span><span class="special">)</span>
+ <span class="special">)</span> <span class="keyword">requires</span><span class="special">(</span> <span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">Convertible</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span> <span class="keyword">int</span><span class="special">>)</span> <span class="special">)</span> <span class="comment">// Commas in concepts.</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">integral_map</span><span class="special">)</span>
+ <span class="keyword">extends</span><span class="special">(</span> <span class="keyword">public</span> <span class="special">(::</span><span class="identifier">sizeable</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>)</span> <span class="special">)</span> <span class="comment">// Commas in bases.</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span> <span class="comment">// Commas in class invariants.</span>
+ <span class="special">(::</span><span class="identifier">sizeable</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>::</span><span class="identifier">max_size</span><span class="special">)</span> <span class="special">>=</span> <span class="identifier">size</span><span class="special">()</span>
+ <span class="special">)</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">map</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">less</span><span class="special"><</span><span class="identifier">Key</span><span class="special">>,</span> <span class="identifier">Allocator</span><span class="special">>::</span>
+ <span class="identifier">iterator</span> <span class="identifier">iterator</span><span class="special">;</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">OtherKey</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">OtherT</span> <span class="special">)</span>
+ <span class="keyword">requires</span><span class="special">(</span>
+ <span class="special">(::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">Convertible</span><span class="special"><</span><span class="identifier">OtherKey</span><span class="special">,</span> <span class="identifier">Key</span><span class="special">>),</span>
+ <span class="special">(::</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">Convertible</span><span class="special"><</span><span class="identifier">OtherT</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>)</span>
+ <span class="special">)</span>
+ <span class="special">(::</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="identifier">iterator</span><span class="special">,</span> <span class="keyword">bool</span><span class="special">>)</span> <span class="special">(</span><span class="identifier">insert</span><span class="special">)</span> <span class="special">(</span> <span class="comment">// Commas in result and params.</span>
+ <span class="special">(::</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="identifier">OtherKey</span><span class="special">,</span> <span class="identifier">OtherT</span><span class="special">></span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">other_value</span><span class="special">,</span>
+ <span class="keyword">default</span> <span class="special">(::</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>(</span><span class="identifier">default_key</span><span class="special">,</span> <span class="identifier">T</span><span class="special">()))</span>
+ <span class="special">)</span> <span class="keyword">throw</span><span class="special">(</span> <span class="special">(::</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>)</span> <span class="special">)</span> <span class="comment">// Commas in exception specs.</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="comment">// Leading symbols in preconditions (same for commas).</span>
+ <span class="special">((!</span><span class="identifier">full</span><span class="special">()))</span> <span class="comment">// LIMITATION: Two sets `((...))` (otherwise seq.).</span>
+ <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="comment">// Commas in postconditions.</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="special">(</span><span class="keyword">typename</span> <span class="identifier">sizeable</span><span class="special"><</span><span class="identifier">OtherKey</span><span class="special">,</span> <span class="identifier">OtherT</span><span class="special">>::</span><span class="identifier">size_type</span><span class="special">)</span>
+ <span class="identifier">old_other_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span>
+ <span class="special">(</span><span class="identifier">size</span><span class="special"><</span><span class="identifier">OtherKey</span><span class="special">,</span> <span class="identifier">OtherT</span><span class="special">>()),</span>
+ <span class="special">(::</span><span class="identifier">sizeable</span><span class="special"><</span><span class="identifier">Key</span><span class="special">,</span> <span class="identifier">T</span><span class="special">>::</span><span class="identifier">max_size</span><span class="special">)</span> <span class="special">>=</span> <span class="identifier">size</span><span class="special">(),</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_other_size</span> <span class="special">+</span> <span class="special">(</span><span class="identifier">result</span><span class="special">.</span><span class="identifier">second</span> <span class="special">?</span> <span class="number">1</span> <span class="special">:</span> <span class="number">0</span><span class="special">)</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// ...</span>
+</pre>
+<p>
+ </p>
+ </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="footnotes">
+<br><hr width="100" align="left">
+<div class="footnote"><p><sup>[<a id="ftn.contract__.no_variadic_macros.commas_and_leading_symbols_in_macros.f0" href="#contract__.no_variadic_macros.commas_and_leading_symbols_in_macros.f0" class="para">75</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> Using variadic macros, the
+ preprocessor can automatically determine the number of commas within a
+ tuple but without variadic macros that is no longer possible so programmers
+ must manually specify the number of commas.
+ </p></div>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="grammar.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../reference.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/contract__/release_notes.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/contract__/release_notes.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,316 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Release Notes</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="prev" href="../CONTRACT_PARAMETER_BODY.html" title="Macro CONTRACT_PARAMETER_BODY">
+<link rel="next" href="bibliography.html" title="Bibliography">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../CONTRACT_PARAMETER_BODY.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="bibliography.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="contract__.release_notes"></a><a class="link" href="release_notes.html" title="Release Notes">Release Notes</a>
+</h2></div></div></div>
+<p>
+ This section contains notes on the current and on all previous library releases
+ (in chronological order).
+ </p>
+<h4>
+<a name="contract__.release_notes.h0"></a>
+ <span><a name="contract__.release_notes.release_0_4_1"></a></span><a class="link" href="release_notes.html#contract__.release_notes.release_0_4_1">Release
+ 0.4.1</a>
+ </h4>
+<p>
+ August 20, 2012
+ </p>
+<p>
+ Notes:
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ Using non-fix-spaced font in Full Table of Contents section.
+ </li>
+<li class="listitem">
+ Added a couple of notes to the documentation.
+ </li>
+<li class="listitem">
+ Changed <code class="computeroutput"><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">class_type</span><span class="special">,</span> <span class="identifier">function_name</span><span class="special">)</span></code> to <code class="computeroutput"><span class="identifier">class_type</span><span class="special">::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">function_name</span><span class="special">)</span></code> so the macro can also be used to declare
+ derived classes avoiding using the library syntax even when the base class
+ has contracts.
+ </li>
+</ol></div>
+<p>
+ Release files
+ and documentation.
+ </p>
+<h4>
+<a name="contract__.release_notes.h1"></a>
+ <span><a name="contract__.release_notes.release_0_4_0"></a></span><a class="link" href="release_notes.html#contract__.release_notes.release_0_4_0">Release
+ 0.4.0</a>
+ </h4>
+<p>
+ June 4, 2012
+ </p>
+<p>
+ Notes:
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ Simplified syntax by reducing extra parenthesis to the bare necessary minimum
+ (using some of the preprocessor parsing techniques originally introduced
+ by Boost.LocalFunction).
+ </li>
+<li class="listitem">
+ Postcondition old values only copy the old-of expression (e.g., copy just
+ vector size instead of entire vector). This improves performance and introduces
+ the <code class="computeroutput"><span class="identifier">ConstantCopyConstructible</span></code>
+ requirement just for the old value expression type (e.g., a vector might
+ not be copyable while its size always is because it is an integral type).
+ Removed the <code class="computeroutput"><span class="identifier">copyable</span></code> tag.
+ </li>
+<li class="listitem">
+ Body defined outside the macros (so compiler-errors for definitions retain
+ their usual meaning).
+ </li>
+<li class="listitem">
+ Added <code class="computeroutput"><span class="identifier">CONTRACT_CLASS</span></code> macro
+ and removed the need to duplicate declaration elements (do not repeat function
+ declaration, do not repeat class name in function declaration, etc).
+ </li>
+<li class="listitem">
+ Using <code class="computeroutput"><span class="identifier">_TPL</span></code> macros so to
+ reduce compile-time (instead of internally making all templates contract
+ functions so to use <code class="computeroutput"><span class="keyword">typename</span></code>
+ freely).
+ </li>
+<li class="listitem">
+ Overloading no longer requires unique parameter names.
+ </li>
+<li class="listitem">
+ Added C++11-like virtual specifiers.
+ </li>
+<li class="listitem">
+ Added constant assertions plus constant-expressions for select assertion
+ if-conditions and for loop variants.
+ </li>
+<li class="listitem">
+ Added named and deduced parameters.
+ </li>
+<li class="listitem">
+ Added concept checking.
+ </li>
+<li class="listitem">
+ Removed the interface to use the library without the macro (programmers
+ were required to write too much boiler-plate code for the non-macro interface
+ to be actually usable, plus supporting both the macro and non-macro interfaces
+ limited what the macros could do).
+ </li>
+</ol></div>
+<p>
+ Release files
+ and documentation.
+ </p>
+<h4>
+<a name="contract__.release_notes.h2"></a>
+ <span><a name="contract__.release_notes.release_0_3_490"></a></span><a class="link" href="release_notes.html#contract__.release_notes.release_0_3_490">Release
+ 0.3.490</a>
+ </h4>
+<p>
+ March 7, 2010
+ </p>
+<p>
+ Notes:
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ Added support and examples for <code class="computeroutput"><span class="keyword">volatile</span></code>,
+ <code class="computeroutput"><span class="keyword">auto</span></code>, <code class="computeroutput"><span class="keyword">explicit</span></code>,
+ <code class="computeroutput"><span class="keyword">export</span></code>, <code class="computeroutput"><span class="keyword">extern</span></code>,
+ <code class="computeroutput"><span class="keyword">friend</span></code>, <code class="computeroutput"><span class="keyword">inline</span></code>,
+ <code class="computeroutput"><span class="keyword">struct</span></code>, and <code class="computeroutput"><span class="keyword">throw</span></code> (for exception specifications).
+ </li>
+<li class="listitem">
+ Documented that <code class="computeroutput"><span class="keyword">union</span></code> cannot
+ be contracted.
+ </li>
+</ol></div>
+<p>
+ Release files
+ and documentation.
+ </p>
+<h4>
+<a name="contract__.release_notes.h3"></a>
+ <span><a name="contract__.release_notes.release_0_3_469"></a></span><a class="link" href="release_notes.html#contract__.release_notes.release_0_3_469">Release
+ 0.3.469</a>
+ </h4>
+<p>
+ February 21, 2010
+ </p>
+<p>
+ Notes:
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ Removed use of <code class="computeroutput"><span class="identifier">self</span></code>, <code class="computeroutput"><span class="identifier">variable</span><span class="special">.</span><span class="identifier">now</span></code>, and <code class="computeroutput"><span class="identifier">variable</span><span class="special">.</span><span class="identifier">old</span></code>
+ in writing contracts. Object <code class="computeroutput"><span class="keyword">this</span></code>
+ and variables are now accessed as usual in member functions. <code class="computeroutput"><span class="identifier">CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">variable</span><span class="special">)</span></code>
+ is used to access old values in postconditions.
+ </li>
+<li class="listitem">
+ Added <code class="computeroutput"><span class="special">(</span><span class="keyword">precondition</span><span class="special">)</span></code>, <code class="computeroutput"><span class="special">(</span><span class="keyword">postcondition</span><span class="special">)</span></code>,
+ and <code class="computeroutput"><span class="special">(</span><span class="identifier">body</span><span class="special">)</span></code> to specify contracts within the function
+ signature sequence. If no preconditions then <code class="computeroutput"><span class="special">(</span><span class="keyword">precondition</span><span class="special">)</span>
+ <span class="special">({...})</span></code> is simply omitted from the
+ sequence (same for postconditions, body is mandatory instead). For non-void
+ functions, users can name the result argument with <code class="computeroutput"><span class="special">(</span><span class="keyword">postcondition</span><span class="special">)</span>
+ <span class="special">(</span><span class="identifier">result</span><span class="special">-</span><span class="identifier">name</span><span class="special">)</span> <span class="special">({...})</span></code>.
+ </li>
+<li class="listitem">
+ Changed contract class template to use same syntax as Boost.Function (i.e.,
+ <code class="computeroutput"><span class="identifier">F</span></code> function type).
+ </li>
+<li class="listitem">
+ Added support for free functions and static member functions.
+ </li>
+<li class="listitem">
+ Added support for subcontracting with multiple inheritance.
+ </li>
+<li class="listitem">
+ Added static class invariants which are always checked (also at constructors
+ entry, destructor exit, and by static member functions).
+ </li>
+<li class="listitem">
+ Added block invariants and Eiffel-like loop variants.
+ </li>
+<li class="listitem">
+ Added handlers to customize action on contract failure (default to <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span><span class="special">()</span></code>).
+ </li>
+<li class="listitem">
+ Removed feature for automatic contract documentation using Doxygen (this
+ is not compatible with added <code class="computeroutput"><span class="special">(</span><span class="keyword">precondition</span><span class="special">)</span></code>,
+ <code class="computeroutput"><span class="special">(</span><span class="keyword">postcondition</span><span class="special">)</span></code>, and <code class="computeroutput"><span class="special">(</span><span class="identifier">body</span><span class="special">)</span></code>
+ because Doxygen preprocessor is not capable to handle Boost.Preprocessor
+ sequences).
+ </li>
+<li class="listitem">
+ Rewritten entire documentation (now using Boost.QuickBook instead of Doxygen).
+ </li>
+</ol></div>
+<p>
+ Release files
+ and documentation.
+ </p>
+<h4>
+<a name="contract__.release_notes.h4"></a>
+ <span><a name="contract__.release_notes.release_0_2_190"></a></span><a class="link" href="release_notes.html#contract__.release_notes.release_0_2_190">Release
+ 0.2.190</a>
+ </h4>
+<p>
+ November 21, 2009
+ </p>
+<p>
+ Notes:
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ Compiled using both GCC (Linux and Cygwin) and MSVC (Windows XP).
+ </li>
+<li class="listitem">
+ Required to use void to specify empty function argument list. This is to
+ comply with C++03 standard that does not allow to pass empty macro parameters
+ so it does not support empty preprocessor sequences <code class="computeroutput"><span class="special">()</span></code>.
+ </li>
+</ol></div>
+<p>
+ Release files
+ and documentation.
+ </p>
+<h4>
+<a name="contract__.release_notes.h5"></a>
+ <span><a name="contract__.release_notes.release_0_1_126"></a></span><a class="link" href="release_notes.html#contract__.release_notes.release_0_1_126">Release
+ 0.1.126</a>
+ </h4>
+<p>
+ June 17, 2009
+ </p>
+<p>
+ Notes:
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">
+ Completed first documentation draft.
+ </li></ol></div>
+<p>
+ Release files
+ and documentation.
+ </p>
+<h4>
+<a name="contract__.release_notes.h6"></a>
+ <span><a name="contract__.release_notes.release_0_1_55"></a></span><a class="link" href="release_notes.html#contract__.release_notes.release_0_1_55">Release
+ 0.1.55</a>
+ </h4>
+<p>
+ April 19, 2009
+ </p>
+<p>
+ Notes:
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ Reorganized files to cleanup root directory.
+ </li>
+<li class="listitem">
+ Added installation program.
+ </li>
+</ol></div>
+<p>
+ Release files
+ and documentation.
+ </p>
+<h4>
+<a name="contract__.release_notes.h7"></a>
+ <span><a name="contract__.release_notes.release_0_1_50"></a></span><a class="link" href="release_notes.html#contract__.release_notes.release_0_1_50">Release
+ 0.1.50</a>
+ </h4>
+<p>
+ April 19, 2009
+ </p>
+<p>
+ Notes:
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">
+ First public release.
+ </li></ol></div>
+<p>
+ Release files
+ and documentation.
+ </p>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="../CONTRACT_PARAMETER_BODY.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="bibliography.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/contract__/tutorial.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/contract__/tutorial.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,1577 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Tutorial</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="prev" href="contract_programming_overview.html" title="Contract Programming Overview">
+<link rel="next" href="advanced_topics.html" title="Advanced Topics">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="contract_programming_overview.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="advanced_topics.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="contract__.tutorial"></a><a class="link" href="tutorial.html" title="Tutorial">Tutorial</a>
+</h2></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section">Free Functions</span></dt>
+<dt><span class="section">Preconditions</span></dt>
+<dt><span class="section"><a href="tutorial.html#contract__.tutorial.postconditions__result_and_old_values_">Postconditions
+ (Result and Old Values)</a></span></dt>
+<dt><span class="section"><a href="tutorial.html#contract__.tutorial.classes_and_class_invariants">Classes
+ and Class Invariants</a></span></dt>
+<dt><span class="section">Constructors</span></dt>
+<dt><span class="section">Destructors</span></dt>
+<dt><span class="section">Member Functions</span></dt>
+<dt><span class="section"><a href="tutorial.html#contract__.tutorial.inheritance_and_subcontracting">Inheritance
+ and Subcontracting</a></span></dt>
+<dt><span class="section">Class Templates</span></dt>
+<dt><span class="section">Function Templates</span></dt>
+<dt><span class="section"><a href="tutorial.html#contract__.tutorial.forward_declarations_and_body_definitions">Forward
+ Declarations and Body Definitions</a></span></dt>
+</dl></div>
+<p>
+ This section explains how to program contracts using this library. See the
+ <a class="link" href="grammar.html" title="Grammar">Grammar</a> section for a complete guide
+ on this library syntax.
+ </p>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.tutorial.free_functions"></a><a class="link" href="tutorial.html#contract__.tutorial.free_functions" title="Free Functions">Free Functions</a>
+</h3></div></div></div>
+<p>
+ Consider the following free function <code class="computeroutput"><span class="identifier">postinc</span></code>
+ which performs a post-increment on its parameter (see also no_contract_postinc.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="keyword">int</span> <span class="keyword">const</span> <span class="identifier">postinc</span> <span class="special">(</span> <span class="keyword">int</span><span class="special">&</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="comment">// precondition: value < std::numeric_limits<int>::max()</span>
+ <span class="comment">// postcondition: value == oldof value + 1</span>
+ <span class="comment">// result == oldof valule</span>
+<span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">value</span><span class="special">++;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+ Let's now program the function declaration using the <code class="computeroutput"><a class="link" href="../CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code>
+ macro but without programming the contract yet (see also no_pre_post_postinc.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Declare free function (for programming contracts).</span>
+ <span class="keyword">int</span> <span class="keyword">const</span> <span class="special">(</span><span class="identifier">postinc</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="keyword">int</span><span class="special">&)</span> <span class="identifier">value</span> <span class="special">)</span> <span class="comment">// Non-fundamental types in `()`.</span>
+ <span class="comment">// precondition: value < std::numeric_limits<int>::max()</span>
+ <span class="comment">// postcondition: value == oldof value + 1</span>
+ <span class="comment">// result == oldof value</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">value</span><span class="special">++;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+ All necessary header files for this library are included by <code class="computeroutput"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span></code>
+ (see also the <a class="link" href="getting_started.html" title="Getting Started">Getting Started</a>
+ section).
+ </p>
+<p>
+ The function body is programmed outside the library macro. Therefore, while
+ this library alters the function declaration syntax, it does not change the
+ syntax used to implement the function.
+ </p>
+<p>
+ The function name <code class="computeroutput"><span class="special">(</span><span class="identifier">postinc</span><span class="special">)</span></code> must always be wrapped within parenthesis
+ so it can be passed to this library macros.
+ </p>
+<p>
+ The function result and parameter types must be wrapped within parenthesis
+ unless they are fundamental types containing no symbol (symbols are tokens
+ different from the alphanumeric tokens <code class="computeroutput"><span class="identifier">a</span><span class="special">-</span><span class="identifier">z</span></code>, <code class="computeroutput"><span class="identifier">A</span><span class="special">-</span><span class="identifier">Z</span></code>,
+ <code class="computeroutput"><span class="number">0</span><span class="special">-</span><span class="number">9</span></code>). In this example, the result type <code class="computeroutput"><span class="keyword">int</span> <span class="keyword">const</span></code>
+ is a fundamental type and it contains no symbol so the parenthesis around
+ it <code class="computeroutput"><span class="special">(</span><span class="keyword">int</span>
+ <span class="keyword">const</span><span class="special">)</span></code>
+ are allowed but not required. <sup>[<a name="contract__.tutorial.free_functions.f0" href="#ftn.contract__.tutorial.free_functions.f0" class="footnote">15</a>]</sup> Instead, the parameter type <code class="computeroutput"><span class="keyword">int</span><span class="special">&</span></code> is a fundamental type but it contains
+ the reference symbol <code class="computeroutput"><span class="special">&</span></code> so
+ it must be wrapped within parenthesis <code class="computeroutput"><span class="special">(</span><span class="keyword">int</span><span class="special">&)</span></code>.
+ </p>
+<div class="important"><table border="0" summary="Important">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../doc/src/images/important.png"></td>
+<th align="left">Important</th>
+</tr>
+<tr><td align="left" valign="top">
+<p>
+ In general, every token which is not a known keyword (<code class="computeroutput"><span class="keyword">int</span></code>
+ is a known keyword but the function name is not) or that contains a non-alphanumeric
+ symbol (e.g., <code class="computeroutput"><span class="keyword">int</span><span class="special">&</span></code>)
+ must be wrapped within round parenthesis <code class="computeroutput"><span class="special">(...)</span></code>
+ unless it is the very last token of a given syntactic element (e.g., the
+ function parameter name <code class="computeroutput"><span class="identifier">value</span></code>
+ is the last token of the parameter declaration). <sup>[<a name="contract__.tutorial.free_functions.f1" href="#ftn.contract__.tutorial.free_functions.f1" class="footnote">16</a>]</sup>
+ </p>
+<p>
+ See the <a class="link" href="grammar.html" title="Grammar">Grammar</a> section for more
+ information.
+ </p>
+</td></tr>
+</table></div>
+<p>
+ Each function parameter must always specify both its type and its name (parameter
+ names can instead by omitted in usual C++ declarations). <sup>[<a name="contract__.tutorial.free_functions.f2" href="#ftn.contract__.tutorial.free_functions.f2" class="footnote">17</a>]</sup> As usual, additional parameters can be specified separated by
+ commas <code class="computeroutput"><span class="special">,</span></code> on compilers that support
+ variadic macros (these include most modern compilers, MSVC, GCC, and all
+ C++11 compilers,
+ see the <a class="link" href="no_variadic_macros.html" title="No Variadic Macros">No Variadic Macros</a>
+ section for compilers that do not support variadic macros). The configuration
+ macro <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_FUNCTION_ARITY_MAX.html" title="Macro CONTRACT_CONFIG_FUNCTION_ARITY_MAX">CONTRACT_CONFIG_FUNCTION_ARITY_MAX</a></code>
+ indicates the maximum number of function parameters that can be specified.
+ An empty parameter list must be specified using <code class="computeroutput"><span class="keyword">void</span></code>
+ (this is similar to the usual C++ syntax that allows to declare a function
+ with no parameter using <code class="literal"><span class="emphasis"><em>result-type function-name </em></span></code><code class="computeroutput"><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span></code>).
+ <sup>[<a name="contract__.tutorial.free_functions.f3" href="#ftn.contract__.tutorial.free_functions.f3" class="footnote">18</a>]</sup> Default parameter values can be specified using <code class="computeroutput"><span class="special">,</span> <span class="keyword">default</span> </code><code class="literal"><span class="emphasis"><em>default-value</em></span></code>
+ immediately following the parameter name. The storage classifiers <code class="computeroutput"><span class="keyword">auto</span></code> and <code class="computeroutput"><span class="keyword">register</span></code>
+ can be specified as usual as part of the parameter type. <sup>[<a name="contract__.tutorial.free_functions.f4" href="#ftn.contract__.tutorial.free_functions.f4" class="footnote">19</a>]</sup> Functions can be overloaded by specifying different parameter
+ types and they can recursively call themselves as usual.
+ </p>
+<p>
+ For example, the following function <code class="computeroutput"><span class="identifier">postinc</span></code>
+ is overloaded to work on <code class="computeroutput"><span class="keyword">long</span></code>
+ instead of <code class="computeroutput"><span class="keyword">int</span></code> numbers, it is
+ implemented using recursion, it increments the specified number by <code class="computeroutput"><span class="identifier">offset</span></code> which is stored into a register
+ variable and it has a default value of <code class="computeroutput"><span class="number">1</span></code>
+ (see also params_postinc.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Overload, storage classifiers, and default parameters.</span>
+ <span class="keyword">long</span> <span class="keyword">const</span> <span class="special">(</span><span class="identifier">postinc</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="keyword">long</span><span class="special">&)</span> <span class="identifier">value</span><span class="special">,</span> <span class="keyword">register</span> <span class="keyword">unsigned</span> <span class="identifier">offset</span><span class="special">,</span> <span class="keyword">default</span> <span class="number">1</span> <span class="special">)</span>
+ <span class="comment">// precondition: value < std::numeric_limits<long>::max()</span>
+ <span class="comment">// postcondition: value == oldof value + offset</span>
+ <span class="comment">// result == oldof value</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">long</span> <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">value</span><span class="special">;</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">offset</span> <span class="special">></span> <span class="number">0</span><span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">value</span> <span class="special">+=</span> <span class="number">1</span><span class="special">;</span>
+ <span class="identifier">postinc</span><span class="special">(</span><span class="identifier">value</span><span class="special">,</span> <span class="identifier">offset</span> <span class="special">-</span> <span class="number">1</span><span class="special">);</span> <span class="comment">// Recursive calls.</span>
+ <span class="special">}</span>
+ <span class="keyword">return</span> <span class="identifier">result</span><span class="special">;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="keyword">long</span> <span class="identifier">value</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span>
+<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">postinc</span><span class="special">(</span><span class="identifier">value</span><span class="special">)</span> <span class="special">==</span> <span class="number">1</span><span class="special">);</span> <span class="comment">// Increment of 1 (it is 1).</span>
+<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">postinc</span><span class="special">(</span><span class="identifier">value</span><span class="special">,</span> <span class="number">4</span><span class="special">)</span> <span class="special">==</span> <span class="number">2</span><span class="special">);</span> <span class="comment">// Increment of 4 (it is 2).</span>
+<span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">value</span> <span class="special">==</span> <span class="number">6</span><span class="special">);</span> <span class="comment">// Incremented of 4 (it was 2).</span>
+</pre>
+<p>
+ </p>
+<p>
+ Function and array types cannot be directly used as function parameter types
+ within the contract macros but extra <code class="computeroutput"><span class="keyword">typedef</span></code>
+ declarations can be used to workaround this limitation (for multi-dimensional
+ arrays, the maximum number of supported array dimensions is specified by
+ the <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_ARRAY_DIMENSION_MAX.html" title="Macro CONTRACT_CONFIG_ARRAY_DIMENSION_MAX">CONTRACT_CONFIG_ARRAY_DIMENSION_MAX</a></code>
+ macro). For example (see also params_funcptr_array_apply.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// Contracts cannot directly use array type syntax, use via `typedef` instead.</span>
+<span class="keyword">typedef</span> <span class="keyword">int</span> <span class="identifier">array_2x3</span><span class="special">[</span><span class="number">2</span><span class="special">][</span><span class="number">3</span><span class="special">];</span>
+<span class="keyword">typedef</span> <span class="keyword">int</span> <span class="special">(*</span><span class="identifier">func_ptr</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="special">);</span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">void</span> <span class="special">(</span><span class="identifier">apply</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">func_ptr</span><span class="special">)</span> <span class="identifier">f</span><span class="special">,</span> <span class="special">(</span><span class="identifier">array_2x3</span><span class="special">)</span> <span class="identifier">m</span> <span class="special">)</span>
+ <span class="comment">// precondition: f != NULL</span>
+ <span class="comment">// m != NULL</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">for</span> <span class="special">(</span> <span class="keyword">size_t</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="number">2</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span>
+ <span class="keyword">for</span> <span class="special">(</span> <span class="keyword">size_t</span> <span class="identifier">j</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">j</span> <span class="special"><</span> <span class="number">3</span><span class="special">;</span> <span class="special">++</span><span class="identifier">j</span><span class="special">)</span>
+ <span class="identifier">m</span><span class="special">[</span><span class="identifier">i</span><span class="special">][</span><span class="identifier">j</span><span class="special">]</span> <span class="special">=</span> <span class="identifier">f</span><span class="special">(</span><span class="identifier">m</span><span class="special">[</span><span class="identifier">i</span><span class="special">][</span><span class="identifier">j</span><span class="special">]);</span>
+<span class="special">}</span>
+
+<span class="keyword">int</span> <span class="identifier">offset</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">i</span> <span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">i</span> <span class="special">+</span> <span class="number">10</span><span class="special">;</span> <span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="keyword">int</span> <span class="identifier">x</span><span class="special">[</span><span class="number">2</span><span class="special">][</span><span class="number">3</span><span class="special">]</span> <span class="special">=</span> <span class="special">{</span>
+ <span class="special">{</span><span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="number">3</span><span class="special">},</span>
+ <span class="special">{</span><span class="number">4</span><span class="special">,</span> <span class="number">5</span><span class="special">,</span> <span class="number">6</span><span class="special">}</span>
+<span class="special">};</span>
+<span class="identifier">apply</span><span class="special">(</span><span class="identifier">offset</span><span class="special">,</span> <span class="identifier">x</span><span class="special">);</span>
+</pre>
+<p>
+ </p>
+<p>
+ Spaces and new-lines make no syntactical difference and they can be used
+ freely within this library macros. <sup>[<a name="contract__.tutorial.free_functions.f5" href="#ftn.contract__.tutorial.free_functions.f5" class="footnote">20</a>]</sup> The following aesthetic conventions are followed in this documentation
+ (because the authors think they improve readability):
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ Round parenthesis are spaced when a list of tokens is expected (e.g.,
+ the function parameter list): <code class="computeroutput"><span class="special">(</span>
+ </code><code class="literal"><span class="emphasis"><em>token1</em></span></code><code class="computeroutput"> <span class="special">)</span></code>,
+ <code class="computeroutput"><span class="special">(</span> </code><code class="literal"><span class="emphasis"><em>token1</em></span></code><code class="computeroutput"><span class="special">,</span> </code><code class="literal"><span class="emphasis"><em>token2</em></span></code><code class="computeroutput">
+ <span class="special">)</span></code>, <code class="computeroutput"><span class="special">(</span>
+ </code><code class="literal"><span class="emphasis"><em>token1</em></span></code><code class="computeroutput"><span class="special">,</span>
+ </code><code class="literal"><span class="emphasis"><em>token2</em></span></code><code class="computeroutput"><span class="special">,</span>
+ </code><code class="literal"><span class="emphasis"><em>token3</em></span></code><code class="computeroutput"> <span class="special">)</span></code>,
+ etc.
+ </li>
+<li class="listitem">
+ Round parenthesis are not spaced when only a single token is expected
+ (e.g., the function name): <code class="computeroutput"><span class="special">(</span></code><code class="literal"><span class="emphasis"><em>token</em></span></code><code class="computeroutput"><span class="special">)</span></code>.
+ </li>
+</ol></div>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.tutorial.preconditions"></a><a class="link" href="tutorial.html#contract__.tutorial.preconditions" title="Preconditions">Preconditions</a>
+</h3></div></div></div>
+<p>
+ Let's program the preconditions of <code class="computeroutput"><span class="identifier">postinc</span></code>
+ (see also pre_only_postinc.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">int</span> <span class="keyword">const</span> <span class="special">(</span><span class="identifier">postinc</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="keyword">int</span><span class="special">&)</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">value</span> <span class="special"><</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="keyword">int</span><span class="special">>::</span><span class="identifier">max</span><span class="special">()</span> <span class="special">)</span> <span class="comment">// Precondition.</span>
+ <span class="comment">// postcondition: value == oldof value + 1</span>
+ <span class="comment">// result == oldof value</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">value</span><span class="special">++;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+ In this example, the preconditions assert only one boolean condition but
+ additional boolean conditions can be listed separated by commas <code class="computeroutput"><span class="special">,</span></code>. Preconditions are automatically checked
+ by the library when the <code class="computeroutput"><span class="identifier">postinc</span></code>
+ function is called, immediately before the body is executed (i.e., at function
+ <span class="emphasis"><em>entry</em></span>). See also the <a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.free_function_calls" title="Free Function Calls">Free
+ Function Calls</a> section.
+ </p>
+<p>
+ Contracts are supposed to check but not to modify the state of the program
+ (see the <a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.constant_correctness" title="Constant-Correctness">Constant-Correctness</a>
+ section). Therefore, this library evaluates all contract conditions in constant-correct
+ context. Specifically, in this example the type of <code class="computeroutput"><span class="identifier">value</span></code>
+ is automatically promoted from <code class="computeroutput"><span class="keyword">int</span><span class="special">&</span></code> to <code class="computeroutput"><span class="keyword">int</span>
+ <span class="keyword">const</span><span class="special">&</span></code>
+ within the preconditions and an attempt to modify <code class="computeroutput"><span class="identifier">value</span></code>
+ within the preconditions will correctly generate a compile-time error.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.tutorial.postconditions__result_and_old_values_"></a><a class="link" href="tutorial.html#contract__.tutorial.postconditions__result_and_old_values_" title="Postconditions (Result and Old Values)">Postconditions
+ (Result and Old Values)</a>
+</h3></div></div></div>
+<p>
+ Let's program the postconditions of <code class="computeroutput"><span class="identifier">postinc</span></code>
+ completing the contract (see also post_also_postinc.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">int</span> <span class="keyword">const</span> <span class="special">(</span><span class="identifier">postinc</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="keyword">int</span><span class="special">&)</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">value</span> <span class="special"><</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="keyword">int</span><span class="special">>::</span><span class="identifier">max</span><span class="special">()</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="comment">// Postconditions.</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span> <span class="comment">// Result value.</span>
+ <span class="keyword">auto</span> <span class="identifier">old_value</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">value</span><span class="special">,</span> <span class="comment">// Old value(s).</span>
+ <span class="identifier">value</span> <span class="special">==</span> <span class="identifier">old_value</span> <span class="special">+</span> <span class="number">1</span><span class="special">,</span> <span class="comment">// Assertion(s)...</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">old_value</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">value</span><span class="special">++;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+ Postconditions are automatically checked by the library when the <code class="computeroutput"><span class="identifier">postinc</span></code> function is called, immediately
+ after the body is executed but only if the body does not throw an exception
+ (i.e., at function <span class="emphasis"><em>normal exit</em></span>). See also the <a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.free_function_calls" title="Free Function Calls">Free
+ Function Calls</a> section.
+ </p>
+<p>
+ Postconditions can access the function return value by declaring a variable
+ of type <code class="computeroutput"><span class="keyword">auto</span></code> <sup>[<a name="contract__.tutorial.postconditions__result_and_old_values_.f0" href="#ftn.contract__.tutorial.postconditions__result_and_old_values_.f0" class="footnote">21</a>]</sup> and assigning it to the <code class="computeroutput"><span class="keyword">return</span></code>
+ keyword (the variable name is arbitrary but <code class="computeroutput"><span class="identifier">result</span></code>
+ is often used).
+ </p>
+<p>
+ Postconditions can also access the <span class="emphasis"><em>old value</em></span> that an
+ expression had just before the body was executed. This is done by declaring
+ a variable of type <code class="computeroutput"><span class="keyword">auto</span></code> and
+ assigning it to <code class="computeroutput"><a class="link" href="../CONTRACT_OLDOF.html" title="Macro CONTRACT_OLDOF">CONTRACT_OLDOF</a></code>
+ <code class="literal"><span class="emphasis"><em>expression</em></span></code> (the variable name is
+ arbitrary but the <code class="computeroutput"><span class="identifier">old_</span></code> prefix
+ is often used). Before executing the function body, the library automatically
+ copies (once) the value of the specified expression into a variable with
+ the specified name which is then made available to the postconditions. Therefore,
+ the type of an old value expression must have a copy constructor (or, more
+ precisely, it must be be <a class="link" href="advanced_topics.html#contract__.advanced_topics.old_and_result_value_copies" title="Old and Result Value Copies"><code class="literal">ConstantCopyConstructible</code></a>),
+ otherwise the library will generate a compile-time error. The parenthesis
+ around the expression passed to the <code class="computeroutput"><a class="link" href="../CONTRACT_OLDOF.html" title="Macro CONTRACT_OLDOF">CONTRACT_OLDOF</a></code>
+ macro are allowed but not required (in this example, <code class="computeroutput"><span class="identifier">CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">value</span><span class="special">)</span></code> could have been equivalently used instead
+ of <code class="computeroutput"><span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">value</span></code>
+ but the latter was preferred because of lesser parenthesis). In this sense,
+ the syntax of the <code class="computeroutput"><span class="identifier">CONTRACT_OLDOF</span></code>
+ macro resembles the syntax of the <code class="computeroutput"><span class="keyword">sizeof</span></code>
+ operator which also allows but does not require parenthesis when applied
+ to value expressions (i.e., <code class="computeroutput"><span class="keyword">sizeof</span>
+ <span class="identifier">value</span></code> and <code class="computeroutput"><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">value</span><span class="special">)</span></code> are both valid). <sup>[<a name="contract__.tutorial.postconditions__result_and_old_values_.f1" href="#ftn.contract__.tutorial.postconditions__result_and_old_values_.f1" class="footnote">22</a>]</sup> (The maximum number of supported and possible old value declarations
+ is specified by the <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_OLDOF_MAX.html" title="Macro CONTRACT_CONFIG_OLDOF_MAX">CONTRACT_CONFIG_OLDOF_MAX</a></code>
+ and <code class="computeroutput"><a class="link" href="../CONTRACT_LIMIT_OLDOFS.html" title="Macro CONTRACT_LIMIT_OLDOFS">CONTRACT_LIMIT_OLDOFS</a></code>
+ macros respectively.)
+ </p>
+<p>
+ Postconditions always access result and old values in constant-correct context
+ so that contracts cannot modify the state of the program (see the <a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.constant_correctness" title="Constant-Correctness">Constant-Correctness</a>
+ section).
+ </p>
+<p>
+ In general, it is recommended to specify multiple assertions separated by
+ commas and not to group them together into a single condition using the operator
+ <code class="computeroutput"><span class="keyword">and</span></code> (or <code class="computeroutput"><span class="special">&&</span></code>).
+ This is because if assertion conditions are programmed together using <code class="computeroutput"><span class="keyword">and</span></code> then it will not be clear which assertion
+ condition actually failed in case the contract is broken. For example, if
+ in the code above we programmed one single postcondition <code class="computeroutput"><span class="special">(</span><span class="identifier">value</span> <span class="special">==</span> <span class="identifier">old_value</span> <span class="special">+</span> <span class="number">1</span><span class="special">)</span> <span class="keyword">and</span>
+ <span class="special">(</span><span class="identifier">result</span>
+ <span class="special">==</span> <span class="identifier">old_value</span><span class="special">)</span></code> then in case the postcondition failed we
+ would not know which condition failed <code class="computeroutput"><span class="identifier">value</span>
+ <span class="special">==</span> <span class="identifier">old_value</span>
+ <span class="special">+</span> <span class="number">1</span></code>
+ or <code class="computeroutput"><span class="identifier">result</span> <span class="special">==</span>
+ <span class="identifier">old_value</span></code>.
+ </p>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ All tokens must be specified in the fixed order listed in the <a class="link" href="grammar.html" title="Grammar">Grammar</a>
+ section (it is not possible to specify postconditions before preconditions,
+ <code class="computeroutput"><span class="keyword">volatile</span></code> before <code class="computeroutput"><span class="keyword">const</span></code> for member functions, etc). <sup>[<a name="contract__.tutorial.postconditions__result_and_old_values_.f2" href="#ftn.contract__.tutorial.postconditions__result_and_old_values_.f2" class="footnote">23</a>]</sup>
+ </p></td></tr>
+</table></div>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.tutorial.classes_and_class_invariants"></a><a class="link" href="tutorial.html#contract__.tutorial.classes_and_class_invariants" title="Classes and Class Invariants">Classes
+ and Class Invariants</a>
+</h3></div></div></div>
+<p>
+ Consider the following class <code class="computeroutput"><span class="identifier">ivector</span></code>
+ which is a vector of integers with a constructor, destructor, and the <code class="computeroutput"><span class="identifier">push_back</span></code> member function (see also no_contract_ivector.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">ivector</span>
+<span class="special">{</span>
+ <span class="comment">// invariant: empty() == (size() == 0)</span>
+ <span class="comment">// size() <= capacity()</span>
+ <span class="comment">// capacity() <= max_size()</span>
+ <span class="comment">// std::distance(begin(), end()) == int(size())</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">>::</span><span class="identifier">size_type</span> <span class="identifier">size_type</span><span class="special">;</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">explicit</span> <span class="identifier">ivector</span> <span class="special">(</span> <span class="identifier">size_type</span> <span class="identifier">count</span> <span class="special">)</span>
+ <span class="comment">// precondition: count >= 0</span>
+ <span class="comment">// postcondition: size() == count</span>
+ <span class="comment">// boost::algorithm::all_of_equal(begin(), end(), 0)</span>
+ <span class="special">:</span> <span class="identifier">vector_</span><span class="special">(</span><span class="identifier">count</span><span class="special">)</span>
+ <span class="special">{}</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">ivector</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">void</span> <span class="identifier">push_back</span> <span class="special">(</span> <span class="keyword">int</span> <span class="keyword">const</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="comment">// precondition: size() < max_size()</span>
+ <span class="comment">// postcondition: size() == oldof size() + 1</span>
+ <span class="comment">// capacity() >= oldof capacity()</span>
+ <span class="comment">// back() == value</span>
+ <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">value</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">vector_</span><span class="special">;</span>
+<span class="special">};</span>
+</pre>
+<p>
+ </p>
+<p>
+ Let's program the class declaration and the class invariants using the <code class="computeroutput"><a class="link" href="../CONTRACT_CLASS.html" title="Macro CONTRACT_CLASS">CONTRACT_CLASS</a></code> and <code class="computeroutput"><a class="link" href="../CONTRACT_CLASS_INVARIANT.html" title="Macro CONTRACT_CLASS_INVARIANT">CONTRACT_CLASS_INVARIANT</a></code>
+ macros respectively (see also class_ivector.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// Declare the class.</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">ivector</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="comment">// Specify the class invariants.</span>
+ <span class="identifier">empty</span><span class="special">()</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">),</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special"><=</span> <span class="identifier">capacity</span><span class="special">(),</span>
+ <span class="identifier">capacity</span><span class="special">()</span> <span class="special"><=</span> <span class="identifier">max_size</span><span class="special">(),</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">())</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">size</span><span class="special">())</span>
+ <span class="special">)</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">>::</span><span class="identifier">size_type</span> <span class="identifier">size_type</span><span class="special">;</span>
+ <span class="comment">// ...</span>
+</pre>
+<p>
+ </p>
+<p>
+ A class must always be declared using the <code class="computeroutput"><a class="link" href="../CONTRACT_CLASS.html" title="Macro CONTRACT_CLASS">CONTRACT_CLASS</a></code>
+ macro in oder to later be able to program contracts for its constructors,
+ destructor, and member functions. Similarly to function names, the class
+ name must always be wrapped within parenthesis <code class="computeroutput"><span class="special">(</span><span class="identifier">ivector</span><span class="special">)</span></code>
+ (because the class name is not a known keyword and it is not the last element
+ of the class declaration syntax for example when base classes and are specified
+ after the class name). Only constructors, destructors, and member functions
+ that are public check the class invariants while the ones that are either
+ protected or private do not (see the <a class="link" href="contract_programming_overview.html" title="Contract Programming Overview">Contract
+ Programming Overview</a> section). The class invariant must always be
+ specified for a class declared using the <code class="computeroutput"><a class="link" href="../CONTRACT_CLASS.html" title="Macro CONTRACT_CLASS">CONTRACT_CLASS</a></code>
+ macro and it must appear at the very beginning of the class definition (no
+ statement can precede the <code class="computeroutput"><a class="link" href="../CONTRACT_CLASS_INVARIANT.html" title="Macro CONTRACT_CLASS_INVARIANT">CONTRACT_CLASS_INVARIANT</a></code>
+ macro, not even a <code class="computeroutput"><span class="keyword">typedef</span></code> or
+ a <code class="computeroutput"><span class="keyword">friend</span></code> declaration). If a
+ class has no class invariant, the class invariants must be specified <code class="computeroutput"><span class="keyword">void</span></code>:
+ </p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">ivector</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="comment">// No class invariant.</span>
+
+ <span class="comment">// ...</span>
+</pre>
+<p>
+ Using the same macro, this library also allows to specify contracts for
+ <code class="computeroutput"><span class="keyword">struct</span></code>: <sup>[<a name="contract__.tutorial.classes_and_class_invariants.f0" href="#ftn.contract__.tutorial.classes_and_class_invariants.f0" class="footnote">24</a>]</sup>
+ </p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">struct</span> <span class="special">(</span><span class="identifier">ivector</span><span class="special">)</span> <span class="comment">// Structs with contracts.</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// ...</span>
+</pre>
+<p>
+ The usual differences between <code class="computeroutput"><span class="keyword">struct</span></code>
+ and <code class="computeroutput"><span class="keyword">class</span></code> also apply when this
+ library is used (i.e., default member and inheritance access levels are
+ <code class="computeroutput"><span class="keyword">public</span></code> for <code class="computeroutput"><span class="keyword">struct</span></code>
+ and <code class="computeroutput"><span class="keyword">private</span></code> for <code class="computeroutput"><span class="keyword">class</span></code>).
+ </p>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ Unfortunately, this library does not allow to specify contracts for <code class="computeroutput"><span class="keyword">union</span></code>. <sup>[<a name="contract__.tutorial.classes_and_class_invariants.f1" href="#ftn.contract__.tutorial.classes_and_class_invariants.f1" class="footnote">25</a>]</sup>
+ </p></td></tr>
+</table></div>
+<p>
+ No contracts are checked (not event the class invariants) when a data member
+ is accessed directly so it might be best for both classes and structs to
+ have no non-constant public data member (but access all data members via
+ appropriate member functions that can check the class and sturct contracts).
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.tutorial.constructors"></a><a class="link" href="tutorial.html#contract__.tutorial.constructors" title="Constructors">Constructors</a>
+</h3></div></div></div>
+<p>
+ Let's program the <code class="computeroutput"><span class="identifier">ivector</span></code>
+ class constructor and its contract using the <code class="computeroutput"><a class="link" href="../CONTRACT_CONSTRUCTOR.html" title="Macro CONTRACT_CONSTRUCTOR">CONTRACT_CONSTRUCTOR</a></code>
+ macro (see also class_ivector.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CONSTRUCTOR</span><span class="special">(</span> <span class="comment">// Declare the constructor and its contract.</span>
+ <span class="keyword">public</span> <span class="keyword">explicit</span> <span class="special">(</span><span class="identifier">ivector</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">size_type</span><span class="special">)</span> <span class="identifier">count</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">count</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span><span class="special">,</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="number">0</span><span class="special">)</span>
+ <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">vector_</span><span class="special">(</span><span class="identifier">count</span><span class="special">)</span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{}</span>
+</pre>
+<p>
+ </p>
+<p>
+ Constructor, destructor, and member function declarations must always repeat
+ their access level <code class="computeroutput"><span class="keyword">public</span></code>,
+ <code class="computeroutput"><span class="keyword">protected</span></code>, or <code class="computeroutput"><span class="keyword">private</span></code> <sup>[<a name="contract__.tutorial.constructors.f0" href="#ftn.contract__.tutorial.constructors.f0" class="footnote">26</a>]</sup> which is specified without the usual trailing column symbol
+ <code class="computeroutput"><span class="special">:</span></code>. (This use of <code class="computeroutput"><span class="keyword">public</span></code>, <code class="computeroutput"><span class="keyword">protected</span></code>,
+ and <code class="computeroutput"><span class="keyword">private</span></code> resembles Java's
+ syntax.)
+ </p>
+<p>
+ The constructor name <code class="computeroutput"><span class="special">(</span><span class="identifier">ivector</span><span class="special">)</span></code> and the non-fundamental parameter type
+ <code class="computeroutput"><span class="special">(</span><span class="identifier">size_type</span><span class="special">)</span></code> must be wrapped within parenthesis (because
+ they are not known keywords and they are not at the end of a syntactic element).
+ </p>
+<p>
+ Member initializers are programed as a comma-separated list but using the
+ specifier <code class="literal">initialize( <span class="emphasis"><em>expression1</em></span>, <span class="emphasis"><em>expression2</em></span>,
+ ... )</code> instead of the usual column symbol <code class="literal">: <span class="emphasis"><em>expression1</em></span>,
+ <span class="emphasis"><em>expression2</em></span>, ...</code>. When specified, they must
+ appear at the very end of constructor declarations (after both preconditions
+ and postcondition if present). <sup>[<a name="contract__.tutorial.constructors.f1" href="#ftn.contract__.tutorial.constructors.f1" class="footnote">27</a>]</sup> Unfortunately, when member initializers are specified, the constructor
+ body must be defined together with its declaration and contract (see the
+ <a class="link" href="tutorial.html#contract__.tutorial.forward_declarations_and_body_definitions" title="Forward Declarations and Body Definitions">Forward
+ Declarations and Body Definitions</a> section).
+ </p>
+<p>
+ There is no object before the constructor body is executed, therefore this
+ library will generate a compile-time error if either preconditions or postcondition
+ old value expressions try to access the object <code class="computeroutput"><span class="keyword">this</span></code>.
+ For the same reason, only static class invariants are checked at entry of
+ public constructors (non-static class invariants are checked at public constructor
+ normal exit but not at entry). Finally, preconditions are checked before
+ member initializers are executed (so the initializers can rely on preconditions
+ for validating constructor arguments). See also the <a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.constructor_calls" title="Constructor Calls">Constructor
+ Calls</a> section.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.tutorial.destructors"></a><a class="link" href="tutorial.html#contract__.tutorial.destructors" title="Destructors">Destructors</a>
+</h3></div></div></div>
+<p>
+ Let's program the <code class="computeroutput"><span class="identifier">ivector</span></code>
+ class destructor using the <code class="computeroutput"><a class="link" href="../CONTRACT_DESTRUCTOR.html" title="Macro CONTRACT_DESTRUCTOR">CONTRACT_DESTRUCTOR</a></code>
+ macro (see also class_ivector.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_DESTRUCTOR</span><span class="special">(</span> <span class="comment">// Declare the destructor (so it checks invariants).</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">ivector</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{}</span>
+</pre>
+<p>
+ </p>
+<p>
+ The destructor access level <code class="computeroutput"><span class="keyword">public</span></code>,
+ <code class="computeroutput"><span class="keyword">protected</span></code>, or <code class="computeroutput"><span class="keyword">private</span></code> must always be specified. The destructor
+ name <code class="computeroutput"><span class="special">(~</span><span class="identifier">ivector</span><span class="special">)</span></code> must be wrapped within parenthesis. The
+ destructor empty parameter list must be specified using <code class="computeroutput"><span class="keyword">void</span></code>
+ (same as for constructors, member functions, and free functions with no parameters).
+ </p>
+<p>
+ Destructors have no parameter and there is no object after the destructor
+ body is executed. Therefore, destructors cannot specify neither preconditions
+ nor postconditions. <sup>[<a name="contract__.tutorial.destructors.f0" href="#ftn.contract__.tutorial.destructors.f0" class="footnote">28</a>]</sup> However, it is still necessary to contract (at least public)
+ destructors so they check static and non-static class invariants at entry,
+ and non-static class invariants at exit. See also the <a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.destructor_calls" title="Destructor Calls">Destructor
+ Calls</a> section.
+ </p>
+<div class="important"><table border="0" summary="Important">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../doc/src/images/important.png"></td>
+<th align="left">Important</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ Only members declared using this library macros check the class invariants.
+ Therefore, at least all public members of a class with non-empty class
+ invariants should be declared using this library macros even when they
+ have no preconditions and no postconditions so that they check the class
+ invariants (that is the case for public destructors).
+ </p></td></tr>
+</table></div>
+<p>
+ In general, there is no need to use this library macros to declare free functions,
+ constructors, destructors, and member function only when:
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ A free function has no preconditions and no postconditions.
+ </li>
+<li class="listitem">
+ A private or protected constructor, destructor, or member function has
+ no preconditions and no postconditions (regardless of class invariants
+ because private and protected members never check class invariants).
+ </li>
+<li class="listitem">
+ A public constructor, destructor, or member function has no preconditions,
+ no postconditions, and its class has no class invariants.
+ </li>
+</ol></div>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.tutorial.member_functions"></a><a class="link" href="tutorial.html#contract__.tutorial.member_functions" title="Member Functions">Member Functions</a>
+</h3></div></div></div>
+<p>
+ Let's program the member function <code class="computeroutput"><span class="identifier">ivector</span><span class="special">::</span><span class="identifier">push_back</span></code>
+ and its contract using the <code class="computeroutput"><a class="link" href="../CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code>
+ macro (see also class_ivector.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Declare the member function with its contract.</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">push_back</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="keyword">const</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">size</span><span class="special">()</span> <span class="special"><</span> <span class="identifier">max_size</span><span class="special">()</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">size</span><span class="special">(),</span>
+ <span class="keyword">auto</span> <span class="identifier">old_capacity</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">capacity</span><span class="special">(),</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_size</span> <span class="special">+</span> <span class="number">1</span><span class="special">,</span>
+ <span class="identifier">capacity</span><span class="special">()</span> <span class="special">>=</span> <span class="identifier">old_capacity</span><span class="special">,</span>
+ <span class="identifier">back</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">value</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">value</span><span class="special">);</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+ The member function access level <code class="computeroutput"><span class="keyword">public</span></code>,
+ <code class="computeroutput"><span class="keyword">protected</span></code>, or <code class="computeroutput"><span class="keyword">private</span></code> must always be specified. The member
+ function name <code class="computeroutput"><span class="special">(</span><span class="identifier">push_back</span><span class="special">)</span></code> must be wrapped within parenthesis. The
+ member function result type <code class="computeroutput"><span class="keyword">void</span></code>
+ and parameter type <code class="computeroutput"><span class="keyword">int</span> <span class="keyword">const</span></code>
+ can but do not have to be wrapped within parenthesis (because they are both
+ fundamental types containing no symbol).
+ </p>
+<p>
+ Public non-static member functions check static and non-static class invariants
+ at both entry and exit. Preconditions are checked at entry and postconditions
+ are checked at normal exit. Both preconditions and postconditions can access
+ the object and the member function parameters in constant-correct context.
+ Postconditions can declare return and old value variables (again, in constant-correct
+ context). See also the <a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.member_function_calls" title="Member Function Calls">Member
+ Function Calls</a> section.
+ </p>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top">
+<p>
+ Contracts are most useful when the assertions only use public members that
+ are accessible from the caller so the caller can properly verify and use
+ the contract. In particular, preconditions of a member function or constructor
+ that use non-public members are essentially incorrect because they cannot
+ be verified by the caller before calling the function (in fact, Eiffel
+ generates a compile-time error in this case).
+ </p>
+<p>
+ This library leave it up to programmers to only use public members when
+ programming contracts and especially when programming preconditions (see
+ the <a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.specification_vs__implementation" title="Specification vs. Implementation">Specification
+ vs. Implementation</a> section).
+ </p>
+</td></tr>
+</table></div>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.tutorial.inheritance_and_subcontracting"></a><a class="link" href="tutorial.html#contract__.tutorial.inheritance_and_subcontracting" title="Inheritance and Subcontracting">Inheritance
+ and Subcontracting</a>
+</h3></div></div></div>
+<p>
+ Consider the following class <code class="computeroutput"><span class="identifier">unique_identifiers</span></code>
+ which is a collection of unique integral identifiers (see also subcontract_identifiers.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">unique_identifiers</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">unique_identifiers</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">unique_identifiers</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">add</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">id</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span>
+ <span class="comment">// Id not already present.</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">id</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">end</span><span class="special">()</span>
+ <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">size</span><span class="special">(),</span>
+ <span class="keyword">auto</span> <span class="identifier">old_found</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">id</span><span class="special">)</span> <span class="special">!=</span> <span class="identifier">end</span><span class="special">(),</span>
+ <span class="comment">// If id was not already present, it was added now...</span>
+ <span class="identifier">old_found</span> <span class="special">?</span> <span class="keyword">true</span> <span class="special">:</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">id</span><span class="special">)</span> <span class="special">!=</span> <span class="identifier">end</span><span class="special">(),</span>
+ <span class="comment">// ...and size was increased of 1.</span>
+ <span class="identifier">old_found</span> <span class="special">?</span> <span class="keyword">true</span> <span class="special">:</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_size</span> <span class="special">+</span> <span class="number">1</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">identifiers_</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">id</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="comment">// ...</span>
+</pre>
+<p>
+ </p>
+<p>
+ Reading the contracts we can understand the semantics of the class operation
+ (even if we do not consult the class implementation):
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ The collection is constructed with zero size as specified by the constructor
+ postconditions. Consistently, the class invariants assert that the class
+ size must never be negative (but it can be zero).
+ </li>
+<li class="listitem">
+ The member function <code class="computeroutput"><span class="identifier">unique_identifiers</span><span class="special">::</span><span class="identifier">add</span></code>
+ allows to add an integral identifier to the collection. The preconditions
+ assert that the specified identifier must not already be part of the
+ collection making sure that duplicate identifiers are never added.
+ </li>
+<li class="listitem">
+ If the specified identifier was not already part of the collection (<code class="computeroutput"><span class="identifier">old_found</span></code> is <code class="computeroutput"><span class="keyword">false</span></code>)
+ then the postconditions assert that the identifier is added and consequently
+ that the size of the collection increased by one. Note that both postconditions
+ are trivially <code class="computeroutput"><span class="keyword">true</span></code> if instead
+ the identifier was already part of the collection (<code class="computeroutput"><span class="identifier">old_found</span></code>
+ is <code class="computeroutput"><span class="keyword">true</span></code>). We call these
+ type of assertions that are "guarded" by an activation condition
+ <span class="emphasis"><em>select assertions</em></span> (here we have used the C++ ternary
+ operator <code class="computeroutput"><span class="special">?:</span></code> to program select
+ assertions, the <a class="link" href="advanced_topics.html" title="Advanced Topics">Advanced Topics</a>
+ section will introduce an alternative construct for select assertions).
+ </li>
+</ol></div>
+<p>
+ Let's assume that we want to derive from <code class="computeroutput"><span class="identifier">unique_identifiers</span></code>
+ another type of collection <code class="computeroutput"><span class="identifier">duplicate_identifiers</span></code>
+ which instead allows to add duplicate identifiers (see also subcontract_identifiers.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">duplicate_identifiers</span><span class="special">)</span>
+ <span class="keyword">extends</span><span class="special">(</span> <span class="keyword">public</span> <span class="identifier">unique_identifiers</span> <span class="special">)</span> <span class="comment">// Automatically subcontract.</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">>=</span> <span class="number">1</span> <span class="comment">// Strengthened inherited class invariants (in `and`).</span>
+ <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">duplicate_identifiers</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">id</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">1</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// As usual, constructor should not call virtual member `add`.</span>
+ <span class="identifier">identifiers_</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">id</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">duplicate_identifiers</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">add</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">int</span> <span class="identifier">id</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="comment">// Wakened inherited preconditions (in `or`).</span>
+ <span class="comment">// OK even if id is already present.</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">id</span><span class="special">)</span> <span class="special">!=</span> <span class="identifier">end</span><span class="special">()</span>
+ <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="comment">// Strengthened inherited postconditions (in `and`).</span>
+ <span class="keyword">auto</span> <span class="identifier">old_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">size</span><span class="special">(),</span>
+ <span class="keyword">auto</span> <span class="identifier">old_found</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">id</span><span class="special">)</span> <span class="special">!=</span> <span class="identifier">end</span><span class="special">(),</span>
+ <span class="comment">// Inherited postconditions not checked because of</span>
+ <span class="comment">// select assertions, plus size unchanged if already present.</span>
+ <span class="identifier">old_found</span> <span class="special">?</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_size</span> <span class="special">:</span> <span class="keyword">true</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">if</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">find</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">id</span><span class="special">)</span> <span class="special">==</span> <span class="identifier">end</span><span class="special">())</span> <span class="special">{</span> <span class="comment">// Not already present.</span>
+ <span class="comment">// Unfortunately, must invoke base function via `BODY` macro.</span>
+ <span class="identifier">unique_identifiers</span><span class="special">::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">add</span><span class="special">)(</span><span class="identifier">id</span><span class="special">);</span>
+ <span class="special">}</span>
+ <span class="special">}</span>
+<span class="special">};</span>
+</pre>
+<p>
+ </p>
+<p>
+ The derived class <code class="computeroutput"><span class="identifier">duplicate_identifiers</span></code>
+ publicly inherits from the base class <code class="computeroutput"><span class="identifier">unique_identifiers</span></code>
+ using the specifier <code class="literal">extends( <span class="emphasis"><em>base1</em></span>, <span class="emphasis"><em>base2</em></span>,
+ ... )</code> instead of the usual column symbol <code class="literal">: <span class="emphasis"><em>base1</em></span>,
+ <span class="emphasis"><em>base2</em></span>, ...</code>. (This use of <code class="computeroutput"><span class="keyword">extends</span></code>
+ resembles Java's
+ syntax.) As usual, the inheritance access level <code class="computeroutput"><span class="keyword">public</span></code>,
+ <code class="computeroutput"><span class="keyword">protected</span></code>, or <code class="computeroutput"><span class="keyword">private</span></code> is optional and it defaults to <code class="computeroutput"><span class="keyword">public</span></code> for <code class="computeroutput"><span class="keyword">struct</span></code>
+ and to <code class="computeroutput"><span class="keyword">private</span></code> for <code class="computeroutput"><span class="keyword">class</span></code>. Virtual base classes can also be specified
+ but <code class="computeroutput"><span class="keyword">virtual</span></code> must always be specified
+ after the inheritance access level <code class="computeroutput"><span class="keyword">public</span></code>,
+ <code class="computeroutput"><span class="keyword">protected</span></code>, or <code class="computeroutput"><span class="keyword">private</span></code> if present. Multiple base classes
+ (<code class="computeroutput"><span class="identifier">base1</span></code>, <code class="computeroutput"><span class="identifier">base2</span></code>,
+ etc) can be specified for multiple-inheritance (the configuration macro
+ <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_INHERITANCE_MAX.html" title="Macro CONTRACT_CONFIG_INHERITANCE_MAX">CONTRACT_CONFIG_INHERITANCE_MAX</a></code>
+ indicates the maximum number of base classes that can be specified).
+ </p>
+<div class="note"><table border="0" summary="Note">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../doc/src/images/note.png"></td>
+<th align="left">Note</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ This library automatically subcontracts the derived class when one or more
+ base classes are specified (see the <a class="link" href="contract_programming_overview.html" title="Contract Programming Overview">Contract
+ Programming Overview</a> section).
+ </p></td></tr>
+</table></div>
+<p>
+ Let's assume that a <code class="computeroutput"><span class="identifier">duplicate_identifers</span></code>
+ object is constructed with identifier <code class="computeroutput"><span class="number">123</span></code>
+ and that we try to add the identifier <code class="computeroutput"><span class="number">123</span></code>
+ again:
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">duplicate_identifiers</span> <span class="identifier">ids</span><span class="special">(</span><span class="number">123</span><span class="special">);</span>
+<span class="identifier">ids</span><span class="special">.</span><span class="identifier">add</span><span class="special">(</span><span class="number">123</span><span class="special">);</span>
+</pre>
+<p>
+ </p>
+<p>
+ Reading both the derived and base class contracts, we can understand the
+ semantics of the derived class operation (even if we do not consult the base
+ and derived class implementations):
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ The <code class="computeroutput"><span class="identifier">duplicate_identifiers</span></code>
+ constructor creates a collection with size one as specified by the constructor
+ postconditions. Therefore, the <code class="computeroutput"><span class="identifier">duplicate_identifiers</span></code>
+ class invariants assert that size is always positive. Subcontracting
+ automatically checks the <code class="computeroutput"><span class="identifier">unique_identifiers</span></code>
+ base class invariants in <a class="link" href="contract_programming_overview.html#logic_and_anchor">logic-and</a>
+ with the <code class="computeroutput"><span class="identifier">duplicate_identifiers</span></code>
+ derived class invariants thus class invariants can only be strengthened
+ by derived classes (this is necessary because the derived class can be
+ used whenever the base class is used therefore the derived class must
+ satisfy the base class invariants at all times, see also the <a href="http://en.wikipedia.org/wiki/Liskov_substitution_principle" target="_top">substitution
+ principle</a> and the <a class="link" href="contract_programming_overview.html" title="Contract Programming Overview">Contract
+ Programming Overview</a> section).
+ </li>
+<li class="listitem">
+ Subcontracting automatically checks the <code class="computeroutput"><span class="identifier">unique_identifiers</span><span class="special">::</span><span class="identifier">add</span></code>
+ overridden preconditions in <a class="link" href="contract_programming_overview.html#logic_or_anchor">logic-or</a>
+ with the <code class="computeroutput"><span class="identifier">duplicate_identifiers</span><span class="special">::</span><span class="identifier">add</span></code>
+ overriding preconditions thus preconditions can only be weakened by overriding
+ member functions (this is necessary because the overriding member function
+ can be called under the conditions for which the overridden function
+ is called, see also the <a href="http://en.wikipedia.org/wiki/Liskov_substitution_principle" target="_top">substitution
+ principle</a> and the <a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.member_function_calls" title="Member Function Calls">Member
+ Function Calls</a> section). Indeed, in this example the <code class="computeroutput"><span class="identifier">unique_identifiers</span><span class="special">::</span><span class="identifier">add</span></code> preconditions fail (because <code class="computeroutput"><span class="number">123</span></code> is already in the collection) but the
+ <code class="computeroutput"><span class="identifier">derived_identifiers</span><span class="special">::</span><span class="identifier">add</span></code> preconditions pass so the <a class="link" href="contract_programming_overview.html#logic_or_anchor">logic-or</a> of the two sets of preconditions
+ passes and the call <code class="computeroutput"><span class="identifier">ids</span><span class="special">.</span><span class="identifier">add</span><span class="special">(</span><span class="number">123</span><span class="special">)</span></code>
+ is a valid call.
+ </li>
+<li class="listitem">
+ Subcontracting automatically checks the <code class="computeroutput"><span class="identifier">unique_identifiers</span><span class="special">::</span><span class="identifier">add</span></code>
+ overridden postconditions in <a class="link" href="contract_programming_overview.html#logic_and_anchor">logic-and</a>
+ with the <code class="computeroutput"><span class="identifier">duplicate_identifiers</span><span class="special">::</span><span class="identifier">add</span></code>
+ overriding postconditions thus postconditions can only be strengthen
+ by overriding member functions (this is necessary because the overriding
+ function can be called in any context in which the overridden function
+ is called, see also the <a href="http://en.wikipedia.org/wiki/Liskov_substitution_principle" target="_top">substitution
+ principle</a> and the <a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.member_function_calls" title="Member Function Calls">Member
+ Function Calls</a> section). Indeed, in this example the <code class="computeroutput"><span class="identifier">unique_identifiers</span><span class="special">::</span><span class="identifier">add</span></code> postconditions pass because the
+ identifier <code class="computeroutput"><span class="number">123</span></code> was already
+ added (<code class="computeroutput"><span class="identifier">old_found</span></code> is
+ <code class="computeroutput"><span class="keyword">true</span></code>) and <code class="computeroutput"><span class="identifier">unique_identifiers</span><span class="special">::</span><span class="identifier">add</span></code> select assertions trivially return
+ <code class="computeroutput"><span class="keyword">true</span></code>. The <code class="computeroutput"><span class="identifier">duplicate_identifiers</span><span class="special">::</span><span class="identifier">add</span></code> postconditions are then checked
+ in <a class="link" href="contract_programming_overview.html#logic_and_anchor">logic-and</a> and they correctly
+ assert that the collection size did not change given that <code class="computeroutput"><span class="number">123</span></code> was already added. Therefore, the call
+ <code class="computeroutput"><span class="identifier">ids</span><span class="special">.</span><span class="identifier">add</span><span class="special">(</span><span class="number">123</span><span class="special">)</span></code> is
+ valid but adds no identifier.
+ </li>
+</ol></div>
+<p>
+ Finally, note that within the body of overriding functions it is necessary
+ to use the <code class="computeroutput"><a class="link" href="../CONTRACT_MEMBER_BODY.html" title="Macro CONTRACT_MEMBER_BODY">CONTRACT_MEMBER_BODY</a></code>
+ macro to call the overridden function as in <code class="computeroutput"><span class="identifier">unique_identifiers</span><span class="special">::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">add</span><span class="special">)(</span><span class="identifier">id</span><span class="special">)</span></code>.
+ </p>
+<div class="warning"><table border="0" summary="Warning">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
+<th align="left">Warning</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ Unfortunately, invoking the overridden function from within the overriding
+ function body without using <code class="computeroutput"><a class="link" href="../CONTRACT_MEMBER_BODY.html" title="Macro CONTRACT_MEMBER_BODY">CONTRACT_MEMBER_BODY</a></code>
+ results in infinite recursion. <sup>[<a name="contract__.tutorial.inheritance_and_subcontracting.f0" href="#ftn.contract__.tutorial.inheritance_and_subcontracting.f0" class="footnote">29</a>]</sup> This limitation might be removed in future revisions of this
+ library (see also <a href="https://sourceforge.net/apps/trac/contractpp/ticket/46" target="_top">Ticket
+ 46</a>).
+ </p></td></tr>
+</table></div>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.tutorial.class_templates"></a><a class="link" href="tutorial.html#contract__.tutorial.class_templates" title="Class Templates">Class Templates</a>
+</h3></div></div></div>
+<p>
+ Let's program a class template <code class="computeroutput"><span class="identifier">vector</span></code>
+ similar to the class <code class="computeroutput"><span class="identifier">ivector</span></code>
+ we have seen before but that works on a generic value type <code class="computeroutput"><span class="identifier">T</span></code> and not just on <code class="computeroutput"><span class="keyword">int</span></code>
+ (see also class_template_vector.cpp
and
+ pushable.hpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="preprocessor">#include</span> <span class="string">"pushable.hpp"</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">vector</span><span class="special">)</span> <span class="keyword">extends</span><span class="special">(</span> <span class="keyword">public</span> <span class="identifier">pushable</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">)</span> <span class="comment">// Subcontract.</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// Within templates, use contract macros postfixed by `_TPL`.</span>
+
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span>
+ <span class="identifier">empty</span><span class="special">()</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">),</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special"><=</span> <span class="identifier">capacity</span><span class="special">(),</span>
+ <span class="identifier">capacity</span><span class="special">()</span> <span class="special"><=</span> <span class="identifier">max_size</span><span class="special">(),</span>
+ <span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">())</span> <span class="special">==</span> <span class="keyword">int</span><span class="special">(</span><span class="identifier">size</span><span class="special">())</span>
+ <span class="special">)</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">size_type</span> <span class="identifier">size_type</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">const_reference</span> <span class="identifier">const_reference</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">const_iterator</span> <span class="identifier">const_iterator</span><span class="special">;</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">explicit</span> <span class="special">(</span><span class="identifier">vector</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">size_type</span><span class="special">)</span> <span class="identifier">count</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">count</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">count</span><span class="special">,</span>
+ <span class="identifier">boost</span><span class="special">::</span><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">all_of_equal</span><span class="special">(</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">end</span><span class="special">(),</span> <span class="identifier">T</span><span class="special">())</span>
+ <span class="special">)</span>
+ <span class="keyword">initialize</span><span class="special">(</span> <span class="identifier">vector_</span><span class="special">(</span><span class="identifier">count</span><span class="special">)</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="special">(~</span><span class="identifier">vector</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">push_back</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">size</span><span class="special">()</span> <span class="special"><</span> <span class="identifier">max_size</span><span class="special">()</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">size</span><span class="special">(),</span>
+ <span class="keyword">auto</span> <span class="identifier">old_capacity</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">capacity</span><span class="special">(),</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_size</span> <span class="special">+</span> <span class="number">1</span><span class="special">,</span>
+ <span class="identifier">capacity</span><span class="special">()</span> <span class="special">>=</span> <span class="identifier">old_capacity</span>
+ <span class="comment">// Overridden postconditions also check `back() == value`.</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">value</span><span class="special">);</span>
+ <span class="special">}</span>
+
+ <span class="comment">// ...</span>
+</pre>
+<p>
+ </p>
+<p>
+ (The specifications of the code in this example are not fully programmed,
+ in particular concepts, see the <a class="link" href="concepts.html" title="Concepts">Concepts</a>
+ section, and assertion requirements, see the <a class="link" href="advanced_topics.html" title="Advanced Topics">Advanced
+ Topics</a> section, have been omitted for simplicity.)
+ </p>
+<p>
+ Note that templates are declared using the specifier <code class="computeroutput"><span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="special">...</span>
+ <span class="special">)</span></code> which uses round parenthesis instead
+ of the usual angular parenthesis <code class="computeroutput"><span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="special">...</span>
+ <span class="special">></span></code>. However, after a template is
+ declared using round parenthesis, angular parenthesis are used as usual to
+ instantiate the template (e.g., the base class <code class="computeroutput"><span class="identifier">pushable</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span></code>).
+ </p>
+<div class="important"><table border="0" summary="Important">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../doc/src/images/important.png"></td>
+<th align="left">Important</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ Within a type-dependent scope (e.g., within the class template of the above
+ example) the special macros with the <code class="computeroutput"><span class="identifier">_TPL</span></code>
+ postfix must be used instead of the macros we have seen so far. <sup>[<a name="contract__.tutorial.class_templates.f0" href="#ftn.contract__.tutorial.class_templates.f0" class="footnote">30</a>]</sup> (The same applies to function templates, see below.)
+ </p></td></tr>
+</table></div>
+<p>
+ In the example above, the enclosing class template <code class="computeroutput"><span class="identifier">vector</span></code>
+ is not declared using the <code class="computeroutput"><a class="link" href="../CONTRACT_CLASS_TPL.html" title="Macro CONTRACT_CLASS_TPL">CONTRACT_CLASS_TPL</a></code>
+ macro because its enclosing scope is not type-dependent (it is the global
+ namespace). Within such a class template however, all contract macros must
+ use the <code class="computeroutput"><span class="identifier">_TPL</span></code> postfix so
+ <code class="computeroutput"><a class="link" href="../CONTRACT_CLASS_INVARIANT_TPL.html" title="Macro CONTRACT_CLASS_INVARIANT_TPL">CONTRACT_CLASS_INVARIANT_TPL</a></code>,
+ <code class="computeroutput"><a class="link" href="../CONTRACT_CONSTRUCTOR_TPL.html" title="Macro CONTRACT_CONSTRUCTOR_TPL">CONTRACT_CONSTRUCTOR_TPL</a></code>,
+ <code class="computeroutput"><a class="link" href="../CONTRACT_DESTRUCTOR_TPL.html" title="Macro CONTRACT_DESTRUCTOR_TPL">CONTRACT_DESTRUCTOR_TPL</a></code>,
+ and <code class="computeroutput"><a class="link" href="../CONTRACT_FUNCTION_TPL.html" title="Macro CONTRACT_FUNCTION_TPL">CONTRACT_FUNCTION_TPL</a></code>
+ must be used to specify class invariants, declare constructors, declare the
+ destructor, and declare member functions respectively. In general, the <code class="computeroutput"><a class="link" href="../CONTRACT_CLASS_TPL.html" title="Macro CONTRACT_CLASS_TPL">CONTRACT_CLASS_TPL</a></code> macro is used when
+ declaring a class nested within a class template (see the <a class="link" href="advanced_topics.html" title="Advanced Topics">Advanced
+ Topics</a> section).
+ </p>
+<p>
+ This libraries supports all the different kinds of template parameters that
+ C++ supports: type template parameters, value template parameters, and template
+ template parameters.
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem">
+ Type template parameters can be prefixed by either <code class="computeroutput"><span class="keyword">typename</span></code>
+ or <code class="computeroutput"><span class="keyword">class</span></code> as usual, <code class="computeroutput"><span class="keyword">typename</span> <span class="identifier">A</span></code>
+ or <code class="computeroutput"><span class="keyword">class</span> <span class="identifier">C</span></code>.
+ </li>
+<li class="listitem">
+ The type of value template parameters must be wrapped within parenthesis
+ <code class="computeroutput"><span class="special">(</span><span class="identifier">A</span><span class="special">)</span> <span class="identifier">D</span></code>
+ but the parenthesis are optional for fundamental types that contain no
+ symbol <code class="computeroutput"><span class="keyword">int</span> <span class="identifier">B</span></code>.
+ </li>
+<li class="listitem">
+ Template template parameters use round parenthesis for their template
+ specifier but then their inner template parameters are specified using
+ the usual C++ syntax <code class="computeroutput"><span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">X</span><span class="special">,</span> <span class="keyword">template</span><span class="special"><</span>
+ <span class="special">...</span> <span class="special">></span>
+ <span class="keyword">class</span> <span class="identifier">Y</span><span class="special">,</span> <span class="special">...</span> <span class="special">)</span> <span class="keyword">class</span> <span class="identifier">E</span></code>.
+ </li>
+</ul></div>
+<p>
+ Default template parameters are specified using <code class="computeroutput"><span class="special">,</span>
+ <span class="keyword">default</span> </code><code class="literal"><span class="emphasis"><em>default-value</em></span></code>
+ right after the template parameter declaration. For example (see also template_params.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// Class template parameters.</span>
+ <span class="keyword">template</span><span class="special">(</span>
+ <span class="keyword">typename</span> <span class="identifier">A</span> <span class="comment">// Type template parameter.</span>
+ <span class="special">,</span> <span class="keyword">int</span> <span class="identifier">B</span> <span class="comment">// Value template parameter.</span>
+ <span class="special">,</span> <span class="keyword">class</span> <span class="identifier">C</span><span class="special">,</span> <span class="keyword">default</span> <span class="identifier">A</span> <span class="comment">// Optional type template parameter.</span>
+ <span class="special">,</span> <span class="special">(</span><span class="identifier">A</span><span class="special">)</span> <span class="identifier">D</span><span class="special">,</span> <span class="keyword">default</span> <span class="identifier">B</span> <span class="comment">// Optional value template parameter.</span>
+ <span class="special">,</span> <span class="keyword">template</span><span class="special">(</span> <span class="comment">// Template template parameter: Outer template</span>
+ <span class="keyword">typename</span> <span class="identifier">X</span> <span class="comment">// uses `()` but rest uses usual syntax.</span>
+ <span class="special">,</span> <span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">=</span> <span class="identifier">S</span> <span class="special">></span> <span class="keyword">class</span> <span class="identifier">Y</span>
+ <span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Z</span> <span class="special">=</span> <span class="keyword">int</span>
+ <span class="special">,</span> <span class="identifier">Z</span> <span class="identifier">V</span> <span class="special">=</span> <span class="number">0</span>
+ <span class="special">)</span> <span class="keyword">class</span> <span class="identifier">E</span><span class="special">,</span> <span class="keyword">default</span> <span class="identifier">x</span> <span class="comment">// Optional template template parameter.</span>
+ <span class="special">)</span>
+ <span class="keyword">struct</span> <span class="special">(</span><span class="identifier">a</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// ...</span>
+</pre>
+<p>
+ </p>
+<p>
+ Finally, the syntax <code class="computeroutput"><span class="keyword">template</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span></code>
+ is used instead of the usual <code class="computeroutput"><span class="keyword">template</span><span class="special"><</span> <span class="special">></span></code>
+ to specify a template with no template parameters (this is typically used
+ for template specializations, see the <a class="link" href="advanced_topics.html" title="Advanced Topics">Advanced
+ Topics</a> section).
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.tutorial.function_templates"></a><a class="link" href="tutorial.html#contract__.tutorial.function_templates" title="Function Templates">Function Templates</a>
+</h3></div></div></div>
+<p>
+ Let's program a function template <code class="computeroutput"><span class="identifier">postinc</span></code>
+ similar to the function <code class="computeroutput"><span class="identifier">postinc</span></code>
+ that we have seen before but that works on a generic type <code class="computeroutput"><span class="identifier">T</span></code>
+ and not just on <code class="computeroutput"><span class="keyword">int</span></code> (see also
+ function_template_postinc.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span> <span class="comment">// Template parameter(s).</span>
+ <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">)</span> <span class="special">(</span><span class="identifier">postinc</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">T</span><span class="special">&)</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">value</span> <span class="special"><</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">max</span><span class="special">()</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="keyword">auto</span> <span class="identifier">old_value</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">value</span><span class="special">,</span>
+ <span class="identifier">value</span> <span class="special">==</span> <span class="identifier">old_value</span> <span class="special">+</span> <span class="number">1</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="identifier">old_value</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">value</span><span class="special">++;</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+ (The specifications of the code in this example are not fully programmed,
+ in particular concepts, see the <a class="link" href="concepts.html" title="Concepts">Concepts</a>
+ section, and assertion requirements, see the <a class="link" href="advanced_topics.html" title="Advanced Topics">Advanced
+ Topics</a> section, have been omitted for simplicity.)
+ </p>
+<p>
+ Type, value, and template template parameters are specified for function
+ templates using the same syntax used for class template parameters, for example
+ (see also template_params.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Function template parameters.</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="comment">// As usual, no default template parameters allowed in functions.</span>
+ <span class="keyword">typename</span> <span class="identifier">A</span> <span class="comment">// Type template parameter.</span>
+ <span class="special">,</span> <span class="keyword">int</span> <span class="identifier">B</span> <span class="comment">// Value template parameter.</span>
+ <span class="special">,</span> <span class="keyword">class</span> <span class="identifier">C</span> <span class="comment">// Type template parameter.</span>
+ <span class="special">,</span> <span class="special">(</span><span class="identifier">A</span><span class="special">)</span> <span class="identifier">D</span> <span class="comment">// Value template parameter.</span>
+ <span class="special">,</span> <span class="keyword">template</span><span class="special">(</span> <span class="comment">// Template template parameter: Outer template</span>
+ <span class="keyword">typename</span> <span class="identifier">X</span> <span class="comment">// uses `()` but rest uses usual syntax.</span>
+ <span class="special">,</span> <span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">S</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">=</span> <span class="identifier">S</span> <span class="special">></span> <span class="keyword">class</span> <span class="identifier">Y</span>
+ <span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Z</span> <span class="special">=</span> <span class="keyword">int</span>
+ <span class="special">,</span> <span class="identifier">Z</span> <span class="identifier">V</span> <span class="special">=</span> <span class="number">0</span>
+ <span class="special">)</span> <span class="keyword">class</span> <span class="identifier">E</span>
+ <span class="special">)</span>
+ <span class="keyword">void</span> <span class="special">(</span><span class="identifier">f</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="comment">// ...</span>
+</pre>
+<p>
+ </p>
+<p>
+ Note that as usual, function templates cannot have default template parameters
+ in C++03.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.tutorial.forward_declarations_and_body_definitions"></a><a class="link" href="tutorial.html#contract__.tutorial.forward_declarations_and_body_definitions" title="Forward Declarations and Body Definitions">Forward
+ Declarations and Body Definitions</a>
+</h3></div></div></div>
+<p>
+ This library supports contracts for classes and functions that have forward
+ declarations. Furthermore, the function body definition can be deferred and
+ separated from the function declaration and its contracts. For example (see
+ also body_natural.hpp
,
+ body_natural_impl.hpp
,
+ and body_natural.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">Default</span> <span class="special">=</span> <span class="identifier">T</span><span class="special">()</span> <span class="special">></span> <span class="comment">// Class forward declaration.</span>
+<span class="keyword">class</span> <span class="identifier">natural</span> <span class="special">;</span>
+
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">></span> <span class="comment">// Function forward declaration.</span>
+<span class="keyword">bool</span> <span class="identifier">less</span> <span class="special">(</span> <span class="identifier">natural</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">left</span><span class="special">,</span> <span class="identifier">natural</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">right</span> <span class="special">)</span> <span class="special">;</span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">greater</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">natural</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">left</span><span class="special">,</span> <span class="special">(</span><span class="identifier">natural</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">right</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">?</span> <span class="keyword">not</span> <span class="identifier">less</span><span class="special">(</span><span class="identifier">left</span><span class="special">,</span> <span class="identifier">right</span><span class="special">)</span> <span class="special">:</span> <span class="keyword">true</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">;</span> <span class="comment">// Deferred free function body definition, use `;`.</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span> <span class="comment">// Class declaration (with contracts).</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="identifier">Default</span> <span class="special">)</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">natural</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span> <span class="identifier">get</span><span class="special">()</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_CONSTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">explicit</span> <span class="special">(</span><span class="identifier">natural</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">value</span><span class="special">,</span> <span class="keyword">default</span> <span class="identifier">Default</span> <span class="special">)</span>
+ <span class="keyword">precondition</span><span class="special">(</span> <span class="identifier">value</span> <span class="special">>=</span> <span class="number">0</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span> <span class="identifier">get</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">value</span> <span class="special">)</span>
+ <span class="comment">// Unfortunately, no member initializers when body deferred.</span>
+ <span class="special">)</span> <span class="special">;</span> <span class="comment">// Deferred constructor body definition, use `;`.</span>
+
+ <span class="identifier">CONTRACT_DESTRUCTOR_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(~</span><span class="identifier">natural</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span> <span class="comment">// Deferred destructor body definition, use `;`.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">equal</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">natural</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">right</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">==</span> <span class="keyword">not</span> <span class="identifier">less</span><span class="special">(*</span><span class="keyword">this</span><span class="special">,</span> <span class="identifier">right</span><span class="special">)</span> <span class="special">&&</span> <span class="keyword">not</span> <span class="identifier">greater</span><span class="special">(*</span><span class="keyword">this</span><span class="special">,</span> <span class="identifier">right</span><span class="special">)</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">;</span> <span class="comment">// Deferred member function body definition, use `;`.</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="special">(</span><span class="identifier">get</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">value_</span><span class="special">;</span>
+ <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">T</span> <span class="identifier">value_</span><span class="special">;</span>
+<span class="special">};</span>
+
+<span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span> <span class="comment">// Function declaration (with contracts).</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span>
+ <span class="keyword">bool</span> <span class="special">(</span><span class="identifier">less</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">natural</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">left</span><span class="special">,</span> <span class="special">(</span><span class="identifier">natural</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">right</span> <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">result</span> <span class="special">=</span> <span class="keyword">return</span><span class="special">,</span>
+ <span class="identifier">result</span> <span class="special">?</span> <span class="keyword">not</span> <span class="identifier">greater</span><span class="special">(</span><span class="identifier">left</span><span class="special">,</span> <span class="identifier">right</span><span class="special">)</span> <span class="special">:</span> <span class="keyword">true</span>
+ <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">left</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special"><</span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">get</span><span class="special">();</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+ In this example, the class <code class="computeroutput"><span class="identifier">natural</span></code>
+ and the function <code class="computeroutput"><span class="identifier">less</span></code> are
+ first forward declared and later declared. Note that the contracts can be
+ specified only once and together with the class or function declaration (not
+ with the forward declarations that can be many).
+ </p>
+<div class="important"><table border="0" summary="Important">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../doc/src/images/important.png"></td>
+<th align="left">Important</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ This library forces to specify contracts with the function and class declarations
+ and not with their definitions. This is correct because contracts are part
+ of the program specifications (declarations) and not of the program implementation
+ (definitions), see also the <a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.specification_vs__implementation" title="Specification vs. Implementation">Specification
+ vs. Implementation</a> section.
+ </p></td></tr>
+</table></div>
+<p>
+ Note that as usual in C++, not all functions need to be defined when they
+ are first declared. In this example, <code class="computeroutput"><span class="identifier">less</span></code>
+ and <code class="computeroutput"><span class="identifier">natural</span><span class="special">::</span><span class="identifier">get</span></code> are defined together with their declarations
+ and contracts while the other function bodies are defined separately.
+ </p>
+<p>
+ The definitions of the free function <code class="computeroutput"><span class="identifier">greater</span></code>,
+ the constructor <code class="computeroutput"><span class="identifier">natural</span><span class="special">::</span><span class="identifier">natural</span></code>, the destructor <code class="computeroutput"><span class="identifier">natural</span><span class="special">::~</span><span class="identifier">natural</span></code>,
+ and the member function <code class="computeroutput"><span class="identifier">natural</span><span class="special">::</span><span class="identifier">equal</span></code>
+ are deferred and separated from their declarations and contracts. In fact,
+ a semicolon <code class="computeroutput"><span class="special">;</span></code> is specified right
+ after the contract declaration macros instead of programming the function
+ bodies. As usual in C++, the semicolon <code class="computeroutput"><span class="special">;</span></code>
+ indicates that the function body definition is deferred and it will appear
+ at some other point in the program (often in a <code class="literal">.cpp</code> file
+ that can be compiled separately). In this example, the deferred functions
+ are templates or template members therefore the definitions where programmed
+ in a header file that must be made available when the template declarations
+ are compiled (see also body_natural_impl.hpp
):
+ <sup>[<a name="contract__.tutorial.forward_declarations_and_body_definitions.f0" href="#ftn.contract__.tutorial.forward_declarations_and_body_definitions.f0" class="footnote">31</a>]</sup>
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="comment">// Deferred body definitions, separated from their declarations and contracts.</span>
+
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">></span>
+<span class="keyword">bool</span> <span class="identifier">CONTRACT_FREE_BODY</span><span class="special">(</span><span class="identifier">greater</span><span class="special">)</span> <span class="special">(</span>
+ <span class="identifier">natural</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">left</span><span class="special">,</span> <span class="identifier">natural</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">right</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="keyword">return</span> <span class="identifier">left</span><span class="special">.</span><span class="identifier">get</span><span class="special">()</span> <span class="special">></span> <span class="identifier">right</span><span class="special">.</span><span class="identifier">get</span><span class="special">();</span>
+<span class="special">}</span>
+
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">Default</span> <span class="special">></span>
+<span class="identifier">CONTRACT_CONSTRUCTOR_BODY</span><span class="special">((</span><span class="identifier">natural</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Default</span><span class="special">>),</span> <span class="identifier">natural</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">value</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="identifier">value_</span> <span class="special">=</span> <span class="identifier">value</span><span class="special">;</span>
+<span class="special">}</span>
+
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">Default</span> <span class="special">></span>
+<span class="identifier">CONTRACT_DESTRUCTOR_BODY</span><span class="special">((</span><span class="identifier">natural</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Default</span><span class="special">>),</span> <span class="special">~</span><span class="identifier">natural</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">{</span>
+ <span class="comment">// Do nothing.</span>
+<span class="special">}</span>
+
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span><span class="special">,</span> <span class="identifier">T</span> <span class="identifier">Default</span> <span class="special">></span>
+<span class="keyword">bool</span> <span class="identifier">natural</span><span class="special"><</span><span class="identifier">T</span><span class="special">,</span> <span class="identifier">Default</span><span class="special">>::</span><span class="identifier">CONTRACT_MEMBER_BODY</span><span class="special">(</span><span class="identifier">equal</span><span class="special">)</span> <span class="special">(</span> <span class="identifier">natural</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">right</span> <span class="special">)</span>
+ <span class="keyword">const</span>
+<span class="special">{</span>
+ <span class="keyword">return</span> <span class="keyword">not</span> <span class="identifier">less</span><span class="special">(*</span><span class="keyword">this</span><span class="special">,</span> <span class="identifier">right</span><span class="special">)</span> <span class="special">&&</span> <span class="keyword">not</span> <span class="identifier">greater</span><span class="special">(*</span><span class="keyword">this</span><span class="special">,</span> <span class="identifier">right</span><span class="special">);</span>
+<span class="special">}</span>
+</pre>
+<p>
+ </p>
+<p>
+ The usual C++ syntax is used to define the bodies (in fact this library only
+ alters the syntax of class and function declarations but not the syntax of
+ their definitions). However, free function, constructor, destructor, and
+ member function names must be specified using the macros <code class="computeroutput"><a class="link" href="../CONTRACT_FREE_BODY.html" title="Macro CONTRACT_FREE_BODY">CONTRACT_FREE_BODY</a></code>,
+ <code class="computeroutput"><a class="link" href="../CONTRACT_CONSTRUCTOR_BODY.html" title="Macro CONTRACT_CONSTRUCTOR_BODY">CONTRACT_CONSTRUCTOR_BODY</a></code>,
+ <code class="computeroutput"><a class="link" href="../CONTRACT_DESTRUCTOR_BODY.html" title="Macro CONTRACT_DESTRUCTOR_BODY">CONTRACT_DESTRUCTOR_BODY</a></code>,
+ and <code class="computeroutput"><a class="link" href="../CONTRACT_MEMBER_BODY.html" title="Macro CONTRACT_MEMBER_BODY">CONTRACT_MEMBER_BODY</a></code>
+ respectively. <sup>[<a name="contract__.tutorial.forward_declarations_and_body_definitions.f1" href="#ftn.contract__.tutorial.forward_declarations_and_body_definitions.f1" class="footnote">32</a>]</sup> The free and member body macros take one parameter which is the
+ function name. The constructor and destructor body macros take two parameters
+ that are the fully qualified class type (including eventual template parameters
+ as usual) and the class name which must be prefixed by the tilde symbol
+ <code class="computeroutput"><span class="special">~</span></code> for destructors as usual.
+ <sup>[<a name="contract__.tutorial.forward_declarations_and_body_definitions.f2" href="#ftn.contract__.tutorial.forward_declarations_and_body_definitions.f2" class="footnote">33</a>]</sup> The class type parameter must be wrapped within extra parenthesis
+ like in this example but only if it contains multiple template parameters
+ (because these use unwrapped commas which cannot be passed within macro parameters,
+ see the beginning of the <a class="link" href="advanced_topics.html" title="Advanced Topics">Advanced
+ Topics</a> section).
+ </p>
+<p>
+ In this example, it was possible to separate the constructor body definition
+ because the constructor did not specify member initializers.
+ </p>
+<div class="warning"><table border="0" summary="Warning">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../doc/src/images/warning.png"></td>
+<th align="left">Warning</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ Unfortunately, when member initializers are specified, the macro <code class="computeroutput"><a class="link" href="../CONTRACT_CONSTRUCTOR_BODY.html" title="Macro CONTRACT_CONSTRUCTOR_BODY">CONTRACT_CONSTRUCTOR_BODY</a></code> cannot
+ be used, the constructor body definition cannot be deferred, and the constructor
+ body must be defined together with the constructor declaration and its
+ contract inside the class definition. <sup>[<a name="contract__.tutorial.forward_declarations_and_body_definitions.f3" href="#ftn.contract__.tutorial.forward_declarations_and_body_definitions.f3" class="footnote">34</a>]</sup>
+ </p></td></tr>
+</table></div>
+</div>
+<div class="footnotes">
+<br><hr width="100" align="left">
+<div class="footnote"><p><sup>[<a id="ftn.contract__.tutorial.free_functions.f0" href="#contract__.tutorial.free_functions.f0" class="para">15</a>] </sup>
+ In the examples presented in this documentation, extra parenthesis are
+ in general avoided unless strictly required (for example, extra parenthesis
+ around fundamental types containing no symbol <code class="computeroutput"><span class="keyword">void</span></code>,
+ <code class="computeroutput"><span class="keyword">bool</span></code>, <code class="computeroutput"><span class="keyword">unsigned</span>
+ <span class="keyword">int</span> <span class="keyword">const</span></code>,
+ etc are always omitted). In the authors' opinion, the syntax is more readable
+ with lesser parenthesis. However, other programmers might find it more
+ readable to always specify extra parenthesis around result and parameter
+ types for consistency even when they are not strictly required.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.tutorial.free_functions.f1" href="#contract__.tutorial.free_functions.f1" class="para">16</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> This library uses preprocessor
+ meta-programming to parse declarations and contracts of classes and functions.
+ The preprocessor cannot parse a token if it is not known a priori or
+ if it contains symbols, unless such a token is wrapped within round parenthesis
+ <code class="computeroutput"><span class="special">()</span></code>. For example, the function
+ name is arbitrary, it cannot be known a priori, so it must always be
+ wrapped within parenthesis. If a type is a fundamental type then it is
+ known a priori (because it is composed of known C++ keywords <code class="computeroutput"><span class="keyword">int</span></code>, <code class="computeroutput"><span class="keyword">const</span></code>,
+ <code class="computeroutput"><span class="keyword">unsigned</span></code>, etc), and if the
+ fundamental type also contains no symbols (<code class="computeroutput"><span class="special">&</span></code>,
+ <code class="computeroutput"><span class="special">*</span></code>, etc) then the parenthesis
+ around such a type are optional.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.tutorial.free_functions.f2" href="#contract__.tutorial.free_functions.f2" class="para">17</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> It would be possible to modify
+ the library syntax to make parameter names optional but that will complicate
+ the library implementation without adding any feature for programmers.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.tutorial.free_functions.f3" href="#contract__.tutorial.free_functions.f3" class="para">18</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> Unfortunately, it is not possible
+ to specify an empty parameter list simply as <code class="literal"><span class="emphasis"><em>result-type
+ function-name </em></span></code><code class="computeroutput"><span class="special">(</span>
+ <span class="special">)</span></code> because the preprocessor can only
+ parse <code class="computeroutput"><span class="special">(</span> <span class="special">)</span></code>
+ if empty macro parameters are supported. Empty macro parameters together
+ with variadic macros where added to C99
+ and the preferred syntax of this library uses variadic macros. However,
+ not all compilers (notably MSVC) that support variadic macros also correctly
+ support empty macro parameters so <code class="computeroutput"><span class="special">(</span>
+ <span class="keyword">void</span> <span class="special">)</span></code>
+ is always used instead of <code class="computeroutput"><span class="special">(</span> <span class="special">)</span></code> to increase portability.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.tutorial.free_functions.f4" href="#contract__.tutorial.free_functions.f4" class="para">19</a>] </sup>
+ Note that the <code class="computeroutput"><span class="keyword">auto</span></code> storage
+ classifier in deprecated by C++11
+ so it should be used with the usual care when writing programs that should
+ be portable from C++03
+ to C++11.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.tutorial.free_functions.f5" href="#contract__.tutorial.free_functions.f5" class="para">20</a>] </sup>
+ An MSVC preprocessor bug requires to use at least one space or newline
+ to separate a parameter name from its type even when the parameter type
+ is wrapped within parenthesis.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.tutorial.postconditions__result_and_old_values_.f0" href="#contract__.tutorial.postconditions__result_and_old_values_.f0" class="para">21</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> The C++11
+ <code class="computeroutput"><span class="keyword">auto</span></code> declaration syntax is
+ adopted for postcondition return value declarations however this library
+ knows the result type because it is specified in the function declaration
+ within the macros so no type deduction is actually used to implement auto
+ declarations of return values. Similarly, the C++11
+ <code class="computeroutput"><span class="keyword">auto</span></code> declaration syntax is
+ adopted for postcondition old value declarations however this library deduces
+ the type of old value expressions using Boost.Typeof
+ so no C++11
+ feature is actually needed (in this case programmers can optionally specify
+ the old value type so to not use Boost.Typeof
+ as explained in the <a class="link" href="advanced_topics.html" title="Advanced Topics">Advanced
+ Topics</a> section).
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.tutorial.postconditions__result_and_old_values_.f1" href="#contract__.tutorial.postconditions__result_and_old_values_.f1" class="para">22</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> This is also the syntax specified
+ by <a class="link" href="bibliography.html#N1962_anchor">[N1962]</a> for the <code class="computeroutput"><span class="keyword">oldof</span></code>
+ operator which is the equivalent of the <code class="computeroutput"><span class="identifier">CONTRACT_OLDOF</span></code>
+ macro.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.tutorial.postconditions__result_and_old_values_.f2" href="#contract__.tutorial.postconditions__result_and_old_values_.f2" class="para">23</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> This library macros could
+ have been implemented to allow to mix the order of some tokens (preconditions
+ and postconditions, <code class="computeroutput"><span class="keyword">volatile</span></code>
+ and <code class="computeroutput"><span class="keyword">const</span></code>). However, that
+ would have complicated the macro implementation without any added functionality
+ for the user.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.tutorial.classes_and_class_invariants.f0" href="#contract__.tutorial.classes_and_class_invariants.f0" class="para">24</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> There is no need for a <code class="computeroutput"><span class="identifier">CONTRACT_STRUCT</span></code> macro because this library
+ macros can parse the class declaration and distinguish between the <code class="computeroutput"><span class="keyword">struct</span></code> and <code class="computeroutput"><span class="keyword">class</span></code>
+ specifiers.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.tutorial.classes_and_class_invariants.f1" href="#contract__.tutorial.classes_and_class_invariants.f1" class="para">25</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> The authors have not fully
+ investigated if this library could be extended to specify contracts for
+ unions. It is possible that future revisions of this library will support
+ contracts for unions (see also <a href="http://sourceforge.net/apps/trac/contractpp/ticket/50" target="_top">Ticket
+ 50</a>).
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.tutorial.constructors.f0" href="#contract__.tutorial.constructors.f0" class="para">26</a>] </sup>
+ <span class="bold"><strong>Rationale</strong></span> This library needs to know each
+ member access level because in Contract Programming only public members
+ are supposed to check class invariants while protected and private members
+ only check preconditions and postconditions but not the class invariants.
+ Unfortunately, in C++ it is not possible for a member to introspect its
+ access level using template meta-programming. Therefore, this library requires
+ the access level to be specified within the macros and it uses preprocessor
+ meta-programming to detect it. Furthermore, given that the access level
+ is has to be specified, the <code class="computeroutput"><a class="link" href="../CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code>
+ macro also uses it to differentiate between free and member functions so
+ no additional macro <code class="computeroutput"><span class="identifier">CONTRACT_MEMBER</span></code>
+ is needed.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.tutorial.constructors.f1" href="#contract__.tutorial.constructors.f1" class="para">27</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> Member initializers are specified
+ after the preconditions and postconditions because they are part of the
+ constructor definition while preconditions and postconditions are part
+ of the constructor declaration.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.tutorial.destructors.f0" href="#contract__.tutorial.destructors.f0" class="para">28</a>] </sup>
+ Future revisions of this library might implement static postconditions
+ for destructors (see the <a class="link" href="contract_programming_overview.html#contract__.contract_programming_overview.destructor_calls" title="Destructor Calls">Destructor
+ Calls</a> section).
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.tutorial.inheritance_and_subcontracting.f0" href="#contract__.tutorial.inheritance_and_subcontracting.f0" class="para">29</a>] </sup>
+ <span class="bold"><strong>Rationale</strong></span>. In this case, the library
+ implementation will recursively check contracts of the overriding function
+ forever (in all other cases, this library is able to avoid infinite recursions
+ due to contract checking).
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.tutorial.class_templates.f0" href="#contract__.tutorial.class_templates.f0" class="para">30</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> The library must know if
+ the enclosing scope is a template so it knows when to prefix nested type
+ expressions with <code class="computeroutput"><span class="keyword">typename</span></code>
+ (because C++03
+ does not allow to use <code class="computeroutput"><span class="keyword">typename</span></code>
+ outside templates). This constraints could be relaxed on future revisions
+ of this library for C++11
+ compilers (because C++11
+ allows to use <code class="computeroutput"><span class="keyword">typename</span></code> more
+ freely). Earlier versions of this library did not require to use the
+ special <code class="computeroutput"><span class="identifier">_TPL</span></code> macros within
+ templates because the library internally implemented every contracted
+ function using a template function, possibly with dummy template parameters,
+ even if the original function was not a template so <code class="computeroutput"><span class="keyword">typename</span></code>
+ could always be used by the library. The dummy template parameters were
+ hidden to the user so this approach did not change the user API and had
+ the benefit of not requiring the <code class="computeroutput"><span class="identifier">_TPL</span></code>
+ macros. However, this approach increased compilation time because of
+ the extra templates that it introduced so the current revision of the
+ library uses the <code class="computeroutput"><span class="identifier">_TPL</span></code>
+ macros.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.tutorial.forward_declarations_and_body_definitions.f0" href="#contract__.tutorial.forward_declarations_and_body_definitions.f0" class="para">31</a>] </sup>
+ In principle, this library supports <code class="computeroutput"><span class="keyword">export</span></code>
+ templates that can be used to program template definitions separately from
+ their declarations and in files that can be pre-compiled. However, <code class="computeroutput"><span class="keyword">export</span></code> templates are not supported by most
+ C++03 compilers
+ (in fact, Comeau
+ might be the only compiler that supports them), they were removed from
+ C++11, and
+ they are an untested feature of this library. Instead of using <code class="computeroutput"><span class="keyword">export</span></code> templates, it is common practise
+ in C++ to program both template declarations and definitions together so
+ they can be compiled correctly. In this example, the authors have used
+ a separate header file <code class="computeroutput"><span class="special">...</span><span class="identifier">_impl</span><span class="special">.</span><span class="identifier">hpp</span></code> to logically separate template declarations
+ and definitions but the header is included at the bottom of the declaration
+ header file so the definitions are always available together with their
+ declarations.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.tutorial.forward_declarations_and_body_definitions.f1" href="#contract__.tutorial.forward_declarations_and_body_definitions.f1" class="para">32</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> Four different body macros
+ are needed because contracts are disabled differently for the different
+ type of functions. For example, disabling preconditions and postconditions
+ turns off contracts for free functions but not for member functions, disabling
+ class invariants turns off contracts for destructors but not for constructors,
+ etc.
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.tutorial.forward_declarations_and_body_definitions.f2" href="#contract__.tutorial.forward_declarations_and_body_definitions.f2" class="para">33</a>] </sup>
+ Some compilers accept to repeat template parameter names in the constructor
+ and destructor names. However, this is not C++03
+ compliant (and, for example, it was fixed in more recent versions of GCC)
+ therefore programmers are advised to specify the template parameter names
+ only for the class type and not for the constructor and destructor names
+ (this is also why the macros must take a second parameter with the class
+ name instead of just the class type parameter).
+ </p></div>
+<div class="footnote"><p><sup>[<a id="ftn.contract__.tutorial.forward_declarations_and_body_definitions.f3" href="#contract__.tutorial.forward_declarations_and_body_definitions.f3" class="para">34</a>] </sup>
+ <span class="bold"><strong>Rationale.</strong></span> This limitation comes from
+ the fact that C++03
+ does not support delegating constructors. If member initializers are
+ specified within the contract, the deferred body will not compile when
+ contract compilation is turned off by the configuration macros. If instead
+ member initializers are specified with the deferred body definition,
+ the deferred body will not compile when contract compilation is turned
+ on by the configuration macros. There is no way to reconcile these two
+ conditions without delegating constructors, so definitions cannot be
+ deferred for constructors that specify member initializers. This limitation
+ could be removed in future revisions of this library for C++11
+ compilers that support delegating constructors (see also <a href="http://sourceforge.net/apps/trac/contractpp/ticket/51" target="_top">Ticket
+ 51</a>).
+ </p></div>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="contract_programming_overview.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="advanced_topics.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/contract__/virtual_specifiers.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/contract__/virtual_specifiers.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,419 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Virtual Specifiers</title>
+<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="../index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="prev" href="advanced_topics.html" title="Advanced Topics">
+<link rel="next" href="concepts.html" title="Concepts">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="advanced_topics.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="concepts.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="contract__.virtual_specifiers"></a><a class="link" href="virtual_specifiers.html" title="Virtual Specifiers">Virtual Specifiers</a>
+</h2></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section">Final Classes</span></dt>
+<dt><span class="section"><a href="virtual_specifiers.html#contract__.virtual_specifiers.final_member_functions">Final
+ Member Functions</a></span></dt>
+<dt><span class="section"><a href="virtual_specifiers.html#contract__.virtual_specifiers.overriding_member_functions">Overriding
+ Member Functions</a></span></dt>
+<dt><span class="section"><a href="virtual_specifiers.html#contract__.virtual_specifiers.new_member_functions">New
+ Member Functions</a></span></dt>
+</dl></div>
+<p>
+ This section explains how to use this library to program virtual specifiers
+ <code class="computeroutput"><span class="keyword">final</span></code>, <code class="computeroutput"><span class="keyword">override</span></code>,
+ and <code class="computeroutput"><span class="keyword">new</span></code>. Virtual specifiers are
+ part of the program specifications because they enforce inheritance constraints
+ at compile-time and therefore they are within the scope of this library.
+ </p>
+<div class="important"><table border="0" summary="Important">
+<tr>
+<td rowspan="2" align="center" valign="top" width="25"><img alt="[Important]" src="../../../doc/src/images/important.png"></td>
+<th align="left">Important</th>
+</tr>
+<tr><td align="left" valign="top"><p>
+ This library implements virtual specifiers for C++03
+ and without using any C++11
+ feature. <sup>[<a name="contract__.virtual_specifiers.f0" href="#ftn.contract__.virtual_specifiers.f0" class="footnote">59</a>]</sup> Obviously, virtual specifiers are supported only if both the
+ base and derived classes and member functions in question are declared using
+ this library macros (otherwise this library has no control over usual C++
+ declarations).
+ </p></td></tr>
+</table></div>
+<p>
+ The examples presented in this section are rather simple (and they do not define
+ virtual destructors for brevity). These examples only aim to illustrate the
+ syntax of this library virtual specifiers and not to make a case about the
+ utility of these specifiers. Virtual specifiers were adopted by C++11
+ and in some form are part of other languages like Java,
+ programmers can refer to the web and to the <a class="link" href="examples.html" title="Examples">Examples</a>
+ section for more interesting examples.
+ </p>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.virtual_specifiers.final_classes"></a><a class="link" href="virtual_specifiers.html#contract__.virtual_specifiers.final_classes" title="Final Classes">Final Classes</a>
+</h3></div></div></div>
+<p>
+ Final classes cannot be derived, otherwise the compiler will generated an
+ error. This library allows to declare a class final by specifying <code class="computeroutput"><span class="keyword">final</span></code> within the <code class="computeroutput"><a class="link" href="../CONTRACT_CLASS.html" title="Macro CONTRACT_CLASS">CONTRACT_CLASS</a></code>
+ macro after the class name, after template specialization types but before
+ base classes if present (see also the <a class="link" href="grammar.html" title="Grammar">Grammar</a>
+ section).
+ </p>
+<p>
+ For example (see also final_class.hpp
and
+ final_class.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">x</span><span class="special">)</span> <span class="keyword">final</span> <span class="comment">// A final class.</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">};</span>
+</pre>
+<p>
+ </p>
+<p>
+ If a derived class declared using <code class="computeroutput"><a class="link" href="../CONTRACT_CLASS.html" title="Macro CONTRACT_CLASS">CONTRACT_CLASS</a></code>
+ attempts to inherit from a final base class, the compiler will generate a
+ compile-time error (this is true only if both the base and derived classes
+ are declared using this library macro <code class="computeroutput"><a class="link" href="../CONTRACT_CLASS.html" title="Macro CONTRACT_CLASS">CONTRACT_CLASS</a></code>).
+ For example, consider the following derived class (see also final_class_error.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">y</span><span class="special">)</span> <span class="keyword">extends</span><span class="special">(</span> <span class="keyword">public</span> <span class="identifier">x</span> <span class="special">)</span> <span class="comment">// Correctly errors because `x` is final.</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+<span class="special">};</span>
+</pre>
+<p>
+ </p>
+<p>
+ This will generate a compile-time error similar to the following because
+ <code class="computeroutput"><span class="identifier">x</span></code> is final (note that the
+ number of the base class that violates the <code class="computeroutput"><span class="keyword">final</span></code>
+ specifier is reported so it is clear which base class is causing the error
+ also in case of multiple-inheritance):
+ </p>
+<pre class="programlisting">final_class_error.cpp:8 ... ERROR_cannot_extend_final_base_class_number_1 ...
+</pre>
+<p>
+ Final class checks are performed at compile-time even when contracts are
+ disabled (using <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_PRECONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_PRECONDITIONS">CONTRACT_CONFIG_NO_PRECONDITIONS</a></code>,
+ <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_POSTCONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_POSTCONDITIONS">CONTRACT_CONFIG_NO_POSTCONDITIONS</a></code>,
+ <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_CLASS_INVARIANTS.html" title="Macro CONTRACT_CONFIG_NO_CLASS_INVARIANTS">CONTRACT_CONFIG_NO_CLASS_INVARIANTS</a></code>,
+ etc).
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.virtual_specifiers.final_member_functions"></a><a class="link" href="virtual_specifiers.html#contract__.virtual_specifiers.final_member_functions" title="Final Member Functions">Final
+ Member Functions</a>
+</h3></div></div></div>
+<p>
+ Final member functions cannot be overridden by derived classes, otherwise
+ the compiler will generate an error. This library allows to declare a member
+ function final by specifying <code class="computeroutput"><span class="keyword">final</span></code>
+ within the <code class="computeroutput"><a class="link" href="../CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code>
+ macro, after the cv-qualifier but before exception specifications if present
+ (see also the <a class="link" href="grammar.html" title="Grammar">Grammar</a> section).
+ </p>
+<p>
+ For example (see also final_member.hpp
and
+ final_member.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">x</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">f</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{}</span>
+<span class="special">};</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">y</span><span class="special">)</span> <span class="keyword">extends</span><span class="special">(</span> <span class="keyword">public</span> <span class="identifier">x</span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">f</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">final</span> <span class="comment">// Final member function.</span>
+ <span class="special">)</span> <span class="special">{}</span>
+<span class="special">};</span>
+</pre>
+<p>
+ </p>
+<p>
+ If a member function of a derived class is declared using <code class="computeroutput"><a class="link" href="../CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code>
+ and attempts to override a final member function from one of the base classes,
+ the compiler will generate a compile-time error (this is true only if both
+ the overriding and overridden functions are declared using this library macro
+ <code class="computeroutput"><a class="link" href="../CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code>). For example,
+ consider the following derived class (see also final_member_error.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">z</span><span class="special">)</span> <span class="keyword">extends</span><span class="special">(</span> <span class="keyword">public</span> <span class="identifier">y</span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">f</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="comment">// Correctly errors because `y::f` is final.</span>
+ <span class="special">)</span> <span class="special">{}</span>
+<span class="special">};</span>
+</pre>
+<p>
+ </p>
+<p>
+ This will generate a compile-time error similar to the following because
+ <code class="computeroutput"><span class="identifier">y</span><span class="special">::</span><span class="identifier">f</span></code> is final (note that the number of the
+ base class that violates the <code class="computeroutput"><span class="keyword">final</span></code>
+ specifier is reported so it is clear which overridden member function is
+ causing the error also in case of multiple-inheritance):
+ </p>
+<pre class="programlisting">final_member_error.cpp:13 ... ERROR_cannot_override_final_function_from_base_class_number_1 ...
+</pre>
+<p>
+ In order to correctly handle overloaded functions, the overriding function
+ and the final function must have the same name, parameter types, and cv-qualifier
+ to generate this error.
+ </p>
+<p>
+ Final member function checks are performed at compile-time but only when
+ class invariants are enabled (<code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_CLASS_INVARIANTS.html" title="Macro CONTRACT_CONFIG_NO_CLASS_INVARIANTS">CONTRACT_CONFIG_NO_CLASS_INVARIANTS</a></code>
+ is left not defined).
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.virtual_specifiers.overriding_member_functions"></a><a class="link" href="virtual_specifiers.html#contract__.virtual_specifiers.overriding_member_functions" title="Overriding Member Functions">Overriding
+ Member Functions</a>
+</h3></div></div></div>
+<p>
+ Overriding member functions must override a virtual member function from
+ one or more of the base classes, otherwise the compiler will generate an
+ error. This library allows to declare an overriding member function by specifying
+ <code class="computeroutput"><span class="keyword">override</span></code> within the <code class="computeroutput"><a class="link" href="../CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code> macro, after the cv-qualifier
+ but before the <code class="computeroutput"><span class="keyword">final</span></code> specifier
+ if present (<code class="computeroutput"><span class="keyword">override</span></code> and <code class="computeroutput"><span class="keyword">final</span></code> can be used together, see also the
+ <a class="link" href="grammar.html" title="Grammar">Grammar</a> section).
+ </p>
+<p>
+ For example (see also override_member.hpp
and
+ override_member.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">x</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">f</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="comment">// Virtual so it can be overridden.</span>
+ <span class="special">)</span> <span class="special">{}</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">g</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="comment">// Not virtual so it cannot be overridden.</span>
+ <span class="special">)</span> <span class="special">{}</span>
+<span class="special">};</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">y</span><span class="special">)</span> <span class="keyword">extends</span><span class="special">(</span> <span class="keyword">public</span> <span class="identifier">x</span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">f</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">override</span> <span class="comment">// OK, overriding virtual `x::f`.</span>
+ <span class="special">)</span> <span class="special">{}</span>
+<span class="special">};</span>
+</pre>
+<p>
+ </p>
+<p>
+ If a member function of a derived class is declared using <code class="computeroutput"><a class="link" href="../CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code>
+ and attempts to override an non-virtual or non-existing member function from
+ one of the base classes, the compiler will generate a compile-time error
+ (this is true only if both the overriding and overridden functions are declared
+ using this library macro <code class="computeroutput"><a class="link" href="../CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code>).
+ For example, consider the following derived class (see also override_member_error.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">z</span><span class="special">)</span> <span class="keyword">extends</span><span class="special">(</span> <span class="keyword">public</span> <span class="identifier">x</span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">g</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">override</span> <span class="comment">// Correctly errors, cannot override.</span>
+ <span class="special">)</span> <span class="special">{}</span>
+<span class="special">};</span>
+</pre>
+<p>
+ </p>
+<p>
+ This will generate a compile-time error similar to the following because
+ <code class="computeroutput"><span class="identifier">x</span><span class="special">::</span><span class="identifier">g</span></code> is not virtual:
+ </p>
+<pre class="programlisting">override_member_error.cpp:12 ... ERROR_no_base_class_declares_matching_virtual_function_to_override_at_line_12 ...
+</pre>
+<p>
+ In order to correctly handle overloaded functions, the overriding function
+ and the overridden virtual function must have the same name, parameter types,
+ and cv-qualifier to <span class="emphasis"><em>not</em></span> generate this error.
+ </p>
+<p>
+ Overriding member function checks are performed at compile-time but only
+ if at least one between preconditions, postconditions, and class invariants
+ is enabled (<code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_PRECONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_PRECONDITIONS">CONTRACT_CONFIG_NO_PRECONDITIONS</a></code>,
+ <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_POSTCONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_POSTCONDITIONS">CONTRACT_CONFIG_NO_POSTCONDITIONS</a></code>
+ and <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_CLASS_INVARIANTS.html" title="Macro CONTRACT_CONFIG_NO_CLASS_INVARIANTS">CONTRACT_CONFIG_NO_CLASS_INVARIANTS</a></code>
+ are not all defined at the same time).
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="contract__.virtual_specifiers.new_member_functions"></a><a class="link" href="virtual_specifiers.html#contract__.virtual_specifiers.new_member_functions" title="New Member Functions">New
+ Member Functions</a>
+</h3></div></div></div>
+<p>
+ New member functions shall not override member functions from any of the
+ base classes, otherwise the compiler will generate an error. This library
+ allows to declare a new member function by specifying <code class="computeroutput"><span class="keyword">new</span></code>
+ within the <code class="computeroutput"><a class="link" href="../CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code>
+ macro, after the cv-qualifier but before the <code class="computeroutput"><span class="keyword">final</span></code>
+ specifier if present (<code class="computeroutput"><span class="keyword">new</span></code> and
+ <code class="computeroutput"><span class="keyword">final</span></code> can be used together,
+ see also the <a class="link" href="grammar.html" title="Grammar">Grammar</a> section).
+ </p>
+<p>
+ For example (see also new_member.hpp
and
+ new_member.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">x</span><span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">f</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">new</span> <span class="comment">// OK, no base so no `f` override.</span>
+ <span class="special">)</span> <span class="special">{}</span>
+<span class="special">};</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">y</span><span class="special">)</span> <span class="keyword">extends</span><span class="special">(</span> <span class="keyword">public</span> <span class="identifier">x</span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">g</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">new</span> <span class="comment">// OK, there is no `x::g`.</span>
+ <span class="special">)</span> <span class="special">{}</span>
+<span class="special">};</span>
+</pre>
+<p>
+ </p>
+<p>
+ If a new member function of a derived class is declared using <code class="computeroutput"><a class="link" href="../CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code> but it overrides an
+ existing member function from one of the base classes, the compiler will
+ generate a compile-time error (this is true only if both the overriding and
+ overridden functions are declared using this library macro <code class="computeroutput"><a class="link" href="../CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code>).
+ For example, consider the following derived class (see also new_member_error.cpp
):
+ </p>
+<p>
+</p>
+<pre class="programlisting"><span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">z</span><span class="special">)</span> <span class="keyword">extends</span><span class="special">(</span> <span class="keyword">public</span> <span class="identifier">y</span> <span class="special">)</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT</span><span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span>
+
+ <span class="identifier">CONTRACT_FUNCTION</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">g</span><span class="special">)</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">new</span> <span class="comment">// Correctly errors because `y::g`.</span>
+ <span class="special">)</span> <span class="special">{}</span>
+<span class="special">};</span>
+</pre>
+<p>
+ </p>
+<p>
+ This will generate a compile-time error similar to the following because
+ <code class="computeroutput"><span class="identifier">f</span></code> was already declared in
+ <code class="computeroutput"><span class="identifier">x</span></code> (note that the number of
+ the base class that violates the <code class="computeroutput"><span class="keyword">new</span></code>
+ specifier is reported so it is clear which overridden member function is
+ causing the error also in case of multiple-inheritance):
+ </p>
+<pre class="programlisting">new_member_error.cpp:12 ... ERROR_matching_virtual_function_already_declared_by_base_class_number_1 ...
+</pre>
+<p>
+ In order to correctly handle overloaded functions, the new function and the
+ overridden function must have the same name, parameter types, and cv-qualifier
+ to generate this error.
+ </p>
+<p>
+ New member function checks are performed at compile-time but only if at least
+ one between preconditions, postconditions, and class invariants is enabled
+ (<code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_PRECONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_PRECONDITIONS">CONTRACT_CONFIG_NO_PRECONDITIONS</a></code>,
+ <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_POSTCONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_POSTCONDITIONS">CONTRACT_CONFIG_NO_POSTCONDITIONS</a></code>
+ and <code class="computeroutput"><a class="link" href="../CONTRACT_CONFIG_NO_CLASS_INVARIANTS.html" title="Macro CONTRACT_CONFIG_NO_CLASS_INVARIANTS">CONTRACT_CONFIG_NO_CLASS_INVARIANTS</a></code>
+ are not all defined at the same time).
+ </p>
+</div>
+<div class="footnotes">
+<br><hr width="100" align="left">
+<div class="footnote"><p><sup>[<a id="ftn.contract__.virtual_specifiers.f0" href="#contract__.virtual_specifiers.f0" class="para">59</a>] </sup>
+ This library declares special member functions to <span class="quote">“<span class="quote">tag</span>”</span> virtual
+ traits of a given member function in a base class (if it is <code class="computeroutput"><span class="keyword">virtual</span></code>, <code class="computeroutput"><span class="keyword">final</span></code>,
+ etc). Then template meta-programming introspection is used by the derived
+ class to inspect virtual trait in its base classes and generate compiler
+ errors if the virtual specifiers are not satisfied. These techniques do
+ not use any C++11
+ feature however, future revisions of this library might use C++11
+ native support for virtual specifiers so to eliminate the extra compilation
+ time required by template meta-programming introspection and correct a
+ number of bugs associated with the current implementation of virtual specifiers
+ in this library (see also <a href="http://sourceforge.net/apps/trac/contractpp/ticket/53" target="_top">Ticket
+ 53</a>, <a href="http://sourceforge.net/apps/trac/contractpp/ticket/53" target="_top">Ticket
+ 55</a>, and <a href="http://sourceforge.net/apps/trac/contractpp/ticket/53" target="_top">Ticket
+ 56</a>).
+ </p></div>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="advanced_topics.html"><img src="../../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="concepts.html"><img src="../../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/html/contractpp.pdf
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/html/index.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/index.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,482 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Chapter 1. Contract++ 0.4.1</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="next" href="contract__/full_table_of_contents.html" title="Full Table of Contents">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav"><a accesskey="n" href="contract__/full_table_of_contents.html"><img src="../..//doc/src/images/next.png" alt="Next"></a></div>
+<div class="chapter">
+<div class="titlepage"><div>
+<div><h2 class="title">
+<a name="contract__"></a>Chapter 1. Contract++ 0.4.1</h2></div>
+<div><div class="author"><h3 class="author">
+<span class="firstname">Lorenzo</span> <span class="surname">Caminiti <code class="email"><<a class="email" href="mailto:lorcaminiti_at_[hidden]">lorcaminiti_at_[hidden]</a>></code></span>
+</h3></div></div>
+<div><p class="copyright">Copyright © 2008-2012 Lorenzo Caminiti</p></div>
+<div><div class="legalnotice">
+<a name="contract__.legal"></a><p>
+ Distributed under 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)
+ </p>
+</div></div>
+</div></div>
+<div class="toc">
+<p><b>Table of Contents</b></p>
+<dl>
+<dt><span class="section">Introduction</span></dt>
+<dt><span class="section">Full Table of Contents</span></dt>
+<dt><span class="section">Getting Started</span></dt>
+<dt><span class="section"><a href="contract__/contract_programming_overview.html">Contract Programming
+ Overview</a></span></dt>
+<dt><span class="section">Tutorial</span></dt>
+<dt><span class="section">Advanced Topics</span></dt>
+<dt><span class="section">Virtual Specifiers</span></dt>
+<dt><span class="section">Concepts</span></dt>
+<dt><span class="section">Named Parameters</span></dt>
+<dt><span class="section">Examples</span></dt>
+<dt><span class="section">Grammar</span></dt>
+<dt><span class="section">No Variadic Macros</span></dt>
+<dt><span class="section">Reference</span></dt>
+<dt><span class="section">Release Notes</span></dt>
+<dt><span class="section">Bibliography</span></dt>
+<dt><span class="section">Acknowledgments</span></dt>
+</dl>
+</div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <span class="emphasis"><em><span class="quote">“<span class="quote">Our field needs more formality, but the profession has not
+ realized it yet.</span>”</span></em></span>
+ </p></blockquote></div>
+<div class="blockquote"><blockquote class="blockquote"><p>
+ <span class="emphasis"><em>-- Bertrand Meyer (see <a class="link" href="contract__/bibliography.html#Meyer97_anchor">[Meyer97]</a>
+ page 400)</em></span>
+ </p></blockquote></div>
+<p>
+ This library implements Contract Programming for the C++ programming language.
+ In addition, the library implements virtual specifiers (<code class="computeroutput"><span class="keyword">final</span></code>,
+ <code class="computeroutput"><span class="keyword">override</span></code>, and <code class="computeroutput"><span class="keyword">new</span></code>,
+ see C++11), concept
+ checking, and named parameters.
+ </p>
+<p>
+ Consult this documentation in HTML or PDF format.
+ </p>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="contract__.introduction"></a><a class="link" href="index.html#contract__.introduction" title="Introduction">Introduction</a>
+</h2></div></div></div>
+<p>
+ Contract Programming
+ (CP) allows to specify preconditions, postconditions, and class invariants
+ that are automatically checked when functions are executed at run-time. These
+ conditions assert program specifications within the source code itself allowing
+ to find bugs more quickly during testing, making the code self-documenting,
+ and increasing overall software quality.
+ </p>
+<p>
+ Contract Programming is also known as Design by Contract (DbC) <sup>[<a name="contract__.introduction.f0" href="#ftn.contract__.introduction.f0" class="footnote">1</a>]</sup> and it was first introduced by the Eiffel
+ programming language (see <a class="link" href="contract__/bibliography.html#Meyer97_anchor">[Meyer97]</a>).
+ All Contract Programming features of the Eiffel
+ programming language are supported by this library, among others (see also
+ the <a class="link" href="contract__/contract_programming_overview.html#contract__.contract_programming_overview.features" title="Features">Features</a>
+ section):
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ Support for preconditions, postconditions, class invariants, block invariants,
+ and loop variants.
+ </li>
+<li class="listitem">
+ Subcontract derived classes (with support for pure virtual functions and
+ multiple inheritance).
+ </li>
+<li class="listitem">
+ Access expression old values and function return value in postconditions.
+ </li>
+<li class="listitem">
+ Optional compilation and checking of preconditions, postconditions, class
+ invariants, block invariants, and loop variants.
+ </li>
+<li class="listitem">
+ Customizable actions on contract assertion failure (terminate by default
+ but it can throw, exit, etc).
+ </li>
+</ol></div>
+<p>
+ In addition, this library supports virtual specifiers, concept checking, and
+ named parameters which together with contracts specify requirements of the
+ program interface. This library is implemented for the C++03
+ standard and it does not require C++11.
+ </p>
+<h4>
+<a name="contract__.introduction.h0"></a>
+ <span><a name="contract__.introduction.an_example"></a></span><a class="link" href="index.html#contract__.introduction.an_example">An
+ Example</a>
+ </h4>
+<p>
+ The example below shows how to use this library to program contracts for the
+ C++ Standard Template Library (STL) member function std::vector::push_back
+ (in order to illustrate subcontracting, the <code class="computeroutput"><span class="identifier">vector</span></code>
+ class inherits from the somewhat arbitrary <code class="computeroutput"><span class="identifier">pushable</span></code>
+ base class). The syntax used by this library is compared side-by-side with
+ the syntax proposed by <a class="link" href="contract__/bibliography.html#N1962_anchor">[N1962]</a> for adding
+ Contract Programming to C++ (see also push_back.cpp
+ and pushable.hpp
):
+ </p>
+<div class="informaltable"><table class="table">
+<colgroup>
+<col>
+<col>
+<col>
+</colgroup>
+<thead><tr>
+<th>
+ <p>
+ #
+ </p>
+ </th>
+<th>
+ <p>
+ This Library (C++03)
+ </p>
+ </th>
+<th>
+ <p>
+ N1962 and N2081 Proposals (not adopted by C++11) <sup>[<a name="contract__.introduction.f1" href="#ftn.contract__.introduction.f1" class="footnote">a</a>]</sup>
+ </p>
+ </th>
+</tr></thead>
+<tbody><tr>
+<td>
+ <p>
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"> <span class="number">1</span>
+ <span class="number">2</span>
+ <span class="number">3</span>
+ <span class="number">4</span>
+ <span class="number">5</span>
+ <span class="number">6</span>
+ <span class="number">7</span>
+ <span class="number">8</span>
+ <span class="number">9</span>
+<span class="number">10</span>
+<span class="number">11</span>
+<span class="number">12</span>
+<span class="number">13</span>
+<span class="number">14</span>
+<span class="number">15</span>
+<span class="number">16</span>
+<span class="number">17</span>
+<span class="number">18</span>
+<span class="number">19</span>
+<span class="number">20</span>
+<span class="number">21</span>
+<span class="number">22</span>
+<span class="number">23</span>
+<span class="number">24</span>
+<span class="number">25</span>
+<span class="number">26</span>
+<span class="number">27</span>
+<span class="number">28</span>
+<span class="number">29</span>
+<span class="number">30</span>
+<span class="number">31</span>
+<span class="number">32</span>
+<span class="number">33</span>
+<span class="number">34</span>
+<span class="number">35</span>
+<span class="number">36</span>
+<span class="number">37</span>
+</pre>
+<p>
+ </p>
+ </td>
+<td>
+ <p>
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">contract</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// This library.</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">concept_check</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">vector</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="string">"pushable.hpp"</span> <span class="comment">// Some base class.</span>
+
+<span class="identifier">CONTRACT_CLASS</span><span class="special">(</span>
+ <span class="keyword">template</span><span class="special">(</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">)</span> <span class="keyword">requires</span><span class="special">(</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">CopyConstructible</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">)</span> <span class="comment">// Concepts.</span>
+ <span class="keyword">class</span> <span class="special">(</span><span class="identifier">vector</span><span class="special">)</span> <span class="keyword">extends</span><span class="special">(</span> <span class="keyword">public</span> <span class="identifier">pushable</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="special">)</span> <span class="comment">// Subcontracting.</span>
+<span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">CONTRACT_CLASS_INVARIANT_TPL</span><span class="special">(</span>
+ <span class="identifier">empty</span><span class="special">()</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">)</span> <span class="comment">// More class invariants here...</span>
+ <span class="special">)</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">size_type</span> <span class="identifier">size_type</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">const_reference</span> <span class="identifier">const_reference</span><span class="special">;</span>
+
+ <span class="identifier">CONTRACT_FUNCTION_TPL</span><span class="special">(</span>
+ <span class="keyword">public</span> <span class="keyword">void</span> <span class="special">(</span><span class="identifier">push_back</span><span class="special">)</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">T</span> <span class="keyword">const</span><span class="special">&)</span> <span class="identifier">value</span> <span class="special">)</span> <span class="keyword">override</span>
+ <span class="keyword">precondition</span><span class="special">(</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special"><</span> <span class="identifier">max_size</span><span class="special">()</span> <span class="comment">// More preconditions here...</span>
+ <span class="special">)</span>
+ <span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="keyword">auto</span> <span class="identifier">old_size</span> <span class="special">=</span> <span class="identifier">CONTRACT_OLDOF</span> <span class="identifier">size</span><span class="special">(),</span> <span class="comment">// Old-of values.</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="identifier">old_size</span> <span class="special">+</span> <span class="number">1</span> <span class="comment">// More postconditions here...</span>
+ <span class="special">)</span>
+ <span class="special">)</span> <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">value</span><span class="special">);</span> <span class="comment">// Original function body.</span>
+ <span class="special">}</span>
+
+ <span class="comment">// Rest of class here (possibly with more contracts)...</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">bool</span> <span class="identifier">empty</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">empty</span><span class="special">();</span> <span class="special">}</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">size_type</span> <span class="identifier">size</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span> <span class="special">}</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">size_type</span> <span class="identifier">max_size</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">max_size</span><span class="special">();</span> <span class="special">}</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">const_reference</span> <span class="identifier">back</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">back</span><span class="special">();</span> <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">vector_</span><span class="special">;</span>
+<span class="special">};</span>
+</pre>
+<p>
+ </p>
+ </td>
+<td>
+ <p>
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="comment">// Extra spaces, newlines, etc used to align text with this library code.</span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="keyword">concept</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">vector</span><span class="special">></span>
+<span class="preprocessor">#include</span> <span class="string">"pushable.hpp"</span> <span class="comment">// Some base class.</span>
+
+
+<span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">T</span> <span class="special">></span> <span class="keyword">requires</span> <span class="identifier">CopyConstructible</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="comment">// Concepts.</span>
+<span class="keyword">class</span> <span class="identifier">vector</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">pushable</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="comment">// Subcontracting.</span>
+<span class="special">{</span>
+ <span class="keyword">invariant</span> <span class="special">{</span>
+ <span class="identifier">empty</span><span class="special">()</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span> <span class="comment">// More class invariants here...</span>
+ <span class="special">}</span>
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">size_type</span> <span class="identifier">size_type</span><span class="special">;</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">const_reference</span> <span class="identifier">const_reference</span><span class="special">;</span>
+
+
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">void</span> <span class="identifier">push_back</span> <span class="special">(</span> <span class="identifier">T</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">value</span> <span class="special">)</span> <span class="keyword">override</span>
+ <span class="keyword">precondition</span> <span class="special">{</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special"><</span> <span class="identifier">max_size</span><span class="special">();</span> <span class="comment">// More preconditions here...</span>
+ <span class="special">}</span>
+ <span class="keyword">postcondition</span> <span class="special">{</span>
+ <span class="comment">// Old-of values use `oldof` operator.</span>
+ <span class="identifier">size</span><span class="special">()</span> <span class="special">==</span> <span class="keyword">oldof</span> <span class="identifier">size</span><span class="special">()</span> <span class="special">+</span> <span class="number">1</span><span class="special">;</span> <span class="comment">// More postconditions here...</span>
+ <span class="special">}</span>
+ <span class="special">{</span>
+ <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">value</span><span class="special">);</span> <span class="comment">// Original function body.</span>
+ <span class="special">}</span>
+
+ <span class="comment">// Rest of class here (with possibly more contracts)...</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="keyword">bool</span> <span class="identifier">empty</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">empty</span><span class="special">();</span> <span class="special">}</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">size_type</span> <span class="identifier">size</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">size</span><span class="special">();</span> <span class="special">}</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">size_type</span> <span class="identifier">max_size</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">max_size</span><span class="special">();</span> <span class="special">}</span>
+ <span class="keyword">public</span><span class="special">:</span> <span class="identifier">const_reference</span> <span class="identifier">back</span> <span class="special">(</span> <span class="keyword">void</span> <span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">vector_</span><span class="special">.</span><span class="identifier">back</span><span class="special">();</span> <span class="special">}</span>
+
+ <span class="keyword">private</span><span class="special">:</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> <span class="identifier">vector_</span><span class="special">;</span>
+<span class="special">};</span>
+</pre>
+<p>
+ </p>
+ </td>
+</tr></tbody>
+<tbody class="footnotes"><tr><td colspan="3"><div class="footnote"><p><sup>[<a id="ftn.contract__.introduction.f1" href="#contract__.introduction.f1" class="para">a</a>] </sup>
+ Unfortunately, the Contract Programming proposal <a class="link" href="contract__/bibliography.html#N1962_anchor">[N1962]</a>
+ and the concept proposal <a class="link" href="contract__/bibliography.html#N2081_anchor">[N2081]</a>
+ were never adopted by the C++ standard so the example on the right
+ hand side will not compile.
+ </p></div></td></tr></tbody>
+</table></div>
+<p>
+ Classes and functions are declared using the <code class="computeroutput"><a class="link" href="CONTRACT_CLASS.html" title="Macro CONTRACT_CLASS">CONTRACT_CLASS</a></code>
+ and <code class="computeroutput"><a class="link" href="CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a></code> macros
+ respectively. Class invariants must appear at the very beginning of the class
+ definition and they are specified using the <code class="computeroutput"><a class="link" href="CONTRACT_CLASS_INVARIANT.html" title="Macro CONTRACT_CLASS_INVARIANT">CONTRACT_CLASS_INVARIANT</a></code>
+ macro. The <code class="computeroutput"><span class="identifier">TPL</span></code> postfixes indicate
+ versions of the macros that need to be used within templates.
+ </p>
+<p>
+ Note the following differences between the syntax used by this library macros
+ and the usual C++ declaration syntax (see the <a class="link" href="contract__/grammar.html#contract__.grammar.differences_with_c___syntax" title="Differences with C++ Syntax">Differences
+ with C++ Syntax</a> section for a complete list):
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem">
+ Round parenthesis <code class="computeroutput"><span class="keyword">template</span><span class="special">(</span> <span class="special">...</span> <span class="special">)</span></code>
+ are used instead of angular parenthesis <code class="computeroutput"><span class="keyword">template</span><span class="special"><</span> <span class="special">...</span> <span class="special">></span></code> to declare templates (line 7).
+ </li>
+<li class="listitem">
+ Similarly to <a class="link" href="contract__/bibliography.html#N2081_anchor">[N2081]</a>, the specifier
+ <code class="computeroutput"><span class="keyword">requires</span><span class="special">(</span>
+ <span class="special">...</span> <span class="special">)</span></code>
+ is used to specify concepts to check (line 7).
+ </li>
+<li class="listitem">
+ The class and function names are wrapped within round parenthesis <code class="computeroutput"><span class="special">(</span><span class="identifier">vector</span><span class="special">)</span></code> and <code class="computeroutput"><span class="special">(</span><span class="identifier">push_back</span><span class="special">)</span></code>
+ (lines 8 and 18).
+ </li>
+<li class="listitem">
+ The specifier <code class="computeroutput"><span class="keyword">extends</span><span class="special">(</span>
+ <span class="special">...</span> <span class="special">)</span></code>
+ is used instead of the column symbol <code class="computeroutput"><span class="special">:</span></code>
+ to inherit from base classes (line 8). This automatically subcontracts
+ <code class="computeroutput"><span class="identifier">vector</span></code> from <code class="computeroutput"><span class="identifier">pushable</span></code> (when subcontracting, derived
+ and base preconditions are checked in <a class="link" href="contract__/contract_programming_overview.html#logic_or_anchor">logic-or</a>,
+ derived and base postconditions are checked in <a class="link" href="contract__/contract_programming_overview.html#logic_and_anchor">logic-and</a>,
+ derived and base class invariants are checked <a class="link" href="contract__/contract_programming_overview.html#logic_and_anchor">logic-and</a>).
+ </li>
+<li class="listitem">
+ The access level <code class="computeroutput"><span class="keyword">public</span></code>,
+ <code class="computeroutput"><span class="keyword">protected</span></code>, or <code class="computeroutput"><span class="keyword">private</span></code> must always be specified for member
+ functions but without the trailing column symbol <code class="computeroutput"><span class="special">:</span></code>
+ (line 18).
+ </li>
+<li class="listitem">
+ The function result and parameter types are wrapped within round parenthesis
+ <code class="computeroutput"><span class="special">(</span><span class="identifier">T</span>
+ <span class="keyword">const</span><span class="special">&)</span></code>
+ (line 18). The parenthesis are allowed but not required for fundamental
+ types that contain no symbol (e.g., the function result type <code class="computeroutput"><span class="keyword">void</span></code> at line 18, but also <code class="computeroutput"><span class="keyword">bool</span></code>, <code class="computeroutput"><span class="keyword">unsigned</span>
+ <span class="keyword">int</span> <span class="keyword">const</span></code>,
+ etc).
+ </li>
+<li class="listitem">
+ Similarly to C++11,
+ the specifier <code class="computeroutput"><span class="keyword">override</span></code> is
+ used to check that a member function is indeed overriding a base member
+ function (line 18).
+ </li>
+<li class="listitem">
+ The specifiers <code class="computeroutput"><span class="keyword">precondition</span><span class="special">(</span> <span class="special">...</span> <span class="special">)</span></code>
+ and <code class="computeroutput"><span class="keyword">postcondition</span><span class="special">(</span>
+ <span class="special">...</span> <span class="special">)</span></code>
+ are used to program function preconditions and postconditions (lines 19
+ and 22). Furthermore, the <code class="computeroutput"><a class="link" href="CONTRACT_OLDOF.html" title="Macro CONTRACT_OLDOF">CONTRACT_OLDOF</a></code>
+ macro can be used within postconditions to declare variables and initialize
+ them to old values that the specified expressions had before executing
+ the function body (line 23).
+ </li>
+<li class="listitem">
+ Class invariants, preconditions, and postconditions assert boolean expressions
+ separated by commas <code class="computeroutput"><span class="special">,</span></code> (lines
+ 11, 20, and 24).
+ </li>
+</ul></div>
+<p>
+ Finally, note that the class and function definitions are programmed outside
+ the macros so they retain their usual C++ syntax (e.g., the function body at
+ line 27).
+ </p>
+<p>
+ The library executes the following steps when the <code class="computeroutput"><span class="identifier">push_back</span></code>
+ function is called at run-time (see also the <a class="link" href="contract__/contract_programming_overview.html" title="Contract Programming Overview">Contract
+ Programming Overview</a> section):
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ First, the class invariants and the function preconditions are checked.
+ </li>
+<li class="listitem">
+ Then, the function body is executed.
+ </li>
+<li class="listitem">
+ Last, the class invariants and the function postconditions are checked.
+ </li>
+</ol></div>
+<p>
+ For example, if there is a bug in the function caller for which <code class="computeroutput"><span class="identifier">push_back</span></code> is called when <code class="computeroutput"><span class="identifier">size</span></code>
+ is equal to <code class="computeroutput"><span class="identifier">max_size</span></code> then the
+ execution of the program will be interrupted reporting a failure of the first
+ assertion in the preconditions and it will be evident that the bug is in the
+ caller:
+ </p>
+<pre class="programlisting">precondition number 1 "size() < max_size()" failed: file "push_back.cpp", line 26
+</pre>
+<p>
+ Instead, if there is a bug in the <code class="computeroutput"><span class="identifier">push_back</span></code>
+ implementation for which <code class="computeroutput"><span class="identifier">size</span></code>
+ is not increased by one after <code class="computeroutput"><span class="identifier">value</span></code>
+ is added to <code class="computeroutput"><span class="identifier">vector</span></code> by the function
+ body then the execution will be interrupted reporting a failure of the first
+ assertion in the postconditions and it will be evident that the bug is in
+ <code class="computeroutput"><span class="identifier">push_back</span></code> body:
+ </p>
+<pre class="programlisting">postcondition number 1 "size() == old_size + 1" failed: file "push_back.cpp", line 26
+</pre>
+<p>
+ By default, when assertions fail this library prints the above error messages
+ to the standard error <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">cerr</span></code> and it terminates the program calling
+ <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">terminate</span></code> (this behaviour can be customized
+ to throw an exception, exit the program, etc, see the <a class="link" href="contract__/contract_programming_overview.html#contract__.contract_programming_overview.broken_contracts" title="Broken Contracts">Broken
+ Contracts</a> section). Note that the library error messages contain enough
+ information to uniquely identify the contract failure: Assertion type (class
+ invariant, precondition, postcondition, etc), assertion number, asserted expression,
+ file name, and line number. (The line number refers to the single line on which
+ each macro expands so it will be the same for class invariants, preconditions,
+ and postconditions of a given class or function but it can still be used together
+ with the assertion number to uniquely identity which assertion failed.)
+ </p>
+<h4>
+<a name="contract__.introduction.h1"></a>
+ <span><a name="contract__.introduction.language_support"></a></span><a class="link" href="index.html#contract__.introduction.language_support">Language
+ Support</a>
+ </h4>
+<p>
+ This library suffers of two limitations:
+ </p>
+<div class="orderedlist"><ol class="orderedlist" type="1">
+<li class="listitem">
+ The unusual syntax used to declare classes and functions within the macros
+ which causes cryptic compiler errors when not used correctly (syntax error
+ checking and reporting could be somewhat improved in future revisions of
+ the library but there are fundamental limitations on what can be done using
+ the preprocessor, see also the <a class="link" href="contract__/grammar.html#syntax_error_warning_anchor">Grammar</a>
+ section).
+ </li>
+<li class="listitem">
+ High compilation times (the authors will try to reduce compilation times
+ in future revisions of the library, see also the <a class="link" href="contract__/contract_programming_overview.html#compilation_time_warning_anchor">Cost</a>
+ section).
+ </li>
+</ol></div>
+<p>
+ With the addition of contracts, concepts, and named parameters, C++ could introduce
+ formal program specification into main-stream programming. The authors wish
+ the work done in developing this library will persuade the C++ community and
+ the C++ standard committee to add these features to the core language so to
+ support formal program specification without the unusual macro syntax and avoiding
+ high compilation times (unfortunately, this has not been the direction taken
+ for C++11 with
+ the rejection of the concept proposal <a class="link" href="contract__/bibliography.html#N2081_anchor">[N2081]</a>
+ and the lack of consideration for the Contract Programming proposal <a class="link" href="contract__/bibliography.html#N1962_anchor">[N1962]</a>,
+ but there might still be hope for C++1x with x > 1).
+ </p>
+</div>
+<div class="footnotes">
+<br><hr width="100" align="left">
+<div class="footnote"><p><sup>[<a id="ftn.contract__.introduction.f0" href="#contract__.introduction.f0" class="para">1</a>] </sup>
+ Design by Contract is a registered trademark of <a href="http://en.wikipedia.org/wiki/Eiffel_Software" target="_top">Eiffel
+ Software</a>.
+ </p></div>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"><p><small>Last revised: October 13, 2012 at 21:39:43 GMT</small></p></td>
+<td align="right"><div class="copyright-footer"></div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav"><a accesskey="n" href="contract__/full_table_of_contents.html"><img src="../..//doc/src/images/next.png" alt="Next"></a></div>
+</body>
+</html>
Added: sandbox/contract/doc/html/reference.html
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/html/reference.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,247 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Reference</title>
+<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="up" href="index.html" title="Chapter 1. Contract++ 0.4.1">
+<link rel="prev" href="contract__/no_variadic_macros.html" title="No Variadic Macros">
+<link rel="next" href="CONTRACT_BLOCK_INVARIANT.html" title="Macro CONTRACT_BLOCK_INVARIANT">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"></td>
+<td align="center">Download</td>
+<td align="center">Bugs</td>
+<td align="center">Reviews</td>
+<td align="center"><a href="mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+<td align="center">Help</td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="contract__/no_variadic_macros.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="index.html"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_BLOCK_INVARIANT.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h2 class="title" style="clear: both">
+<a name="reference"></a>Reference</h2></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section">Header <contract/block_invariant.hpp></span></dt>
+<dt><span class="section">Header <contract/body.hpp></span></dt>
+<dt><span class="section">Header <contract/broken.hpp></span></dt>
+<dt><span class="section">Header <contract/class.hpp></span></dt>
+<dt><span class="section">Header <contract/class_invariant.hpp></span></dt>
+<dt><span class="section">Header <contract/config.hpp></span></dt>
+<dt><span class="section">Header <contract/constructor.hpp></span></dt>
+<dt><span class="section">Header <contract/copy.hpp></span></dt>
+<dt><span class="section">Header <contract/destructor.hpp></span></dt>
+<dt><span class="section">Header <contract/function.hpp></span></dt>
+<dt><span class="section">Header <contract/limits.hpp></span></dt>
+<dt><span class="section">Header <contract/loop_variant.hpp></span></dt>
+<dt><span class="section">Header <contract/oldof.hpp></span></dt>
+<dt><span class="section">Header <contract/parameter.hpp></span></dt>
+</dl></div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="header.contract.block_invariant_hpp"></a>Header <contract/block_invariant.hpp></h3></div></div></div>
+<p>Macros used to specify block invariants (this header is automatically included by <code class="computeroutput">contract.hpp</code>). </p>
+<pre class="synopsis">
+
+<a class="link" href="CONTRACT_BLOCK_INVARIANT.html" title="Macro CONTRACT_BLOCK_INVARIANT">CONTRACT_BLOCK_INVARIANT</a>(assertions)
+<a class="link" href="CONTRACT_BLOCK_INVARIANT_TPL.html" title="Macro CONTRACT_BLOCK_INVARIANT_TPL">CONTRACT_BLOCK_INVARIANT_TPL</a>(assertions)</pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="header.contract.body_hpp"></a>Header <contract/body.hpp></h3></div></div></div>
+<p>Macros used to program body definitions separately from the contract declarations (this header is automatically include by <code class="computeroutput">contract.hpp</code>). </p>
+<pre class="synopsis">
+
+<a class="link" href="CONTRACT_FREE_BODY.html" title="Macro CONTRACT_FREE_BODY">CONTRACT_FREE_BODY</a>(function_name)
+<a class="link" href="CONTRACT_MEMBER_BODY.html" title="Macro CONTRACT_MEMBER_BODY">CONTRACT_MEMBER_BODY</a>(function_name)
+<a class="link" href="CONTRACT_CONSTRUCTOR_BODY.html" title="Macro CONTRACT_CONSTRUCTOR_BODY">CONTRACT_CONSTRUCTOR_BODY</a>(class_type, constructor_name)
+<a class="link" href="CONTRACT_DESTRUCTOR_BODY.html" title="Macro CONTRACT_DESTRUCTOR_BODY">CONTRACT_DESTRUCTOR_BODY</a>(class_type, destructor_name)</pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="header.contract.broken_hpp"></a>Header <contract/broken.hpp></h3></div></div></div>
+<p>Contract broken handlers (this header is automatically included by <code class="computeroutput">contract.hpp</code>). </p>
+<pre class="synopsis"><span class="keyword">namespace</span> <span class="identifier">contract</span> <span class="special">{</span>
+ <span class="keyword">class</span> <a class="link" href="contract/broken.html" title="Class broken">broken</a><span class="special">;</span>
+
+ <span class="keyword">enum</span> <a class="link" href="contract/from.html" title="Type from">from</a><span class="special">;</span>
+ <span class="keyword">typedef</span> <span class="identifier">handler_function_pointer</span> <a class="link" href="contract/broken_contract_handler.html" title="Type definition broken_contract_handler"><span class="identifier">broken_contract_handler</span></a><span class="special">;</span>
+
+ <span class="comment">// Set precondition broken handler to specified handler returning replaced handler. </span>
+ <span class="identifier">broken_contract_handler</span>
+ <a name="contract.set_precondition_broken"></a><span class="identifier">set_precondition_broken</span><span class="special">(</span><span class="identifier">broken_contract_handler</span> handler<span class="special">)</span><span class="special">;</span>
+ <span class="keyword">void</span> <a class="link" href="contract/precondition_broken.html" title="Function precondition_broken"><span class="identifier">precondition_broken</span></a><span class="special">(</span><span class="identifier">from</span> <span class="keyword">const</span> <span class="special">&</span><span class="special">)</span><span class="special">;</span>
+
+ <span class="comment">// Set postcondition broken handler to specified handler returning replaced handler. </span>
+ <span class="identifier">broken_contract_handler</span>
+ <a name="contract.set_postcondition_broken"></a><span class="identifier">set_postcondition_broken</span><span class="special">(</span><span class="identifier">broken_contract_handler</span> handler<span class="special">)</span><span class="special">;</span>
+ <span class="keyword">void</span> <a class="link" href="contract/postcondition_broken.html" title="Function postcondition_broken"><span class="identifier">postcondition_broken</span></a><span class="special">(</span><span class="identifier">from</span> <span class="keyword">const</span> <span class="special">&</span><span class="special">)</span><span class="special">;</span>
+
+ <span class="comment">// Set handler for class invariant broken on entry to specified handler returning replaced handler. </span>
+ <span class="identifier">broken_contract_handler</span>
+ <a name="contract.set_class_invaria_id552567"></a><span class="identifier">set_class_invariant_broken_on_entry</span><span class="special">(</span><span class="identifier">broken_contract_handler</span> handler<span class="special">)</span><span class="special">;</span>
+ <span class="keyword">void</span> <a class="link" href="contract/class_invariant_b_id552579.html" title="Function class_invariant_broken_on_entry"><span class="identifier">class_invariant_broken_on_entry</span></a><span class="special">(</span><span class="identifier">from</span> <span class="keyword">const</span> <span class="special">&</span><span class="special">)</span><span class="special">;</span>
+
+ <span class="comment">// Set handler for class invariant broken on exit to specified handler returning replaced handler. </span>
+ <span class="identifier">broken_contract_handler</span>
+ <a name="contract.set_class_invaria_id552645"></a><span class="identifier">set_class_invariant_broken_on_exit</span><span class="special">(</span><span class="identifier">broken_contract_handler</span> handler<span class="special">)</span><span class="special">;</span>
+ <span class="keyword">void</span> <a class="link" href="contract/class_invariant_b_id552657.html" title="Function class_invariant_broken_on_exit"><span class="identifier">class_invariant_broken_on_exit</span></a><span class="special">(</span><span class="identifier">from</span> <span class="keyword">const</span> <span class="special">&</span><span class="special">)</span><span class="special">;</span>
+
+ <span class="comment">// Set handler for class invariant broken on throw to specified handler returning replaced handler. </span>
+ <span class="identifier">broken_contract_handler</span>
+ <a name="contract.set_class_invaria_id552723"></a><span class="identifier">set_class_invariant_broken_on_throw</span><span class="special">(</span><span class="identifier">broken_contract_handler</span> handler<span class="special">)</span><span class="special">;</span>
+ <span class="keyword">void</span> <a class="link" href="contract/class_invariant_b_id552735.html" title="Function class_invariant_broken_on_throw"><span class="identifier">class_invariant_broken_on_throw</span></a><span class="special">(</span><span class="identifier">from</span> <span class="keyword">const</span> <span class="special">&</span><span class="special">)</span><span class="special">;</span>
+
+ <span class="comment">// For convenience, set all class invariant broken handlers (on entry, on exit, and on throw) to specified handler. </span>
+ <span class="keyword">void</span> <a name="contract.set_class_invariant_broken"></a><span class="identifier">set_class_invariant_broken</span><span class="special">(</span><span class="identifier">broken_contract_handler</span> handler<span class="special">)</span><span class="special">;</span>
+
+ <span class="comment">// Set block invariant broken handler to specified handler returning replaced handler. </span>
+ <span class="identifier">broken_contract_handler</span>
+ <a name="contract.set_block_invariant_broken"></a><span class="identifier">set_block_invariant_broken</span><span class="special">(</span><span class="identifier">broken_contract_handler</span> handler<span class="special">)</span><span class="special">;</span>
+ <span class="keyword">void</span> <a class="link" href="contract/block_invariant_broken.html" title="Function block_invariant_broken"><span class="identifier">block_invariant_broken</span></a><span class="special">(</span><span class="identifier">from</span> <span class="keyword">const</span> <span class="special">&</span><span class="special">)</span><span class="special">;</span>
+
+ <span class="comment">// Set the loop variant broken handler to specified handler returning replaced handler. </span>
+ <span class="identifier">broken_contract_handler</span>
+ <a name="contract.set_loop_variant_broken"></a><span class="identifier">set_loop_variant_broken</span><span class="special">(</span><span class="identifier">broken_contract_handler</span> handler<span class="special">)</span><span class="special">;</span>
+ <span class="keyword">void</span> <a class="link" href="contract/loop_variant_broken.html" title="Function loop_variant_broken"><span class="identifier">loop_variant_broken</span></a><span class="special">(</span><span class="identifier">from</span> <span class="keyword">const</span> <span class="special">&</span><span class="special">)</span><span class="special">;</span>
+<span class="special">}</span></pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="header.contract.class_hpp"></a>Header <contract/class.hpp></h3></div></div></div>
+<p>Macros used to declare classes with contracts (this header is automatically included by <code class="computeroutput">contract.hpp</code>). </p>
+<pre class="synopsis">
+
+<a class="link" href="CONTRACT_CLASS.html" title="Macro CONTRACT_CLASS">CONTRACT_CLASS</a>(class_declaration)
+<a class="link" href="CONTRACT_CLASS_TPL.html" title="Macro CONTRACT_CLASS_TPL">CONTRACT_CLASS_TPL</a>(class_declaration)</pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="header.contract.class_invariant_hpp"></a>Header <contract/class_invariant.hpp></h3></div></div></div>
+<p>Macros used to specify class invariants (this header is automatically included by <code class="computeroutput">contract.hpp</code>). </p>
+<pre class="synopsis">
+
+<a class="link" href="CONTRACT_CLASS_INVARIANT.html" title="Macro CONTRACT_CLASS_INVARIANT">CONTRACT_CLASS_INVARIANT</a>(class_invariants)
+<a class="link" href="CONTRACT_CLASS_INVARIANT_TPL.html" title="Macro CONTRACT_CLASS_INVARIANT_TPL">CONTRACT_CLASS_INVARIANT_TPL</a>(class_invariants)</pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="header.contract.config_hpp"></a>Header <contract/config.hpp></h3></div></div></div>
+<p>Macros used to configure the library behaviour at compile-time (this header is automatically included by <code class="computeroutput">contract.hpp</code>). </p>
+<p>These configuration macros have appropriate default values if left undefined. Programmers can define these macros before including any of the library headers (using compiler options like <code class="computeroutput">-D</code> for GCC, <code class="computeroutput">/D</code> for MSVC, etc) in order to change the library behaviour.</p>
+<p>The macros <code class="computeroutput"><a class="link" href="CONTRACT_CONFIG_NO_PRECONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_PRECONDITIONS">CONTRACT_CONFIG_NO_PRECONDITIONS</a></code>, <code class="computeroutput"><a class="link" href="CONTRACT_CONFIG_NO_POSTCONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_POSTCONDITIONS">CONTRACT_CONFIG_NO_POSTCONDITIONS</a></code>, etc can be defined to selectively disable compilation and run-time checking of all preconditions, postconditions, etc. This is a common practice in Contract Programming to generate debug and release builds with less correctness checks but faster run-times. Note that all contracts are compiled and checked at run-time by default unless specified otherwise using these configuration macros.</p>
+<p><span class="bold"><strong>See also:</strong></span> <a class="link" href="contract__/getting_started.html" title="Getting Started"> Getting Started</a> section, <a class="link" href="contract__/contract_programming_overview.html" title="Contract Programming Overview"> Contract Programming Overview</a> section. </p>
+<pre class="synopsis">
+
+<a class="link" href="CONTRACT_CONFIG_NO_PRECONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_PRECONDITIONS">CONTRACT_CONFIG_NO_PRECONDITIONS</a>
+<a class="link" href="CONTRACT_CONFIG_NO_POSTCONDITIONS.html" title="Macro CONTRACT_CONFIG_NO_POSTCONDITIONS">CONTRACT_CONFIG_NO_POSTCONDITIONS</a>
+<a class="link" href="CONTRACT_CONFIG_NO_CLASS_INVARIANTS.html" title="Macro CONTRACT_CONFIG_NO_CLASS_INVARIANTS">CONTRACT_CONFIG_NO_CLASS_INVARIANTS</a>
+<a class="link" href="CONTRACT_CONFIG_NO_BLOCK_INVARIANTS.html" title="Macro CONTRACT_CONFIG_NO_BLOCK_INVARIANTS">CONTRACT_CONFIG_NO_BLOCK_INVARIANTS</a>
+<a class="link" href="CONTRACT_CONFIG_NO_LOOP_VARIANTS.html" title="Macro CONTRACT_CONFIG_NO_LOOP_VARIANTS">CONTRACT_CONFIG_NO_LOOP_VARIANTS</a>
+<a class="link" href="CONTRACT_CONFIG_FUNCTION_ARITY_MAX.html" title="Macro CONTRACT_CONFIG_FUNCTION_ARITY_MAX">CONTRACT_CONFIG_FUNCTION_ARITY_MAX</a>
+<a class="link" href="CONTRACT_CONFIG_INHERITANCE_MAX.html" title="Macro CONTRACT_CONFIG_INHERITANCE_MAX">CONTRACT_CONFIG_INHERITANCE_MAX</a>
+<a class="link" href="CONTRACT_CONFIG_OLDOF_MAX.html" title="Macro CONTRACT_CONFIG_OLDOF_MAX">CONTRACT_CONFIG_OLDOF_MAX</a>
+<a class="link" href="CONTRACT_CONFIG_ARRAY_DIMENSION_MAX.html" title="Macro CONTRACT_CONFIG_ARRAY_DIMENSION_MAX">CONTRACT_CONFIG_ARRAY_DIMENSION_MAX</a>
+<a class="link" href="CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS.html" title="Macro CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS">CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS</a>
+<a class="link" href="CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION.html" title="Macro CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION">CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION</a>
+<a class="link" href="CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE.html" title="Macro CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE">CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE</a>
+<a class="link" href="CONTRACT_CONFIG_THREAD_SAFE.html" title="Macro CONTRACT_CONFIG_THREAD_SAFE">CONTRACT_CONFIG_THREAD_SAFE</a></pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="header.contract.constructor_hpp"></a>Header <contract/constructor.hpp></h3></div></div></div>
+<p>Macros used to declare constructors with contracts (this header is automatically included by <code class="computeroutput">contract.hpp</code>). </p>
+<pre class="synopsis">
+
+<a class="link" href="CONTRACT_CONSTRUCTOR.html" title="Macro CONTRACT_CONSTRUCTOR">CONTRACT_CONSTRUCTOR</a>(function_declaration)
+<a class="link" href="CONTRACT_CONSTRUCTOR_TPL.html" title="Macro CONTRACT_CONSTRUCTOR_TPL">CONTRACT_CONSTRUCTOR_TPL</a>(function_declaration)</pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="header.contract.copy_hpp"></a>Header <contract/copy.hpp></h3></div></div></div>
+<p>Copy result value and old values for postconditions (this header is automatically included by <code class="computeroutput">contract.hpp</code>). </p>
+<pre class="synopsis"><span class="keyword">namespace</span> <span class="identifier">contract</span> <span class="special">{</span>
+ <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> T<span class="special">></span> <span class="keyword">class</span> <a class="link" href="contract/copy.html" title="Class template copy">copy</a><span class="special">;</span>
+<span class="special">}</span></pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="header.contract.destructor_hpp"></a>Header <contract/destructor.hpp></h3></div></div></div>
+<p>Macros used to declare destructors with contracts (this header is automatically included by <code class="computeroutput">contract.hpp</code>). </p>
+<pre class="synopsis">
+
+<a class="link" href="CONTRACT_DESTRUCTOR.html" title="Macro CONTRACT_DESTRUCTOR">CONTRACT_DESTRUCTOR</a>(function_declaration)
+<a class="link" href="CONTRACT_DESTRUCTOR_TPL.html" title="Macro CONTRACT_DESTRUCTOR_TPL">CONTRACT_DESTRUCTOR_TPL</a>(function_declaration)</pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="header.contract.function_hpp"></a>Header <contract/function.hpp></h3></div></div></div>
+<p>Macros used to declare free functions, member functions, and operators with contracts (this header is automatically included by <code class="computeroutput">contract.hpp</code>). </p>
+<pre class="synopsis">
+
+<a class="link" href="CONTRACT_FUNCTION.html" title="Macro CONTRACT_FUNCTION">CONTRACT_FUNCTION</a>(function_declaration)
+<a class="link" href="CONTRACT_FUNCTION_TPL.html" title="Macro CONTRACT_FUNCTION_TPL">CONTRACT_FUNCTION_TPL</a>(function_declaration)</pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="header.contract.limits_hpp"></a>Header <contract/limits.hpp></h3></div></div></div>
+<p>Macros reporting bounds of some library constructs (this header is automatically included by <code class="computeroutput">contract.hpp</code>). </p>
+<p>These are <span class="emphasis"><em>not</em></span> configuration macros so programmers cannot change these values. These macros are used to inform programmers of bounds on some of this library constructs. </p>
+<pre class="synopsis">
+
+<a class="link" href="CONTRACT_LIMIT_OLDOFS.html" title="Macro CONTRACT_LIMIT_OLDOFS">CONTRACT_LIMIT_OLDOFS</a>
+<a class="link" href="CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS.html" title="Macro CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS">CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS</a>
+<a class="link" href="CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES.html" title="Macro CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES">CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES</a></pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="header.contract.loop_variant_hpp"></a>Header <contract/loop_variant.hpp></h3></div></div></div>
+<p>Macros used to specify loop variants (this header is automatically included by <code class="computeroutput">contract.hpp</code>). </p>
+<pre class="synopsis">
+
+<a class="link" href="CONTRACT_LOOP.html" title="Macro CONTRACT_LOOP">CONTRACT_LOOP</a>(loop_declaration)
+<a class="link" href="CONTRACT_LOOP_VARIANT.html" title="Macro CONTRACT_LOOP_VARIANT">CONTRACT_LOOP_VARIANT</a>(loop_variant)
+<a class="link" href="CONTRACT_LOOP_VARIANT_TPL.html" title="Macro CONTRACT_LOOP_VARIANT_TPL">CONTRACT_LOOP_VARIANT_TPL</a>(loop_variant)</pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="header.contract.oldof_hpp"></a>Header <contract/oldof.hpp></h3></div></div></div>
+<p>Constructs to declare postcondition old values (this header is automatically included by <code class="computeroutput">contract.hpp</code>). </p>
+<pre class="synopsis">
+
+<a class="link" href="CONTRACT_OLDOF.html" title="Macro CONTRACT_OLDOF">CONTRACT_OLDOF</a></pre>
+<pre class="synopsis"><span class="keyword">namespace</span> <span class="identifier">contract</span> <span class="special">{</span>
+ <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> OldofExpressionType<span class="special">></span> <span class="keyword">struct</span> <a class="link" href="contract/has_oldof.html" title="Struct template has_oldof">has_oldof</a><span class="special">;</span>
+<span class="special">}</span></pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="header.contract.parameter_hpp"></a>Header <contract/parameter.hpp></h3></div></div></div>
+<p>Macros used to program named and deduced parameters (this header is automatically included by <code class="computeroutput">contract.hpp</code>). </p>
+<pre class="synopsis">
+
+<a class="link" href="CONTRACT_CONSTRUCTOR_ARG.html" title="Macro CONTRACT_CONSTRUCTOR_ARG">CONTRACT_CONSTRUCTOR_ARG</a>(parameter_name)
+<a class="link" href="CONTRACT_PARAMETER_TYPEOF.html" title="Macro CONTRACT_PARAMETER_TYPEOF">CONTRACT_PARAMETER_TYPEOF</a>(parameter_name)
+<a class="link" href="CONTRACT_PARAMETER.html" title="Macro CONTRACT_PARAMETER">CONTRACT_PARAMETER</a>(named_parameter_declaration)
+<a class="link" href="CONTRACT_TEMPLATE_PARAMETER.html" title="Macro CONTRACT_TEMPLATE_PARAMETER">CONTRACT_TEMPLATE_PARAMETER</a>(named_parameter_declaration)
+<a class="link" href="CONTRACT_PARAMETER_BODY.html" title="Macro CONTRACT_PARAMETER_BODY">CONTRACT_PARAMETER_BODY</a>(function_name)</pre>
+</div>
+</div>
+<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
+<td align="left"></td>
+<td align="right"><div class="copyright-footer">Copyright © 2008-2012 Lorenzo Caminiti<p>
+ Distributed under 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)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="contract__/no_variadic_macros.html"><img src="../..//doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="index.html"><img src="../..//doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="index.html"><img src="../..//doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="CONTRACT_BLOCK_INVARIANT.html"><img src="../..//doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
Added: sandbox/contract/doc/introduction.qbk
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/introduction.qbk 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,100 @@
+
+[/ Copyright (C) 2008-2012 Lorenzo Caminiti ]
+[/ Distributed under 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) ]
+[/ Home at http://sourceforge.net/projects/contractpp ]
+
+[section Introduction]
+
+[@http://en.wikipedia.org/wiki/Design_by_contract Contract Programming] (CP) allows to specify preconditions, postconditions, and class invariants that are automatically checked when functions are executed at run-time.
+These conditions assert program specifications within the source code itself allowing to find bugs more quickly during testing, making the code self-documenting, and increasing overall software quality.
+
+Contract Programming is also known as Design by Contract (DbC)
+[footnote
+Design by Contract is a registered trademark of [@http://en.wikipedia.org/wiki/Eiffel_Software Eiffel Software].
+]
+and it was first introduced by the __Eiffel__ programming language (see __Meyer97__).
+All Contract Programming features of the __Eiffel__ programming language are supported by this library, among others (see also the __Features__ section):
+
+# Support for preconditions, postconditions, class invariants, block invariants, and loop variants.
+# Subcontract derived classes (with support for pure virtual functions and multiple inheritance).
+# Access expression old values and function return value in postconditions.
+# Optional compilation and checking of preconditions, postconditions, class invariants, block invariants, and loop variants.
+# Customizable actions on contract assertion failure (terminate by default but it can throw, exit, etc).
+
+In addition, this library supports virtual specifiers, concept checking, and named parameters which together with contracts specify requirements of the program interface.
+This library is implemented for the __CXX03__ standard and it does not require __CXX11__.
+
+[heading An Example]
+
+The example below shows how to use this library to program contracts for the C++ Standard Template Library (STL) member function [@http://www.sgi.com/tech/stl/BackInsertionSequence.html `std::vector::push_back`] (in order to illustrate subcontracting, the `vector` class inherits from the somewhat arbitrary `pushable` base class).
+The syntax used by this library is compared side-by-side with the syntax proposed by __N1962__ for adding Contract Programming to C++ (see also [@../../example/contracts/push_back.cpp =push_back.cpp=] and [@../../example/contracts/pushable.hpp =pushable.hpp=]):
+
+[import ../example/contracts/push_back.cpp]
+[import ../example/contracts/push_back_lines.cpp]
+[import ../example/contracts/push_back_npaper.cpp]
+[table
+ [ [#] [This Library (C++03)] [N1962 and N2081 Proposals (not adopted by C++11)
+[footnote
+Unfortunately, the Contract Programming proposal __N1962__ and the concept proposal __N2081__ were never adopted by the C++ standard so the example on the right hand side will not compile.
+]
+ ] ]
+ [ [[push_back_lines]] [[push_back]] [[push_back_npaper]] ]
+]
+
+Classes and functions are declared using the [macroref CONTRACT_CLASS] and [macroref CONTRACT_FUNCTION] macros respectively.
+Class invariants must appear at the very beginning of the class definition and they are specified using the [macroref CONTRACT_CLASS_INVARIANT] macro.
+The `TPL` postfixes indicate versions of the macros that need to be used within templates.
+
+Note the following differences between the syntax used by this library macros and the usual C++ declaration syntax (see the __Differences_with_CXX_Syntax__ section for a complete list):
+
+* Round parenthesis `template( ... )` are used instead of angular parenthesis `template< ... >` to declare templates (line 7).
+* Similarly to __N2081__, the specifier `requires( ... )` is used to specify concepts to check (line 7).
+* The class and function names are wrapped within round parenthesis `(vector)` and `(push_back)` (lines 8 and 18).
+* The specifier `extends( ... )` is used instead of the column symbol `:` to inherit from base classes (line 8).
+This automatically subcontracts `vector` from `pushable` (when subcontracting, derived and base preconditions are checked in __logic_or__, derived and base postconditions are checked in __logic_and__, derived and base class invariants are checked __logic_and__).
+* The access level `public`, `protected`, or `private` must always be specified for member functions but without the trailing column symbol `:` (line 18).
+* The function result and parameter types are wrapped within round parenthesis `(T const&)` (line 18).
+The parenthesis are allowed but not required for fundamental types that contain no symbol (e.g., the function result type `void` at line 18, but also `bool`, `unsigned int const`, etc).
+* Similarly to __CXX11__, the specifier `override` is used to check that a member function is indeed overriding a base member function (line 18).
+* The specifiers `precondition( ... )` and `postcondition( ... )` are used to program function preconditions and postconditions (lines 19 and 22).
+Furthermore, the [macroref CONTRACT_OLDOF] macro can be used within postconditions to declare variables and initialize them to old values that the specified expressions had before executing the function body (line 23).
+* Class invariants, preconditions, and postconditions assert boolean expressions separated by commas `,` (lines 11, 20, and 24).
+
+Finally, note that the class and function definitions are programmed outside the macros so they retain their usual C++ syntax (e.g., the function body at line 27).
+
+The library executes the following steps when the `push_back` function is called at run-time (see also the __Contract_Programming_Overview__ section):
+
+# First, the class invariants and the function preconditions are checked.
+# Then, the function body is executed.
+# Last, the class invariants and the function postconditions are checked.
+
+For example, if there is a bug in the function caller for which `push_back` is called when `size` is equal to `max_size` then the execution of the program will be interrupted reporting a failure of the first assertion in the preconditions and it will be evident that the bug is in the caller:
+
+[pre
+ precondition number 1 "size() < max_size()" failed: file "push_back.cpp", line 26
+]
+
+Instead, if there is a bug in the `push_back` implementation for which `size` is not increased by one after `value` is added to `vector` by the function body then the execution will be interrupted reporting a failure of the first assertion in the postconditions and it will be evident that the bug is in `push_back` body:
+
+[pre
+ postcondition number 1 "size() == old_size + 1" failed: file "push_back.cpp", line 26
+]
+
+By default, when assertions fail this library prints the above error messages to the standard error `std::cerr` and it terminates the program calling `std::terminate` (this behaviour can be customized to throw an exception, exit the program, etc, see the __Broken_Contracts__ section).
+Note that the library error messages contain enough information to uniquely identify the contract failure: Assertion type (class invariant, precondition, postcondition, etc), assertion number, asserted expression, file name, and line number.
+(The line number refers to the single line on which each macro expands so it will be the same for class invariants, preconditions, and postconditions of a given class or function but it can still be used together with the assertion number to uniquely identity which assertion failed.)
+
+[heading Language Support]
+
+This library suffers of two limitations:
+
+# The unusual syntax used to declare classes and functions within the macros which causes cryptic compiler errors when not used correctly (syntax error checking and reporting could be somewhat improved in future revisions of the library but there are fundamental limitations on what can be done using the preprocessor, see also the [link syntax_error_warning_anchor Grammar] section).
+# High compilation times (the authors will try to reduce compilation times in future revisions of the library, see also the [link compilation_time_warning_anchor Cost] section).
+
+With the addition of contracts, concepts, and named parameters, C++ could introduce formal program specification into main-stream programming.
+The authors wish the work done in developing this library will persuade the C++ community and the C++ standard committee to add these features to the core language so to support formal program specification without the unusual macro syntax and avoiding high compilation times (unfortunately, this has not been the direction taken for __CXX11__ with the rejection of the concept proposal __N2081__ and the lack of consideration for the Contract Programming proposal __N1962__, but there might still be hope for C++1x with x > 1).
+
+[endsect]
+
Added: sandbox/contract/doc/named_parameters.qbk
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/named_parameters.qbk 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,426 @@
+
+[/ Copyright (C) 2008-2012 Lorenzo Caminiti ]
+[/ Distributed under 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) ]
+[/ Home at http://sourceforge.net/projects/contractpp ]
+
+[section Named Parameters]
+
+This section explains how to use this library to program named parameters and deduced named parameters which are used instead of C++ usual positional parameters to specify arguments to function calls.
+Parameter names are part of the program specifications and therefore named parameters are within the scope of this library.
+
+This library internally uses __Boost_Parameter__ to implement named parameters.
+This library only offers an easier syntax for constructor and class template named parameters with respect the functionality already provided by __Boost_Parameter__, but this library allows to specify named parameters, concepts, and contracts all together within a unified syntax.
+
+[section Overview]
+
+In C++, parameters are identified with respect to their declaration position within the parameter list: The first call /argument/ (i.e., the specific value assigned to the formal parameter at the call site) maps to the first declared parameter, the second call argument maps to the second declared parameter, etc.
+For example:
+
+ window* make_window (
+ char const& name,
+ size_t width = 10,
+ bool moveable = true,
+ bool visible = true
+ )
+ ;
+
+This protocol is sufficient when there is at most one parameter with a useful default value but when there are even a few useful default parameters the positional interface becomes difficult to use at the calling site.
+For example, in the following call we need to repeat the default parameter value `10`:
+
+ bool const unmoveable = false;
+ make_window("warning", 10, unmoveable); // Positional (usual).
+
+Furthermore, it would be easier to understand the meaning of the arguments at the calling site if the parameters could be referred by their names.
+For example, in order to understand if the following window is moveable and invisible, or unmoveable and visible, programmers at the calling site need to remember the order of the parameter declarations:
+
+ make_window("note", 10, true, false); // Positional (usual).
+
+These issues would be solved if the parameter names could be referred at the calling site and that is what [@http://en.wikipedia.org/wiki/Named_parameter ['named parameters]] allow to do:
+
+ make_window("warning", moveable = false); // Named.
+ make_widnow("note", visible = false);
+
+Named parameters were proposed for addition to early versions of C++ but the proposal was never accepted (see ["keyword arguments] in __Stroustrup94__).
+Other programming languages support named parameters (__Ada__, __Python__, etc).
+
+Furthermore, /deduced named parameters/ are named parameters that can be passed in any position and without supplying their names.
+These are useful when functions have parameters that can be uniquely identified (or /deduced/) based on the argument types of the function call.
+For example, the `name` parameter is such a parameter, it can be deduced because no other argument, if valid, can be reasonably converted into a `char const*`.
+Therefore, with a deduced parameter interface, we could pass the window name in any position without causing any ambiguity (with an appropriately designed deduced parameter interface, the caller might not even have to remember the actual parameter names):
+
+ make_window(moveable = false, "warning"); // Deduced.
+ make_window("note", visible = false);
+
+The same reasoning applies to named template parameters and deduced named template parameters:
+
+ template< typename ValueType, bool Shared = true >
+ class smart_ptr ;
+
+ smart_ptr<std::string, false> p1; // Positional (usual).
+ smart_ptr<false, std::string> p2; // Deduced.
+ smart_ptr<Shared = false, ValueType = std::string> p3; // Named.
+
+[endsect]
+
+[section Named Function Parameters]
+
+To show how to program named parameters, we will program a named parameter interface for the [@http://www.boost.org/doc/libs/1_49_0/libs/graph/doc/depth_first_search.html Depth First Search (DFS)] algorithm of the __Boost_Graph__ library:
+
+ template<
+ class Graph,
+ class Visitor,
+ class IndexMap,
+ class ColorMap
+ > requires
+ is_incidence_and_vertex_list_graph<Graph>,
+ is_integral_property_map_of_key<IndexMap, vertext_descriptor<Graph> >,
+ is_property_map_of_key<ColorMap, vertex_descriptor<Graph> >
+ void depth_first_search (
+ Graph const& graph,
+ Visitor const& visitor = dfs_visitor<>(),
+ vertex_descriptor<Graph> const& root_vertex =
+ *vertices(graph).first,
+ IndexMap const& index_map = get(vertex_index, graph),
+ ColorMap& color_map =
+ default_color_map(num_vertices(graph), index_map)
+ )
+ ;
+
+This is non-valid C++ code but it can be considered pseudo-code to illustrate the function interface that we need to program.
+The concept syntax `requires` was ["borrowed] here to express parameter type requirements but a failure to satisfy such requirements is intended to fail the function call resolution and not to cause a concept error as usual.
+
+[variablelist
+[ [=graph=] [
+This is an input parameter (`const&`), its type must match a model of both `IndicenceGraph` and `VertexListGraph`, and it has no default value (required parameter).
+] ]
+[ [=visitor=] [
+This is an input parameter (`const&`), its type has no requirement, and its value defaults to a DFS visitor (optional parameter).
+] ]
+[ [=root_vertex=] [
+This is an input parameter (`const&`), its type must be `vertex_descriptor<Graph>`, and its value defaults to the first vertex of the specified graph (optional parameter).
+] ]
+[ [=index_map=] [
+This is an input parameter (`const&`), its type must match a model of `IntegralPropertyMap` with key type `vertex_descriptor<Graph>`, its value defaults to the vertex index of the specified graph (optional parameter).
+] ]
+[ [=color_map=] [
+This is an input and output parameter (non-constant reference `&`), its type must match a model of `PropertyMap` with key type `vertex_descriptor<Graph>`, its value defaults to a map with size equal to the number of vertices of the specified graph and created from the specified `index_map` (optional parameter).
+] ]
+]
+
+[*Parameter Identifiers]
+
+First of all, it is necessary to declare special elements that will serve as the parameter and argument identifiers (see also [file example/named_parameters named_params_dfs.cpp]):
+
+[import ../example/named_parameters/named_params_dfs.cpp]
+[named_params_dfs_keywords]
+
+For example, the first [macroref CONTRACT_PARAMETER] macro declares an identifier `graph` that is used as the parameter name in the function declaration and also an identifier `graph_` (note the trailing underscore `_`) that is used to name the argument at the call site.
+
+[note
+By default, argument identifiers are differentiated from parameter identifiers using a trailing underscore `_` to avoid name clashes (see also the __Parameter_Identifiers__ section).
+Furthermore, it is recommended to always declare these identifiers within a namespace to avoid name clashes (because different functions in different sections of the code might very well use the same parameter names so namespaces can be used to control overlapping names).
+]
+
+For example, for a library named Graphs, all named parameter identifiers could be declared under the `graphs` namespace and maybe in a single header =graphs_params.hpp=.
+Many different functions within `graphs` (for example `graphs::depth_first_search` and `graphs::breadth_first_search`) will share a number of common parameter names (for example a parameter named `graph` with parameter identifier `graphs::graph` and argument identifier `graphs::graph_`).
+All these named parameters will be defined in one places in =graphs_params.hpp= and within the `graphs` namespace so programmers can conveniently control and avoid named clashes.
+
+[*Function Declaration]
+
+The function is declared using the following syntax (see also [file example/named_parameters named_params_dfs.cpp]):
+
+[named_params_dfs_decl]
+
+This example required no preconditions and no postconditions.
+
+[*In, In Out, and Out Parameters]
+
+Input parameters (i.e., constant references `const&`) are prefixed by the specifier `in` (see also the __Grammar__ section):
+
+ in ... graph // Input parameter.
+
+Input and output parameters (i.e., non-constant reference `&`) are prefixed by both specifiers `in out` (in this order, see also the __Grammar__ section):
+
+ in out ... color_map // Input-output parameter.
+
+Output parameters can be prefixed just by the specifier `out` but their implementation is equivalent to using the specifiers `in out` (i.e., non-constant reference `&`).
+[footnote
+*Rationale.*
+C++ cannot express the semantics that an output parameter should be written and never read within a function because references can always be both written and read.
+]
+Note that a named parameter must always be specified either `in`, `in out`, or `out` (and that is what distinguish syntactically a named parameter from a positional parameter; this use of `in`, `in out`, and `out` resembles __Ada__'s syntax).
+Named and positional parameters cannot be used together in the same function declaration.
+
+[*Parameter Types]
+
+Exact parameter types are specified just before the parameter name and within parenthesis (unless they are fundamental types containing no symbol, see also the __Grammar__ section):
+
+ in (vertex_descriptor<CONTRACT_PARAMETER_TYPEOF(graph)>) root_vertex // Exact parameter type requirement.
+
+Generic parameter types (i.e., parameter types with no requirement, same as usual type template parameters) are specified using `auto` instead of the parameter type (see also the __Grammar__ section):
+
+ in auto visitor // No parameter type requirement.
+
+Predicate parameter type requirements are specified using `requires(`[^['unary-boolean-metafunction]]`)` instead of the parameter type, the type of the argument specified by the function call will be required to match the specified unary boolean meta-function in order for the call to be resolved (see also the __Grammar__ section):
+
+ in requires(is_incidence_and_vertex_list_graph<boost::mpl::_>) graph // Predicate parameter type requirement.
+
+The placeholder `boost::mpl::_` makes this expression a unary meta-function (see __Boost_MPL__) and the library will substitute such a placeholder with the argument type specified at the call site when resolving the function call.
+
+[*Default Parameter Values]
+
+Default parameter values are specified using `, default `[^['default-parameter-value]] right after the parameter declaration (see also the __Grammar__ section):
+
+ in auto visitor, default boost::dfs_visitor<>()
+
+Default parameter values are not evaluated and their types are not even instantiated if an actual argument is specified by the function call.
+
+[note
+The type and value of a parameters can be used within the declaration of other parameters.
+The type of a named parameter can be accessed using the [macroref CONTRACT_PARAMETER_TYPEOF] macro (this is especially useful for generic parameter types and for parameter types with predicate requirements because these types are not known until the function call is resolved).
+]
+
+[*Function Call]
+
+The `graphs::depth_first_search` function can be called using argument identifiers to name its parameters (see also [file example/named_parameters named_params_dfs.cpp]):
+
+[named_params_dfs_call]
+
+[endsect]
+
+[section Deduced Function Parameters]
+
+To show how to program deduced named parameters, we program the parameter interface for the [@http://www.boost.org/doc/libs/1_49_0/libs/python/doc/v2/def.html#def-spec `def`] function of the __Boost_Python__ library (see also [file example/named_parameters deduced_params_pydef.cpp]):
+
+[import ../example/named_parameters/deduced_params_pydef.cpp]
+[deduced_params_pydef_decl]
+
+Also a precondition was specified in this example.
+(Concepts for named parameters are explained later in this section.)
+
+Deduced parameters are named parameter that are prefixed by the `deduce` specifier (see also the __Grammar__ section):
+
+ deduce in (char const*) docstring // Deduced input parameter.
+
+When calling the function `py::def` only two arguments are required `name` and `func`.
+The association between any addition argument and its parameter can be deduced based on the types of the arguments specified by the function call (so the caller is neither required to remember the parameter positions nor to explicitly specify the parameter names for these arguments).
+
+For example, the first two calls below are equivalent and if programmers need to pass a `policy` argument that is also, for some reason, convertible to `char const*`, they can always specify the parameter name as in the third call below (see also [file example/named_parameters deduced_params_pydef.cpp]):
+
+[deduced_params_pydef_calls]
+
+[endsect]
+
+[section Member Function Parameters]
+
+The same syntax is used to specify named and deduced parameters for member functions (see also [file example/named_parameters member_named_params_callable2.cpp]):
+
+[import ../example/named_parameters/member_named_params_callable2.cpp]
+[member_named_params_callable2]
+
+No contracts were specified in this example.
+
+[note
+When the body definition of a function with named parameters is deferred from the function declaration, the body must be declared as a template function when it is defined and the special macro [macroref CONTRACT_PARAMETER_BODY] must be used to name the function.
+]
+
+The same macro is used to name both free and member body functions because the class type is specified outside this macro.
+The constructor body definition cannot be deferred from the constructor declaration (because of the lack of delegating constructors in __CXX03__).
+Destructors have no named parameters (because they have no parameter).
+Named parameters are not supported for operators (because of a __Boost_Parameter__ bug).
+[footnote
+*Rationale.*
+This library syntax supports named and deduced parameters for operators.
+However, __Boost_Parameter__ does not compile when used with operators because of a bug (__Boost_Parameter__ documentation claims support for operators but later revisions of __Boost_Parameter__ no longer compile when operators are used).
+If __Boost_Parameter__ were to be fixed to work with operators then this library named and deduced parameters should also work with operators.
+]
+Therefore the [macroref CONTRACT_PARAMETER_BODY] macro is used only with free and member functions that are not operators.
+[footnote
+*Rationale.*
+A macro [macroref CONTRACT_PARAMETER_BODY] different from [macroref CONTRACT_MEMBER_BODY] and [macroref CONTRACT_FREE_BODY] is necessary because named parameters will still be enabled even when contracts are turned off using [macroref CONTRACT_CONFIG_NO_PRECONDITIONS], etc.
+]
+
+In this example, named parameters were specified for all `callable2::call` overloads and for the `static` member function `callable2:static_call`:
+
+[member_named_params_callable2_calls]
+
+[endsect]
+
+[section Constructor Parameters]
+
+The same syntax is used to specify named and deduced parameters for constructors (see also [file example/named_parameters constructor_named_params_family.cpp]):
+[footnote
+Arguably, this library offers a better syntax than __Boost_Parameter__ for constructor named and deduced parameters (because __Boost_Parameter__ requires boiler-plate code and an extra base class in order to handle constructors).
+]
+
+[import ../example/named_parameters/constructor_named_params_family.cpp]
+[constructor_named_params_family]
+
+Both preconditions and postconditions were specified for the constructor.
+
+[important
+Member initializers must access named and deduced parameters using the special macro [macroref CONTRACT_CONSTRUCTOR_ARG] (otherwise the compiler will generate an error).
+[footnote
+*Rationale.*
+This limitation comes from the lacks of delegating constructors in __CXX03__ (as with all other limitations of this library related to member initializers).
+]
+]
+
+Named and deduced parameters can be used to specify the arguments when constructing the object:
+
+[constructor_named_params_family_call]
+
+[endsect]
+
+[section Class Template Parameters]
+
+Only class templates are discussed in this section because function templates are effectively always declared when a function uses named or deduced parameters.
+In fact, a function with named or deduced parameters is always a function template (possibly with fully generic templated types when the named and deduced parameters types are specified `auto`).
+
+To show how to program named and deduced template parameters, we will program a named parameter interface for the [@http://www.boost.org/doc/libs/1_49_0/libs/python/doc/v2/class.html#class_-spec `class_`] class template of the __Boost_Python__ library:
+
+ template<
+ class ClassType,
+ class Bases = bases<>,
+ typename HeldType = not_sepcified,
+ typename Copyable = not_specified
+ > requires
+ is_class<ClassType>
+ class class_ ;
+
+[variablelist
+[ [ClassType] [
+This type parameter must be a class and it has no default value (required parameter).
+] ]
+[ [Bases] [
+This type parameter must be a specialization of `boost::python::bases` specifying base classes if any (see `boost::python::detail::specifies_bases`) and its value defaults to `boost::python::bases<>`.
+] ]
+[ [HeldType] [
+This type parameter has no constraint and it is not specified by default (see `boost::python::detail::not_specified`).
+] ]
+[ [Copyable] [
+This type parameter must be `boost::noncopyable` if specified and it is not specified by default (see `boost::python::detail::not_specified`).
+] ]
+]
+
+[important
+Unfortunately, named and deduced template parameters can only handle type template parameters (i.e., value template parameters and template template parameters are not supported).
+[footnote
+*Rationale.*
+This library only supports named and deduced type template parameter because it internally uses __Boost_Parameter__ and __Boost_Parameter__ does not support non-type template parameters.
+However, this library syntax would support named and deduced value template parameters and template template parameters if these were ever supported by __Boost_Parameter__ (see template parameters within the __Grammar__ section).
+Named and deduced value template parameters can be emulated by wrapping their values into types (using `boost::mpl::int_`, `boos::mpl::bool_`, etc) at the cost of a somewhat cumbersome syntax.
+]
+]
+
+First of all, it is necessary to declare elements that will serve as template parameter and argument identifiers (see also [file example/named_parameters named_template_params_pyclass.cpp]):
+
+[import ../example/named_parameters/named_template_params_pyclass.cpp]
+[named_template_params_pyclass_keywords]
+
+For example, the first [macroref CONTRACT_TEMPLATE_PARAMETER] macro declares a specifier `ClassType` that can be used as the parameter name in the class template declaration and a specifier `ClassType_` (note the trailing underscore `_`) that can be used for the template argument at the template instantiation site.
+
+[note
+By default, template argument identifiers are differentiated from template parameter identifiers using a trailing underscore `_` to avoid name clashes (see also the __Parameter_Identifiers__ section).
+Furthermore, it is recommended to always declare these identifiers within a namespace to avoid name clashes (because different class templates in different sections of the code might very well use the same template parameter names so namespaces can be used to control overlapping names).
+]
+
+The class template is declared using a syntax similar to the one we have seen so far for named and deduced function parameters (see also [file example/named_parameters named_template_params_pyclass.cpp]):
+[footnote
+Arguably, this library offers a better syntax than __Boost_Parameter__ for named and deduced template parameters (because __Boost_Parameter__ requires boiler-plate code and the additional argument packing types to be programmed manually).
+]
+
+[named_template_params_pyclass]
+
+Note that template parameters are always specified using `in` because they are always input parameters (they are static types).
+Furthermore, `typename` or `class` must always follow the `in` specifier for type template parameters.
+[footnote
+*Rationale.*
+This syntax was designed so it can support non-type template parameters if this library and __Boost_Parameter__ were ever extended to support value template parameters and template template parameters (see template parameters in the __Grammar__ section).
+]
+Predicate type requirements `requires(`[^['unary-boolean-metafunction]]`)` are optional and they are specified right after `typename` or `class` if present.
+Default template parameter values are specified using `, default `[^['default-parameter-value]] as usual.
+(See also the __Grammar__ section.)
+
+The class template `py::class_` can be instantiated using the template parameter identifiers to name the arguments (see also [file example/named_parameters named_template_params_pyclass.cpp]):
+[footnote
+This named and deduced parameter syntax is not entirely ideal because it uses angular parenthesis `py::ClassType_<bx>` instead of the more readable assignment operator `py::ClassType_ = bx` to name the arguments (but that is how __Boost_Parameter__ is implemented and also this library authors see no way to implement the assignment operator syntax for named and deduced template parameters).
+]
+
+[named_template_params_pyclass_calls]
+
+[endsect]
+
+[section Concepts]
+
+As shown in the `py::class_` example above, it is possible to specify concepts for named and deduced template parameters.
+Concepts are specified using `requires` after the class template parameter declaration:
+
+ template( ... ) requires( ``[^['concept1]]``, ``[^['concept2]]``, ... )
+ class (class_) ...
+
+As shown in the `py::def` example earlier in this section, it is also possible to specify concepts for named and deduced function parameters (because named and deduced function parameter can be generic, as function template parameters are, when their types are specified `auto` or via a predicate type requirement).
+However, in this case concepts are specified using `requires` after the function parameter list (because there is not `template` declaration for functions with named and deduced parameters):
+
+ void (def) ( ... ) requires( ``[^['concept1]]``, ``[^['concept2]]``, ... )
+
+Note the following differences between specifying predicate type requirements and concepts for named and deduced parameters:
+
+* If predicate type requirements are not met, the function or class template will be taken out from the set of possible function overloads or template specializations in the function call or template instantiation resolution (this might ultimately generate a compiler error but only if there is no other function overload or template specialization that can be used).
+* If a concept check fails, the compiler will always generate a compiler error.
+
+[endsect]
+
+[section Parameter Identifiers]
+
+When using the [macroref CONTRACT_PARAMETER] and [macroref CONTRACT_TEMPLATE_PARAMETER] macros (see also the __Grammar__ section):
+
+# It is possible to specify a namespace that will contain the parameter identifiers using `namespace(`[^['parameter-identifier-namespace]]`)`.
+# It is also possible to specify the name of the argument identifier instead of using the automatic underscore `_` postfix using `(`[^['argument-identifier]]`)`.
+
+The following example generates parameter identifiers within the `params` namespace, and argument identifiers `NumberArg` and `value_arg` instead of the default `Number_` and `value_` for the `Number` and `value` parameters respectively (see also [file example/named_parameters named_param_identifiers_positive.cpp]):
+
+[import ../example/named_parameters/named_param_identifiers_positive.cpp]
+[named_param_identifiers_positive_keywords]
+
+When the parameter identifier namespace is specified, it must be repeated in the named and deduced parameter declaration list (see also the __Grammar__ section):
+
+ using namespace ``/paraemeter-identifier-namespace/``, ... // named and deduced parameters follow
+
+The authors find this syntax confusing so they recommend to never specify the parameter identifier namespace when using the [macroref CONTRACT_PARAMETER] and [macroref CONTRACT_TEMPLATE_PARAMETER] macros.
+[footnote
+*Rationale.*
+The ability to specify the parameter identifier (or tag) namespace is offered because it is offered by __Boost_Parameter__ and it gives programmers greater control.
+However, it should be rarely if ever needed because this library provides the [macro CONTRACT_PARAMETER_TYPEOF] macro.
+]
+Instead programmers are encouraged to use these macros within an enclosing namespace as done by the rest of the examples in this documentation.
+
+For example (see also [file example/named_parameters named_param_identifiers_positive.cpp]):
+
+[named_param_identifiers_positive]
+
+Class invariants, preconditions, and postconditions were also specified in this example.
+
+At the template instantiation and function call site, the specified argument identifiers `NumberArg` and `value_arg` can be used instead of the usual trailing underscore (see also [file example/named_parameters named_param_identifiers_positive.cpp]):
+
+[named_param_identifiers_positive_call]
+
+It is not necessary to specify both the parameter identifier namespace and the argument identifier as they are both and independently optional (see also the __Grammar__ section):
+
+ CONTRACT_TEMPLATE_PARAMETER( (NumberArg) Number ) // Specify only argument identifier.
+ CONTRACT_PARAMETER( namespace(params) value ) // Specify only parameter identifier namespace.
+
+It is recommended to never specify the argument identifiers to have the same names as the parameter identifiers in order to avoid the following usually silent bug (see also [file example/named_parameters named_param_identifiers_failure.cpp]):
+
+[import ../example/named_parameters/named_param_identifiers_failure.cpp]
+[named_param_identifiers_failure]
+
+The call `print(age = 3);` will assign `3` to `f`'s parameter `age` instead than passing `3` as the argument of `print`'s parameter `age`.
+The trailing underscore `_` convention and enclosing the named parameter declaration macros [macroref CONTRACT_PARAMETER] and [macroref CONTRACT_TEMPLATE_PARAMETER] within a namespace make this type of name clashes unlikely.
+
+[endsect]
+
+[endsect]
+
Added: sandbox/contract/doc/navbar.xsl
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/navbar.xsl 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,409 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (c) 2002 Douglas Gregor <doug.gregor -at- gmail.com>
+
+ 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)
+ -->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<!-- Already included in the main style sheet -->
+<!-- <xsl:import href="relative-href.xsl"/> -->
+
+ <!--
+ boost.defaults:
+ *custom - only use explicitly set parameters
+ Boost - use standard boost settings, can be overridden
+ -->
+ <xsl:param name = "boost.defaults" select = "'none'"/>
+
+ <!--
+ how to render the Home | Libraries | ... | More contents
+ *none - do not display ("standalone" mode)
+ horizontal - display in old-Boost style format (default for Boost)
+ vertical - like the new Getting Started layout
+ -->
+ <xsl:param name = "nav.layout">
+ <xsl:choose>
+ <xsl:when test = "$boost.defaults='Boost'">horizontal</xsl:when>
+ <xsl:otherwise>none</xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+ <!--
+ header border layout
+ Boost - place the old-Boost border around the header
+ *none - do not place a border around the header
+ -->
+ <xsl:param name = "nav.border" select = "'none'" />
+
+ <!--
+ nav.flow:
+ none - do not display navigation at the header
+ DocBook - display the navigation after the header
+ *Spirit - display "mini" navigation on the right
+ -->
+ <xsl:param name = "nav.flow" select = "'Spirit'"/>
+
+ <!-- location of the various Boost elements -->
+
+ <xsl:param name = "boost.root" select = "'../..'"/>
+ <xsl:param name = "boost.website" select = "'http://www.boost.org'"/>
+ <!-- Logo image location, leave empty for no logo -->
+ <xsl:param name = "boost.image.src">
+ <xsl:if test = "$boost.defaults = 'Boost'">
+ <xsl:value-of select = "'../../logo.png'"/>
+ </xsl:if>
+ </xsl:param>
+ <xsl:param name = "boost.image.alt">
+ <xsl:if test = "$boost.defaults = 'Boost'">
+ <xsl:value-of select = "'Logo'"/>
+ </xsl:if>
+ </xsl:param>
+ <xsl:param name = "boost.image.w">
+ <xsl:if test = "$boost.defaults = 'Boost'">
+ <xsl:value-of select = "277"/>
+ </xsl:if>
+ </xsl:param>
+ <xsl:param name = "boost.image.h">
+ <xsl:if test = "$boost.defaults = 'Boost'">
+ <xsl:value-of select = "86"/>
+ </xsl:if>
+ </xsl:param>
+ <xsl:param name = "boost.libraries">
+ <xsl:if test = "$boost.defaults = 'Boost'">
+ <xsl:value-of select = "concat($boost.root, '/libs/libraries.htm')"/>
+ </xsl:if>
+ </xsl:param>
+
+ <!-- header -->
+
+ <xsl:template name = "header.navigation">
+ <xsl:param name = "prev" select = "/foo"/>
+ <xsl:param name = "next" select = "/foo"/>
+ <xsl:param name = "nav.context"/>
+
+ <xsl:variable name = "home" select = "/*[1]"/>
+ <xsl:variable name = "up" select = "parent::*"/>
+
+ <table cellpadding = "2" width = "100%"><tr>
+ <xsl:if test = "$nav.border = 'Boost'">
+ <xsl:attribute name = "class">boost-head</xsl:attribute>
+ </xsl:if>
+
+ <td valign = "top">
+ <xsl:if test = "$nav.border = 'Boost'">
+ <xsl:attribute name = "style">background-color: white; width: 50%;</xsl:attribute>
+ </xsl:if>
+ <xsl:if test = "boolean(normalize-space($boost.image.src))">
+ <a href="http://sourceforge.net/projects/contractpp/">
+ <img alt="{$boost.image.alt}" width="{$boost.image.w}" height="{$boost.image.h}">
+ <xsl:attribute name="src">
+ <xsl:call-template name="href.target.relative">
+ <xsl:with-param name="target" select="$boost.image.src"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:if>
+ </td><xsl:choose>
+ <xsl:when test = "$nav.layout = 'horizontal'">
+ <xsl:call-template name = "header.navdata-horiz"/>
+ </xsl:when><xsl:when test = "$nav.layout = 'vertical'">
+ <xsl:call-template name = "header.navdata-vert"/>
+ </xsl:when>
+ </xsl:choose>
+ </tr></table>
+ <hr/>
+ <xsl:choose>
+ <xsl:when test = "$nav.flow = 'DocBook'">
+ <table width = "100%" class = "navheader">
+ <xsl:call-template name = "navbar.docbook-homeinfo">
+ <xsl:with-param name = "prev" select = "$prev"/>
+ <xsl:with-param name = "next" select = "$next"/>
+ <xsl:with-param name = "nav.context" select = "$nav.context"/>
+ </xsl:call-template>
+ <xsl:call-template name = "navbar.docbook-prevnext">
+ <xsl:with-param name = "prev" select = "$prev"/>
+ <xsl:with-param name = "next" select = "$next"/>
+ <xsl:with-param name = "nav.context" select = "$nav.context"/>
+ </xsl:call-template>
+ </table>
+ </xsl:when><xsl:when test = "$nav.flow = 'Spirit'">
+ <xsl:call-template name = "navbar.spirit">
+ <xsl:with-param name = "prev" select = "$prev"/>
+ <xsl:with-param name = "next" select = "$next"/>
+ <xsl:with-param name = "nav.context" select = "$nav.context"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name = "header.navdata-horiz">
+ <xsl:variable name="home_link">
+ <xsl:call-template name="href.target.relative">
+ <xsl:with-param name="target" select="concat( $boost.root, '/index.html' )"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="libraries_link">
+ <xsl:if test = "boolean($boost.libraries)">
+ <xsl:call-template name="href.target.relative">
+ <xsl:with-param name="target" select="$boost.libraries"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="people_link">
+ <xsl:call-template name="href.target.relative">
+ <xsl:with-param name="target" select="concat( $boost.website, '/users/people.html' )"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="faq_link">
+ <xsl:call-template name="href.target.relative">
+ <xsl:with-param name="target" select="concat( $boost.website, '/users/faq.html' )"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="more_link">
+ <xsl:call-template name="href.target.relative">
+ <xsl:with-param name="target" select="concat( $boost.root, '/more/index.htm' )"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test = "$nav.border = 'Boost'">
+ <td align = "center" class = "boost-headtd"><a href = "{$home_link}" class = "boost-headelem">Home</a></td>
+ <xsl:if test = "boolean($libraries_link)">
+ <td align = "center" class = "boost-headtd"><a href = "{$libraries_link}" class = "boost-headelem">Libraries</a></td>
+ </xsl:if>
+ <td align = "center" class = "boost-headtd"><a href = "{$people_link}" class = "boost-headelem">People</a></td>
+ <td align = "center" class = "boost-headtd"><a href = "{$faq_link}" class = "boost-headelem">FAQ</a></td>
+ <td align = "center" class = "boost-headtd"><a href = "{$more_link}" class = "boost-headelem">More</a></td>
+ </xsl:when><xsl:otherwise>
+ <td align = "center"><a href = "http://sourceforge.net/projects/contractpp/files/latest/download">Download</a></td>
+ <td align = "center"><a href = "http://sourceforge.net/apps/trac/contractpp/report/3">Bugs</a></td>
+ <td align = "center"><a href = "http://sourceforge.net/projects/contractpp/reviews/">Reviews</a></td>
+ <td align = "center"><a href = "mailto:lorcaminiti_at_[hidden]">Contact Us</a></td>
+ <td align = "center"><a href = "http://sourceforge.net/projects/contractpp/forums/forum/920163">Help</a></td>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name = "header.navdata-vert">
+ <xsl:variable name="home_link">
+ <xsl:call-template name="href.target.relative">
+ <xsl:with-param name="target" select="concat( $boost.root, '/index.html' )"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="libraries_link">
+ <xsl:call-template name="href.target.relative">
+ <xsl:with-param name="target" select="$boost.libraries"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="people_link">
+ <xsl:call-template name="href.target.relative">
+ <xsl:with-param name="target" select="concat( $boost.website, '/users/people.html' )"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="faq_link">
+ <xsl:call-template name="href.target.relative">
+ <xsl:with-param name="target" select="concat( $boost.website, '/users/faq.html' )"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="more_link">
+ <xsl:call-template name="href.target.relative">
+ <xsl:with-param name="target" select="concat( $boost.root, '/more/index.htm' )"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <td><div>
+ <xsl:if test = "$nav.border != 'Boost'">
+ <xsl:attribute name = "class">boost-toc</xsl:attribute>
+ </xsl:if>
+ <div><a href = "{$home_link}">Home</a></div>
+ <div><a href = "{$libraries_link}">Libraries</a></div>
+ <div><a href = "{$people_link}">People</a></div>
+ <div><a href = "{$faq_link}">FAQ</a></div>
+ <div><a href = "{$more_link}">More</a></div>
+ </div></td>
+ </xsl:template>
+
+
+ <!-- footer -->
+
+ <xsl:template name = "footer.navigation">
+ <xsl:param name = "prev" select = "/foo"/>
+ <xsl:param name = "next" select = "/foo"/>
+ <xsl:param name = "nav.context"/>
+
+ <hr/>
+ <xsl:choose>
+ <xsl:when test = "$nav.flow = 'DocBook'">
+ <table width = "100%" class = "navheader">
+ <xsl:call-template name = "navbar.docbook-prevnext">
+ <xsl:with-param name = "prev" select = "$prev"/>
+ <xsl:with-param name = "next" select = "$next"/>
+ <xsl:with-param name = "nav.context" select = "$nav.context"/>
+ </xsl:call-template>
+ <xsl:call-template name = "navbar.docbook-homeinfo">
+ <xsl:with-param name = "prev" select = "$prev"/>
+ <xsl:with-param name = "next" select = "$next"/>
+ <xsl:with-param name = "nav.context" select = "$nav.context"/>
+ </xsl:call-template>
+ </table>
+ </xsl:when><xsl:when test = "$nav.flow = 'Spirit'">
+ <xsl:call-template name = "navbar.spirit">
+ <xsl:with-param name = "prev" select = "$prev"/>
+ <xsl:with-param name = "next" select = "$next"/>
+ <xsl:with-param name = "nav.context" select = "$nav.context"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- navbar -->
+
+ <xsl:template name = "navbar.docbook-homeinfo">
+ <xsl:param name = "prev" select = "/foo"/>
+ <xsl:param name = "next" select = "/foo"/>
+ <xsl:param name = "nav.context"/>
+
+ <xsl:variable name = "home" select = "/*[1]"/>
+ <tr>
+ <td align = "left" width = "40%">
+ <xsl:if test = "$navig.showtitles != 0"> <!-- prev:name -->
+ <xsl:apply-templates select = "$prev" mode = "object.title.markup"/>
+ </xsl:if>
+ </td><td align = "center" width = "20%">
+ <!-- home -->
+ <xsl:if test = "$home != . or $nav.context = 'toc'">
+ <a accesskey = "h">
+ <xsl:attribute name = "href"><xsl:call-template name = "href.target">
+ <xsl:with-param name = "object" select = "$home"/>
+ </xsl:call-template></xsl:attribute>
+ <xsl:call-template name = "navig.content">
+ <xsl:with-param name = "direction" select = "'home'"/>
+ </xsl:call-template>
+ </a>
+ <xsl:if test = "$chunk.tocs.and.lots != 0 and $nav.context != 'toc'">
+ <xsl:text>|</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test = "$chunk.tocs.and.lots != 0 and $nav.context != 'toc'"><a accesskey = "t">
+ <xsl:attribute name = "href">
+ <xsl:apply-templates select = "/*[1]" mode = "recursive-chunk-filename"/>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select = "$html.ext"/>
+ </xsl:attribute>
+ <xsl:call-template name = "gentext">
+ <xsl:with-param name = "key" select = "'nav-toc'"/>
+ </xsl:call-template>
+ </a></xsl:if>
+ </td><td align = "right" width = "40%">
+ <xsl:if test = "$navig.showtitles != 0"> <!-- next:name -->
+ <xsl:apply-templates select = "$next" mode = "object.title.markup"/>
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:template>
+
+ <xsl:template name = "navbar.docbook-prevnext">
+ <xsl:param name = "prev" select = "/foo"/>
+ <xsl:param name = "next" select = "/foo"/>
+ <xsl:param name = "nav.context"/>
+
+ <xsl:variable name = "up" select = "parent::*"/>
+ <tr>
+ <td align = "left" width = "40%">
+ <xsl:if test = "count($prev)>0"><a accesskey = "p"> <!-- prev -->
+ <xsl:attribute name = "href"><xsl:call-template name = "href.target">
+ <xsl:with-param name = "object" select = "$prev"/>
+ </xsl:call-template></xsl:attribute>
+ <xsl:call-template name = "navig.content">
+ <xsl:with-param name = "direction" select = "'prev'"/>
+ </xsl:call-template>
+ </a></xsl:if>
+ </td><td align = "center" width = "20%">
+ <xsl:if test = "count($up)>0"><a accesskey = "u"> <!-- up -->
+ <xsl:attribute name = "href"><xsl:call-template name = "href.target">
+ <xsl:with-param name = "object" select = "$up"/>
+ </xsl:call-template></xsl:attribute>
+ <xsl:call-template name = "navig.content">
+ <xsl:with-param name = "direction" select = "'up'"/>
+ </xsl:call-template>
+ </a></xsl:if>
+ </td><td align = "right" width = "40%">
+ <xsl:if test = "count($next)>0"><a accesskey = "n"> <!-- next -->
+ <xsl:attribute name = "href"><xsl:call-template name = "href.target">
+ <xsl:with-param name = "object" select = "$next"/>
+ </xsl:call-template></xsl:attribute>
+ <xsl:call-template name = "navig.content">
+ <xsl:with-param name = "direction" select = "'next'"/>
+ </xsl:call-template>
+ </a></xsl:if>
+ </td>
+ </tr>
+ </xsl:template>
+
+ <xsl:template name = "navbar.spirit">
+ <xsl:param name = "prev" select = "/foo"/>
+ <xsl:param name = "next" select = "/foo"/>
+ <xsl:param name = "nav.context"/>
+
+ <xsl:variable name = "home" select = "/*[1]"/>
+ <xsl:variable name = "up" select = "parent::*"/>
+
+ <div class = "spirit-nav">
+ <!-- prev -->
+ <xsl:if test = "count($prev)>0"><a accesskey = "p">
+ <xsl:attribute name = "href"><xsl:call-template name = "href.target">
+ <xsl:with-param name = "object" select = "$prev"/>
+ </xsl:call-template></xsl:attribute>
+ <xsl:call-template name = "navig.content">
+ <xsl:with-param name = "direction" select = "'prev'"/>
+ </xsl:call-template>
+ </a></xsl:if>
+ <!-- up -->
+ <xsl:if test = "count($up)>0"><a accesskey = "u">
+ <xsl:attribute name = "href"><xsl:call-template name = "href.target">
+ <xsl:with-param name = "object" select = "$up"/>
+ </xsl:call-template></xsl:attribute>
+ <xsl:call-template name = "navig.content">
+ <xsl:with-param name = "direction" select = "'up'"/>
+ </xsl:call-template>
+ </a></xsl:if>
+ <!-- home -->
+ <xsl:if test = "generate-id($home) != generate-id(.) or $nav.context = 'toc'">
+ <a accesskey = "h">
+ <xsl:attribute name = "href"><xsl:call-template name = "href.target">
+ <xsl:with-param name = "object" select = "$home"/>
+ </xsl:call-template></xsl:attribute>
+ <xsl:call-template name = "navig.content">
+ <xsl:with-param name = "direction" select = "'home'"/>
+ </xsl:call-template>
+ </a>
+ <xsl:if test = "$chunk.tocs.and.lots != 0 and $nav.context != 'toc'">
+ <xsl:text>|</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test = "$chunk.tocs.and.lots != 0 and $nav.context != 'toc'"><a accesskey = "t">
+ <xsl:attribute name = "href">
+ <xsl:apply-templates select = "/*[1]" mode = "recursive-chunk-filename"/>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select = "$html.ext"/>
+ </xsl:attribute>
+ <xsl:call-template name = "gentext">
+ <xsl:with-param name = "key" select = "'nav-toc'"/>
+ </xsl:call-template>
+ </a></xsl:if>
+ <!-- next -->
+ <xsl:if test = "count($next)>0"><a accesskey = "n">
+ <xsl:attribute name = "href"><xsl:call-template name = "href.target">
+ <xsl:with-param name = "object" select = "$next"/>
+ </xsl:call-template></xsl:attribute>
+ <xsl:call-template name = "navig.content">
+ <xsl:with-param name = "direction" select = "'next'"/>
+ </xsl:call-template>
+ </a></xsl:if>
+ </div>
+ </xsl:template>
+</xsl:stylesheet>
Added: sandbox/contract/doc/no_variadic_macros.qbk
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/no_variadic_macros.qbk 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,81 @@
+
+[/ Copyright (C) 2008-2012 Lorenzo Caminiti ]
+[/ Distributed under 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) ]
+[/ Home at http://sourceforge.net/projects/contractpp ]
+
+[section No Variadic Macros]
+
+This section illustrates an alternative syntax, the /sequence syntax/, that can be used on compilers that do not support variadic macros.
+Most modern compilers support [@http://en.wikipedia.org/wiki/Variadic_macro variadic macros] (notably, these include GCC, MSVC, and all __CXX11__ compilers).
+
+[warning
+The sequence syntax presented in this section has not been fully tested yet.
+Future revisions of the library are expected to test and support the sequence syntax more thoroughly (see also [@https://sourceforge.net/apps/trac/contractpp/ticket/58 Ticket 58]).
+]
+
+The sequence syntax uses many extra parenthesis and it is significantly less readable than the comma-separated syntax that we have seen so far.
+Therefore, it is strongly recommended to not use the sequence syntax unless it is absolutely necessary to program contracts that are portable to compilers that do not support variadic macros.
+
+[section Sequence Syntax]
+
+In the rare case that programmers need to use this library on compliers without variadic macros, this library also allows to specify its macro parameters using a __Boost_Preprocessor__ sequence in which tokens are separated using round parenthesis `()`:
+
+ (token1) (token2) ... // All compilers.
+
+Instead of the comma-separated lists that we have seen so far which require variadic macros:
+
+ token1, token2, ... // Only compilers with variadic macros (preferred).
+
+This library detects preprocessor support for variadic macros using the __Boost_Config__ macro `BOOST_NO_VARIADIC_MACROS`.
+__Boost_Config__ defines the `BOOST_NO_VARIADIC_MACROS` only on compilers that do not support variadic macros furthermore programmers can forcefully define this macro also on compilers that support variadic macros.
+When this macro is not defined, this library macros support both the camma-separated and sequence syntax, otherwise only the sequence syntax is supported.
+
+[note
+The same macros accept both syntaxes on compilers with variadic macros and only the sequence syntax on compilers without variadic macros.
+]
+
+For example, the syntax on the left hand side works on all compilers with and without variaidic macros (see also [file example/contracts class_template_vector_seq.cpp], [file example/contracts pushable_seq.hpp], [file example/contracts class_template_vector.cpp], and [file example/contracts pushable.hpp]):
+
+[import ../example/contracts/pushable_seq.hpp]
+[import ../example/contracts/class_template_vector_seq.cpp]
+[table
+[ [Sequence Syntax (all compilers)] [Comma-Separated Syntax (variadic macros only, preferred)] ]
+[ [[pushable_seq]] [[pushable]] ]
+[ [[class_template_vector_seq]] [[class_template_vector]] ]
+]
+
+Note the many extra parenthesis around all tokens within the lists: template parameters `(typename T)`, base classes `(public pushable<T>)`, function parameters `(size_type) count`, all assertions, etc.
+Furthermore, empty lists need to be specified using `(void)` instead of just `void`.
+
+When using the sequence syntax, the macro [macroref CONTRACT_LIMIT_OLDOFS] specifies the maximum number of postconditions sequence elements (instead of the maximum possible number of old value declarations as for variadic macros).
+
+[endsect]
+
+[section Commas and Leading Symbols in Macros]
+
+As we have seen in the __Advanced_Topics__ section, syntactic elements containing unwrapped commas and leading symbols need to be wrapped within extra round parenthesis:
+
+ (::std::map<char, int, std::less<char> >) // With variadic macros.
+
+However, without variadic macros this is no longer sufficient and the number of commas needs to be explicitly specified using the following syntax:
+[footnote
+*Rationale.*
+Using variadic macros, the preprocessor can automatically determine the number of commas within a tuple but without variadic macros that is no longer possible so programmers must manually specify the number of commas.
+]
+
+ comma(2)(::std::map<char, int, std::less<char> >) // Without variadic macros.
+
+For example (see also [file example/contracts macro_commas_symbols_integral_map_seq.cpp] and [file example/contracts macro_commas_symbols_integral_map.cpp]):
+
+[import ../example/contracts/macro_commas_symbols_integral_map_seq.cpp]
+[table
+[ [Sequence Syntax (all compilers)] [Comma-Separated Syntax (variadic macros only, preferred)] ]
+[ [[macro_commas_symbols_integral_map_seq]] [[macro_commas_symbols_integral_map]] ]
+]
+
+[endsect]
+
+[endsect]
+
Added: sandbox/contract/doc/release_notes.qbk
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/release_notes.qbk 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,124 @@
+
+[/ Copyright (C) 2008-2012 Lorenzo Caminiti ]
+[/ Distributed under 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) ]
+[/ Home at http://sourceforge.net/projects/contractpp ]
+
+[section Release Notes]
+
+This section contains notes on the current and on all previous library releases (in chronological order).
+
+[heading Release 0.4.1]
+
+August 20, 2012
+
+Notes:
+
+# Using non-fix-spaced font in Full Table of Contents section.
+# Added a couple of notes to the documentation.
+# Changed `CONTRACT_MEMBER_BODY(class_type, function_name)` to `class_type::CONTRACT_MEMBER_BODY(function_name)` so the macro can also be used to declare derived classes avoiding using the library syntax even when the base class has contracts.
+
+Release [@http://contractpp.svn.sourceforge.net/viewvc/contractpp/releases/contractpp_0_4_1 files] and [@http://contractpp.svn.sourceforge.net/viewvc/contractpp/releases/contractpp_0_4_1/doc/html/index.html documentation].
+
+[heading Release 0.4.0]
+
+June 4, 2012
+
+Notes:
+
+# Simplified syntax by reducing extra parenthesis to the bare necessary minimum (using some of the preprocessor parsing techniques originally introduced by Boost.LocalFunction).
+# Postcondition old values only copy the old-of expression (e.g., copy just vector size instead of entire vector).
+This improves performance and introduces the `ConstantCopyConstructible` requirement just for the old value expression type (e.g., a vector might not be copyable while its size always is because it is an integral type).
+Removed the `copyable` tag.
+# Body defined outside the macros (so compiler-errors for definitions retain their usual meaning).
+# Added `CONTRACT_CLASS` macro and removed the need to duplicate declaration elements (do not repeat function declaration, do not repeat class name in function declaration, etc).
+# Using `_TPL` macros so to reduce compile-time (instead of internally making all templates contract functions so to use `typename` freely).
+# Overloading no longer requires unique parameter names.
+# Added C++11-like virtual specifiers.
+# Added constant assertions plus constant-expressions for select assertion if-conditions and for loop variants.
+# Added named and deduced parameters.
+# Added concept checking.
+# Removed the interface to use the library without the macro (programmers were required to write too much boiler-plate code for the non-macro interface to be actually usable, plus supporting both the macro and non-macro interfaces limited what the macros could do).
+
+Release [@http://contractpp.svn.sourceforge.net/viewvc/contractpp/releases/contractpp_0_4_0 files] and [@http://contractpp.svn.sourceforge.net/viewvc/contractpp/releases/contractpp_0_4_0/doc/html/index.html documentation].
+
+[heading Release 0.3.490]
+
+March 7, 2010
+
+Notes:
+
+# Added support and examples for `volatile`, `auto`, `explicit`, `export`, `extern`, `friend`, `inline`, `struct`, and `throw` (for exception specifications).
+# Documented that `union` cannot be contracted.
+
+Release [@http://contractpp.svn.sourceforge.net/viewvc/contractpp/releases/contractpp_0_3_490 files] and [@http://contractpp.svn.sourceforge.net/viewvc/contractpp/releases/contractpp_0_3_490/doc/html/index.html documentation].
+
+[heading Release 0.3.469]
+
+February 21, 2010
+
+Notes:
+
+# Removed use of `self`, `variable.now`, and `variable.old` in writing contracts.
+Object `this` and variables are now accessed as usual in member functions.
+`CONTRACT_OLDOF(variable)` is used to access old values in postconditions.
+# Added `(precondition)`, `(postcondition)`, and `(body)` to specify contracts within the function signature sequence.
+If no preconditions then `(precondition) ({...})` is simply omitted from the sequence (same for postconditions, body is mandatory instead).
+For non-void functions, users can name the result argument with `(postcondition) (result-name) ({...})`.
+# Changed contract class template to use same syntax as Boost.Function (i.e., `F` function type).
+# Added support for free functions and static member functions.
+# Added support for subcontracting with multiple inheritance.
+# Added static class invariants which are always checked (also at constructors entry, destructor exit, and by static member functions).
+# Added block invariants and Eiffel-like loop variants.
+# Added handlers to customize action on contract failure (default to `std::terminate()`).
+# Removed feature for automatic contract documentation using Doxygen (this is not compatible with added `(precondition)`, `(postcondition)`, and `(body)` because Doxygen preprocessor is not capable to handle Boost.Preprocessor sequences).
+# Rewritten entire documentation (now using Boost.QuickBook instead of Doxygen).
+
+Release [@http://contractpp.svn.sourceforge.net/viewvc/contractpp/releases/contractpp_0_3_469 files] and [@http://contractpp.svn.sourceforge.net/viewvc/contractpp/releases/contractpp_0_3_469/doc/html/index.html documentation].
+
+[heading Release 0.2.190]
+
+November 21, 2009
+
+Notes:
+
+# Compiled using both GCC (Linux and Cygwin) and MSVC (Windows XP).
+# Required to use void to specify empty function argument list.
+This is to comply with C++03 standard that does not allow to pass empty macro parameters so it does not support empty preprocessor sequences `()`.
+
+Release [@http://contractpp.svn.sourceforge.net/viewvc/contractpp/releases/contractpp_0_2_190 files] and [@http://contractpp.svn.sourceforge.net/viewvc/contractpp/releases/contractpp_0_2_190/doc/html/index.html documentation].
+
+[heading Release 0.1.126]
+
+June 17, 2009
+
+Notes:
+
+# Completed first documentation draft.
+
+Release [@http://contractpp.svn.sourceforge.net/viewvc/contractpp/releases/contractpp_0_1_126 files] and [@http://contractpp.svn.sourceforge.net/viewvc/contractpp/releases/contractpp_0_1_126/doc/html/index.html documentation].
+
+[heading Release 0.1.55]
+
+April 19, 2009
+
+Notes:
+
+# Reorganized files to cleanup root directory.
+# Added installation program.
+
+Release [@http://contractpp.svn.sourceforge.net/viewvc/contractpp/releases/contractpp_0_1_55 files] and [@http://contractpp.svn.sourceforge.net/viewvc/contractpp/releases/contractpp_0_1_55/doc/DBC_Documentation.txt documentation].
+
+[heading Release 0.1.50]
+
+April 19, 2009
+
+Notes:
+
+# First public release.
+
+Release [@http://contractpp.svn.sourceforge.net/viewvc/contractpp/releases/contractpp_0_1_50 files] and [@http://contractpp.svn.sourceforge.net/viewvc/contractpp/releases/contractpp_0_1_50/README.txt documentation].
+
+[endsect]
+
Added: sandbox/contract/doc/src/boost.xml
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/src/boost.xml 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,757 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE boostbook PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN"
+ "http://www.boost.org/tools/boostbook/dtd/boostbook.dtd">
+<boostbook id="boost" xmlns:xi="http://www.w3.org/2001/XInclude"
+ last-revision="$Date: 2010-10-30 13:34:45 -0400 (Sat, 30 Oct 2010) $">
+ <title>The Boost C++ Libraries BoostBook Documentation Subset</title>
+
+ <preface id="about">
+ <title>What's Included in This Document</title>
+
+ <para>This document represents only a subset of the full Boost
+ documentation: that part which is generated from BoostBook or
+ QuickBook sources. Eventually all Boost libraries may use these
+ formats, but in the meantime, much of Boost's documentation is not
+ available here. Please
+ see <ulink
+ url="http://www.boost.org/libs">http://www.boost.org/libs>
+ for complete documentation.
+ </para>
+
+ <para>
+ Documentation for some of the libraries described in this document is
+ available in alternative formats:
+ <itemizedlist>
+ <listitem>
+ <simpara><link linkend="boost">HTML</link></simpara>
+ </listitem>
+ </itemizedlist>
+ <itemizedlist>
+ <listitem>
+ <simpara><ulink url="http://sourceforge.net/projects/boost/files/boost-docs/">PDF</ulink></simpara>
+ </listitem>
+ </itemizedlist>
+ </para>
+
+ </preface>
+
+ <part id="libraries">
+ <title>The Boost C++ Libraries (BoostBook Subset)</title>
+
+ <xi:include href="accumulators.xml"/>
+
+ <xi:include href="../../libs/any/doc/any.xml"/>
+ <xi:include href="../../libs/array/doc/array.xml"/>
+
+ <library name="Asio" dirname="asio" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>Christopher</firstname>
+ <surname>Kohlhoff</surname>
+ </author>
+
+ <librarypurpose>Portable networking and other low-level I/O, including sockets, timers, hostname resolution, socket iostreams, serial ports, file descriptors and Windows HANDLEs</librarypurpose>
+ <librarycategory name="category:io"/>
+ </libraryinfo>
+ </library>
+
+ <library name="Bind" dirname="bind" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>Peter</firstname>
+ <surname>Dimov</surname>
+ </author>
+ <librarypurpose>Generalized binders for function/object/pointers and member functions</librarypurpose>
+ <librarycategory name="category:higher-order"/>
+ </libraryinfo>
+ </library>
+
+ <library name="Mem_fn" dirname="bind" html-only="1"
+ url="../../libs/bind/mem_fn.html">
+ <libraryinfo>
+ <author>
+ <firstname>Peter</firstname>
+ <surname>Dimov</surname>
+ </author>
+ <librarypurpose>Generalized binders for member functions</librarypurpose>
+ <librarycategory name="category:higher-order"/>
+ </libraryinfo>
+ </library>
+
+ <library name="Call Traits" dirname="call_traits" html-only="1"
+ url="../../libs/utility/call_traits.htm">
+ <libraryinfo>
+ <author>
+ <firstname>John</firstname>
+ <surname>Maddock</surname>
+ </author>
+ <author>
+ <firstname>Howard</firstname>
+ <surname>Hinnant</surname>
+ </author>
+ <librarypurpose>Defines types for passing parameters</librarypurpose>
+ <librarycategory name="category:generic"/>
+ </libraryinfo>
+ </library>
+
+ <library name="Circular Buffer" dirname="circular_buffer" html-only="1"
+ url="../../libs/circular_buffer/index.html">
+ <libraryinfo>
+ <author>
+ <firstname>Jan</firstname>
+ <surname>Gaspar</surname>
+ </author>
+ <librarypurpose>A STL compliant container also known as ring or cyclic buffer</librarypurpose>
+ <librarycategory name="category:containers"/>
+ </libraryinfo>
+ </library>
+
+ <library name="Compatibility" dirname="compatibility" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>Ralf</firstname>
+ <surname>Grosse-Kunstleve</surname>
+ </author>
+ <author>
+ <firstname>Jens</firstname>
+ <surname>Maurer</surname>
+ </author>
+ <librarypurpose>Help for non-conforming standard libraries</librarypurpose>
+ <librarycategory name="category:broken"/>
+ </libraryinfo>
+ </library>
+
+ <library name="Compose" dirname="compose" html-only="1"
+ url="../../libs/compose/index.htm">
+ <libraryinfo>
+ <author>
+ <firstname>Nicolai</firstname>
+ <surname>Josuttis</surname>
+ </author>
+
+ <librarypurpose>Functional composition adapters for the STL</librarypurpose>
+ <librarycategory name="category:higher-order"/>
+ </libraryinfo>
+ </library>
+
+ <library name="Compressed Pair" dirname="compressed_pair" html-only="1"
+ url="../../libs/utility/compressed_pair.htm">
+ <libraryinfo>
+ <author>
+ <firstname>John</firstname>
+ <surname>Maddock</surname>
+ </author>
+ <author>
+ <firstname>Howard</firstname>
+ <surname>Hinnant</surname>
+ </author>
+ <librarypurpose>Empty member optimization</librarypurpose>
+ <librarycategory name="category:data-structures"/>
+ <librarycategory name="category:misc"/>
+ </libraryinfo>
+ </library>
+
+ <library name="Concept Check" dirname="concept_check">
+ <libraryinfo>
+ <author>
+ <firstname>Jeremy</firstname>
+ <surname>Siek</surname>
+ </author>
+ <librarypurpose>Tools for generic programming</librarypurpose>
+ <librarycategory name="category:generic"/>
+ <librarycategory name="category:testing"/>
+ </libraryinfo>
+ <title>Boost.Concept_Check</title>
+ <xi:include href="../../libs/concept_check/doc/reference/concepts.xml"/>
+ </library>
+
+ <library name="Config" dirname="config" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>John</firstname>
+ <surname>Maddock</surname>
+ </author>
+ <author>
+ <firstname>Beman</firstname>
+ <surname>Dawes</surname>
+ </author>
+ <author>
+ <firstname>Vesa</firstname>
+ <surname>Karvonen</surname>
+ </author>
+
+ <librarypurpose>Helps boost library developers adapt to compiler idiosyncrasies; not intended for library users</librarypurpose>
+ <librarycategory name="category:broken"/>
+ </libraryinfo>
+ </library>
+
+ <library name="Conversion" dirname="conversion" html-only="1"
+ url="../../libs/conversion/index.html">
+ <libraryinfo>
+ <author>
+ <firstname>Dave</firstname>
+ <surname>Abrahams</surname>
+ </author>
+ <author>
+ <firstname>Kevlin</firstname>
+ <surname>Henney</surname>
+ </author>
+
+ <librarypurpose>Numeric, polymorphic, and lexical casts</librarypurpose>
+ <librarycategory name="category:misc"/>
+ </libraryinfo>
+ </library>
+
+ <library name="CRC" dirname="crc" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>Daryle</firstname>
+ <surname>Walker</surname>
+ </author>
+
+ <librarypurpose>Cyclic Redundancy Code</librarypurpose>
+ <librarycategory name="category:misc"/>
+ </libraryinfo>
+ </library>
+
+ <xi:include href="../../libs/date_time/xmldoc/date_time.xml"/>
+
+ <library name="Dynamic Bitset" dirname="dynamic_bitset" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>Jeremy</firstname>
+ <surname>Siek</surname>
+ </author>
+ <author>
+ <firstname>Chuck</firstname>
+ <surname>Allison</surname>
+ </author>
+ <librarypurpose>A runtime sized version of <code>std::bitset</code></librarypurpose>
+ <librarycategory name="category:containers"/>
+ </libraryinfo>
+ </library>
+
+ <library name="Format" dirname="format" html-only="1"
+ url="../../libs/format/index.html">
+ <libraryinfo>
+ <author>
+ <firstname>Samuel</firstname>
+ <surname>Krempp</surname>
+ </author>
+
+ <librarypurpose>Type-safe 'printf-like' format operations</librarypurpose>
+ <librarycategory name="category:string-text"/>
+ <librarycategory name="category:io"/>
+ </libraryinfo>
+ </library>
+
+ <library name="Filesystem" dirname="filesystem" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>Beman</firstname>
+ <surname>Dawes</surname>
+ </author>
+
+ <librarypurpose>Portable paths, iteration over directories, and other useful filesystem operations</librarypurpose>
+ <librarycategory name="category:misc"/>
+ </libraryinfo>
+ </library>
+
+ <xi:include href="foreach.xml"/>
+
+ <xi:include href="../../libs/function/doc/function.xml"/>
+
+ <library name="Functional" dirname="functional" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>Mark</firstname>
+ <surname>Rodgers</surname>
+ </author>
+ <librarypurpose>Enhanced function object adaptors</librarypurpose>
+ <librarycategory name="category:higher-order"/>
+ </libraryinfo>
+ </library>
+
+ <xi:include href="hash.xml"/>
+
+ <library name="Graph" dirname="graph" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>Jeremy</firstname>
+ <surname>Siek</surname>
+ </author>
+ <author>
+ <firstname>University of Notre Dame</firstname>
+ <surname>Team</surname>
+ </author>
+ <librarypurpose>Generic graph components and algorithms</librarypurpose>
+ <librarycategory name="category:containers"/>
+ <librarycategory name="category:iterators"/>
+ <librarycategory name="category:algorithms"/>
+ </libraryinfo>
+ </library>
+
+ <library name="Integer" dirname="integer" html-only="1"
+ url="../../libs/integer/index.html">
+ <libraryinfo>
+ <author>
+ <firstname>various</firstname>
+ <surname>authors</surname>
+ </author>
+
+ <librarypurpose>Headers to ease dealing with integral types</librarypurpose>
+ <librarycategory name="category:math"/>
+ </libraryinfo>
+ </library>
+
+ <xi:include href="interprocess.xml"/>
+
+ <library name="Interval" dirname="numeric/interval" html-only="1"
+ url="../../libs/numeric/interval/doc/index.html">
+ <libraryinfo>
+ <author>
+ <firstname>Guillaume</firstname>
+ <surname>Melquiond</surname>
+ </author>
+ <author>
+ <firstname>Hervé</firstname>
+ <surname>Brönnimann</surname>
+ </author>
+ <author>
+ <firstname>Sylvain</firstname>
+ <surname>Pion</surname>
+ </author>
+
+ <librarypurpose>Extends the usual arithmetic functions to mathematical intervals</librarypurpose>
+ <librarycategory name="category:math"/>
+ </libraryinfo>
+ </library>
+
+ <xi:include href="intrusive.xml"/>
+
+ <library name="I/O State Savers" dirname="io" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>Daryle</firstname>
+ <surname>Walker</surname>
+ </author>
+
+ <librarypurpose>Save I/O state to prevent jumbled data</librarypurpose>
+ <librarycategory name="category:io"/>
+ </libraryinfo>
+ </library>
+
+ <library name="Iterator Adaptors" dirname="utility" html-only="1"
+ url="../../libs/utility/iterator_adaptors.htm">
+ <libraryinfo>
+ <author>
+ <firstname>Dave</firstname>
+ <surname>Abrahams</surname>
+ </author>
+ <author>
+ <firstname>Jeremy</firstname>
+ <surname>Siek</surname>
+ </author>
+ <author>
+ <firstname>John</firstname>
+ <surname>Potter</surname>
+ </author>
+
+ <librarypurpose>Adapt a base type into a standard conforming iterator</librarypurpose>
+ <librarycategory name="category:iterators"/>
+ </libraryinfo>
+ </library>
+
+ <xi:include href="../../libs/lambda/doc/lambda.xml"/>
+
+ <library name="Math" dirname="math" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>various</firstname>
+ <surname>authors</surname>
+ </author>
+
+ <librarypurpose>Several contributions in the domain of mathematics</librarypurpose>
+ <librarycategory name="category:math"/>
+ </libraryinfo>
+ </library>
+
+ <library name="Math/Common Factor" dirname="math/common_factor" html-only="1"
+ url="../../libs/math/doc/common_factor.html">
+ <libraryinfo>
+ <author>
+ <firstname>Daryle</firstname>
+ <surname>Walker</surname>
+ </author>
+
+ <librarypurpose>Greatest common divisor and least common multiple</librarypurpose>
+ <librarycategory name="category:math"/>
+ </libraryinfo>
+ </library>
+
+ <library name="Math/Octonion" dirname="math/octonion" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>Hubert</firstname>
+ <surname>Holin</surname>
+ </author>
+
+ <librarypurpose>Octonions</librarypurpose>
+ <librarycategory name="category:math"/>
+ </libraryinfo>
+ </library>
+
+ <library name="Math/Quaternion" dirname="math/quaternion" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>Hubert</firstname>
+ <surname>Holin</surname>
+ </author>
+
+ <librarypurpose>Quaternions</librarypurpose>
+ <librarycategory name="category:math"/>
+ </libraryinfo>
+ </library>
+
+ <library name="Math/Special Functions" dirname="math/special_functions" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>Hubert</firstname>
+ <surname>Holin</surname>
+ </author>
+
+ <librarypurpose>Mathematical special functions such as atanh, sinc, and sinhc</librarypurpose>
+ <librarycategory name="category:math"/>
+ </libraryinfo>
+ </library>
+
+ <library name="MPL" dirname="mpl" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>Aleksey</firstname>
+ <surname>Gurtovoy</surname>
+ </author>
+
+ <librarypurpose>Template metaprogramming framework of compile-time algorithms, sequences and metafunction classes</librarypurpose>
+ <librarycategory name="category:template"/>
+ </libraryinfo>
+ </library>
+
+ <library name="Multi Array" dirname="multi_array" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>Ron</firstname>
+ <surname>Garcia</surname>
+ </author>
+
+ <librarypurpose>Multidimensional containers and adaptors for arrays of contiguous data</librarypurpose>
+ <librarycategory name="category:math"/>
+ <librarycategory name="category:containers"/>
+ </libraryinfo>
+ </library>
+
+ <library name="Operators" dirname="utility" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>Dave</firstname>
+ <surname>Abrahams</surname>
+ </author>
+ <author>
+ <firstname>Jeremy</firstname>
+ <surname>Siek</surname>
+ </author>
+
+ <librarypurpose>Templates ease arithmetic classes and iterators</librarypurpose>
+ <librarycategory name="category:generic"/>
+ <librarycategory name="category:iterators"/>
+ <librarycategory name="category:math"/>
+ </libraryinfo>
+ </library>
+
+ <library name="Optional" dirname="optional" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>Fernando</firstname>
+ <surname>Cacciola</surname>
+ </author>
+
+ <librarypurpose>Discriminated-union wrapper for optional values</librarypurpose>
+ <librarycategory name="category:misc"/>
+ <librarycategory name="category:data-structures"/>
+ </libraryinfo>
+ </library>
+
+ <xi:include href="mpi.xml"/>
+
+ <library name="Pool" dirname="pool" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>Steve</firstname>
+ <surname>Cleary</surname>
+ </author>
+
+ <librarypurpose>Memory pool management</librarypurpose>
+ <librarycategory name="category:memory"/>
+ </libraryinfo>
+ </library>
+
+ <library name="Preprocessor" dirname="preprocessor" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>Vesa</firstname>
+ <surname>Karvonen</surname>
+ </author>
+ <author>
+ <firstname>Paul</firstname>
+ <surname>Mensonides</surname>
+ </author>
+
+ <librarypurpose>Preprocessor metaprogramming tools including repetition and recursion</librarypurpose>
+ <librarycategory name="category:preprocessor"/>
+ </libraryinfo>
+ </library>
+
+ <xi:include href="../../libs/program_options/doc/program_options.xml"/>
+
+ <library name="Property Map" dirname="property_map" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>Jeremy</firstname>
+ <surname>Siek</surname>
+ </author>
+ <librarypurpose>Concepts defining interfaces which map key objects to value objects</librarypurpose>
+ <librarycategory name="category:containers"/>
+ <librarycategory name="category:generic"/>
+ </libraryinfo>
+ </library>
+
+ <xi:include href="property_tree.xml"/>
+
+ <xi:include href="proto.xml"/>
+
+ <library name="Python" dirname="python" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>Dave</firstname>
+ <surname>Abrahams</surname>
+ </author>
+ <librarypurpose>Reflects C++ classes and functions into <ulink url="http://www.python.org">Python</ulink></librarypurpose>
+ <librarycategory name="category:lang"/>
+ </libraryinfo>
+ </library>
+
+ <xi:include href="random.xml"/>
+
+ <library name="Rational" dirname="rational" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>Paul</firstname>
+ <surname>Moore</surname>
+ </author>
+ <librarypurpose>A rational number class</librarypurpose>
+ <librarycategory name="category:math"/>
+ </libraryinfo>
+ </library>
+
+ <xi:include href="../../libs/bind/doc/ref.xml"/>
+
+ <library name="Regex" dirname="regex" html-only="1"
+ url="../../libs/regex/index.html">
+ <libraryinfo>
+ <author>
+ <firstname>John</firstname>
+ <surname>Maddock</surname>
+ </author>
+ <librarypurpose>Regular expression library</librarypurpose>
+ <librarycategory name="category:string-text"/>
+ </libraryinfo>
+ </library>
+
+ <library name="Serialization" dirname="serialization" html-only="1"
+ url="../../libs/serialization/index.html">
+ <libraryinfo>
+ <author>
+ <firstname>Robert</firstname>
+ <surname>Ramey</surname>
+ </author>
+ <librarypurpose>Serialization of C++ objects for persistence and marshalling</librarypurpose>
+ <librarycategory name="category:io"/>
+ </libraryinfo>
+ </library>
+
+ <xi:include href="../../libs/signals/doc/signals.xml"/>
+
+ <xi:include href="../../libs/signals2/doc/signals.xml"/>
+
+ <library name="Smart Pointer" dirname="smart_ptr" html-only="1"
+ url="../../libs/smart_ptr/index.html">
+ <libraryinfo>
+ <author>
+ <firstname>Greg</firstname>
+ <surname>Colvin</surname>
+ </author>
+ <author>
+ <firstname>Beman</firstname>
+ <surname>Dawes</surname>
+ </author>
+ <author>
+ <firstname>Peter</firstname>
+ <surname>Dimov</surname>
+ </author>
+ <author>
+ <firstname>Darin</firstname>
+ <surname>Adler</surname>
+ </author>
+ <librarypurpose>Six smart pointer class templates</librarypurpose>
+ <librarycategory name="category:memory"/>
+ </libraryinfo>
+ </library>
+
+ <library name="Spirit" dirname="spirit" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>Joel</firstname>
+ <surname>de Guzman</surname>
+ </author>
+ <author>
+ <firstname>team</firstname>
+ </author>
+
+ <librarypurpose>LL parser framework represents parsers directly as EBNF grammars in inlined C++</librarypurpose>
+ <librarycategory name="category:text"/>
+ <librarycategory name="category:parsing"/>
+ </libraryinfo>
+ </library>
+
+ <xi:include href="static_assert.xml"/>
+
+ <xi:include href="../../libs/algorithm/string/doc/string_algo.xml"/>
+
+ <library name="Test" dirname="test" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>Gennadiy</firstname>
+ <surname>Rozental</surname>
+ </author>
+ <librarypurpose>Support for simple program testing, full unit testing, and for program execution monitoring</librarypurpose>
+ <librarycategory name="category:testing"/>
+ </libraryinfo>
+ </library>
+
+ <xi:include href="thread.xml"/>
+
+ <library name="Timer" dirname="timer" html-only="1"
+ url="../../libs/timer/index.html">
+ <libraryinfo>
+ <author>
+ <firstname>Beman</firstname>
+ <surname>Dawes</surname>
+ </author>
+ <librarypurpose>Event timer, progress timer, and progress display classes</librarypurpose>
+ <librarycategory name="category:misc"/>
+ </libraryinfo>
+ </library>
+
+ <library name="Tokenizer" dirname="tokenizer" html-only="1"
+ url="../../libs/tokenizer/index.html">
+ <libraryinfo>
+ <author>
+ <firstname>John</firstname>
+ <surname>Bandela</surname>
+ </author>
+ <librarypurpose>Break of a string or other character sequence into a series of tokens</librarypurpose>
+ <librarycategory name="category:string-text"/>
+ <librarycategory name="category:iterators"/>
+ </libraryinfo>
+ </library>
+
+ <xi:include href="tr1.xml"/>
+ <xi:include href="../../libs/logic/doc/tribool.boostbook"/>
+
+ <library name="Tuple" dirname="tuple" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>Jaakko</firstname>
+ <surname>Järvi</surname>
+ </author>
+ <librarypurpose>Ease definition of functions returning multiple values, and more</librarypurpose>
+ <librarycategory name="category:data-structures"/>
+ </libraryinfo>
+ </library>
+
+ <library name="Type Traits" dirname="type_traits" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>John</firstname>
+ <surname>Maddock</surname>
+ </author>
+ <librarypurpose>Meta-programming support library.</librarypurpose>
+ <librarycategory name="category:generic"/>
+ </libraryinfo>
+ </library>
+
+ <xi:include href="typeof.xml"/>
+
+ <library name="uBLAS" dirname="numeric/ublas" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>Joerg</firstname>
+ <surname>Walter</surname>
+ </author>
+ <author>
+ <firstname>Mathias</firstname>
+ <surname>Koch</surname>
+ </author>
+ <librarypurpose>Basic linear algebra for dense, packed and sparse matrices</librarypurpose>
+ <librarycategory name="category:math"/>
+ </libraryinfo>
+ </library>
+
+ <xi:include href="units.xml"/>
+
+ <xi:include href="unordered.xml"/>
+
+ <library name="Utility" dirname="utility" html-only="1">
+ <libraryinfo>
+ <author>
+ <firstname>Dave</firstname>
+ <surname>Abrahams</surname>
+ </author>
+ <author>
+ <firstname>others</firstname>
+ </author>
+
+ <librarypurpose>Class noncopyable plus <functionname>checked_delete</functionname>, <functionname>checked_array_delete</functionname>, <functionname>next</functionname>, <functionname>prior</functionname> function templates, plus base-from-member idiom</librarypurpose>
+ <librarycategory name="category:misc"/>
+ <librarycategory name="category:memory"/>
+ <librarycategory name="category:algorithms"/>
+ </libraryinfo>
+ </library>
+ <xi:include href="../../libs/variant/doc/variant.xml"/>
+
+ <xi:include href="xpressive.xml"/>
+
+ </part>
+
+ <part id="tools">
+ <title>Boost Tools</title>
+ <partintro>
+ <para>
+ Boost developers, testers, and maintainers have developed various programs to
+ help with the administration of the Boost Libraries. Like everything else about
+ Boost, these tools are available in source form, and are part of the regular
+ Boost distribution.
+ </para>
+ <para>
+ Users may find these tools useful when porting Boost libraries to a new platform,
+ or for use with their own applications.
+ </para>
+ </partintro>
+ <xi:include href="../../tools/boostbook/doc/boostbook.xml"/>
+ <xi:include href="quickbook.xml"/>
+ <xi:include href="bjam.xml"/>
+ <xi:include href="../../tools/build/v2/doc/src/userman.xml"/>
+ </part>
+</boostbook>
+
+
Added: sandbox/contract/doc/src/boostbook.css
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/src/boostbook.css 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,601 @@
+/*=============================================================================
+ Copyright (c) 2004 Joel de Guzman
+ http://spirit.sourceforge.net/
+
+ Distributed under the Boost Software License, Version 1.0. (See accompany-
+ ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+=============================================================================*/
+
+/*=============================================================================
+ Body defaults
+=============================================================================*/
+
+ body
+ {
+ margin: 1em;
+ font-family: sans-serif;
+ }
+
+/*=============================================================================
+ Paragraphs
+=============================================================================*/
+
+ p
+ {
+ text-align: left;
+ font-size: 10pt;
+ line-height: 1.15;
+ }
+
+/*=============================================================================
+ Program listings
+=============================================================================*/
+
+ /* Code on paragraphs */
+ p tt.computeroutput
+ {
+ font-size: 9pt;
+ }
+
+ pre.synopsis
+ {
+ font-size: 9pt;
+ margin: 1pc 4% 0pc 4%;
+ padding: 0.5pc 0.5pc 0.5pc 0.5pc;
+ }
+
+ .programlisting,
+ .screen
+ {
+ font-size: 9pt;
+ display: block;
+ margin: 1pc 4% 0pc 4%;
+ padding: 0.5pc 0.5pc 0.5pc 0.5pc;
+ }
+
+ /* Program listings in tables don't get borders */
+ td .programlisting,
+ td .screen
+ {
+ margin: 0pc 0pc 0pc 0pc;
+ padding: 0pc 0pc 0pc 0pc;
+ }
+
+/*=============================================================================
+ Headings
+=============================================================================*/
+
+ h1, h2, h3, h4, h5, h6
+ {
+ text-align: left;
+ margin: 1em 0em 0.5em 0em;
+ font-weight: bold;
+ }
+
+ h1 { font: 140% }
+ h2 { font: bold 140% }
+ h3 { font: bold 130% }
+ h4 { font: bold 120% }
+ h5 { font: italic 110% }
+ h6 { font: italic 100% }
+
+ /* Top page titles */
+ title,
+ h1.title,
+ h2.title
+ h3.title,
+ h4.title,
+ h5.title,
+ h6.title,
+ .refentrytitle
+ {
+ font-weight: bold;
+ margin-bottom: 1pc;
+ }
+
+ h1.title { font-size: 140% }
+ h2.title { font-size: 140% }
+ h3.title { font-size: 130% }
+ h4.title { font-size: 120% }
+ h5.title { font-size: 110% }
+ h6.title { font-size: 100% }
+
+ .section h1
+ {
+ margin: 0em 0em 0.5em 0em;
+ font-size: 140%;
+ }
+
+ .section h2 { font-size: 140% }
+ .section h3 { font-size: 130% }
+ .section h4 { font-size: 120% }
+ .section h5 { font-size: 110% }
+ .section h6 { font-size: 100% }
+
+ /* Code on titles */
+ h1 tt.computeroutput { font-size: 140% }
+ h2 tt.computeroutput { font-size: 140% }
+ h3 tt.computeroutput { font-size: 130% }
+ h4 tt.computeroutput { font-size: 130% }
+ h5 tt.computeroutput { font-size: 130% }
+ h6 tt.computeroutput { font-size: 130% }
+
+
+/*=============================================================================
+ Author
+=============================================================================*/
+
+ h3.author
+ {
+ font-size: 100%
+ }
+
+/*=============================================================================
+ Lists
+=============================================================================*/
+
+ li
+ {
+ font-size: 10pt;
+ line-height: 1.3;
+ }
+
+ /* Unordered lists */
+ ul
+ {
+ text-align: left;
+ }
+
+ /* Ordered lists */
+ ol
+ {
+ text-align: left;
+ }
+
+/*=============================================================================
+ Links
+=============================================================================*/
+
+ a
+ {
+ text-decoration: none; /* no underline */
+ }
+
+ a:hover
+ {
+ text-decoration: underline;
+ }
+
+/*=============================================================================
+ Spirit style navigation
+=============================================================================*/
+
+ .spirit-nav
+ {
+ text-align: right;
+ }
+
+ .spirit-nav a
+ {
+ color: white;
+ padding-left: 0.5em;
+ }
+
+ .spirit-nav img
+ {
+ border-width: 0px;
+ }
+
+/*=============================================================================
+ Copyright footer
+=============================================================================*/
+ .copyright-footer
+ {
+ text-align: right;
+ font-size: 70%;
+ }
+
+ .copyright-footer p
+ {
+ text-align: right;
+ font-size: 80%;
+ }
+
+/*=============================================================================
+ Table of contents
+=============================================================================*/
+
+ .toc
+ {
+ margin: 1pc 4% 0pc 4%;
+ padding: 0.1pc 1pc 0.1pc 1pc;
+ font-size: 80%;
+ line-height: 1.15;
+ }
+
+ .boost-toc
+ {
+ float: right;
+ padding: 0.5pc;
+ }
+
+ /* Code on toc */
+ .toc .computeroutput { font-size: 120% }
+
+/*=============================================================================
+ Tables
+=============================================================================*/
+
+ .table-title,
+ div.table p.title
+ {
+ margin-left: 4%;
+ padding-right: 0.5em;
+ padding-left: 0.5em;
+ }
+
+ .informaltable table,
+ .table table
+ {
+ width: 92%;
+ margin-left: 4%;
+ margin-right: 4%;
+ }
+
+ div.informaltable table,
+ div.table table
+ {
+ padding: 4px;
+ }
+
+ /* Table Cells */
+ div.informaltable table tr td,
+ div.table table tr td
+ {
+ padding: 0.5em;
+ text-align: left;
+ font-size: 9pt;
+ }
+
+ div.informaltable table tr th,
+ div.table table tr th
+ {
+ padding: 0.5em 0.5em 0.5em 0.5em;
+ border: 1pt solid white;
+ font-size: 80%;
+ }
+
+ table.simplelist
+ {
+ width: auto !important;
+ margin: 0em !important;
+ padding: 0em !important;
+ border: none !important;
+ }
+ table.simplelist td
+ {
+ margin: 0em !important;
+ padding: 0em !important;
+ text-align: left !important;
+ font-size: 9pt !important;
+ border: none !important;
+ }
+
+/*=============================================================================
+ Blurbs
+=============================================================================*/
+
+ div.note,
+ div.tip,
+ div.important,
+ div.caution,
+ div.warning,
+ p.blurb
+ {
+ font-size: 9pt; /* A little bit smaller than the main text */
+ line-height: 1.2;
+ display: block;
+ margin: 1pc 4% 0pc 4%;
+ padding: 0.5pc 0.5pc 0.5pc 0.5pc;
+ }
+
+ p.blurb img
+ {
+ padding: 1pt;
+ }
+
+/*=============================================================================
+ Variable Lists
+=============================================================================*/
+
+ div.variablelist
+ {
+ margin: 1em 0;
+ }
+
+ /* Make the terms in definition lists bold */
+ div.variablelist dl dt,
+ span.term
+ {
+ font-weight: bold;
+ font-size: 10pt;
+ }
+
+ div.variablelist table tbody tr td
+ {
+ text-align: left;
+ vertical-align: top;
+ padding: 0em 2em 0em 0em;
+ font-size: 10pt;
+ margin: 0em 0em 0.5em 0em;
+ line-height: 1;
+ }
+
+ div.variablelist dl dt
+ {
+ margin-bottom: 0.2em;
+ }
+
+ div.variablelist dl dd
+ {
+ margin: 0em 0em 0.5em 2em;
+ font-size: 10pt;
+ }
+
+ div.variablelist table tbody tr td p,
+ div.variablelist dl dd p
+ {
+ margin: 0em 0em 0.5em 0em;
+ line-height: 1;
+ }
+
+/*=============================================================================
+ Misc
+=============================================================================*/
+
+ /* Title of books and articles in bibliographies */
+ span.title
+ {
+ font-style: italic;
+ }
+
+ span.underline
+ {
+ text-decoration: underline;
+ }
+
+ span.strikethrough
+ {
+ text-decoration: line-through;
+ }
+
+ /* Copyright, Legal Notice */
+ div div.legalnotice p
+ {
+ text-align: left
+ }
+
+/*=============================================================================
+ Colors
+=============================================================================*/
+
+ @media screen
+ {
+ body {
+ background-color: #FFFFFF;
+ color: #000000;
+ }
+
+ /* Syntax Highlighting */
+ .keyword { color: #0000AA; }
+ .identifier { color: #000000; }
+ .special { color: #707070; }
+ .preprocessor { color: #402080; }
+ .char { color: teal; }
+ .comment { color: #800000; }
+ .string { color: teal; }
+ .number { color: teal; }
+ .white_bkd { background-color: #FFFFFF; }
+ .dk_grey_bkd { background-color: #999999; }
+
+ /* Links */
+ a, a .keyword, a .identifier, a .special, a .preprocessor
+ a .char, a .comment, a .string, a .number
+ {
+ color: #005a9c;
+ }
+
+ a:visited, a:visited .keyword, a:visited .identifier,
+ a:visited .special, a:visited .preprocessor a:visited .char,
+ a:visited .comment, a:visited .string, a:visited .number
+ {
+ color: #9c5a9c;
+ }
+
+ h1 a, h2 a, h3 a, h4 a, h5 a, h6 a,
+ h1 a:hover, h2 a:hover, h3 a:hover, h4 a:hover, h5 a:hover, h6 a:hover,
+ h1 a:visited, h2 a:visited, h3 a:visited, h4 a:visited, h5 a:visited, h6 a:visited
+ {
+ text-decoration: none; /* no underline */
+ color: #000000;
+ }
+
+ /* Copyright, Legal Notice */
+ .copyright
+ {
+ color: #666666;
+ font-size: small;
+ }
+
+ div div.legalnotice p
+ {
+ color: #666666;
+ }
+
+ /* Program listing */
+ pre.synopsis
+ {
+ border: 1px solid #DCDCDC;
+ }
+
+ .programlisting,
+ .screen
+ {
+ border: 1px solid #DCDCDC;
+ }
+
+ td .programlisting,
+ td .screen
+ {
+ border: 0px solid #DCDCDC;
+ }
+
+ /* Blurbs */
+ div.note,
+ div.tip,
+ div.important,
+ div.caution,
+ div.warning,
+ p.blurb
+ {
+ border: 1px solid #DCDCDC;
+ }
+
+ /* Table of contents */
+ .toc
+ {
+ border: 1px solid #DCDCDC;
+ }
+
+ /* Tables */
+ div.informaltable table tr td,
+ div.table table tr td
+ {
+ border: 1px solid #DCDCDC;
+ }
+
+ div.informaltable table tr th,
+ div.table table tr th
+ {
+ background-color: #F0F0F0;
+ border: 1px solid #DCDCDC;
+ }
+
+ .copyright-footer
+ {
+ color: #8F8F8F;
+ }
+
+ /* Misc */
+ span.highlight
+ {
+ color: #00A000;
+ }
+ }
+
+ @media print
+ {
+ /* Links */
+ a
+ {
+ color: black;
+ }
+
+ a:visited
+ {
+ color: black;
+ }
+
+ .spirit-nav
+ {
+ display: none;
+ }
+
+ /* Program listing */
+ pre.synopsis
+ {
+ border: 1px solid gray;
+ }
+
+ .programlisting,
+ .screen
+ {
+ border: 1px solid gray;
+ }
+
+ td .programlisting,
+ td .screen
+ {
+ border: 0px solid #DCDCDC;
+ }
+
+ /* Table of contents */
+ .toc
+ {
+ border: 1px solid gray;
+ }
+
+ .informaltable table,
+ .table table
+ {
+ border: 1px solid gray;
+ border-collapse: collapse;
+ }
+
+ /* Tables */
+ div.informaltable table tr td,
+ div.table table tr td
+ {
+ border: 1px solid gray;
+ }
+
+ div.informaltable table tr th,
+ div.table table tr th
+ {
+ border: 1px solid gray;
+ }
+
+ table.simplelist tr td
+ {
+ border: none !important;
+ }
+
+ /* Misc */
+ span.highlight
+ {
+ font-weight: bold;
+ }
+ }
+
+/*=============================================================================
+ Images
+=============================================================================*/
+
+ span.inlinemediaobject img
+ {
+ vertical-align: middle;
+ }
+
+/*==============================================================================
+ Super and Subscript: style so that line spacing isn't effected, see
+ http://www.adobe.com/cfusion/communityengine/index.cfm?event=showdetails&productId=1&postId=5341
+==============================================================================*/
+
+sup,
+sub {
+ height: 0;
+ line-height: 1;
+ vertical-align: baseline;
+ _vertical-align: bottom;
+ position: relative;
+
+}
+
+sup {
+ bottom: 1ex;
+}
+
+sub {
+ top: .5ex;
+}
+
Added: sandbox/contract/doc/src/docutils.css
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/src/docutils.css 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,275 @@
+/*
+:Author: David Goodger
+:Contact: goodger_at_[hidden]
+:Date: $Date: 2007-11-25 14:34:32 -0500 (Sun, 25 Nov 2007) $
+:Revision: $Revision: 41371 $
+:Copyright: This stylesheet has been placed in the public domain.
+
+Default cascading style sheet for the HTML output of Docutils.
+
+See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
+customize this style sheet.
+*/
+
+/* used to remove borders from tables and images */
+.borderless, table.borderless td, table.borderless th {
+ border: 0 }
+
+table.borderless td, table.borderless th {
+ /* Override padding for "table.docutils td" with "! important".
+ The right padding separates the table cells. */
+ padding: 0 0.5em 0 0 ! important }
+
+.first {
+ /* Override more specific margin styles with "! important". */
+ margin-top: 0 ! important }
+
+.last, .with-subtitle {
+ margin-bottom: 0 ! important }
+
+.hidden {
+ display: none }
+
+a.toc-backref {
+ text-decoration: none ;
+ color: black }
+
+blockquote.epigraph {
+ margin: 2em 5em ; }
+
+dl.docutils dd {
+ margin-bottom: 0.5em }
+
+/* Uncomment (and remove this text!) to get bold-faced definition list terms
+dl.docutils dt {
+ font-weight: bold }
+*/
+
+div.abstract {
+ margin: 2em 5em }
+
+div.abstract p.topic-title {
+ font-weight: bold ;
+ text-align: center }
+
+div.admonition, div.attention, div.caution, div.danger, div.error,
+div.hint, div.important, div.note, div.tip, div.warning {
+ margin: 2em ;
+ border: medium outset ;
+ padding: 1em }
+
+div.admonition p.admonition-title, div.hint p.admonition-title,
+div.important p.admonition-title, div.note p.admonition-title,
+div.tip p.admonition-title {
+ font-weight: bold ;
+ font-family: sans-serif }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title {
+ color: red ;
+ font-weight: bold ;
+ font-family: sans-serif }
+
+/* Uncomment (and remove this text!) to get reduced vertical space in
+ compound paragraphs.
+div.compound .compound-first, div.compound .compound-middle {
+ margin-bottom: 0.5em }
+
+div.compound .compound-last, div.compound .compound-middle {
+ margin-top: 0.5em }
+*/
+
+div.dedication {
+ margin: 2em 5em ;
+ text-align: center ;
+ font-style: italic }
+
+div.dedication p.topic-title {
+ font-weight: bold ;
+ font-style: normal }
+
+div.figure {
+ margin-left: 2em ;
+ margin-right: 2em }
+
+div.footer, div.header {
+ clear: both;
+ font-size: smaller }
+
+div.line-block {
+ display: block ;
+ margin-top: 1em ;
+ margin-bottom: 1em }
+
+div.line-block div.line-block {
+ margin-top: 0 ;
+ margin-bottom: 0 ;
+ margin-left: 1.5em }
+
+div.sidebar {
+ margin-left: 1em ;
+ border: medium outset ;
+ padding: 1em ;
+ background-color: #ffffee ;
+ width: 40% ;
+ float: right ;
+ clear: right }
+
+div.sidebar p.rubric {
+ font-family: sans-serif ;
+ font-size: medium }
+
+div.system-messages {
+ margin: 5em }
+
+div.system-messages h1 {
+ color: red }
+
+div.system-message {
+ border: medium outset ;
+ padding: 1em }
+
+div.system-message p.system-message-title {
+ color: red ;
+ font-weight: bold }
+
+div.topic {
+ margin: 2em }
+
+h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
+h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
+ margin-top: 0.4em }
+
+h1.title {
+ text-align: center }
+
+h2.subtitle {
+ text-align: center }
+
+hr.docutils {
+ width: 75% }
+
+img.align-left {
+ clear: left }
+
+img.align-right {
+ clear: right }
+
+ol.simple, ul.simple {
+ margin-bottom: 1em }
+
+ol.arabic {
+ list-style: decimal }
+
+ol.loweralpha {
+ list-style: lower-alpha }
+
+ol.upperalpha {
+ list-style: upper-alpha }
+
+ol.lowerroman {
+ list-style: lower-roman }
+
+ol.upperroman {
+ list-style: upper-roman }
+
+p.attribution {
+ text-align: right ;
+ margin-left: 50% }
+
+p.caption {
+ font-style: italic }
+
+p.credits {
+ font-style: italic ;
+ font-size: smaller }
+
+p.label {
+ white-space: nowrap }
+
+p.rubric {
+ font-weight: bold ;
+ font-size: larger ;
+ color: maroon ;
+ text-align: center }
+
+p.sidebar-title {
+ font-family: sans-serif ;
+ font-weight: bold ;
+ font-size: larger }
+
+p.sidebar-subtitle {
+ font-family: sans-serif ;
+ font-weight: bold }
+
+p.topic-title {
+ font-weight: bold }
+
+pre.address {
+ margin-bottom: 0 ;
+ margin-top: 0 ;
+ font-family: serif ;
+ font-size: 100% }
+
+pre.literal-block, pre.doctest-block {
+ margin-left: 2em ;
+ margin-right: 2em }
+
+span.classifier {
+ font-family: sans-serif ;
+ font-style: oblique }
+
+span.classifier-delimiter {
+ font-family: sans-serif ;
+ font-weight: bold }
+
+span.interpreted {
+ font-family: sans-serif }
+
+span.option {
+ white-space: nowrap }
+
+span.pre {
+ white-space: pre }
+
+span.problematic {
+ color: red }
+
+span.section-subtitle {
+ /* font-size relative to parent (h1..h6 element) */
+ font-size: 80% }
+
+table.citation {
+ border-left: solid 1px gray;
+ margin-left: 1px }
+
+table.docinfo {
+ margin: 2em 4em }
+
+table.docutils {
+ margin-top: 0.5em ;
+ margin-bottom: 0.5em }
+
+table.footnote {
+ border-left: solid 1px black;
+ margin-left: 1px }
+
+table.docutils td, table.docutils th,
+table.docinfo td, table.docinfo th {
+ padding-left: 0.5em ;
+ padding-right: 0.5em ;
+ vertical-align: top }
+
+table.docutils th.field-name, table.docinfo th.docinfo-name {
+ font-weight: bold ;
+ text-align: left ;
+ white-space: nowrap ;
+ padding-left: 0 }
+
+h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
+h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
+ font-size: 100% }
+
+ul.auto-toc {
+ list-style-type: none }
Added: sandbox/contract/doc/src/images/alert.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/blank.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/1.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/1.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/10.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/10.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/11.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/11.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/12.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/12.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/13.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/13.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/14.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/14.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/15.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/15.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/16.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/17.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/18.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/19.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/2.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/2.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/20.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/21.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/22.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/23.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/24.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/25.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/26.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/27.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/28.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/29.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/3.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/3.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/30.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/4.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/4.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/5.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/5.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/6.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/6.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/7.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/7.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/8.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/8.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/9.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/callouts/9.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/caution.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/caution.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/draft.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/home.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/home.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/important.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/important.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/next.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/next.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/next_disabled.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/note.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/note.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/prev.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/prev.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/prev_disabled.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/smiley.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/tip.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/tip.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/toc-blank.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/toc-minus.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/toc-plus.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/up.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/up.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/up_disabled.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/warning.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/images/warning.svg
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/doc/src/minimal.css
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/src/minimal.css 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,29 @@
+/*
+
+ © Copyright Beman Dawes, 2007
+
+ Distributed under the Boost Software License, Version 1.0.
+ See www.boost.org/LICENSE_1_0.txt
+
+*/
+
+/*******************************************************************************
+ Body
+*******************************************************************************/
+
+body { font-family: sans-serif; margin: 1em; }
+
+/*******************************************************************************
+ Table
+*******************************************************************************/
+
+table { margin: 0.5em; }
+
+/*******************************************************************************
+ Font sizes
+*******************************************************************************/
+
+p, td, li, blockquote { font-size: 10pt; }
+pre { font-size: 9pt; }
+
+/*** end ***/
\ No newline at end of file
Added: sandbox/contract/doc/src/reference.css
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/src/reference.css 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,11 @@
+/*============================================================================
+ Copyright 2003-2004 Douglas Gregor
+ Distributed under the Boost Software License, Version 1.0. (See accompany-
+ ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+============================================================================*/
+
+PRE.synopsis {
+ background-color: #e0ffff;
+ border: thin solid blue;
+ padding: 1em
+}
\ No newline at end of file
Added: sandbox/contract/doc/tutorial.qbk
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/tutorial.qbk 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,491 @@
+
+[/ Copyright (C) 2008-2012 Lorenzo Caminiti ]
+[/ Distributed under 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) ]
+[/ Home at http://sourceforge.net/projects/contractpp ]
+
+[section Tutorial]
+
+This section explains how to program contracts using this library.
+See the __Grammar__ section for a complete guide on this library syntax.
+
+[section Free Functions]
+
+Consider the following free function `postinc` which performs a post-increment on its parameter (see also [file example/contracts no_contract_postinc.cpp]):
+
+[import ../example/contracts/no_contract_postinc.cpp]
+[no_contract_postinc]
+
+Let's now program the function declaration using the [macroref CONTRACT_FUNCTION] macro but without programming the contract yet (see also [file example/contracts no_pre_post_postinc.cpp]):
+
+[import ../example/contracts/no_pre_post_postinc.cpp]
+[no_pre_post_postinc]
+
+All necessary header files for this library are included by `#include <contract.hpp>` (see also the __Getting_Started__ section).
+
+The function body is programmed outside the library macro.
+Therefore, while this library alters the function declaration syntax, it does not change the syntax used to implement the function.
+
+The function name `(postinc)` must always be wrapped within parenthesis so it can be passed to this library macros.
+
+The function result and parameter types must be wrapped within parenthesis unless they are fundamental types containing no symbol (symbols are tokens different from the alphanumeric tokens `a-z`, `A-Z`, `0-9`).
+In this example, the result type `int const` is a fundamental type and it contains no symbol so the parenthesis around it `(int const)` are allowed but not required.
+[footnote
+In the examples presented in this documentation, extra parenthesis are in general avoided unless strictly required (for example, extra parenthesis around fundamental types containing no symbol `void`, `bool`, `unsigned int const`, etc are always omitted).
+In the authors' opinion, the syntax is more readable with lesser parenthesis.
+However, other programmers might find it more readable to always specify extra parenthesis around result and parameter types for consistency even when they are not strictly required.
+]
+Instead, the parameter type `int&` is a fundamental type but it contains the reference symbol `&` so it must be wrapped within parenthesis `(int&)`.
+
+[important
+In general, every token which is not a known keyword (`int` is a known keyword but the function name is not) or that contains a non-alphanumeric symbol (e.g., `int&`) must be wrapped within round parenthesis `(...)` unless it is the very last token of a given syntactic element (e.g., the function parameter name `value` is the last token of the parameter declaration).
+[footnote
+*Rationale.*
+This library uses preprocessor meta-programming to parse declarations and contracts of classes and functions.
+The preprocessor cannot parse a token if it is not known a priori or if it contains symbols, unless such a token is wrapped within round parenthesis `()`.
+For example, the function name is arbitrary, it cannot be known a priori, so it must always be wrapped within parenthesis.
+If a type is a fundamental type then it is known a priori (because it is composed of known C++ keywords `int`, `const`, `unsigned`, etc), and if the fundamental type also contains no symbols (`&`, `*`, etc) then the parenthesis around such a type are optional.
+]
+
+See the __Grammar__ section for more information.
+]
+
+Each function parameter must always specify both its type and its name (parameter names can instead by omitted in usual C++ declarations).
+[footnote
+*Rationale.*
+It would be possible to modify the library syntax to make parameter names optional but that will complicate the library implementation without adding any feature for programmers.
+]
+As usual, additional parameters can be specified separated by commas `,` on compilers that support variadic macros (these include most modern compilers, MSVC, GCC, and all __CXX11__ compilers, see the __No_Variadic_Macros__ section for compilers that do not support variadic macros).
+The configuration macro [macroref CONTRACT_CONFIG_FUNCTION_ARITY_MAX] indicates the maximum number of function parameters that can be specified.
+An empty parameter list must be specified using `void` (this is similar to the usual C++ syntax that allows to declare a function with no parameter using [^['result-type function-name ]]`( void )`).
+[footnote
+*Rationale.*
+Unfortunately, it is not possible to specify an empty parameter list simply as [^['result-type function-name ]]`( )` because the preprocessor can only parse `( )` if empty macro parameters are supported.
+Empty macro parameters together with variadic macros where added to __C99__ and the preferred syntax of this library uses variadic macros.
+However, not all compilers (notably MSVC) that support variadic macros also correctly support empty macro parameters so `( void )` is always used instead of `( )` to increase portability.
+]
+Default parameter values can be specified using `, default `[^['default-value]] immediately following the parameter name.
+The storage classifiers `auto` and `register` can be specified as usual as part of the parameter type.
+[footnote
+Note that the `auto` storage classifier in deprecated by __CXX11__ so it should be used with the usual care when writing programs that should be portable from __CXX03__ to __CXX11__.
+]
+Functions can be overloaded by specifying different parameter types and they can recursively call themselves as usual.
+
+For example, the following function `postinc` is overloaded to work on `long` instead of `int` numbers, it is implemented using recursion, it increments the specified number by `offset` which is stored into a register variable and it has a default value of `1` (see also [file example/contracts params_postinc.cpp]):
+
+[import ../example/contracts/params_postinc.cpp]
+[params_postinc]
+[params_postinc_call]
+
+Function and array types cannot be directly used as function parameter types within the contract macros but extra `typedef` declarations can be used to workaround this limitation (for multi-dimensional arrays, the maximum number of supported array dimensions is specified by the [macroref CONTRACT_CONFIG_ARRAY_DIMENSION_MAX] macro).
+For example (see also [file example/contracts params_funcptr_array_apply.cpp]):
+
+[import ../example/contracts/params_funcptr_array_apply.cpp]
+[params_funcptr_array_apply]
+[params_funcptr_array_apply_call]
+
+Spaces and new-lines make no syntactical difference and they can be used freely within this library macros.
+[footnote
+An MSVC preprocessor bug requires to use at least one space or newline to separate a parameter name from its type even when the parameter type is wrapped within parenthesis.
+]
+The following aesthetic conventions are followed in this documentation (because the authors think they improve readability):
+
+# Round parenthesis are spaced when a list of tokens is expected (e.g., the function parameter list): `( `[^['token1]]` )`, `( `[^['token1]]`, `[^['token2]]` )`, `( `[^['token1]]`, `[^['token2]]`, `[^['token3]]` )`, etc.
+# Round parenthesis are not spaced when only a single token is expected (e.g., the function name): `(`[^['token]]`)`.
+
+[endsect]
+
+[section Preconditions]
+
+Let's program the preconditions of `postinc` (see also [file example/contracts pre_only_postinc.cpp]):
+
+[import ../example/contracts/pre_only_postinc.cpp]
+[pre_only_postinc]
+
+In this example, the preconditions assert only one boolean condition but additional boolean conditions can be listed separated by commas `,`.
+Preconditions are automatically checked by the library when the `postinc` function is called, immediately before the body is executed (i.e., at function /entry/).
+See also the __Free_Function_Calls__ section.
+
+Contracts are supposed to check but not to modify the state of the program (see the __Constant_Correctness__ section).
+Therefore, this library evaluates all contract conditions in constant-correct context.
+Specifically, in this example the type of `value` is automatically promoted from `int&` to `int const&` within the preconditions and an attempt to modify `value` within the preconditions will correctly generate a compile-time error.
+
+[endsect]
+
+[section Postconditions (Result and Old Values)]
+
+Let's program the postconditions of `postinc` completing the contract (see also [file example/contracts post_also_postinc.cpp]):
+
+[import ../example/contracts/post_also_postinc.cpp]
+[post_also_postinc]
+
+Postconditions are automatically checked by the library when the `postinc` function is called, immediately after the body is executed but only if the body does not throw an exception (i.e., at function /normal exit/).
+See also the __Free_Function_Calls__ section.
+
+Postconditions can access the function return value by declaring a variable of type `auto`
+[footnote
+*Rationale.*
+The __CXX11__ `auto` declaration syntax is adopted for postcondition return value declarations however this library knows the result type because it is specified in the function declaration within the macros so no type deduction is actually used to implement auto declarations of return values.
+Similarly, the __CXX11__ `auto` declaration syntax is adopted for postcondition old value declarations however this library deduces the type of old value expressions using __Boost_Typeof__ so no __CXX11__ feature is actually needed (in this case programmers can optionally specify the old value type so to not use __Boost_Typeof__ as explained in the __Advanced_Topics__ section).
+]
+and assigning it to the `return` keyword (the variable name is arbitrary but `result` is often used).
+
+Postconditions can also access the /old value/ that an expression had just before the body was executed.
+This is done by declaring a variable of type `auto` and assigning it to [macroref CONTRACT_OLDOF] [^['expression]] (the variable name is arbitrary but the `old_` prefix is often used).
+Before executing the function body, the library automatically copies (once) the value of the specified expression into a variable with the specified name which is then made available to the postconditions.
+Therefore, the type of an old value expression must have a copy constructor (or, more precisely, it must be be __ConstantCopyConstructible__), otherwise the library will generate a compile-time error.
+The parenthesis around the expression passed to the [macroref CONTRACT_OLDOF] macro are allowed but not required (in this example, `CONTRACT_OLDOF(value)` could have been equivalently used instead of `CONTRACT_OLDOF value` but the latter was preferred because of lesser parenthesis).
+In this sense, the syntax of the `CONTRACT_OLDOF` macro resembles the syntax of the `sizeof` operator which also allows but does not require parenthesis when applied to value expressions (i.e., `sizeof value` and `sizeof(value)` are both valid).
+[footnote
+*Rationale.*
+This is also the syntax specified by __N1962__ for the `oldof` operator which is the equivalent of the `CONTRACT_OLDOF` macro.
+]
+(The maximum number of supported and possible old value declarations is specified by the [macroref CONTRACT_CONFIG_OLDOF_MAX] and [macroref CONTRACT_LIMIT_OLDOFS] macros respectively.)
+
+Postconditions always access result and old values in constant-correct context so that contracts cannot modify the state of the program (see the __Constant_Correctness__ section).
+
+In general, it is recommended to specify multiple assertions separated by commas and not to group them together into a single condition using the operator `and` (or `&&`).
+This is because if assertion conditions are programmed together using `and` then it will not be clear which assertion condition actually failed in case the contract is broken.
+For example, if in the code above we programmed one single postcondition `(value == old_value + 1) and (result == old_value)` then in case the postcondition failed we would not know which condition failed `value == old_value + 1` or `result == old_value`.
+
+[note
+All tokens must be specified in the fixed order listed in the __Grammar__ section (it is not possible to specify postconditions before preconditions, `volatile` before `const` for member functions, etc).
+[footnote
+*Rationale.*
+This library macros could have been implemented to allow to mix the order of some tokens (preconditions and postconditions, `volatile` and `const`).
+However, that would have complicated the macro implementation without any added functionality for the user.
+]
+]
+
+[endsect]
+
+[section Classes and Class Invariants]
+
+Consider the following class `ivector` which is a vector of integers with a constructor, destructor, and the `push_back` member function (see also [file example/contracts no_contract_ivector.cpp]):
+
+[import ../example/contracts/no_contract_ivector.cpp]
+[no_contract_ivector]
+
+Let's program the class declaration and the class invariants using the [macroref CONTRACT_CLASS] and [macroref CONTRACT_CLASS_INVARIANT] macros respectively (see also [file example/contracts class_ivector.cpp]):
+
+[import ../example/contracts/class_ivector.cpp]
+[class_ivector_classinv]
+
+A class must always be declared using the [macroref CONTRACT_CLASS] macro in oder to later be able to program contracts for its constructors, destructor, and member functions.
+Similarly to function names, the class name must always be wrapped within parenthesis `(ivector)` (because the class name is not a known keyword and it is not the last element of the class declaration syntax for example when base classes and are specified after the class name).
+Only constructors, destructors, and member functions that are public check the class invariants while the ones that are either protected or private do not (see the __Contract_Programming_Overview__ section).
+The class invariant must always be specified for a class declared using the [macroref CONTRACT_CLASS] macro and it must appear at the very beginning of the class definition (no statement can precede the [macroref CONTRACT_CLASS_INVARIANT] macro, not even a `typedef` or a `friend` declaration).
+If a class has no class invariant, the class invariants must be specified `void`:
+
+ CONTRACT_CLASS(
+ class (ivector)
+ ) {
+ CONTRACT_CLASS_INVARIANT( void ) // No class invariant.
+
+ // ...
+
+Using the same macro, this library also allows to specify contracts for `struct`:
+[footnote
+*Rationale.*
+There is no need for a `CONTRACT_STRUCT` macro because this library macros can parse the class declaration and distinguish between the `struct` and `class` specifiers.
+]
+
+ CONTRACT_CLASS(
+ struct (ivector) // Structs with contracts.
+ ) {
+ // ...
+
+The usual differences between `struct` and `class` also apply when this library is used (i.e., default member and inheritance access levels are `public` for `struct` and `private` for `class`).
+
+[note
+Unfortunately, this library does not allow to specify contracts for `union`.
+[footnote
+*Rationale.*
+The authors have not fully investigated if this library could be extended to specify contracts for unions.
+It is possible that future revisions of this library will support contracts for unions (see also [@http://sourceforge.net/apps/trac/contractpp/ticket/50 Ticket 50]).
+]
+]
+
+No contracts are checked (not event the class invariants) when a data member is accessed directly so it might be best for both classes and structs to have no non-constant public data member (but access all data members via appropriate member functions that can check the class and sturct contracts).
+
+[endsect]
+
+[section Constructors]
+
+Let's program the `ivector` class constructor and its contract using the [macroref CONTRACT_CONSTRUCTOR] macro (see also [file example/contracts class_ivector.cpp]):
+
+[class_ivector_constructor]
+
+Constructor, destructor, and member function declarations must always repeat their access level `public`, `protected`, or `private`
+[footnote
+*Rationale*
+This library needs to know each member access level because in Contract Programming only public members are supposed to check class invariants while protected and private members only check preconditions and postconditions but not the class invariants.
+Unfortunately, in C++ it is not possible for a member to introspect its access level using template meta-programming.
+Therefore, this library requires the access level to be specified within the macros and it uses preprocessor meta-programming to detect it.
+Furthermore, given that the access level is has to be specified, the [macroref CONTRACT_FUNCTION] macro also uses it to differentiate between free and member functions so no additional macro `CONTRACT_MEMBER` is needed.
+]
+which is specified without the usual trailing column symbol `:`.
+(This use of `public`, `protected`, and `private` resembles __Java__'s syntax.)
+
+The constructor name `(ivector)` and the non-fundamental parameter type `(size_type)` must be wrapped within parenthesis (because they are not known keywords and they are not at the end of a syntactic element).
+
+Member initializers are programed as a comma-separated list but using the specifier [^initialize( /expression1/, /expression2/, ... )] instead of the usual column symbol [^: /expression1/, /expression2/, ...].
+When specified, they must appear at the very end of constructor declarations (after both preconditions and postcondition if present).
+[footnote
+*Rationale.*
+Member initializers are specified after the preconditions and postconditions because they are part of the constructor definition while preconditions and postconditions are part of the constructor declaration.
+]
+Unfortunately, when member initializers are specified, the constructor body must be defined together with its declaration and contract (see the __Forward_Declarations_and_Body_Definitions__ section).
+
+There is no object before the constructor body is executed, therefore this library will generate a compile-time error if either preconditions or postcondition old value expressions try to access the object `this`.
+For the same reason, only static class invariants are checked at entry of public constructors (non-static class invariants are checked at public constructor normal exit but not at entry).
+Finally, preconditions are checked before member initializers are executed (so the initializers can rely on preconditions for validating constructor arguments).
+See also the __Constructor_Calls__ section.
+
+[endsect]
+
+[section Destructors]
+
+Let's program the `ivector` class destructor using the [macroref CONTRACT_DESTRUCTOR] macro (see also [file example/contracts class_ivector.cpp]):
+
+[class_ivector_destructor]
+
+The destructor access level `public`, `protected`, or `private` must always be specified.
+The destructor name `(~ivector)` must be wrapped within parenthesis.
+The destructor empty parameter list must be specified using `void` (same as for constructors, member functions, and free functions with no parameters).
+
+Destructors have no parameter and there is no object after the destructor body is executed.
+Therefore, destructors cannot specify neither preconditions nor postconditions.
+[footnote
+Future revisions of this library might implement static postconditions for destructors (see the __Destructor_Calls__ section).
+]
+However, it is still necessary to contract (at least public) destructors so they check static and non-static class invariants at entry, and non-static class invariants at exit.
+See also the __Destructor_Calls__ section.
+
+[important
+Only members declared using this library macros check the class invariants.
+Therefore, at least all public members of a class with non-empty class invariants should be declared using this library macros even when they have no preconditions and no postconditions so that they check the class invariants (that is the case for public destructors).
+]
+
+In general, there is no need to use this library macros to declare free functions, constructors, destructors, and member function only when:
+
+# A free function has no preconditions and no postconditions.
+# A private or protected constructor, destructor, or member function has no preconditions and no postconditions (regardless of class invariants because private and protected members never check class invariants).
+# A public constructor, destructor, or member function has no preconditions, no postconditions, and its class has no class invariants.
+
+[endsect]
+
+[section Member Functions]
+
+Let's program the member function `ivector::push_back` and its contract using the [macroref CONTRACT_FUNCTION] macro (see also [file example/contracts class_ivector.cpp]):
+
+[class_ivector_member]
+
+The member function access level `public`, `protected`, or `private` must always be specified.
+The member function name `(push_back)` must be wrapped within parenthesis.
+The member function result type `void` and parameter type `int const` can but do not have to be wrapped within parenthesis (because they are both fundamental types containing no symbol).
+
+Public non-static member functions check static and non-static class invariants at both entry and exit.
+Preconditions are checked at entry and postconditions are checked at normal exit.
+Both preconditions and postconditions can access the object and the member function parameters in constant-correct context.
+Postconditions can declare return and old value variables (again, in constant-correct context).
+See also the __Member_Function_Calls__ section.
+
+[note
+Contracts are most useful when the assertions only use public members that are accessible from the caller so the caller can properly verify and use the contract.
+In particular, preconditions of a member function or constructor that use non-public members are essentially incorrect because they cannot be verified by the caller before calling the function (in fact, __Eiffel__ generates a compile-time error in this case).
+
+This library leave it up to programmers to only use public members when programming contracts and especially when programming preconditions (see the __Specification_vs__Implementation__ section).
+]
+
+[endsect]
+
+[section Inheritance and Subcontracting]
+
+Consider the following class `unique_identifiers` which is a collection of unique integral identifiers (see also [file example/contracts subcontract_identifiers.cpp]):
+
+[import ../example/contracts/subcontract_identifiers.cpp]
+[subcontract_identifiers_unique]
+
+Reading the contracts we can understand the semantics of the class operation (even if we do not consult the class implementation):
+
+# The collection is constructed with zero size as specified by the constructor postconditions.
+Consistently, the class invariants assert that the class size must never be negative (but it can be zero).
+# The member function `unique_identifiers::add` allows to add an integral identifier to the collection.
+The preconditions assert that the specified identifier must not already be part of the collection making sure that duplicate identifiers are never added.
+# If the specified identifier was not already part of the collection (`old_found` is `false`) then the postconditions assert that the identifier is added and consequently that the size of the collection increased by one.
+Note that both postconditions are trivially `true` if instead the identifier was already part of the collection (`old_found` is `true`).
+We call these type of assertions that are "guarded" by an activation condition /select assertions/ (here we have used the C++ ternary operator `?:` to program select assertions, the __Advanced_Topics__ section will introduce an alternative construct for select assertions).
+
+Let's assume that we want to derive from `unique_identifiers` another type of collection `duplicate_identifiers` which instead allows to add duplicate identifiers (see also [file example/contracts subcontract_identifiers.cpp]):
+
+[subcontract_identifiers_duplicate]
+
+The derived class `duplicate_identifiers` publicly inherits from the base class `unique_identifiers` using the specifier [^extends( /base1/, /base2/, ... )] instead of the usual column symbol [^: /base1/, /base2/, ...]. (This use of `extends` resembles __Java__'s syntax.)
+As usual, the inheritance access level `public`, `protected`, or `private` is optional and it defaults to `public` for `struct` and to `private` for `class`.
+Virtual base classes can also be specified but `virtual` must always be specified after the inheritance access level `public`, `protected`, or `private` if present.
+Multiple base classes (`base1`, `base2`, etc) can be specified for multiple-inheritance (the configuration macro [macroref CONTRACT_CONFIG_INHERITANCE_MAX] indicates the maximum number of base classes that can be specified).
+
+[note
+This library automatically subcontracts the derived class when one or more base classes are specified (see the __Contract_Programming_Overview__ section).
+]
+
+Let's assume that a `duplicate_identifers` object is constructed with identifier `123` and that we try to add the identifier `123` again:
+
+[subcontract_identifiers_duplicate_add]
+
+Reading both the derived and base class contracts, we can understand the semantics of the derived class operation (even if we do not consult the base and derived class implementations):
+
+# The `duplicate_identifiers` constructor creates a collection with size one as specified by the constructor postconditions.
+Therefore, the `duplicate_identifiers` class invariants assert that size is always positive.
+Subcontracting automatically checks the `unique_identifiers` base class invariants in __logic_and__ with the `duplicate_identifiers` derived class invariants thus class invariants can only be strengthened by derived classes (this is necessary because the derived class can be used whenever the base class is used therefore the derived class must satisfy the base class invariants at all times, see also the __substitution_principle__ and the __Contract_Programming_Overview__ section).
+# Subcontracting automatically checks the `unique_identifiers::add` overridden preconditions in __logic_or__ with the `duplicate_identifiers::add` overriding preconditions thus preconditions can only be weakened by overriding member functions (this is necessary because the overriding member function can be called under the conditions for which the overridden function is called, see also the __substitution_principle__ and the __Member_Function_Calls__ section).
+Indeed, in this example the `unique_identifiers::add` preconditions fail (because `123` is already in the collection) but the `derived_identifiers::add` preconditions pass so the __logic_or__ of the two sets of preconditions passes and the call `ids.add(123)` is a valid call.
+# Subcontracting automatically checks the `unique_identifiers::add` overridden postconditions in __logic_and__ with the `duplicate_identifiers::add` overriding postconditions thus postconditions can only be strengthen by overriding member functions (this is necessary because the overriding function can be called in any context in which the overridden function is called, see also the __substitution_principle__ and the __Member_Function_Calls__ section).
+Indeed, in this example the `unique_identifiers::add` postconditions pass because the identifier `123` was already added (`old_found` is `true`) and `unique_identifiers::add` select assertions trivially return `true`.
+The `duplicate_identifiers::add` postconditions are then checked in __logic_and__ and they correctly assert that the collection size did not change given that `123` was already added.
+Therefore, the call `ids.add(123)` is valid but adds no identifier.
+
+Finally, note that within the body of overriding functions it is necessary to use the [macroref CONTRACT_MEMBER_BODY] macro to call the overridden function as in `unique_identifiers::CONTRACT_MEMBER_BODY(add)(id)`.
+
+[warning
+Unfortunately, invoking the overridden function from within the overriding function body without using [macroref CONTRACT_MEMBER_BODY] results in infinite recursion.
+[footnote
+*Rationale*.
+In this case, the library implementation will recursively check contracts of the overriding function forever (in all other cases, this library is able to avoid infinite recursions due to contract checking).
+]
+This limitation might be removed in future revisions of this library (see also [@https://sourceforge.net/apps/trac/contractpp/ticket/46 Ticket 46]).
+]
+
+[endsect]
+
+[section Class Templates]
+
+Let's program a class template `vector` similar to the class `ivector` we have seen before but that works on a generic value type `T` and not just on `int` (see also [file example/contracts class_template_vector.cpp] and [file example/contracts pushable.hpp]):
+
+[import ../example/contracts/class_template_vector.cpp]
+[class_template_vector]
+
+(The specifications of the code in this example are not fully programmed, in particular concepts, see the __Concepts__ section, and assertion requirements, see the __Advanced_Topics__ section, have been omitted for simplicity.)
+
+Note that templates are declared using the specifier `template( typename T, ... )` which uses round parenthesis instead of the usual angular parenthesis `template< typename T, ... >`.
+However, after a template is declared using round parenthesis, angular parenthesis are used as usual to instantiate the template (e.g., the base class `pushable<T>`).
+
+[important
+Within a type-dependent scope (e.g., within the class template of the above example) the special macros with the `_TPL` postfix must be used instead of the macros we have seen so far.
+[footnote
+*Rationale.*
+The library must know if the enclosing scope is a template so it knows when to prefix nested type expressions with `typename` (because __CXX03__ does not allow to use `typename` outside templates).
+This constraints could be relaxed on future revisions of this library for __CXX11__ compilers (because __CXX11__ allows to use `typename` more freely).
+Earlier versions of this library did not require to use the special `_TPL` macros within templates because the library internally implemented every contracted function using a template function, possibly with dummy template parameters, even if the original function was not a template so `typename` could always be used by the library.
+The dummy template parameters were hidden to the user so this approach did not change the user API and had the benefit of not requiring the `_TPL` macros.
+However, this approach increased compilation time because of the extra templates that it introduced so the current revision of the library uses the `_TPL` macros.
+]
+(The same applies to function templates, see below.)
+]
+
+In the example above, the enclosing class template `vector` is not declared using the [macroref CONTRACT_CLASS_TPL] macro because its enclosing scope is not type-dependent (it is the global namespace).
+Within such a class template however, all contract macros must use the `_TPL` postfix so [macroref CONTRACT_CLASS_INVARIANT_TPL], [macroref CONTRACT_CONSTRUCTOR_TPL], [macroref CONTRACT_DESTRUCTOR_TPL], and [macroref CONTRACT_FUNCTION_TPL] must be used to specify class invariants, declare constructors, declare the destructor, and declare member functions respectively.
+In general, the [macroref CONTRACT_CLASS_TPL] macro is used when declaring a class nested within a class template (see the __Advanced_Topics__ section).
+
+This libraries supports all the different kinds of template parameters that C++ supports: type template parameters, value template parameters, and template template parameters.
+
+* Type template parameters can be prefixed by either `typename` or `class` as usual, `typename A` or `class C`.
+* The type of value template parameters must be wrapped within parenthesis `(A) D` but the parenthesis are optional for fundamental types that contain no symbol `int B`.
+* Template template parameters use round parenthesis for their template specifier but then their inner template parameters are specified using the usual C++ syntax `template( typename X, template< ... > class Y, ... ) class E`.
+
+Default template parameters are specified using `, default `[^['default-value]] right after the template parameter declaration.
+For example (see also [file example/contracts template_params.cpp]):
+
+[import ../example/contracts/template_params.cpp]
+[template_params_class]
+
+Finally, the syntax `template( void )` is used instead of the usual `template< >` to specify a template with no template parameters (this is typically used for template specializations, see the __Advanced_Topics__ section).
+
+[endsect]
+
+[section Function Templates]
+
+Let's program a function template `postinc` similar to the function `postinc` that we have seen before but that works on a generic type `T` and not just on `int` (see also [file example/contracts function_template_postinc.cpp]):
+
+[import ../example/contracts/function_template_postinc.cpp]
+[function_template_postinc]
+
+(The specifications of the code in this example are not fully programmed, in particular concepts, see the __Concepts__ section, and assertion requirements, see the __Advanced_Topics__ section, have been omitted for simplicity.)
+
+Type, value, and template template parameters are specified for function templates using the same syntax used for class template parameters, for example (see also [file example/contracts template_params.cpp]):
+
+[template_params_function]
+
+Note that as usual, function templates cannot have default template parameters in __CXX03__.
+
+[endsect]
+
+[section Forward Declarations and Body Definitions]
+
+This library supports contracts for classes and functions that have forward declarations.
+Furthermore, the function body definition can be deferred and separated from the function declaration and its contracts.
+For example (see also [file example/contracts body_natural.hpp], [file example/contracts body_natural_impl.hpp], and [file example/contracts body_natural.cpp]):
+
+[import ../example/contracts/body_natural.hpp]
+[body_natural]
+
+In this example, the class `natural` and the function `less` are first forward declared and later declared.
+Note that the contracts can be specified only once and together with the class or function declaration (not with the forward declarations that can be many).
+
+[important
+This library forces to specify contracts with the function and class declarations and not with their definitions.
+This is correct because contracts are part of the program specifications (declarations) and not of the program implementation (definitions), see also the __Specification_vs__Implementation__ section.
+]
+
+Note that as usual in C++, not all functions need to be defined when they are first declared.
+In this example, `less` and `natural::get` are defined together with their declarations and contracts while the other function bodies are defined separately.
+
+The definitions of the free function `greater`, the constructor `natural::natural`, the destructor `natural::~natural`, and the member function `natural::equal` are deferred and separated from their declarations and contracts.
+In fact, a semicolon `;` is specified right after the contract declaration macros instead of programming the function bodies.
+As usual in C++, the semicolon `;` indicates that the function body definition is deferred and it will appear at some other point in the program (often in a =.cpp= file that can be compiled separately).
+In this example, the deferred functions are templates or template members therefore the definitions where programmed in a header file that must be made available when the template declarations are compiled (see also [file example/contracts body_natural_impl.hpp]):
+[footnote
+In principle, this library supports `export` templates that can be used to program template definitions separately from their declarations and in files that can be pre-compiled.
+However, `export` templates are not supported by most __CXX03__ compilers (in fact, [@http://www.comeaucomputing.com/4.0/docs/userman/export.html Comeau] might be the only compiler that supports them), they were removed from __CXX11__, and they are an untested feature of this library.
+Instead of using `export` templates, it is common practise in C++ to program both template declarations and definitions together so they can be compiled correctly.
+In this example, the authors have used a separate header file `..._impl.hpp` to logically separate template declarations and definitions but the header is included at the bottom of the declaration header file so the definitions are always available together with their declarations.
+]
+
+[import ../example/contracts/body_natural_impl.hpp]
+[body_natural_impl]
+
+The usual C++ syntax is used to define the bodies (in fact this library only alters the syntax of class and function declarations but not the syntax of their definitions).
+However, free function, constructor, destructor, and member function names must be specified using the macros [macroref CONTRACT_FREE_BODY], [macroref CONTRACT_CONSTRUCTOR_BODY], [macroref CONTRACT_DESTRUCTOR_BODY], and [macroref CONTRACT_MEMBER_BODY] respectively.
+[footnote
+*Rationale.*
+Four different body macros are needed because contracts are disabled differently for the different type of functions.
+For example, disabling preconditions and postconditions turns off contracts for free functions but not for member functions, disabling class invariants turns off contracts for destructors but not for constructors, etc.
+]
+The free and member body macros take one parameter which is the function name.
+The constructor and destructor body macros take two parameters that are the fully qualified class type (including eventual template parameters as usual) and the class name which must be prefixed by the tilde symbol `~` for destructors as usual.
+[footnote
+Some compilers accept to repeat template parameter names in the constructor and destructor names.
+However, this is not __CXX03__ compliant (and, for example, it was fixed in more recent versions of GCC) therefore programmers are advised to specify the template parameter names only for the class type and not for the constructor and destructor names (this is also why the macros must take a second parameter with the class name instead of just the class type parameter).
+]
+The class type parameter must be wrapped within extra parenthesis like in this example but only if it contains multiple template parameters (because these use unwrapped commas which cannot be passed within macro parameters, see the beginning of the __Advanced_Topics__ section).
+
+In this example, it was possible to separate the constructor body definition because the constructor did not specify member initializers.
+
+[warning
+Unfortunately, when member initializers are specified, the macro [macroref CONTRACT_CONSTRUCTOR_BODY] cannot be used, the constructor body definition cannot be deferred, and the constructor body must be defined together with the constructor declaration and its contract inside the class definition.
+[footnote
+*Rationale.*
+This limitation comes from the fact that __CXX03__ does not support delegating constructors.
+If member initializers are specified within the contract, the deferred body will not compile when contract compilation is turned off by the configuration macros.
+If instead member initializers are specified with the deferred body definition, the deferred body will not compile when contract compilation is turned on by the configuration macros.
+There is no way to reconcile these two conditions without delegating constructors, so definitions cannot be deferred for constructors that specify member initializers.
+This limitation could be removed in future revisions of this library for __CXX11__ compilers that support delegating constructors (see also [@http://sourceforge.net/apps/trac/contractpp/ticket/51 Ticket 51]).
+]
+]
+
+[endsect]
+
+[endsect]
+
Added: sandbox/contract/doc/virtual_specifiers.qbk
==============================================================================
--- (empty file)
+++ sandbox/contract/doc/virtual_specifiers.qbk 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,138 @@
+
+[/ Copyright (C) 2008-2012 Lorenzo Caminiti ]
+[/ Distributed under 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) ]
+[/ Home at http://sourceforge.net/projects/contractpp ]
+
+[section Virtual Specifiers]
+
+This section explains how to use this library to program virtual specifiers `final`, `override`, and `new`.
+Virtual specifiers are part of the program specifications because they enforce inheritance constraints at compile-time and therefore they are within the scope of this library.
+
+[important
+This library implements virtual specifiers for __CXX03__ and without using any __CXX11__ feature.
+[footnote
+This library declares special member functions to ["tag] virtual traits of a given member function in a base class (if it is `virtual`, `final`, etc).
+Then template meta-programming introspection is used by the derived class to inspect virtual trait in its base classes and generate compiler errors if the virtual specifiers are not satisfied.
+These techniques do not use any __CXX11__ feature however, future revisions of this library might use __CXX11__ native support for virtual specifiers so to eliminate the extra compilation time required by template meta-programming introspection and correct a number of bugs associated with the current implementation of virtual specifiers in this library (see also [@http://sourceforge.net/apps/trac/contractpp/ticket/53 Ticket 53], [@http://sourceforge.net/apps/trac/contractpp/ticket/53 Ticket 55], and [@http://sourceforge.net/apps/trac/contractpp/ticket/53 Ticket 56]).
+]
+Obviously, virtual specifiers are supported only if both the base and derived classes and member functions in question are declared using this library macros (otherwise this library has no control over usual C++ declarations).
+]
+
+The examples presented in this section are rather simple (and they do not define virtual destructors for brevity).
+These examples only aim to illustrate the syntax of this library virtual specifiers and not to make a case about the utility of these specifiers.
+Virtual specifiers were adopted by __CXX11__ and in some form are part of other languages like __Java__, programmers can refer to the web and to the __Examples__ section for more interesting examples.
+
+[section Final Classes]
+
+Final classes cannot be derived, otherwise the compiler will generated an error.
+This library allows to declare a class final by specifying `final` within the [macroref CONTRACT_CLASS] macro after the class name, after template specialization types but before base classes if present (see also the __Grammar__ section).
+
+For example (see also [file example/virtual_specifiers final_class.hpp] and [file example/virtual_specifiers final_class.cpp]):
+
+[import ../example/virtual_specifiers/final_class.hpp]
+[final_class]
+
+If a derived class declared using [macroref CONTRACT_CLASS] attempts to inherit from a final base class, the compiler will generate a compile-time error (this is true only if both the base and derived classes are declared using this library macro [macroref CONTRACT_CLASS]).
+For example, consider the following derived class (see also [file example/virtual_specifiers final_class_error.cpp]):
+
+[import ../example/virtual_specifiers/final_class_error.cpp]
+[final_class_error]
+
+This will generate a compile-time error similar to the following because `x` is final (note that the number of the base class that violates the `final` specifier is reported so it is clear which base class is causing the error also in case of multiple-inheritance):
+
+[pre
+final_class_error.cpp:8 ... ERROR_cannot_extend_final_base_class_number_1 ...
+]
+
+Final class checks are performed at compile-time even when contracts are disabled (using [macroref CONTRACT_CONFIG_NO_PRECONDITIONS], [macroref CONTRACT_CONFIG_NO_POSTCONDITIONS], [macroref CONTRACT_CONFIG_NO_CLASS_INVARIANTS], etc).
+
+[endsect]
+
+[section Final Member Functions]
+
+Final member functions cannot be overridden by derived classes, otherwise the compiler will generate an error.
+This library allows to declare a member function final by specifying `final` within the [macroref CONTRACT_FUNCTION] macro, after the cv-qualifier but before exception specifications if present (see also the __Grammar__ section).
+
+For example (see also [file example/virtual_specifiers final_member.hpp] and [file example/virtual_specifiers final_member.cpp]):
+
+[import ../example/virtual_specifiers/final_member.hpp]
+[final_member]
+
+If a member function of a derived class is declared using [macroref CONTRACT_FUNCTION] and attempts to override a final member function from one of the base classes, the compiler will generate a compile-time error (this is true only if both the overriding and overridden functions are declared using this library macro [macroref CONTRACT_FUNCTION]).
+For example, consider the following derived class (see also [file example/virtual_specifiers final_member_error.cpp]):
+
+[import ../example/virtual_specifiers/final_member_error.cpp]
+[final_member_error]
+
+This will generate a compile-time error similar to the following because `y::f` is final (note that the number of the base class that violates the `final` specifier is reported so it is clear which overridden member function is causing the error also in case of multiple-inheritance):
+
+[pre
+final_member_error.cpp:13 ... ERROR_cannot_override_final_function_from_base_class_number_1 ...
+]
+
+In order to correctly handle overloaded functions, the overriding function and the final function must have the same name, parameter types, and cv-qualifier to generate this error.
+
+Final member function checks are performed at compile-time but only when class invariants are enabled ([macroref CONTRACT_CONFIG_NO_CLASS_INVARIANTS] is left not defined).
+
+[endsect]
+
+[section Overriding Member Functions]
+
+Overriding member functions must override a virtual member function from one or more of the base classes, otherwise the compiler will generate an error.
+This library allows to declare an overriding member function by specifying `override` within the [macroref CONTRACT_FUNCTION] macro, after the cv-qualifier but before the `final` specifier if present (`override` and `final` can be used together, see also the __Grammar__ section).
+
+For example (see also [file example/virtual_specifiers override_member.hpp] and [file example/virtual_specifiers override_member.cpp]):
+
+[import ../example/virtual_specifiers/override_member.hpp]
+[override_member]
+
+If a member function of a derived class is declared using [macroref CONTRACT_FUNCTION] and attempts to override an non-virtual or non-existing member function from one of the base classes, the compiler will generate a compile-time error (this is true only if both the overriding and overridden functions are declared using this library macro [macroref CONTRACT_FUNCTION]).
+For example, consider the following derived class (see also [file example/virtual_specifiers override_member_error.cpp]):
+
+[import ../example/virtual_specifiers/override_member_error.cpp]
+[override_member_error]
+
+This will generate a compile-time error similar to the following because `x::g` is not virtual:
+
+[pre
+override_member_error.cpp:12 ... ERROR_no_base_class_declares_matching_virtual_function_to_override_at_line_12 ...
+]
+
+In order to correctly handle overloaded functions, the overriding function and the overridden virtual function must have the same name, parameter types, and cv-qualifier to /not/ generate this error.
+
+Overriding member function checks are performed at compile-time but only if at least one between preconditions, postconditions, and class invariants is enabled ([macroref CONTRACT_CONFIG_NO_PRECONDITIONS], [macroref CONTRACT_CONFIG_NO_POSTCONDITIONS] and [macroref CONTRACT_CONFIG_NO_CLASS_INVARIANTS] are not all defined at the same time).
+
+[endsect]
+
+[section New Member Functions]
+
+New member functions shall not override member functions from any of the base classes, otherwise the compiler will generate an error.
+This library allows to declare a new member function by specifying `new` within the [macroref CONTRACT_FUNCTION] macro, after the cv-qualifier but before the `final` specifier if present (`new` and `final` can be used together, see also the __Grammar__ section).
+
+For example (see also [file example/virtual_specifiers new_member.hpp] and [file example/virtual_specifiers new_member.cpp]):
+
+[import ../example/virtual_specifiers/new_member.hpp]
+[new_member]
+
+If a new member function of a derived class is declared using [macroref CONTRACT_FUNCTION] but it overrides an existing member function from one of the base classes, the compiler will generate a compile-time error (this is true only if both the overriding and overridden functions are declared using this library macro [macroref CONTRACT_FUNCTION]).
+For example, consider the following derived class (see also [file example/virtual_specifiers new_member_error.cpp]):
+
+[import ../example/virtual_specifiers/new_member_error.cpp]
+[new_member_error]
+
+This will generate a compile-time error similar to the following because `f` was already declared in `x` (note that the number of the base class that violates the `new` specifier is reported so it is clear which overridden member function is causing the error also in case of multiple-inheritance):
+
+[pre
+new_member_error.cpp:12 ... ERROR_matching_virtual_function_already_declared_by_base_class_number_1 ...
+]
+
+In order to correctly handle overloaded functions, the new function and the overridden function must have the same name, parameter types, and cv-qualifier to generate this error.
+
+New member function checks are performed at compile-time but only if at least one between preconditions, postconditions, and class invariants is enabled ([macroref CONTRACT_CONFIG_NO_PRECONDITIONS], [macroref CONTRACT_CONFIG_NO_POSTCONDITIONS] and [macroref CONTRACT_CONFIG_NO_CLASS_INVARIANTS] are not all defined at the same time).
+
+[endsect]
+
+[endsect]
+
Added: sandbox/contract/example/Jamfile.v2
==============================================================================
--- (empty file)
+++ sandbox/contract/example/Jamfile.v2 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,422 @@
+
+# Copyright (C) 2008-2012 Lorenzo Caminiti
+# Distributed under 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)
+# Home at http://sourceforge.net/projects/contractpp
+
+import testing ;
+import python ;
+import type ;
+import generators ;
+
+echo """
+Usage: bjam [TARGET]... [BJAM_OPTION]...
+By default, build examples from all directories and with all contract on/off
+combinations (this takes a long time). Targets `all_on` and `all_off` build
+examples from all directories but only with contracts on and off respectively.
+Target `dirname` build examples only in the given directory but with all
+contracts on. See TARGET below for a complete list of targets.
+Other Bjam options (`-q`, `--clean`, etc) are specified as usual.
+
+TARGET
+ [noflags][_dirname][_filename] | dirname_onoff | all_on | all_off
+noflags
+ Turn off specific contract combinations using `no[e][o][i][b][l]`:
+ noe | noo | noi | nob | nol | noeo | noei | nooi | nobl | noeoi | noeoibl
+ Where:
+ e = prEconditions o = pOstconditions i = class Invariants
+ b = Block invariants l = Loop variants
+ Turn off no contract when `noflags` is not specified. (Longer flag names
+ would have caused too long build file names on some OS.)
+dirname
+ Build the specified directory (contracts on if `noflags` not specified).
+filename
+ Build the specified file (contracts on if `noflags` not specified).
+dirname_onoff
+ Build in specified directory name with all contract on/off combinations.
+all_on
+ Build all directories but with all contracts on.
+all_off
+ Build all directories but with all contracts off.
+
+EXAMPLES
+ bjam contracts_push_back # only contracts/push_back, contracts on
+ bjam noeo_contracts_push_back # contract/push_back, pre and post off
+ bjam contracts # all in contracts/, contracts on
+ bjam noeo_contracts # all in contracts/, pre and post off
+ bjam contracts_onoff # all in contracts/, all on/off combinations
+ bjam all_on # all directories, contracts on
+ bjam # all directories, all on/off combinations
+""" ;
+
+# Directory Builds #
+
+# Build from the "contracts" directory.
+rule dir-contracts ( name : defines * )
+{
+ test-suite $(name) :
+ [ dir-run contracts : assertion_complexity_factorial
+ : $(name) : $(defines) ]
+ [ dir-run contracts : assertion_requirements_push_back
+ : $(name) : $(defines) ]
+ [ dir-run contracts : assertion_statement_ialloc
+ : $(name) : $(defines) ]
+ [ dir-run contracts : blockinv_loopvar_gcd : $(name) : $(defines) ]
+ [ dir-run contracts : body_natural : $(name) : $(defines) ]
+ [ dir-run contracts : broken_handler_sqrt : $(name) : $(defines) ]
+ [ dir-run contracts : class_ivector : $(name) : $(defines) ]
+ [ dir-run contracts : class_template_vector : $(name) : $(defines) ]
+ [ dir-run contracts : class_template_vector_seq
+ : $(name) : $(defines) ]
+ [ dir-run contracts : class_template_vector_seq_nova
+ : $(name) : $(defines) ]
+ [ dir-run contracts : const_assertion_number : $(name) : $(defines) ]
+ [ dir-run contracts : contract_failure : $(name) : $(defines) ]
+ [ dir-err contracts : const_assertion_number_global_error
+ : $(name) : $(defines) ]
+ [ dir-err contracts : const_assertion_number_static_error
+ : $(name) : $(defines) ]
+ [ dir-run contracts : const_select_assertion_factorial
+ : $(name) : $(defines) ]
+ [ dir-err contracts : const_select_assertion_factorial_error
+ : $(name) : $(defines) ]
+ [ dir-run contracts : copy_inc : $(name) : $(defines) ]
+ [ dir-run contracts : default_subcontracting_base
+ : $(name) : $(defines) ]
+ [ dir-run contracts : exception_array : $(name) : $(defines) ]
+ [ dir-run contracts : friend_counter : $(name) : $(defines) ]
+ [ dir-run contracts : function_template_postinc : $(name) : $(defines) ]
+ [ dir-run contracts : has_oldof_inc : $(name) : $(defines) ]
+ [ dir-run contracts : macro_commas_symbols_integral_map
+ : $(name) : $(defines) ]
+ [ dir-run contracts : macro_commas_symbols_integral_map_seq
+ : $(name) : $(defines) ]
+ [ dir-run contracts : macro_commas_symbols_integral_map_seq_nova
+ : $(name) : $(defines) ]
+ [ dir-run contracts : member_operator_string : $(name) : $(defines) ]
+ [ dir-run contracts : nested_class_bitset : $(name) : $(defines) ]
+ [ dir-run contracts : no_contract_ivector : $(name) : $(defines) ]
+ [ dir-run contracts : no_contract_postinc : $(name) : $(defines) ]
+ [ dir-run contracts : no_pre_post_postinc : $(name) : $(defines) ]
+ [ dir-run contracts : params_funcptr_array_apply
+ : $(name) : $(defines) ]
+ [ dir-run contracts : params_postinc : $(name) : $(defines) ]
+ [ dir-run contracts : post_also_postinc : $(name) : $(defines) ]
+ [ dir-run contracts : pre_only_postinc : $(name) : $(defines) ]
+ [ dir-run contracts : push_back : $(name) : $(defines) ]
+ [ dir-run contracts : select_assertion_factorial
+ : $(name) : $(defines) ]
+ [ dir-run contracts : static_assertion_memcopy : $(name) : $(defines) ]
+ [ dir-run contracts : static_contract_instance_counter
+ : $(name) : $(defines) ]
+ [ dir-run contracts : subcontract_identifiers : $(name) : $(defines) ]
+ [ dir-run contracts : subcontract_pre_natural_failure
+ : $(name) : $(defines) ]
+ [ dir-run contracts : template_params : $(name) : $(defines) ]
+ [ dir-run contracts : template_specializations_vector
+ : $(name) : $(defines) ]
+ [ dir-run contracts : typed_counter : $(name) : $(defines) ]
+ [ dir-run contracts : volatile_contract_shared_instance
+ : $(name) : $(defines) ]
+ ;
+}
+
+# Build from the "virtual_specifiers" directory.
+rule dir-virtual_specifiers ( name : defines * )
+{
+ test-suite $(name) :
+ [ dir-run virtual_specifiers : final_class : $(name) : $(defines) ]
+ [ dir-err virtual_specifiers : final_class_error
+ : $(name) : $(defines) ]
+ [ dir-run virtual_specifiers : final_member : $(name) : $(defines) ]
+ [ dir-err virtual_specifiers : final_member_error
+ : $(name) : $(defines) ]
+ [ dir-run virtual_specifiers : new_member : $(name) : $(defines) ]
+ [ dir-err virtual_specifiers : new_member_error : $(name) : $(defines) ]
+ [ dir-run virtual_specifiers : override_member
+ : $(name) : $(defines) ]
+ [ dir-err virtual_specifiers : override_member_error
+ : $(name) : $(defines) ]
+ ;
+}
+
+# Build from the "concepts" directory.
+rule dir-concepts ( name : defines * )
+{
+ test-suite $(name) :
+ [ dir-run concepts : class_member_concept_vector
+ : $(name) : $(defines) ]
+ [ dir-err concepts : class_member_concept_vector_error
+ : $(name) : $(defines) ]
+ [ dir-err concepts : class_member_concept_vector_constructor_error
+ : $(name) : $(defines) ]
+ [ dir-err concepts : class_member_concept_vector_member_error
+ : $(name) : $(defines) ]
+ [ dir-run concepts : free_concept_operator_preinc
+ : $(name) : $(defines) ]
+ [ dir-err concepts : free_concept_operator_preinc_error
+ : $(name) : $(defines) ]
+ ;
+}
+
+# Build from the "named_parameters" directory.
+rule dir-named_parameters ( name : defines * )
+{
+ test-suite $(name) :
+ [ dir-run named_parameters : constructor_named_params_family
+ : $(name) : $(defines) ]
+ [ dir-run named_parameters : member_named_params_callable2
+ : $(name) : $(defines) ]
+ [ dir-run named_parameters : named_param_identifiers_failure
+ : $(name) : $(defines) ]
+ [ dir-run named_parameters : named_param_identifiers_positive
+ : $(name) : $(defines) ]
+ [ dir-run named_parameters : named_params_dfs
+ : $(name) : $(defines) ]
+ [ dir-pymodule named_parameters : deduced_params_pydef
+ : $(name) : $(defines) ]
+ [ dir-pymodule named_parameters : named_template_params_pyclass
+ : $(name) : $(defines) ]
+ ;
+}
+
+# Build from the "n1962" directory.
+rule dir-n1962 ( name : defines * )
+{
+ test-suite $(name) :
+ [ dir-run n1962 : block_invariant : $(name) : $(defines) ]
+ [ dir-run n1962 : circle : $(name) : $(defines) ]
+ [ run n1962/equal_main.cpp : : : $(defines) : $(name)_equal ]
+ [ dir-run n1962 : factorial : $(name) : $(defines) ]
+ [ dir-run n1962 : sqrt : $(name) : $(defines) ]
+ [ run n1962/sum.cpp n1962/sum_main.cpp : : : $(defines) : $(name)_sum ]
+ [ dir-run n1962 : vector : $(name) : $(defines) ]
+ ;
+}
+
+# Build from the "n2081" directory.
+rule dir-n2081 ( name : defines * )
+{
+ test-suite $(name) :
+ [ dir-run n2081 : add : $(name) : $(defines) ]
+ [ dir-err n2081 : add_error : $(name) : $(defines) ]
+ [ dir-run n2081 : advance : $(name) : $(defines) ]
+ [ dir-run n2081 : apply : $(name) : $(defines) ]
+ [ dir-run n2081 : convert : $(name) : $(defines) ]
+ [ dir-err n2081 : convert_error : $(name) : $(defines) ]
+ [ dir-run n2081 : count : $(name) : $(defines) ]
+ [ dir-run n2081 : deref : $(name) : $(defines) ]
+ [ dir-run n2081 : equal : $(name) : $(defines) ]
+ [ dir-err n2081 : equal_error : $(name) : $(defines) ]
+ [ dir-run n2081 : find : $(name) : $(defines) ]
+ [ dir-err n2081 : find_error : $(name) : $(defines) ]
+ [ dir-run n2081 : for_each : $(name) : $(defines) ]
+ [ dir-run n2081 : less_eq : $(name) : $(defines) ]
+ [ dir-run n2081 : min : $(name) : $(defines) ]
+ [ dir-err n2081 : min_error : $(name) : $(defines) ]
+ [ dir-run n2081 : transform : $(name) : $(defines) ]
+ ;
+}
+
+# Build from the "meyer97" directory.
+rule dir-meyer97 ( name : defines * )
+{
+ test-suite $(name) :
+ [ dir-run meyer97 : gcd : $(name) : $(defines) ]
+ [ dir-run meyer97 : maxarray : $(name) : $(defines) ]
+ [ dir-run meyer97 : stack3 : $(name) : $(defines) ]
+ [ run meyer97/stack4_main.cpp : : : $(defines) : $(name)_stack4 ]
+ ;
+}
+
+# Build from the "mitchell02" directory.
+rule dir-mitchell02 ( name : defines * )
+{
+ test-suite $(name) :
+ [ run mitchell02/counter_main.cpp : : : $(defines) : $(name)_counter ]
+ [ run mitchell02/courier_main.cpp mitchell02/courier.cpp : :
+ : $(defines) : $(name)_courier ]
+ [ run mitchell02/customer_manager_main.cpp
+ mitchell02/customer_manager.cpp : : : $(defines)
+ : $(name)_customer_manager ]
+ [ dir-run mitchell02 : dictionary : $(name) : $(defines) ]
+ [ run mitchell02/name_list_main.cpp mitchell02/name_list.cpp : :
+ : $(defines) : $(name)_name_list ]
+ [ run mitchell02/observer_main.cpp : : : $(defines) : $(name)_observer ]
+ [ dir-run mitchell02 : simple_queue : $(name) : $(defines) ]
+ [ dir-run mitchell02 : stack : $(name) : $(defines) ]
+ ;
+}
+
+# Build from the "stroustrup97" directory.
+rule dir-stroustrup97 ( name : defines * )
+{
+ test-suite $(name) :
+ [ run stroustrup97/string_main.cpp stroustrup97/string.cpp : :
+ : $(defines) : $(name)_string ]
+ ;
+}
+
+# Build from the "cline90" directory.
+rule dir-cline90 ( name : defines * )
+{
+ test-suite $(name) :
+ [ dir-run cline90 : calendar : $(name) : $(defines) ]
+ [ dir-run cline90 : stack : $(name) : $(defines) ]
+ [ run cline90/vector_main.cpp : : : $(defines) : $(name)_vector ]
+ [ dir-run cline90 : vstack : $(name) : $(defines) ]
+ ;
+}
+
+# Convenience Rules #
+
+# Compile a file in a directory and run it.
+rule dir-run ( dir : cppfile : name : defines * )
+{
+ run $(dir)/$(cppfile).cpp : : : $(defines) : $(name)_$(cppfile) ;
+}
+
+# Check compiler-error for a file in a directory.
+rule dir-err ( dir : cppfile : name : defines * )
+{
+ compile-fail $(dir)/$(cppfile).cpp : $(defines) : $(name)_$(cppfile) ;
+}
+
+type.register UNIT_TEST_RAW : UNIT_TEST ;
+generators.register-standard testing.unit-test : : UNIT_TEST_RAW ;
+if ! [ python.configured ]
+{
+ exit "error: python is not configured" ;
+}
+
+# Use Python script to run a test.
+rule py-test ( name : pyscript : commandline )
+{
+ # Unfortunately, unit-test does not stop compilation when `-q` is used but
+ # it will signal the failure and build again the test in next runs.
+ unit-test-raw $(name) : $(pyscript) :
+ <testing.launcher>"python "$(pyscript)" "$(commandline) ;
+ always $(name) ;
+}
+
+# Assume Boost.Python cppfile defines module named `$(name)_$(cppfile)_module`.
+# Assume Python test script to run is named "$(cppfile).py".
+rule dir-pymodule ( dir : cppfile : name : defines * )
+{
+ python-extension $(name)_$(cppfile)_module :
+ # Need this complex file name because file name is always target of
+ # this rule so it must be unique across all on/off combinations.
+ $(dir)/$(cppfile)_module/$(name)_$(cppfile)_module.cpp :
+ <library>/boost/python//boost_python
+ <library>/boost/regex//boost_regex
+ <link>shared:<define>BOOST_REGEX_DYN_LINK=1
+ $(defines)
+ ;
+ install $(name)_$(cppfile)_install1 :
+ $(name)_$(cppfile)_module :
+ <install-dependencies>on
+ <install-type>SHARED_LIB
+ <install-type>PYTHON_EXTENSION
+ <location>$(dir)
+ ;
+ install $(name)_$(cppfile)_install2 :
+ $(name)_$(cppfile)_module :
+ <install-dependencies>on
+ <install-type>SHARED_LIB
+ <install-type>PYTHON_EXTENSION
+ <location>.
+ ;
+ # On Linux, need to install on both `$(dir)` and `.`.
+ alias $(name)_$(cppfile)_install :
+ $(name)_$(cppfile)_install1 $(name)_$(cppfile)_install2 ;
+ py-test $(name)_$(cppfile)_run
+ : $(dir)/$(cppfile).py
+ : $(name)_$(cppfile)_module
+ ;
+ alias $(name)_$(cppfile) :
+ $(name)_$(cppfile)_install
+ $(name)_$(cppfile)_run
+ ;
+}
+
+# Build all files with all sensible combinations of contract-off config macros.
+rule config-combinations ( name )
+{
+ # Pre, post, and class-inv are combined with each other but not with
+ # block-inv and loop-var (unless for all off) because they do not influence
+ # each other and in the interest to limit the target combinations.
+ # All on.
+ dir-$(name) $(name) ;
+ # 1 off.
+ dir-$(name) noe_$(name) :
+ <define>CONTRACT_CONFIG_NO_PRECONDITIONS
+ ;
+ dir-$(name) noo_$(name) :
+ <define>CONTRACT_CONFIG_NO_POSTCONDITIONS
+ ;
+ dir-$(name) noi_$(name) :
+ <define>CONTRACT_CONFIG_NO_CLASS_INVARIANTS
+ ;
+ dir-$(name) nob_$(name) :
+ <define>CONTRACT_CONFIG_NO_BLOCK_INVARIANTS
+ ;
+ dir-$(name) nol_$(name) :
+ <define>CONTRACT_CONFIG_NO_LOOP_VARIANTS
+ ;
+ # 2 off.
+ dir-$(name) noeo_$(name) :
+ <define>CONTRACT_CONFIG_NO_PRECONDITIONS
+ <define>CONTRACT_CONFIG_NO_POSTCONDITIONS
+ ;
+ dir-$(name) noei_$(name) :
+ <define>CONTRACT_CONFIG_NO_PRECONDITIONS
+ <define>CONTRACT_CONFIG_NO_CLASS_INVARIANTS
+ ;
+ dir-$(name) nooi_$(name) :
+ <define>CONTRACT_CONFIG_NO_POSTCONDITIONS
+ <define>CONTRACT_CONFIG_NO_CLASS_INVARIANTS
+ ;
+ dir-$(name) nobl_$(name) :
+ <define>CONTRACT_CONFIG_NO_BLOCK_INVARIANTS
+ <define>CONTRACT_CONFIG_NO_LOOP_VARIANTS
+ ;
+ # 3 off.
+ dir-$(name) noeoi_$(name) :
+ <define>CONTRACT_CONFIG_NO_PRECONDITIONS
+ <define>CONTRACT_CONFIG_NO_POSTCONDITIONS
+ <define>CONTRACT_CONFIG_NO_CLASS_INVARIANTS
+ ;
+ # All off.
+ dir-$(name) noeoibl_$(name) :
+ <define>CONTRACT_CONFIG_NO_PRECONDITIONS
+ <define>CONTRACT_CONFIG_NO_POSTCONDITIONS
+ <define>CONTRACT_CONFIG_NO_CLASS_INVARIANTS
+ <define>CONTRACT_CONFIG_NO_BLOCK_INVARIANTS
+ <define>CONTRACT_CONFIG_NO_LOOP_VARIANTS
+ ;
+ # Target for all contract on/off combinations for a given directory.
+ alias $(name)_onoff : $(name) noe_$(name) noo_$(name) noi_$(name)
+ nob_$(name) nol_$(name) noeo_$(name) noei_$(name) nooi_$(name)
+ nobl_$(name) noeoi_$(name) noeoibl_$(name) ;
+}
+
+# Target Definitions #
+
+# Define targets for all directories and all contract on/off combinations.
+config-combinations contracts ;
+config-combinations virtual_specifiers ;
+config-combinations concepts ;
+config-combinations named_parameters ;
+config-combinations n1962 ;
+config-combinations n2081 ;
+config-combinations meyer97 ;
+config-combinations mitchell02 ;
+config-combinations stroustrup97 ;
+config-combinations cline90 ;
+alias all_on : contracts virtual_specifiers concepts named_parameters n1962
+ n2081 meyer97 mitchell02 stroustrup97 cline90 ;
+alias all_off : noeoibl_contracts noeoibl_virtual_specifiers noeoibl_concepts
+ noeoibl_named_parameters noeoibl_n1962 noeoibl_n2081 noeoibl_meyer97
+ noeoibl_mitchell02 noeoibl_stroustrup97 noeoibl_cline90 ;
+
Added: sandbox/contract/example/cline90/calendar.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/cline90/calendar.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,74 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[cline90_calendar
+// File: calendar.cpp
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+CONTRACT_CLASS(
+ class (calendar)
+) {
+ CONTRACT_CLASS_INVARIANT(
+ month() >= 1,
+ month() <= 12,
+ date() >= 1,
+ date() <= days_in(month())
+ )
+
+ CONTRACT_CONSTRUCTOR(
+ public (calendar) ( void )
+ postcondition( month() == 1, date() == 31 )
+ initialize( month_(1), date_(31) )
+ ) {}
+
+ CONTRACT_DESTRUCTOR(
+ public virtual (~calendar) ( void )
+ ) {}
+
+ CONTRACT_FUNCTION(
+ public int (month) ( void ) const
+ ) {
+ return month_;
+ }
+
+ CONTRACT_FUNCTION(
+ public int (date) ( void ) const
+ ) {
+ return date_;
+ }
+
+ CONTRACT_FUNCTION(
+ public void (reset) ( int new_month )
+ precondition( new_month >= 1, new_month <= 12 )
+ postcondition( month() == new_month )
+ ) {
+ month_ = new_month;
+ }
+
+ CONTRACT_FUNCTION(
+ private static int (days_in) ( int month )
+ precondition( month >= 1, month <= 12 )
+ postcondition( auto result = return, result >= 1, result <= 31 )
+ ) {
+ return 31; // For simplicity, assume all months have 31 days.
+ }
+
+ private: int month_, date_;
+};
+
+int main ( void )
+{
+ calendar c;
+ BOOST_TEST(c.date() == 31);
+ BOOST_TEST(c.month() == 1);
+ c.reset(8); // Set month to August.
+ BOOST_TEST(c.month() == 8);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/cline90/stack.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/cline90/stack.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,139 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[cline90_stack
+// File: stack.cpp
+#include <contract.hpp>
+#include <boost/config.hpp>
+#include <boost/utility/identity_type.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <exception>
+#include <new>
+#include <utility>
+#include <iostream>
+
+CONTRACT_CLASS(
+ template( typename T )
+ class (stack)
+) {
+ // NOTE: Incomplete set of assertions addressing only `empty` and `full`.
+
+ CONTRACT_CLASS_INVARIANT( void )
+
+ public: struct out_of_memory {};
+ public: struct error {};
+
+ CONTRACT_CONSTRUCTOR_TPL(
+ public explicit (stack) ( int capacity )
+ precondition( capacity >= 0 )
+ postcondition(
+ empty(),
+ full() == (capacity == 0)
+ )
+ // Function-Try blocks are programmed within the macros only for
+ // constructors with member initializers otherwise they are
+ // programmed with the body definition and outside the macros.
+ try initialize( // Try-block for constructor initializers and body.
+ data_(new T[capacity]),
+ capacity_(capacity),
+ size_(0)
+ ) catch(std::bad_alloc& e) (
+ std::cerr << "out of memory for " << capacity << "-stack: " <<
+ e.what() << std::endl;
+ throw out_of_memory();
+ // Unfortunately, cannot wrap exception type commas with extra
+ // parenthesis (because symbol `...` used to catch-all) but
+ // `BOOST_IDENTITY_TYPE` can be used.
+ ) catch(BOOST_IDENTITY_TYPE((std::pair<int, char const*>&)) e) (
+ std::cerr << "error number " << e.first << " for " <<
+ capacity << "-stack: " << e.second << std::endl;
+ throw error();
+ ) catch(...) (
+ std::cerr << "unknown error for " << capacity << "-stack" <<
+ std::endl;
+ throw; // Re-throw exception.
+ )
+ ) {
+ for(int i = 0; i < capacity_; ++i) data_[i] = T();
+ }
+
+ CONTRACT_DESTRUCTOR_TPL(
+ public virtual (~stack) ( void )
+ )
+#if !defined(BOOST_MSVC) // MSVC supports only constructor-try blocks.
+ try { // Function-try block (outside the macro).
+ delete[] data_;
+ } catch(...) {
+ std::cerr << "error for stack destruction, terminating" << std::endl;
+ std::terminate(); // Destructor should never throw.
+ }
+#else // MSVC
+ {
+ delete[] data_;
+ }
+#endif // MSVC
+
+ CONTRACT_FUNCTION_TPL(
+ public bool (empty) ( void ) const
+ ) {
+ return size_ == 0;
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public bool (full) ( void ) const
+ ) {
+ return size_ == capacity_;
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public void (push) ( (T) value )
+#if !defined(BOOST_MSVC) // MSVC only supports throw( void ) exception spec.
+ throw( std::exception, error ) // Ex spec.
+#endif // MSVC
+ precondition( not full() )
+ postcondition( not empty() )
+ )
+#if !defined(BOOST_MSVC) // MSVC supports only constructor-try blocks.
+ try
+#endif // MSVC
+ { // Function-Try block (outside the macro).
+ data_[size_++] = value;
+ }
+#if !defined(BOOST_MSVC) // MSVC supports only constructor-try blocks.
+ catch(std::exception& e) {
+ std::cerr << "error for " << capacity_ << "-stack: " << e.what() <<
+ std::endl;
+ throw; // Re-throw STL exception.
+ } catch(...) {
+ std::cerr << "unknown error for " << capacity_ << "-stack" <<
+ std::endl;
+ throw error();
+ }
+#endif // MSVC
+
+ CONTRACT_FUNCTION_TPL(
+ public (T) (pop) ( void )
+ precondition( not empty() )
+ postcondition( not full() )
+ ) {
+ return data_[--size_];
+ }
+
+ private: T* data_;
+ private: int capacity_;
+ private: int size_;
+};
+
+int main ( void )
+{
+ stack<int> s(3);
+ s.push(123);
+ BOOST_TEST(s.pop() == 123);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/cline90/vector.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/cline90/vector.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,73 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[cline90_vector_header
+// File: vector.hpp
+#ifndef VECTOR_HPP_
+#define VECTOR_HPP_
+
+#include <contract.hpp>
+
+CONTRACT_CLASS(
+ template( typename T )
+ class (vector)
+) {
+ // NOTE: Incomplete set of assertions addressing only `size`.
+
+ CONTRACT_CLASS_INVARIANT_TPL( size() >= 0 )
+
+ CONTRACT_CONSTRUCTOR_TPL(
+ public explicit (vector) ( int count, default 10 )
+ precondition( count >= 0 )
+ postcondition( size() == count )
+ initialize( data_(new T[count]), size_(count) )
+ ) {
+ for(int i = 0; i < size_; ++i) data_[i] = T();
+ }
+
+ CONTRACT_DESTRUCTOR_TPL(
+ public virtual (~vector) ( void )
+ ) {
+ delete[] data_;
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public int (size) ( void ) const
+ // postcondition: Result non-negative checked by class invariant
+ ) {
+ return size_;
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public void (resize) ( int count )
+ precondition( count >= 0 )
+ postcondition( size() == count )
+ ) {
+ T* slice = new T[count];
+ for(int i = 0; i < count && i < size_; ++i) slice[i] = data_[i];
+ delete[] data_;
+ data_ = slice;
+ size_ = count;
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public (T&) operator([])(at) ( int index )
+ precondition(
+ index >= 0,
+ index < size()
+ )
+ ) {
+ return data_[index];
+ }
+
+ private: T* data_;
+ private: int size_;
+};
+
+#endif // #include guard
+//]
+
Added: sandbox/contract/example/cline90/vector_app.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/cline90/vector_app.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,73 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[cline90_vector_app_header
+// File: vector_app.hpp
+// Extra spaces, newlines, etc used to align text with this library code.
+
+
+
+
+
+template< typename T>
+class vector
+{
+ legal: size() >= 0; // Class invariants (legal).
+
+ public: explicit vector ( int count = 10 )
+ : data_(new T[count]), size_(count)
+ {
+ for(int i = 0; i < size_; ++i) data_[i] = T();
+ }
+
+ public: virtual ~vector ( void )
+ {
+ delete[] data_;
+ }
+
+ public: int size ( void ) const
+ {
+ return size_;
+ }
+
+ public: void resize ( int count )
+ {
+ T* slice = new T[count];
+ for(int i = 0; i < count && i < size_; ++i) slice[i] = data_[i];
+ delete[] data_;
+ data_ = slice;
+ size_ = count;
+ }
+
+ public: T& operator[] ( int index )
+ {
+ return data_[index];
+ }
+
+ // Preconditions (require) and postconditions (promise) for each function.
+ axioms: [ int count; require count >= 0; promise size() == count ]
+ vector(count);
+ axioms: [ int count; require count >= 0; promise size() == count ]
+ resize(count);
+ axioms: [ int index; require index >= 0 && index < size() ]
+ (*this)[x];
+
+ private: T* data_;
+ private: int size_;
+};
+
+
+
+
+
+
+
+
+
+
+//]
+
Added: sandbox/contract/example/cline90/vector_main.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/cline90/vector_main.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,24 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[cline90_vector_main
+// File: vector_main.cpp
+#include "vector.hpp"
+#include <boost/detail/lightweight_test.hpp>
+
+int main ( void )
+{
+ vector<int> v(3); // Also set all elements to 0.0.
+ BOOST_TEST(v.size() == 3);
+ v[0] = 123;
+ v.resize(2);
+ BOOST_TEST(v[0] == 123);
+ BOOST_TEST(v.size() == 2);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/cline90/vstack.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/cline90/vstack.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,144 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[cline90_vstack
+// File: vstack.cpp
+#include "vector.hpp"
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+CONTRACT_CLASS( // Stack Abstract Data Type (ADT).
+ template( typename T )
+ class (stack_adt)
+) {
+ // NOTE: Incomplete set of assertions addressing only empty/full issues.
+
+ CONTRACT_CLASS_INVARIANT_TPL( void ) // no invariants
+
+ CONTRACT_CONSTRUCTOR_TPL(
+ public (stack_adt) ( void )
+ // postcondition:
+ // empty (cannot be checked because empty's postcondition uses
+ // length which is pure virtual during construction)
+ ) {}
+
+ CONTRACT_DESTRUCTOR_TPL(
+ public (~stack_adt) ( void )
+ ) {}
+
+ CONTRACT_FUNCTION_TPL(
+ public bool (full) ( void ) const
+ postcondition(
+ auto result = return,
+ result == (length() == capacity())
+ )
+ ) {
+ return length() == capacity();
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public bool (empty) ( void ) const
+ postcondition( auto result = return, result == (length() == 0) )
+ ) {
+ return length() == 0;
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public virtual int (length) ( void ) const
+ postcondition( auto result = return, result >= 0 )
+ ) = 0;
+
+ CONTRACT_FUNCTION_TPL(
+ public virtual int (capacity) ( void ) const
+ postcondition( auto result = return, result >= 0 )
+ ) = 0;
+
+ CONTRACT_FUNCTION_TPL(
+ public virtual void (push) ( (T) value )
+ precondition( not full() )
+ postcondition( not empty() )
+ ) = 0; // Contract for pure virtual function.
+
+ CONTRACT_FUNCTION_TPL(
+ public virtual (T) (pop) ( void )
+ precondition( not empty() )
+ postcondition( not full() )
+ ) = 0;
+
+ CONTRACT_FUNCTION_TPL(
+ public virtual void (clear) ( void )
+ postcondition( empty() )
+ ) = 0;
+};
+
+CONTRACT_CLASS( // Vector-based stack.
+ template( typename T )
+ class (vstack) extends( public stack_adt<T> )
+) {
+ CONTRACT_CLASS_INVARIANT_TPL(
+ length() >= 0,
+ length() < capacity()
+ )
+
+ CONTRACT_CONSTRUCTOR_TPL(
+ public explicit (vstack) ( int count, default 10 )
+ precondition( count >= 0 )
+ postcondition( length() == 0, capacity() == count )
+ initialize( vect_(count), length_(0) ) // OK, after preconditions.
+ ) {}
+
+ CONTRACT_DESTRUCTOR_TPL(
+ public virtual (~vstack) ( void )
+ ) {}
+
+ // NOTE: All following inherit contracts from `stack_adt`.
+
+ CONTRACT_FUNCTION_TPL(
+ public int (length) ( void ) const override final
+ ) {
+ return length_;
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public int (capacity) ( void ) const
+ ) {
+ return vect_.size();
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public void (push) ( (T) value ) override final
+ ) {
+ vect_[length_++] = value;
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public (T) (pop) ( void ) override final
+ ) {
+ return vect_[--length_];
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public void (clear) ( void ) override final
+ ) {
+ length_ = 0;
+ }
+
+ private: vector<T> vect_;
+ private: int length_;
+};
+
+int main ( void )
+{
+ vstack<int> s(3);
+ BOOST_TEST(s.capacity() == 3);
+ s.push(123);
+ BOOST_TEST(s.length() == 1);
+ BOOST_TEST(s.pop() == 123);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/concepts/class_member_concept_vector.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/concepts/class_member_concept_vector.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,25 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include "class_member_concept_vector.hpp"
+#include <boost/detail/lightweight_test.hpp>
+
+int main ( void )
+{
+ std::vector<int> v;
+ v.push_back(123);
+ v.push_back(456);
+ vector<int> w(v.begin(), v.end());
+ vector<int>::iterator i = w.begin();
+ w.insert(i, w.begin(), w.end());
+ BOOST_TEST(w[0] == 123);
+ BOOST_TEST(w[1] == 456);
+ BOOST_TEST(w[2] == 123);
+ BOOST_TEST(w[3] == 456);
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/concepts/class_member_concept_vector.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/concepts/class_member_concept_vector.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,79 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CLASS_MEMBER_CONCEPT_VECTOR_HPP_
+#define CLASS_MEMBER_CONCEPT_VECTOR_HPP_
+
+#include <contract.hpp>
+#include <vector>
+
+//[class_member_concept_vector_class
+#include <boost/concept_check.hpp> // Boost.ConceptCheck predefined concepts.
+
+CONTRACT_CLASS(
+ template( typename T )
+ requires( boost::CopyConstructible<T> ) // Check concepts.
+ class (vector)
+) {
+ CONTRACT_CLASS_INVARIANT_TPL(
+ size() <= capacity(),
+ capacity() <= max_size()
+ )
+
+ // ...
+//]
+
+ public: typedef typename std::vector<T>::size_type size_type;
+ public: typedef typename std::vector<T>::iterator iterator;
+ public: typedef typename std::vector<T>::const_reference const_reference;
+
+ //[class_member_concept_vector_constructor
+ CONTRACT_CONSTRUCTOR_TPL(
+ public template( class Iterator )
+ requires( boost::InputIterator<Iterator> ) // Check concepts.
+ (vector) ( (Iterator) first, (Iterator) last )
+ postcondition( std::distance(first, last) == int(size()) )
+ initialize( vector_(first, last) )
+ ) {}
+ //]
+
+ CONTRACT_DESTRUCTOR_TPL(
+ public (~vector) ( void )
+ ) {}
+
+ //[class_member_concept_vector_member
+ CONTRACT_FUNCTION_TPL(
+ public template( class Iterator )
+ requires( boost::InputIterator<Iterator> ) // Check concepts.
+ void (insert) ( (Iterator) where, (Iterator) first, (Iterator) last )
+ precondition( size() + std::distance(first, last) < max_size() )
+ postcondition(
+ auto old_increased_size = CONTRACT_OLDOF
+ size() + std::distance(first, last),
+ auto old_capacity = CONTRACT_OLDOF capacity(),
+ size() == old_increased_size,
+ capacity() >= old_capacity
+ )
+ ) {
+ vector_.insert(where, first, last);
+ }
+ //]
+
+ public: size_type size ( void ) const { return vector_.size(); }
+ public: size_type max_size ( void ) const { return vector_.max_size(); }
+ public: size_type capacity ( void ) const { return vector_.capacity(); }
+ public: iterator begin ( void ) { return vector_.begin(); }
+ public: iterator end ( void ) { return vector_.end(); }
+ public: const_reference operator[] ( size_type index ) const
+ { return vector_[index]; }
+
+ private: std::vector<T> vector_;
+};
+//]
+
+#endif // #include guard
+
Added: sandbox/contract/example/concepts/class_member_concept_vector_constructor_error.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/concepts/class_member_concept_vector_constructor_error.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,20 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include "class_member_concept_vector.hpp"
+#include <boost/utility.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+struct x {};
+
+int main ( void )
+{
+ x begin, end;
+ vector<int> v(begin, end); // Correctly error: `x` is not `InputIterator`.
+ return 0;
+}
+
Added: sandbox/contract/example/concepts/class_member_concept_vector_error.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/concepts/class_member_concept_vector_error.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,24 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include "class_member_concept_vector.hpp"
+#include <boost/utility.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+struct x : boost::noncopyable
+{
+ x ( int const& ) {}
+};
+
+int main ( void )
+{
+ std::vector<int> v;
+ // Correctly error: `x` is not `CopyConstructible`.
+ vector<x> w(v.begin(), v.end());
+ return 0;
+}
+
Added: sandbox/contract/example/concepts/class_member_concept_vector_member_error.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/concepts/class_member_concept_vector_member_error.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,22 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include "class_member_concept_vector.hpp"
+#include <boost/utility.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+struct x {};
+
+int main ( void )
+{
+ std::vector<int> v;
+ vector<int> w(v.begin(), v.end());
+ x where, begin, end;
+ w.insert(where, begin, end); // Correctly error: `x` is not `InputIterator`.
+ return 0;
+}
+
Added: sandbox/contract/example/concepts/concept_def.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/concepts/concept_def.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,184 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[concept_def
+CONTRACT_CONCEPT(
+ concept (ArithmeticLike) ( typename T )
+ extends(
+ Regular<T>,
+ LessThanComparable<T>,
+ HasUnaryPlus<T>,
+ HasNegate<T>,
+ (HasPlus<T, T>),
+ (HasMinus<T, T>)
+ // ...
+ )
+ (
+ explicit constructor(T, T) ( intmax_t),
+ explicit constructor(T, T) ( uintmax_t ),
+ explicit constructor(T, T) ( long double ),
+
+ requires (Convertible<typename HasUnaryPlus<T>::result_type, T>)
+ // ...
+ )
+)
+
+CONTRACT_CONCEPT(
+ auto concept (HasFind) ( typename T )
+ (
+ typename key_type, as typename T::key_type,
+ typename mapped_type,
+
+ (std::pair<key_type, mapped_type>) (find) ( T const&, key_type const& )
+ )
+)
+
+CONTRACT_CONCEPT(
+ auto concept (HasDereference) ( typename T )
+ (
+ typename result_type,
+
+ (result_type) operator(*)(deref) ( T& ),
+ (result_type) operator(*)(deref) ( T&& )
+ )
+)
+
+CONTRACT_CONCEPT(
+ auto concept (IdentityOf) ( typename T )
+ (
+ typename type, as T,
+ requires (SameType<type, T>)
+ )
+)
+
+CONTRACT_CONCEPT(
+ auto concept (MemberFunctionRequirements) ( typename T )
+ (
+ constructor(T, T) ( int a, float b ),
+ destructor(T, ~T) ( void ),
+ void member(T, f) ( void ) const
+ )
+)
+
+CONTRACT_CONCEPT(
+ auto concept (HasEqualTo) ( typename T, typename U )
+ (
+ bool operator(==)(equal) ( T const&, U const& )
+ )
+)
+
+CONTRACT_CONCEPT(
+ auto concept (ExplicitlyConvertible) ( typename T, typename U )
+ (
+ explicit operator(U)(U_type) ( T const& )
+ )
+)
+
+CONTRACT_CONCEPT(
+ auto concept (Convertible) ( typename T, typename U )
+ extends( (ExplicitlyConvetible<T, U>) )
+ (
+ operator(U)(U_type) ( T const& )
+ )
+)
+
+CONTRACT_CONCEPT(
+ concept (True) ( bool Value )
+ (
+ void // Empty concept definition.
+ )
+)
+
+CONTRACT_CONCEPT(
+ concept_map (True) ( true )
+ (
+ void // Empty concept definition.
+ )
+)
+
+CONTRACT_CONCEPT(
+ auto concept (IsEven) ( intmax_t Value )
+ (
+ requires True<V % 2 == 0>
+ )
+)
+
+CONTRACT_CONCEPT(
+ auto concept (CopyConstructible) ( typename T )
+ extends( MoveConstructible<T>, (Constructible<T, T const&>) )
+ (
+ axiom (CopyPreservation) ( (T) x )
+ (
+ T(x) == x;
+ )
+ )
+)
+
+CONTRACT_CONCEPT(
+ concept (Iterator) ( typename X ) extends( Semiregular<X> )
+ (
+ typename(MoveConstructible) reference, as typename X::reference,
+ typename(MoveConstructible) postinc_result,
+ requires HasDereference<postinc_result>,
+
+ (reference) operator(*)(deref) ( X& ),
+ (reference) operator(*)(deref) ( X&& ),
+ (X&) operator(++)(preinc) ( X& ),
+ (postinc_result) operator(++)(postinc) ( X&, int )
+ )
+)
+
+CONTRACT_CONCEPT(
+ concept (RandomAccessIterator) ( typename X )
+ extends( BidirectionalIterator<X>, LessThanComparable<X> )
+ (
+ typename(MoveConstructible) reference,
+ requires (Convertible<reference, value_type const&>),
+
+ (X&) operator(+=)(inc) ( X&, difference_type ),
+
+ (X) operator(+)(add) ( (X const&) x, (difference_type) n )
+ (
+ X y(x);
+ y += n;
+ return y;
+ ),
+
+ (X) operator(+)(add) ( (difference_type) n, (X const&) x )
+ (
+ X y(x);
+ y += n;
+ return y;
+ ),
+
+ (X) operator(-=)(dec) ( X&, difference_type ),
+
+ (X) operator(-)(sub) ( (X const&) x, (difference_type) n )
+ (
+ X y(x);
+ y -= n;
+ return y;
+ ),
+
+ (difference_type) operator(-)(sub) ( X const&, X const& ),
+
+ (reference) operator([])(at) ( X const&, difference_type )
+ )
+)
+
+CONTRACT_CONCEPT(
+ template( typename(ObjectType) T )
+ concept_map (RandomAccessIterator) ( T* )
+ (
+ typedef (T) value_type,
+ typedef ptrdiff_t difference_type,
+ typedef (T&) reference,
+ typedef (T*) pointer
+ )
+)
+//]
+
Added: sandbox/contract/example/concepts/concept_def_npaper.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/concepts/concept_def_npaper.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,184 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[concept_def_npaper
+// Extra spaces, newlines, etc used to align text with this library code.
+concept ArithmeticLike < typename T >
+ :
+ Regular<T>,
+ LessThanComparable<T>,
+ HasUnaryPlus<T>,
+ HasNegate<T>,
+ HasPlus<T, T>,
+ HasMinus<T, T>
+ // ...
+
+{
+ explicit T::T ( intmax_t ) ;
+ explicit T::T ( uintmax_t ) ;
+ explicit T::T ( long double ) ;
+
+ requires Convertible<typename HasUnaryPlus<T>::result_type, T> ;
+ // ...
+}
+
+
+
+auto concept HasFind < typename T >
+{
+ typename key_type = typename T::key_type ;
+ typename mapped_type ;
+
+ std::pair<key_type, mapped_type> find ( T const&, key_type const& ) ;
+}
+
+
+
+auto concept HasDereference < typename T >
+{
+ typename result_type ;
+
+ result_type operator* ( T& ) ;
+ result_type operator* ( T&& ) ;
+}
+
+
+
+auto concept IdentityOf < typename T >
+{
+ typename type = T ;
+ requires SameType<type, T> ;
+}
+
+
+
+auto concept MemberFunctionRequirements < typename T >
+{
+ T::T ( int a, float b ) ;
+ T::~T ( void ) ;
+ void T::f ( void ) const ;
+}
+
+
+
+auto concept HasEqualTo < typename T, typename U >
+{
+ bool operator== ( T const&, U const& ) ;
+}
+
+
+
+auto concept ExplicitlyConvertible < typename T, typename U >
+{
+ explicit operator U ( T const& ) ;
+}
+
+
+
+auto concept Convertible < typename T, typename U >
+ : ExplicitlyConvetible<T, U>
+{
+ operator U ( T const& ) ;
+}
+
+
+
+concept True < bool Value >
+{
+ // No operation.
+}
+
+
+
+concept_map True < true >
+{
+ // No operation.
+}
+
+
+
+auto concept IsEven < intmax_t Value >
+{
+ requires True<V % 2 == 0> ;
+}
+
+
+
+auto concept CopyConstructible < typename T >
+ : MoveConstructible<T>, Constructible<T, T const&>
+{
+ axiom CopyPreservation ( T x )
+ {
+ T(x) == x;
+ }
+}
+
+
+
+concept Iterator < typename X > : Semiregular<X>
+{
+ MoveConstructible reference = typename X::reference ;
+ MoveConstructible postinc_result ;
+ requires HasDereference<postinc_result> ;
+
+ reference operator* ( X& ) ;
+ reference operator* ( X&& ) ;
+ X& operator++ ( X& ) ;
+ postinc_result operator++ ( X&, int ) ;
+}
+
+
+
+concept RandomAccessIterator < typename X >
+ : BidirectionalIterator<X>, LessThanComparable<X>
+{
+ MoveConstructible reference ;
+ requires Convertible<reference, value_type const&> ;
+
+ X& operator+= ( X&, difference_type ) ;
+
+ X operator+ ( X const& x, difference_type n )
+ {
+ X y(x);
+ y += n;
+ return y;
+ }
+
+ X operator+ ( difference_type n, X const& x )
+ {
+ X y(x);
+ x += n;
+ return y;
+ }
+
+ X operator-= ( X&, difference_type ) ;
+
+ X operator- ( X const& x, difference_type n )
+ {
+ X y(x);
+ y -= n;
+ return y;
+ }
+
+ difference_type operator- ( X const&, X const& ) ;
+
+ reference operator[] ( X const&, difference_type ) ;
+}
+
+
+
+template< ObjectType T >
+concept_map RandomAccessIterator < T* >
+{
+ typedef T value_type ;
+ typedef ptrdiff_t difference_type ;
+ typedef T& reference ;
+ typedef T* pointer ;
+}
+
+//]
+
Added: sandbox/contract/example/concepts/free_concept_operator_preinc.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/concepts/free_concept_operator_preinc.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,30 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include "free_concept_operator_preinc.hpp"
+#include <boost/detail/lightweight_test.hpp>
+
+struct num
+{
+ explicit num ( int value ) : value_(value) {}
+
+ public: num operator+ ( num const& right ) const
+ { return num(value_ + right.value_); }
+ public: bool operator== ( num const& right ) const
+ { return value_ == right.value_; }
+
+ private: int value_;
+};
+
+int main ( void )
+{
+ num n(1), m(2);
+ ++n;
+ BOOST_TEST(n == m);
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/concepts/free_concept_operator_preinc.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/concepts/free_concept_operator_preinc.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,49 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef FREE_CONCEPT_OPERATOR_PREINC_HPP_
+#define FREE_CONCEPT_OPERATOR_PREINC_HPP_
+
+#include <contract.hpp>
+#include <boost/concept_check.hpp>
+#include <boost/type_traits/has_equal_to.hpp>
+
+//[free_concept_operator_preinc
+template< typename T >
+struct Addable // New concept defined and implemented using Boost.ConceptCheck.
+{
+ BOOST_CONCEPT_USAGE(Addable)
+ {
+ return_type(x + y);
+ }
+
+private:
+ void return_type ( T ) {}
+ static T const& x;
+ static T const& y;
+};
+
+CONTRACT_FUNCTION(
+ template( typename T )
+ requires(
+ boost::Assignable<T>, // Check both predefined and
+ Addable<T> // newly defined concepts.
+ )
+ (T&) operator(++)(preinc) ( (T&) value )
+ postcondition(
+ auto result = return,
+ auto old_value = CONTRACT_OLDOF value,
+ value == old_value + T(1), requires boost::has_equal_to<T>::value
+ result == value, requires boost::has_equal_to<T>::value
+ )
+) {
+ return value = value + T(1);
+}
+//]
+
+#endif // #include guard
+
Added: sandbox/contract/example/concepts/free_concept_operator_preinc_error.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/concepts/free_concept_operator_preinc_error.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,29 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include "free_concept_operator_preinc.hpp"
+#include <boost/detail/lightweight_test.hpp>
+
+struct num
+{
+ explicit num ( int value ) : value_(value) {}
+
+ // Intentionally missing `operator+`.
+ public: bool operator== ( num const& right ) const
+ { return value_ == right.value_; }
+
+ private: int value_;
+};
+
+int main ( void )
+{
+ num n(1), m(2);
+ ++n; // Correctly error, `num` not `Addable`.
+ BOOST_TEST(n == m);
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/assertion_complexity_factorial.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/assertion_complexity_factorial.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,47 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+//[assertion_complexity_factorial
+// Assertion requirements used to model assertion computational complexity.
+#define O_1 0 // O(1) constant (default).
+#define O_N 1 // O(n) linear.
+#define O_NN 2 // O(n * n) quadratic.
+#define O_NX 3 // O(n^x) polynomial.
+#define O_FACTN 4 // O(n!) factorial.
+#define O_EXPN 5 // O(e^n) exponential.
+#define O_ALL 10
+#define COMPLEXITY_MAX O_ALL
+
+CONTRACT_FUNCTION(
+ int (factorial) ( int n )
+ precondition( n >= 0 )
+ postcondition(
+ auto result = return,
+ result >= 1,
+ if(n < 2) (
+ result == 1
+ ) else (
+ // Assertion compiled and checked only if within complexity.
+ result == n * factorial(n - 1),
+ requires O_FACTN <= COMPLEXITY_MAX
+ )
+ )
+) {
+ if(n < 2) return 1;
+ else return n * factorial(n - 1);
+}
+//]
+
+int main ( void )
+{
+ BOOST_TEST(factorial(4) == 24);
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/assertion_requirements_push_back.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/assertion_requirements_push_back.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,77 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <vector>
+
+//[assertion_requirements_push_back
+#include <boost/type_traits/has_equal_to.hpp>
+
+CONTRACT_CLASS(
+ template( typename T )
+ class (vector)
+) {
+ CONTRACT_CLASS_INVARIANT_TPL(
+ size() <= capacity(),
+ capacity() <= max_size()
+ // ...
+ )
+
+ CONTRACT_FUNCTION_TPL(
+ public void (push_back) ( (T const&) value )
+ precondition( size() < max_size() )
+ postcondition(
+ auto old_size = CONTRACT_OLDOF size(),
+ auto old_capacity = CONTRACT_OLDOF capacity(),
+ size() == old_size + 1,
+ capacity() >= old_capacity,
+ // Requirements disable assertion if `T` has no `operator==`.
+ back() == value, requires boost::has_equal_to<T>::value
+ )
+ ) {
+ vector_.push_back(value);
+ }
+
+ // ...
+//]
+
+ public: typedef typename std::vector<T>::size_type size_type;
+ public: typedef typename std::vector<T>::const_reference const_reference;
+
+ public: size_type size ( void ) const { return vector_.size(); }
+ public: size_type max_size ( void ) const { return vector_.max_size(); }
+ public: size_type capacity ( void ) const { return vector_.capacity(); }
+ public: const_reference back ( void ) const { return vector_.back(); }
+
+ private: std::vector<T> vector_;
+};
+
+//[assertion_requirements_push_back_call
+struct num // Not equality comparable.
+{
+ int value;
+ explicit num ( int a_value ) : value(a_value) {}
+};
+
+int main ( void )
+{
+ vector<int> i;
+ i.push_back(123);
+
+ vector<num> n;
+ n.push_back(num(123));
+ BOOST_TEST(not boost::has_equal_to<num>::value);
+
+ // ...
+//]
+
+ BOOST_TEST(i.size() == 1);
+ BOOST_TEST(n.size() == 1);
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/assertion_statement_ialloc.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/assertion_statement_ialloc.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,42 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <memory>
+#include <cstdlib>
+
+//[assertion_statement_ialloc
+CONTRACT_FUNCTION(
+ template( typename T )
+ (T*) (ialloc) ( void )
+ precondition(
+ namespace mpl = boost::mpl, // Namespace aliasing.
+ using namespace std, // Using directive.
+ typedef typename allocator<T>::pointer ptr, // Type definition.
+ static_assert(
+ (mpl::or_<
+ mpl::bool_<sizeof(T) <= sizeof(int)>
+ , mpl::bool_<sizeof(ptr) <= sizeof(int*)>
+ >::value)
+ , "within max size"
+ )
+ )
+) {
+ return static_cast<T*>(malloc(sizeof(T)));
+}
+//]
+
+int main ( void )
+{
+ char* p = ialloc<char>();
+ BOOST_TEST(p);
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/blockinv_loopvar_gcd.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/blockinv_loopvar_gcd.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,51 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+//[blockinv_loopvar_gcd
+CONTRACT_FUNCTION(
+ template( typename T )
+ (T) (gcd) ( (T const&) a, (T const&) b )
+ precondition(
+ static_assert(boost::is_integral<T>::value, "integral type"),
+ a != 0,
+ b != 0
+ )
+ postcondition(
+ auto result = return,
+ result <= a,
+ result <= b
+ )
+) {
+ T x = a, y = b;
+ // Block invariant assert conditions within body,
+ CONTRACT_BLOCK_INVARIANT_TPL( const( x, a ) x == a, const( y, b ) y == b )
+
+ CONTRACT_LOOP( while(x != y) ) { // Define a loop with variants (below).
+ // Block invariant for loops (i.e., loop invariants).
+ CONTRACT_BLOCK_INVARIANT_TPL( const( x ) x > 0, const( y ) y > 0 )
+ // Loop variant checked to be non-negative and monotonically decreasing.
+ CONTRACT_LOOP_VARIANT_TPL( const( x, y ) std::max(x, y) )
+
+ if(x > y) x = x - y;
+ else y = y - x;
+ }
+
+ return x;
+}
+//]
+
+int main ( void )
+{
+ BOOST_TEST(gcd(12, 28) == 4);
+ BOOST_TEST(gcd(4, 14) == 2);
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/body_natural.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/body_natural.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,19 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <boost/detail/lightweight_test.hpp>
+#include "body_natural.hpp"
+
+int main ( void )
+{
+ natural<int> n, m(123);
+ BOOST_TEST(n.equal(natural<int>()));
+ BOOST_TEST(less(n, m));
+ BOOST_TEST(greater(m, n));
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/body_natural.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/body_natural.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,78 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef BODY_NATURAL_HPP_
+#define BODY_NATURAL_HPP_
+
+#include <contract.hpp>
+
+//[body_natural
+template< typename T, T Default = T() > // Class forward declaration.
+class natural ;
+
+template< typename T > // Function forward declaration.
+bool less ( natural<T> const& left, natural<T> const& right ) ;
+
+CONTRACT_FUNCTION(
+ template( typename T )
+ bool (greater) ( (natural<T> const&) left, (natural<T> const&) right )
+ postcondition(
+ auto result = return,
+ result ? not less(left, right) : true
+ )
+) ; // Deferred free function body definition, use `;`.
+
+CONTRACT_CLASS( // Class declaration (with contracts).
+ template( typename T, (T) Default )
+ class (natural)
+) {
+ CONTRACT_CLASS_INVARIANT_TPL( get() >= 0 )
+
+ CONTRACT_CONSTRUCTOR_TPL(
+ public explicit (natural) ( (T const&) value, default Default )
+ precondition( value >= 0 )
+ postcondition( get() == value )
+ // Unfortunately, no member initializers when body deferred.
+ ) ; // Deferred constructor body definition, use `;`.
+
+ CONTRACT_DESTRUCTOR_TPL(
+ public (~natural) ( void )
+ ) ; // Deferred destructor body definition, use `;`.
+
+ CONTRACT_FUNCTION_TPL(
+ public bool (equal) ( (natural const&) right ) const
+ postcondition(
+ auto result = return,
+ result == not less(*this, right) && not greater(*this, right)
+ )
+ ) ; // Deferred member function body definition, use `;`.
+
+ CONTRACT_FUNCTION_TPL(
+ public (T) (get) ( void ) const
+ ) {
+ return value_;
+ }
+
+ private: T value_;
+};
+
+CONTRACT_FUNCTION( // Function declaration (with contracts).
+ template( typename T )
+ bool (less) ( (natural<T> const&) left, (natural<T> const&) right )
+ postcondition(
+ auto result = return,
+ result ? not greater(left, right) : true
+ )
+) {
+ return left.get() < right.get();
+}
+//]
+
+#include "body_natural_impl.hpp"
+
+#endif // #include guard
+
Added: sandbox/contract/example/contracts/body_natural_impl.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/body_natural_impl.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,39 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include "body_natural.hpp"
+
+//[body_natural_impl
+// Deferred body definitions, separated from their declarations and contracts.
+
+template< typename T >
+bool CONTRACT_FREE_BODY(greater) (
+ natural<T> const& left, natural<T> const& right )
+{
+ return left.get() > right.get();
+}
+
+template< typename T, T Default >
+CONTRACT_CONSTRUCTOR_BODY((natural<T, Default>), natural) ( T const& value )
+{
+ value_ = value;
+}
+
+template< typename T, T Default >
+CONTRACT_DESTRUCTOR_BODY((natural<T, Default>), ~natural) ( void )
+{
+ // Do nothing.
+}
+
+template< typename T, T Default >
+bool natural<T, Default>::CONTRACT_MEMBER_BODY(equal) ( natural const& right )
+ const
+{
+ return not less(*this, right) && not greater(*this, right);
+}
+//]
+
Added: sandbox/contract/example/contracts/broken_handler_sqrt.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/broken_handler_sqrt.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,92 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#if defined(__GNUC__) && defined(__GXX_EXPERIMENTAL_CXX0X__)
+# warning "ignored known failure on G++ with C++0x"
+# warning "note: maybe a compiler bug catching re-throws"
+ int main ( void ) { return 0; } // Trivial success.
+#else
+
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <iostream>
+
+//[broken_handler_sqrt
+struct not_a_number {}; // User defined exception.
+
+CONTRACT_FUNCTION(
+ double (sqrt) ( double x )
+ precondition(
+ x >= 0.0 ? true : throw not_a_number() // Throw user exception.
+ )
+ postcondition(
+ auto root = return,
+ root * root == x // Failure throws `contract::broken` exception.
+ )
+) {
+ return 0.0; // Intentionally incorrect to fail postcondition.
+}
+
+void throwing_handler ( contract::from const& context )
+{
+ // Failure handlers always called with active exception that failed the
+ // contract, so re-throw it to catch it below for logging.
+ try {
+ throw;
+ } catch(contract::broken& failure) {
+ std::cerr << failure.file_name() << "(" << failure.line_number() <<
+ "): contract assertion \"" << failure.assertion_code() <<
+ "\" failed " << std::endl;
+ } catch(std::exception& failure) {
+ std::cerr << "contract failed: " << failure.what() << std::endl;
+ } catch(...) {
+ std::cerr << "contract failed with unknown error" << std::endl;
+ }
+
+ // Cannot throw from destructors to comply with STL exception safety,
+ // otherwise re-throw active exception that failed the contract.
+ if(context == contract::FROM_DESTRUCTOR)
+ std::cerr << "Ignoring destructor contract failure (probably "
+ << "something bad has happened)" << std::endl;
+ else throw; // Never terminates.
+}
+
+int main ( void )
+{
+ // Customize contract broken handlers to throw exceptions instead of
+ // terminating the program (default).
+ contract::set_precondition_broken(&throwing_handler);
+ contract::set_postcondition_broken(&throwing_handler);
+
+#ifndef CONTRACT_CONFIG_NO_PRECONDITIONS
+ bool pre = false;
+ try {
+ sqrt(-1.0); // Fails precondition.
+ } catch(not_a_number&) {
+ pre = true;
+ std::clog << "Ignoring not-a-number exception" << std::endl;
+ }
+ BOOST_TEST(pre);
+#endif
+
+#ifndef CONTRACT_CONFIG_NO_POSTCONDITIONS
+ bool post = false;
+ try {
+ sqrt(4.0); // Fails postcondition.
+ } catch(...) {
+ post = true;
+ std::clog << "Unable to calculate square root" << std::endl;
+ }
+ BOOST_TEST(post);
+#endif
+
+ return boost::report_errors();
+}
+//]
+
+#endif // known failures
+
Added: sandbox/contract/example/contracts/class_ivector.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/class_ivector.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,89 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/algorithm/cxx11/all_of.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <iterator>
+#include <vector>
+
+//[class_ivector_classinv
+CONTRACT_CLASS( // Declare the class.
+ class (ivector)
+) {
+ CONTRACT_CLASS_INVARIANT( // Specify the class invariants.
+ empty() == (size() == 0),
+ size() <= capacity(),
+ capacity() <= max_size(),
+ std::distance(begin(), end()) == int(size())
+ )
+
+ public: typedef std::vector<int>::size_type size_type;
+ // ...
+//]
+ public: typedef std::vector<int>::const_reference const_reference;
+ public: typedef std::vector<int>::const_iterator const_iterator;
+
+
+ //[class_ivector_constructor
+ CONTRACT_CONSTRUCTOR( // Declare the constructor and its contract.
+ public explicit (ivector) ( (size_type) count )
+ precondition( count >= 0 )
+ postcondition(
+ size() == count,
+ boost::algorithm::all_of_equal(begin(), end(), 0)
+ )
+ initialize( vector_(count) )
+ ) {}
+ //]
+
+ //[class_ivector_destructor
+ CONTRACT_DESTRUCTOR( // Declare the destructor (so it checks invariants).
+ public virtual (~ivector) ( void )
+ ) {}
+ //]
+
+ //[class_ivector_member
+ CONTRACT_FUNCTION( // Declare the member function with its contract.
+ public void (push_back) ( int const value )
+ precondition( size() < max_size() )
+ postcondition(
+ auto old_size = CONTRACT_OLDOF size(),
+ auto old_capacity = CONTRACT_OLDOF capacity(),
+ size() == old_size + 1,
+ capacity() >= old_capacity,
+ back() == value
+ )
+ ) {
+ vector_.push_back(value);
+ }
+ //]
+
+ public: bool empty ( void ) const { return vector_.empty(); }
+ public: size_type size ( void ) const { return vector_.size(); }
+ public: size_type max_size ( void ) const { return vector_.max_size(); }
+ public: size_type capacity ( void ) const { return vector_.capacity(); }
+ public: const_reference back ( void ) const { return vector_.back(); }
+ public: const_iterator begin ( void ) const { return vector_.begin(); }
+ public: const_iterator end ( void ) const { return vector_.end(); }
+
+ private: std::vector<int> vector_;
+};
+
+int main ( void )
+{
+ ivector v(1);
+ BOOST_TEST(v.size() == 1);
+ BOOST_TEST(v.back() == 0);
+
+ v.push_back(123);
+ BOOST_TEST(v.size() == 2);
+ BOOST_TEST(v.back() == 123);
+
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/class_template_vector.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/class_template_vector.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,88 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/algorithm/cxx11/all_of.hpp>
+#include <iterator>
+#include <vector>
+
+//[class_template_vector
+#include "pushable.hpp"
+
+CONTRACT_CLASS(
+ template( typename T )
+ class (vector) extends( public pushable<T> ) // Subcontract.
+) {
+ // Within templates, use contract macros postfixed by `_TPL`.
+
+ CONTRACT_CLASS_INVARIANT_TPL(
+ empty() == (size() == 0),
+ size() <= capacity(),
+ capacity() <= max_size(),
+ std::distance(begin(), end()) == int(size())
+ )
+
+ public: typedef typename std::vector<T>::size_type size_type;
+ public: typedef typename std::vector<T>::const_reference const_reference;
+ public: typedef typename std::vector<T>::const_iterator const_iterator;
+
+ CONTRACT_CONSTRUCTOR_TPL(
+ public explicit (vector) ( (size_type) count )
+ precondition( count >= 0 )
+ postcondition(
+ size() == count,
+ boost::algorithm::all_of_equal(begin(), end(), T())
+ )
+ initialize( vector_(count) )
+ ) {}
+
+ CONTRACT_DESTRUCTOR_TPL(
+ public virtual (~vector) ( void )
+ ) {}
+
+ CONTRACT_FUNCTION_TPL(
+ public void (push_back) ( (T const&) value )
+ precondition( size() < max_size() )
+ postcondition(
+ auto old_size = CONTRACT_OLDOF size(),
+ auto old_capacity = CONTRACT_OLDOF capacity(),
+ size() == old_size + 1,
+ capacity() >= old_capacity
+ // Overridden postconditions also check `back() == value`.
+ )
+ ) {
+ vector_.push_back(value);
+ }
+
+ // ...
+//]
+
+ public: bool empty ( void ) const { return vector_.empty(); }
+ public: size_type size ( void ) const { return vector_.size(); }
+ public: size_type max_size ( void ) const { return vector_.max_size(); }
+ public: size_type capacity ( void ) const { return vector_.capacity(); }
+ public: const_reference back ( void ) const { return vector_.back(); }
+ public: const_iterator begin ( void ) const { return vector_.begin(); }
+ public: const_iterator end ( void ) const { return vector_.end(); }
+
+ private: std::vector<T> vector_;
+};
+
+int main ( void )
+{
+ vector<int> v(1);
+ BOOST_TEST(v.size() == 1);
+ BOOST_TEST(v.back() == 0);
+
+ v.push_back(123);
+ BOOST_TEST(v.size() == 2);
+ BOOST_TEST(v.back() == 123);
+
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/class_template_vector_seq.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/class_template_vector_seq.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,88 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/algorithm/cxx11/all_of.hpp>
+#include <iterator>
+#include <vector>
+
+//[class_template_vector_seq
+#include "pushable_seq.hpp"
+
+CONTRACT_CLASS(
+ template( (typename T) )
+ class (vector) extends( (public pushable<T>) )
+) {
+ // Use preprocessor sequences instead of variadic comma-separated lists.
+
+ CONTRACT_CLASS_INVARIANT_TPL(
+ (empty() == (size() == 0))
+ (size() <= capacity())
+ (capacity() <= max_size())
+ (std::distance(begin(), end()) == int(size()))
+ )
+
+ public: typedef typename std::vector<T>::size_type size_type;
+ public: typedef typename std::vector<T>::const_reference const_reference;
+ public: typedef typename std::vector<T>::const_iterator const_iterator;
+
+ CONTRACT_CONSTRUCTOR_TPL(
+ public explicit (vector) ( ((size_type) count) )
+ precondition( (count >= 0) )
+ postcondition(
+ (size() == count)
+ (boost::algorithm::all_of_equal(begin(), end(), T()))
+ )
+ initialize( (vector_(count)) )
+ ) {}
+
+ CONTRACT_DESTRUCTOR_TPL(
+ public virtual (~vector) ( void )
+ ) {}
+
+ CONTRACT_FUNCTION_TPL(
+ public void (push_back) ( ((T const&) value) )
+ precondition( (size() < max_size()) )
+ postcondition(
+ (auto old_size = CONTRACT_OLDOF size())
+ (auto old_capacity = CONTRACT_OLDOF capacity())
+ (size() == old_size + 1)
+ (capacity() >= old_capacity)
+ // Overridden postconditions also check `back() == value`.
+ )
+ ) {
+ vector_.push_back(value);
+ }
+
+ // ...
+//]
+
+ public: bool empty ( void ) const { return vector_.empty(); }
+ public: size_type size ( void ) const { return vector_.size(); }
+ public: size_type max_size ( void ) const { return vector_.max_size(); }
+ public: size_type capacity ( void ) const { return vector_.capacity(); }
+ public: const_reference back ( void ) const { return vector_.back(); }
+ public: const_iterator begin ( void ) const { return vector_.begin(); }
+ public: const_iterator end ( void ) const { return vector_.end(); }
+
+ private: std::vector<T> vector_;
+};
+
+int main ( void )
+{
+ vector<int> v(1);
+ BOOST_TEST(v.size() == 1);
+ BOOST_TEST(v.back() == 0);
+
+ v.push_back(123);
+ BOOST_TEST(v.size() == 2);
+ BOOST_TEST(v.back() == 123);
+
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/class_template_vector_seq_nova.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/class_template_vector_seq_nova.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,10 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include "nova.hpp"
+#include "class_template_vector_seq.cpp"
+
Added: sandbox/contract/example/contracts/const_assertion_number.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/const_assertion_number.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,47 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+//[const_assertion_number
+unsigned even = 0;
+
+CONTRACT_CLASS(
+ class (number)
+) {
+ CONTRACT_CLASS_INVARIANT( void )
+
+ public: static unsigned odd;
+
+ CONTRACT_FUNCTION(
+ public void (next) ( void )
+ postcondition(
+ auto old_even = CONTRACT_OLDOF even,
+ auto old_odd = CONTRACT_OLDOF odd,
+ // `[old_]even` and `[old_]odd` all `const&` within assertions.
+ const( even, old_even ) even == old_even + 2,
+ const( odd, old_odd ) odd == old_odd + 2
+ )
+ ) {
+ even += 2;
+ odd += 2;
+ }
+};
+
+unsigned number::odd = 1;
+//]
+
+int main ( void )
+{
+ number n;
+ n.next();
+ BOOST_TEST(even == 2);
+ BOOST_TEST(number::odd == 3);
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/const_assertion_number_global_error.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/const_assertion_number_global_error.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,50 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#ifdef CONTRACT_CONFIG_NO_POSTCONDITIONS
+# error "constant assertion failure requires postconditions"
+#endif
+
+//[const_assertion_number
+unsigned even = 0;
+
+CONTRACT_CLASS(
+ class (number)
+) {
+ CONTRACT_CLASS_INVARIANT( void )
+
+ public: static unsigned odd;
+
+ CONTRACT_FUNCTION(
+ public void (next) ( void )
+ postcondition(
+ auto old_even = CONTRACT_OLDOF even,
+ auto old_odd = CONTRACT_OLDOF odd,
+ const( even, old_even ) even = old_even + 2, // Correctly error.
+ const( odd, old_odd ) odd == old_odd + 2
+ )
+ ) {
+ even += 2;
+ odd += 2;
+ }
+};
+
+unsigned number::odd = 1;
+//]
+
+int main ( void )
+{
+ number n;
+ n.next();
+ BOOST_TEST(even == 2);
+ BOOST_TEST(number::odd == 3);
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/const_assertion_number_static_error.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/const_assertion_number_static_error.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,50 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#ifdef CONTRACT_CONFIG_NO_POSTCONDITIONS
+# error "constant assertion failure requires postconditions"
+#endif
+
+//[const_assertion_number
+unsigned even = 0;
+
+CONTRACT_CLASS(
+ class (number)
+) {
+ CONTRACT_CLASS_INVARIANT( void )
+
+ public: static unsigned odd;
+
+ CONTRACT_FUNCTION(
+ public void (next) ( void )
+ postcondition(
+ auto old_even = CONTRACT_OLDOF even,
+ auto old_odd = CONTRACT_OLDOF odd,
+ const( even, old_even ) even == old_even + 2,
+ const( odd, old_odd ) odd = old_odd + 2 // Correctly error.
+ )
+ ) {
+ even += 2;
+ odd += 2;
+ }
+};
+
+unsigned number::odd = 1;
+//]
+
+int main ( void )
+{
+ number n;
+ n.next();
+ BOOST_TEST(even == 2);
+ BOOST_TEST(number::odd == 3);
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/const_select_assertion_factorial.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/const_select_assertion_factorial.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,42 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+//[const_select_assertion_factorial
+int n = 0;
+
+CONTRACT_FUNCTION(
+ int (factorial) ( void )
+ precondition( const( n ) n >= 0 )
+ postcondition(
+ auto result = return,
+ if(const( n ) n == -1 or n == 0) ( // Constant-correct if-condition.
+ result == 1
+ ) else (
+ result >= 1
+ )
+ )
+) {
+ int m = n;
+ if(m == 0 or m == 1) {
+ return 1;
+ } else {
+ --n;
+ return m * factorial();
+ }
+}
+//]
+
+int main ( void )
+{
+ n = 4;
+ BOOST_TEST(factorial() == 24);
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/const_select_assertion_factorial_error.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/const_select_assertion_factorial_error.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,46 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#ifdef CONTRACT_CONFIG_NO_POSTCONDITIONS
+# error "constant select assertion failure requires postconditions"
+#endif
+
+//[const_select_assertion_factorial
+int n = 0;
+
+CONTRACT_FUNCTION(
+ int (factorial) ( void )
+ precondition( const( n ) n >= 0 )
+ postcondition(
+ auto result = return,
+ if(const( n ) n = 0 or n == 1) ( // n is const& within if-condition.
+ result == 1
+ ) else (
+ result >= 1
+ )
+ )
+) {
+ int m = n;
+ if(m == 0 or m == 1) {
+ return 1;
+ } else {
+ --n;
+ return m * factorial();
+ }
+}
+//]
+
+int main ( void )
+{
+ n = 4;
+ BOOST_TEST(factorial() == 24);
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/contract_failure.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/contract_failure.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,474 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <string>
+#include <iostream>
+
+bool // Fail the asserted conditions.
+ class_inv = true
+ , static_class_inv = true
+ , volatile_class_inv = true
+ , pre = true
+ , post = true
+;
+
+struct check_pre // Check pre asserted before member initializers.
+{
+ check_pre ( void ) { BOOST_TEST(pre); }
+};
+
+struct forced_exception {};
+
+CONTRACT_CLASS(
+ struct (failer) extends( check_pre )
+) {
+ CONTRACT_CLASS_INVARIANT(
+ class_inv,
+ static class( static_class_inv ),
+ volatile class( volatile_class_inv )
+ )
+
+ CONTRACT_CONSTRUCTOR(
+ public (failer) (
+ (bool*) inv, default 0,
+ bool const throwing, default false
+ )
+ precondition( pre )
+ postcondition( post )
+ initialize(
+ check_pre(),
+ destructor_inv(0),
+ destructor_throwing(false)
+ )
+ ) {
+ if(inv) *inv = false;
+ if(throwing) throw forced_exception();
+ }
+
+ bool* destructor_inv; // Destructor has not parameter,
+ bool destructor_throwing; // use data members instead.
+
+ CONTRACT_DESTRUCTOR(
+ public virtual (~failer) ( void )
+ ) {
+ if(destructor_inv) *destructor_inv = false;
+ // STL says destrcutors shall not throw, throwing here just for testing.
+ if(destructor_throwing) throw forced_exception();
+ }
+
+ CONTRACT_FUNCTION(
+ public void (fail) (
+ (bool*) inv, default 0,
+ bool const throwing, default false
+ )
+ precondition( pre )
+ postcondition( post )
+ ) {
+ if(inv) *inv = false;
+ if(throwing) throw forced_exception();
+ }
+
+ CONTRACT_FUNCTION(
+ public void (fail) (
+ (bool*) inv, default 0,
+ bool const throwing, default false
+ ) volatile
+ precondition( pre )
+ postcondition( post )
+ ) {
+ if(inv) *inv = false;
+ if(throwing) throw forced_exception();
+ }
+
+ CONTRACT_FUNCTION(
+ public static void (static_failure) (
+ (bool*) inv, default 0,
+ bool const throwing, default false
+ )
+ precondition( pre )
+ postcondition( post )
+ ) {
+ if(inv) *inv = false;
+ if(throwing) throw forced_exception();
+ }
+};
+
+CONTRACT_FUNCTION(
+ void (free_failure) ( bool const throwing, default false )
+ precondition( pre )
+ postcondition( post )
+) {
+ if(throwing) throw forced_exception();
+}
+
+std::string str ( contract::from const& context )
+{
+ switch(context) {
+ case contract::FROM_CONSTRUCTOR: return "constructor";
+ case contract::FROM_DESTRUCTOR: return "destructor";
+ case contract::FROM_NONSTATIC_MEMBER_FUNCTION:
+ return "non-static member function";
+ case contract::FROM_STATIC_MEMBER_FUNCTION: return "static member function";
+ case contract::FROM_FREE_FUNCTION: return "free function";
+ case contract::FROM_BODY: return "body";
+ }
+ return "<unknown>";
+}
+
+#define THROWING_HANDLER(name) \
+ struct name \
+ { \
+ contract::from context; \
+ contract::broken error; \
+ name ( contract::from const& a_context, \
+ contract::broken const& an_error ) \
+ : context(a_context), error(an_error) {} \
+ }; \
+ void BOOST_PP_CAT(name, _handler) ( contract::from const& context ) \
+ { \
+ try { \
+ throw; \
+ } catch(contract::broken& error) { \
+ std::cerr << "checking " << BOOST_PP_STRINGIZE(name) << \
+ " from " << str(context) << ":" << std::endl; \
+ std::cerr << " " << error.what() << std::endl; \
+ throw name(context, error); \
+ } \
+ }
+
+#define CHECK(assertion, exception, from_context, body) \
+ pass = false; \
+ try { \
+ body \
+ } catch(exception& ex) { \
+ assertion = true; \
+ BOOST_TEST(ex.context == from_context); \
+ BOOST_TEST(std::string(ex.error.assertion_code()) == \
+ BOOST_PP_STRINGIZE(assertion)); \
+ BOOST_TEST(ex.error.assertion_number() == 1); \
+ pass = true; \
+ } \
+ assertion = true; \
+ BOOST_TEST(pass); \
+
+#define CHECK_THROW(body) \
+ pass = false; \
+ try { \
+ body \
+ } catch(forced_exception) { \
+ std::cerr << "checking throw with no contract failure:" << std::endl; \
+ std::cerr << " no broken contract: file \"" << __FILE__ << \
+ "\", line " << __LINE__ << std::endl; \
+ pass = true; \
+ } \
+ BOOST_TEST(pass);
+
+THROWING_HANDLER(class_inv_broken_on_entry)
+THROWING_HANDLER(class_inv_broken_on_exit)
+THROWING_HANDLER(class_inv_broken_on_throw)
+THROWING_HANDLER(pre_broken)
+THROWING_HANDLER(post_broken)
+THROWING_HANDLER(block_inv_broken)
+THROWING_HANDLER(loop_var_broken)
+
+int main ( void )
+{
+ contract::set_class_invariant_broken_on_entry(
+ &class_inv_broken_on_entry_handler);
+ contract::set_class_invariant_broken_on_exit(
+ &class_inv_broken_on_exit_handler);
+ contract::set_class_invariant_broken_on_throw(
+ &class_inv_broken_on_throw_handler);
+ contract::set_precondition_broken(&pre_broken_handler);
+ contract::set_postcondition_broken(&post_broken_handler);
+ contract::set_block_invariant_broken(&block_inv_broken_handler);
+ contract::set_loop_variant_broken(&loop_var_broken_handler);
+
+ bool const throwing = true;
+ bool* const no_broken_inv = 0;
+ contract::from context;
+ bool pass = false;
+
+ // Check constructor contract failures.
+ context = contract::FROM_CONSTRUCTOR;
+#ifndef CONTRACT_CONFIG_NO_CLASS_INVARIANTS
+ // Fail static class invariants on entry.
+ CHECK(static_class_inv, class_inv_broken_on_entry, context,
+ static_class_inv = false;
+ failer failure;
+ )
+ // Fail static class invariants on exit.
+ CHECK(static_class_inv, class_inv_broken_on_exit, context,
+ failer failure(&static_class_inv);
+ )
+ // Fail static class invariants on throw.
+ CHECK(static_class_inv, class_inv_broken_on_throw, context,
+ failer failure(&static_class_inv, throwing);
+ )
+ // Class invariants on entry do not apply.
+ // Fail class invariants on exit.
+ CHECK(class_inv, class_inv_broken_on_exit, context,
+ failer failure(&class_inv);
+ )
+ // Class invariants on throw do not apply.
+ // Volatile class invariants on entry do not apply.
+ // Volatile class invariants on exit do not apply.
+ // Volatile class invariants on throw do not apply.
+#endif
+#ifndef CONTRACT_CONFIG_NO_PRECONDITIONS
+ // Fail preconditions on entry (before member initializers).
+ CHECK(pre, pre_broken, context,
+ pre = false;
+ failer failure;
+ )
+#endif
+#ifndef CONTRACT_CONFIG_NO_POSTCONDITIONS
+ // Fail postconditions on exit (when no throw).
+ CHECK(post, post_broken, context,
+ post = false;
+ failer failure;
+ )
+#endif
+ // Throw with no contract failure.
+ CHECK_THROW(
+ failer failure(no_broken_inv, throwing);
+ )
+ std::cerr << std::endl;
+
+ // Check destructor contract failures.
+ context = contract::FROM_DESTRUCTOR;
+#ifndef CONTRACT_CONFIG_NO_CLASS_INVARIANTS
+ // Fail static class invariants on entry.
+ CHECK(static_class_inv, class_inv_broken_on_entry, context,
+ failer failure;
+ static_class_inv = false;
+ )
+ // Fail static class invariants on exit.
+ CHECK(static_class_inv, class_inv_broken_on_exit, context,
+ failer failure;
+ failure.destructor_inv = &static_class_inv;
+ )
+ // Fail static class invariants on throw.
+ CHECK(static_class_inv, class_inv_broken_on_throw, context,
+ failer failure;
+ failure.destructor_inv = &static_class_inv;
+ failure.destructor_throwing = true;
+ )
+ // Fail class invariants on entry.
+ CHECK(class_inv, class_inv_broken_on_entry, context,
+ failer failure;
+ class_inv = false;
+ )
+ // Class invariants on exit do not apply.
+ // Fail class invariants on throw.
+ CHECK(class_inv, class_inv_broken_on_throw, context,
+ failer failure;
+ failure.destructor_inv = &class_inv;
+ failure.destructor_throwing = true;
+ )
+ // Volatile class invariants on entry do not apply.
+ // Volatile class invariants on exit do not apply.
+ // Volatile class invariants on throw do not apply.
+#endif
+ // Preconditions on entry do not apply.
+ // Postconditions on exit (when no throw) do not apply.
+ // Throw with no contract failure.
+ CHECK_THROW(
+ failer failure;
+ failure.destructor_throwing = true;
+ )
+ std::cerr << std::endl;
+
+ // Failure objects declared here to they are not destructed within the
+ // code checking member function contracts (otherwise, that code would also
+ // re-check constructor and destructor contracts all the times).
+ failer failure;
+ failer volatile volatile_failure;
+
+ // Check non-static member function contract failures.
+ context = contract::FROM_NONSTATIC_MEMBER_FUNCTION;
+#ifndef CONTRACT_CONFIG_NO_CLASS_INVARIANTS
+ // Fail static class invariants on entry.
+ CHECK(static_class_inv, class_inv_broken_on_entry, context,
+ static_class_inv = false;
+ failure.fail();
+ )
+ // Fail static class invariants on exit.
+ CHECK(static_class_inv, class_inv_broken_on_exit, context,
+ failure.fail(&static_class_inv);
+ )
+ // Fail static class invariants on throw.
+ CHECK(static_class_inv, class_inv_broken_on_throw, context,
+ failure.fail(&static_class_inv, throwing);
+ )
+ // Fail class invariants on entry.
+ CHECK(class_inv, class_inv_broken_on_entry, context,
+ class_inv = false;
+ failure.fail();
+ )
+ // Fail class invariants on exit.
+ CHECK(class_inv, class_inv_broken_on_exit, context,
+ failure.fail(&class_inv);
+ )
+ // Fail class invariants on throw.
+ CHECK(class_inv, class_inv_broken_on_throw, context,
+ failure.fail(&class_inv, throwing);
+ )
+ // Fail volatile class invariants on entry.
+ CHECK(volatile_class_inv, class_inv_broken_on_entry, context,
+ volatile_class_inv = false;
+ volatile_failure.fail();
+ )
+ // Fail volatile class invariants on exit.
+ CHECK(volatile_class_inv, class_inv_broken_on_exit, context,
+ volatile_failure.fail(&volatile_class_inv);
+ )
+ // Fail volatile class invariants on throw.
+ CHECK(volatile_class_inv, class_inv_broken_on_throw, context,
+ volatile_failure.fail(&volatile_class_inv, throwing);
+ )
+#endif
+#ifndef CONTRACT_CONFIG_NO_PRECONDITIONS
+ // Fail preconditions on entry.
+ CHECK(pre, pre_broken, context,
+ pre = false;
+ failure.fail();
+ )
+#endif
+#ifndef CONTRACT_CONFIG_NO_POSTCONDITIONS
+ // Fail postconditions on exit (when no throw).
+ CHECK(post, post_broken, context,
+ post = false;
+ failure.fail();
+ )
+#endif
+ // Throw with no contract failure.
+ CHECK_THROW(
+ failure.fail(no_broken_inv, throwing);
+ )
+ std::cerr << std::endl;
+
+ // Check static member function contract failures.
+ context = contract::FROM_STATIC_MEMBER_FUNCTION;
+#ifndef CONTRACT_CONFIG_NO_CLASS_INVARIANTS
+ // Fail static class invariants on entry.
+ CHECK(static_class_inv, class_inv_broken_on_entry, context,
+ static_class_inv = false;
+ failer::static_failure();
+ )
+ // Fail static class invariants on exit.
+ CHECK(static_class_inv, class_inv_broken_on_exit, context,
+ failer::static_failure(&static_class_inv);
+ )
+ // Fail static class invariants on throw.
+ CHECK(static_class_inv, class_inv_broken_on_throw, context,
+ failer::static_failure(&static_class_inv, throwing);
+ )
+ // Class invariants on entry do not apply.
+ // Class invariants on exit do not apply.
+ // Class invariants on throw do not apply.
+ // Volatile class invariants on entry do not apply.
+ // Volatile class invariants on exit do not apply.
+ // Volatile class invariants on throw do not apply.
+#endif
+#ifndef CONTRACT_CONFIG_NO_PRECONDITIONS
+ // Fail preconditions on entry.
+ CHECK(pre, pre_broken, context,
+ pre = false;
+ failer::static_failure();
+ )
+#endif
+#ifndef CONTRACT_CONFIG_NO_POSTCONDITIONS
+ // Fail postconditions on exit (when no throw).
+ CHECK(post, post_broken, context,
+ post = false;
+ failer::static_failure();
+ )
+#endif
+ // Throw with no contract failure.
+ CHECK_THROW(
+ failer::static_failure(no_broken_inv, throwing);
+ )
+ std::cerr << std::endl;
+
+ // Check free function contract failures.
+ context = contract::FROM_FREE_FUNCTION;
+ // Static class invariants on entry do not apply.
+ // Static class invariants on exit do not apply.
+ // Static class invariants on throw do not apply.
+ // Class invariants on entry do not apply.
+ // Class invariants on exit do not apply.
+ // Class invariants on throw do not apply.
+ // Volatile class invariants on entry do not apply.
+ // Volatile class invariants on exit do not apply.
+ // Volatile class invariants on throw do not apply.
+#ifndef CONTRACT_CONFIG_NO_PRECONDITIONS
+ // Fail preconditions on entry.
+ CHECK(pre, pre_broken, context,
+ pre = false;
+ free_failure();
+ )
+#endif
+#ifndef CONTRACT_CONFIG_NO_POSTCONDITIONS
+ // Fail postconditions on exit (when no throw).
+ CHECK(post, post_broken, context,
+ post = false;
+ free_failure();
+ )
+#endif
+ // Throw with no contract failure.
+ CHECK_THROW(
+ free_failure(throwing);
+ )
+ std::cerr << std::endl;
+
+ // Check block invariant contract failure.
+#ifndef CONTRACT_CONFIG_NO_BLOCK_INVARIANTS
+ pass = false;
+ try {
+ CONTRACT_BLOCK_INVARIANT(false)
+ } catch(block_inv_broken) {
+ pass = true;
+ }
+ BOOST_TEST(pass);
+ std::cerr << std::endl;
+#endif
+
+ // Check loop variant contract failures.
+#ifndef CONTRACT_CONFIG_NO_LOOP_VARIANTS
+ // OK, decreasing to 0.
+ CONTRACT_LOOP( for(int i = 0; i < 10; ++i) ) {
+ CONTRACT_LOOP_VARIANT( 9 - i )
+ }
+ // Failure, decreasing to negative.
+ pass = false;
+ try {
+ CONTRACT_LOOP( for(int i = 0; i < 10; ++i) ) {
+ CONTRACT_LOOP_VARIANT( 8 - i )
+ }
+ } catch(loop_var_broken) {
+ pass = true;
+ }
+ BOOST_TEST(pass);
+ // Failure, not decreasing.
+ pass = false;
+ try {
+ CONTRACT_LOOP( for(int i = 0; i < 10; ++i) ) {
+ CONTRACT_LOOP_VARIANT( 10 )
+ }
+ } catch(loop_var_broken) {
+ pass = true;
+ }
+ BOOST_TEST(pass);
+ std::cerr << std::endl;
+#endif
+
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/copy_inc.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/copy_inc.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,76 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/type_traits/has_equal_to.hpp>
+#include <boost/type_traits/has_plus.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/utility.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+//[copy_inc
+CONTRACT_FUNCTION(
+ template( typename T )
+ (T&) (inc) ( (T&) value, (T const&) offset )
+ postcondition(
+ auto old_value = CONTRACT_OLDOF value, // Use `copy`.
+ auto result = return, // Would use `copy` but reference so no copy.
+ value == old_value + offset, requires
+ boost::has_plus<T>::value and
+ boost::has_equal_to<T>::value,
+ result == value, requires
+ boost::has_equal_to<T>::value
+ )
+) {
+ return value += offset;
+}
+
+class num : boost::noncopyable // Non-copyable (for some reason...).
+{
+ friend class contract::copy<num>; // Contract copy is friend.
+
+ public: explicit num ( int value ) : ptr_(new int(value)) {}
+ private: num ( num const& other ) : ptr_(other.ptr_) {}
+ public: ~num ( void ) { delete ptr_; }
+
+ public: num operator+ ( num const& right ) const
+ { return num(*ptr_ + *right.ptr_); }
+ public: num& operator+= ( num const& right )
+ { *ptr_ += *right.ptr_; return *this; }
+ public: bool operator== ( num const& right ) const
+ { return *ptr_ == *right.ptr_; }
+
+ private: int* ptr_;
+};
+
+// Specialization disables old-of for non-copyable `num` (no C++ type trait can
+// automatically detect copy constructors).
+namespace contract
+{
+ template< >
+ class copy < num >
+ {
+ public: explicit copy ( num const& n ) : num_(*n.ptr_) {}
+ public: num const& value ( void ) const { return num_; }
+
+ private: num num_;
+ };
+} // namespace
+//]
+
+int main ( void )
+{
+ //[copy_inc_call
+ int i = 1, j = 2;
+ BOOST_TEST(inc(i, j) == 3);
+
+ num n(1), m(2);
+ BOOST_TEST(inc(n, m) == num(3));
+ //]
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/default_subcontracting_base.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/default_subcontracting_base.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,34 @@
+
+#include <contract.hpp>
+#include <iostream>
+
+//[default_subcontracting_base
+CONTRACT_CLASS(
+ class (base) // Declared with contract macros.
+) {
+ CONTRACT_CLASS_INVARIANT( std::clog << "base::inv" << std::endl )
+
+ CONTRACT_FUNCTION(
+ public virtual void (f) ( void )
+ precondition( std::clog << "base::f::pre" << std::endl )
+ postcondition( std::clog << "base::f::post" << std::endl )
+ ) = 0;
+};
+
+class deriv : public base // Declared without contract macros...
+{
+ // ...but using `BODY` instead of `CLASS` and `FUNCTION` macros, overriding
+ // functions have exact same contracts as base (not real subcontracting).
+ public: virtual void CONTRACT_MEMBER_BODY(f) ( void )
+ {
+ std::clog << "deriv::f::body" << std::endl;
+ }
+};
+//]
+
+int main ( void )
+{
+ deriv().f(); // Check `base::f` contract but execute `deriv::f` body.
+ return 0;
+}
+
Added: sandbox/contract/example/contracts/exception_array.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/exception_array.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,75 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+//[exception_array
+CONTRACT_CLASS(
+ template( typename T )
+ class (array)
+) {
+ CONTRACT_CLASS_INVARIANT_TPL( size() >= 0 )
+
+ public: struct out_of_memory {};
+ public: struct error {};
+
+ CONTRACT_CONSTRUCTOR_TPL(
+ public explicit (array) ( size_t count )
+ precondition( count >= 0 )
+ postcondition( size() == count )
+ // Function try-blocks are programmed within the macros only for
+ // constructors with member initializers otherwise they are
+ // programmed with the body definitions and outside the macros.
+ try initialize( // Try block for constructor initializers and body.
+ data_(new T[count]),
+ size_(count)
+ // Use `BOOST_IDENTITY_TYPE` if the exception type has unwrapped
+ // commas or leading symbols.
+ ) catch(std::bad_alloc&) (
+ throw out_of_memory();
+ ) catch(...) (
+ throw error();
+ )
+ ) {}
+
+ CONTRACT_DESTRUCTOR_TPL(
+ public virtual (~array) ( void ) throw( void ) // Throw nothing.
+ ) {
+ delete[] data_;
+ }
+
+ // ...
+//]
+
+ CONTRACT_FUNCTION_TPL(
+ public size_t (size) ( void ) const
+ ) {
+ return size_;
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public (T&) operator([])(at) ( size_t index )
+ precondition( index >= 0, index < size() )
+ ) {
+ return data_[index];
+ }
+
+ private: T* data_;
+ private: size_t size_;
+};
+
+int main ( void )
+{
+ array<int> a(3);
+ BOOST_TEST(a.size() == 3);
+ a[0] = 1; BOOST_TEST(a[0] == 1);
+ a[1] = 2; BOOST_TEST(a[1] == 2);
+ a[2] = 3; BOOST_TEST(a[2] == 3);
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/friend_counter.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/friend_counter.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,106 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/concept_check.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+//[friend_counter
+CONTRACT_CLASS( // Not even necessary to contract this class.
+ template( typename T ) requires( boost::CopyConstructible<T> )
+ class (counter)
+) {
+ CONTRACT_CLASS_INVARIANT_TPL( value() >= 0 );
+
+ CONTRACT_FUNCTION_TPL( // Friend (contracted declaration and definition).
+ public friend (counter) operator(/)(div) ( (counter const&) left,
+ (T const&) right )
+ precondition( right > 0 ) // Strictly positive, cannot be zero.
+ postcondition(
+ auto result = return,
+ result.value() * right == left.value()
+ )
+ ) {
+ return counter(left.value() / right);
+ }
+
+ // Friend forward declaration (contracted declaration and definition below).
+ public: template< typename U >
+ friend bool CONTRACT_FREE_BODY(operator(==)(equal)) ( // Use BODY.
+ counter<U> const& left, U const& right ) ;
+
+// NOTE: Forward friend template instantiations give internal MSVC error.
+#if defined(BOOST_MSVC) && !defined(CONTRACT_CONFIG_NO_POSTCONDITIONS)
+ // Friend definition (contracted declaration below).
+ public: friend counter CONTRACT_FREE_BODY(operator(*)(mult)) ( // Use BODY.
+ counter const& left, T const& right )
+ {
+ return counter(left.value() * right); // Contract checked `right >=0` .
+ }
+#endif
+
+ CONTRACT_CONSTRUCTOR_TPL( // Public constructor gets next counter value.
+ public explicit (counter) ( void )
+ initialize( value_(next_value_++) )
+ ) {}
+
+ CONTRACT_CONSTRUCTOR_TPL( // Private constructor.
+ private explicit (counter) ( (T const&) a_value )
+ precondition( a_value >= 0 )
+ postcondition( value() == a_value )
+ initialize( value_(a_value) )
+ ) {}
+
+ CONTRACT_FUNCTION_TPL(
+ public (T) (value) ( void ) const
+ postcondition( auto result = return, result >= 0 )
+ ) {
+ return value_;
+ }
+
+ private: T value_;
+ private: static T next_value_;
+};
+
+template<typename T>
+T counter<T>::next_value_ = T();
+
+CONTRACT_FUNCTION(
+ template( typename U )
+ bool operator(==)(equal) ( (counter<U> const&) left, (U const&) right )
+ precondition( right >= 0 )
+ postcondition(
+ auto result = return,
+ result == (left.value() == right)
+ )
+) {
+ return left.value() == right;
+}
+
+#if defined(BOOST_MSVC) && !defined(CONTRACT_CONFIG_NO_POSTCONDITIONS)
+CONTRACT_FUNCTION(
+ (counter<int>) operator(*)(mult) ( (counter<int> const&) left,
+ (int const&) right )
+ precondition( right >= 0 )
+ postcondition(
+ auto result = return,
+ result.value() == left.value() * right
+ )
+) ;
+#endif
+//]
+
+int main ( void )
+{
+ counter<int> i0, i1, i2, i3, i4;
+ BOOST_TEST(i4 / 2 == 2);
+#if defined(BOOST_MSVC) && !defined(CONTRACT_CONFIG_NO_POSTCONDITIONS)
+ BOOST_TEST(i3 * 2 == 6);
+#endif
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/function_template_postinc.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/function_template_postinc.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,35 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <limits>
+
+//[function_template_postinc
+CONTRACT_FUNCTION(
+ template( typename T ) // Template parameter(s).
+ (T const) (postinc) ( (T&) value )
+ precondition( value < std::numeric_limits<T>::max() )
+ postcondition(
+ auto result = return,
+ auto old_value = CONTRACT_OLDOF value,
+ value == old_value + 1,
+ result == old_value
+ )
+) {
+ return value++;
+}
+//]
+
+int main ( void )
+{
+ int value = 1;
+ BOOST_TEST(postinc(value) == 1);
+ BOOST_TEST(value == 2);
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/has_oldof_inc.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/has_oldof_inc.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,68 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/type_traits/has_equal_to.hpp>
+#include <boost/type_traits/has_plus.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/utility.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+//[has_oldof_inc
+CONTRACT_FUNCTION(
+ template( typename T )
+ (T&) (inc) ( (T&) value, (T const&) offset )
+ postcondition(
+ auto old_value = CONTRACT_OLDOF value, // Skip if no old-of.
+ auto result = return, // Never skipped.
+ value == old_value + offset, requires
+ contract::has_oldof<T>::value and // Requires old-of.
+ boost::has_plus<T>::value and
+ boost::has_equal_to<T>::value,
+ result == value, requires
+ boost::has_equal_to<T>::value
+ )
+) {
+ return value += offset;
+}
+
+class num : boost::noncopyable // Non-copyable (for some reason...).
+{
+ public: explicit num ( int value ) : ptr_(new int(value)) {}
+ private: num ( num const& other ) : ptr_(other.ptr_) {} // Private copy.
+ public: ~num ( void ) { delete ptr_; }
+
+ public: num operator+ ( num const& right ) const
+ { return num(*ptr_ + *right.ptr_); }
+ public: num& operator+= ( num const& right )
+ { *ptr_ += *right.ptr_; return *this; }
+ public: bool operator== ( num const& right ) const
+ { return *ptr_ == *right.ptr_; }
+
+ private: int* ptr_;
+};
+
+// Specialization disables old-of for non-copyable `num` (no C++ type trait can
+// automatically detect copy constructors).
+namespace contract
+{
+ template< > struct has_oldof < num > : boost::mpl::false_ {};
+} // namespace
+//]
+
+int main ( void )
+{
+ //[has_oldof_inc_call
+ int i = 1, j = 2;
+ BOOST_TEST(inc(i, j) == 3);
+
+ num n(1), m(2);
+ BOOST_TEST(inc(n, m) == num(3));
+ //]
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/macro_commas_symbols_integral_map.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/macro_commas_symbols_integral_map.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,103 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/concept_check.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <map>
+#include <utility>
+
+template< typename Key, typename T >
+struct sizeable
+{
+ public: typedef typename std::map<Key, T>::size_type size_type;
+ public: static size_type const max_size = 100;
+ public: virtual size_type size( void ) const = 0;
+};
+
+//[macro_commas_symbols_integral_map
+CONTRACT_CLASS(
+ template(
+ typename Key,
+ typename T, // Commas in following template params.
+ class Allocator,
+ default (::std::allocator<std::pair<Key const, T> >),
+ (typename ::std::map<int, T>::key_type) default_key,
+ default (-1)
+ ) requires( (boost::Convertible<Key, int>) ) // Commas in concepts.
+ class (integral_map)
+ extends( public (::sizeable<Key, T>) ) // Commas in bases.
+) {
+ CONTRACT_CLASS_INVARIANT_TPL( // Commas in class invariants.
+ (::sizeable<Key, T>::max_size) >= size()
+ )
+
+ public: typedef typename std::map<Key, T, std::less<Key>, Allocator>::
+ iterator iterator;
+
+ CONTRACT_FUNCTION_TPL(
+ public template( typename OtherKey, typename OtherT )
+ requires(
+ (::boost::Convertible<OtherKey, Key>),
+ (::boost::Convertible<OtherT, T>)
+ )
+ (::std::pair<iterator, bool>) (insert) ( // Commas in result and params.
+ (::std::pair<OtherKey, OtherT> const&) other_value,
+ default (::std::pair<Key, T>(default_key, T()))
+ ) throw( (::std::pair<Key, T>) ) // Commas in exception specs.
+ precondition( // Leading symbols in preconditions (same for commas).
+ ((!full())) // LIMITATION: Two sets `((...))` (otherwise seq.).
+ )
+ postcondition( // Commas in postconditions.
+ auto result = return,
+ (typename sizeable<OtherKey, OtherT>::size_type)
+ old_other_size = CONTRACT_OLDOF
+ (size<OtherKey, OtherT>()),
+ (::sizeable<Key, T>::max_size) >= size(),
+ size() == old_other_size + (result.second ? 1 : 0)
+ )
+ ) {
+ // ...
+//]
+ std::pair<Key, T> value(other_value.first, other_value.second);
+ std::pair<iterator, bool> result = map_.insert(value);
+ if(size() > sizeable<Key, T>::max_size) throw value;
+ return result;
+ }
+
+ public: bool full ( void ) const
+ { return size() == sizeable<Key, T>::max_size; }
+
+ public: typename sizeable<Key, T>::size_type size ( void ) const
+ { return map_.size(); }
+
+ public: template< typename OtherKey, typename OtherT >
+ typename sizeable<OtherKey, OtherT>::size_type size ( void ) const
+ { return map_.size(); }
+
+ public: T& operator[] ( Key const& key ) { return map_[key]; }
+
+ private: std::map<Key, T, std::less<Key>, Allocator> map_;
+};
+
+int main ( void )
+{
+ integral_map<char, int> m;
+ m.insert(std::make_pair(123, 'a'));
+ BOOST_TEST(m[char(123)] == int('a'));
+ m.insert<char, int>();
+ BOOST_TEST(m[char(-1)] == int());
+
+ // Test an implementation detail.
+ BOOST_TEST(CONTRACT_DETAIL_PP_IS_VARIADIC( (std::pair<char, int>) ) == 1);
+ BOOST_TEST(CONTRACT_DETAIL_PP_IS_VARIADIC( (std::pair<char, int>) p) == 1);
+ BOOST_TEST(CONTRACT_DETAIL_PP_IS_VARIADIC( false ) == 1);
+ BOOST_TEST(CONTRACT_DETAIL_PP_IS_VARIADIC( (!false) ) == 0); // Sequence.
+
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/macro_commas_symbols_integral_map_seq.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/macro_commas_symbols_integral_map_seq.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,96 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/concept_check.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <map>
+#include <utility>
+
+template< typename Key, typename T >
+struct sizeable
+{
+ public: typedef typename std::map<Key, T>::size_type size_type;
+ public: static size_type const max_size = 100;
+ public: virtual size_type size( void ) const = 0;
+};
+
+//[macro_commas_symbols_integral_map_seq
+CONTRACT_CLASS(
+ template(
+ (typename Key)
+ (typename T)
+ (class Allocator)
+ (default comma(1)(::std::allocator<std::pair<Key const, T> >))
+ (comma(1)(typename ::std::map<int, T>::key_type) default_key)
+ (default (-1))
+ ) requires( (comma(1)(boost::Convertible<Key, int>)) )
+ class (integral_map)
+ extends( (public comma(1)(::sizeable<Key, T>)) )
+) {
+ CONTRACT_CLASS_INVARIANT_TPL(
+ (((::sizeable<Key, T>::max_size)) >= size())
+ )
+
+ public: typedef typename std::map<Key, T, std::less<Key>, Allocator>::
+ iterator iterator;
+
+ CONTRACT_FUNCTION_TPL(
+ public template( (typename OtherKey) (typename OtherT) )
+ requires(
+ (comma(1)(::boost::Convertible<OtherKey, Key>))
+ (comma(1)(::boost::Convertible<OtherT, T>))
+ )
+ comma(1)(::std::pair<iterator, bool>) (insert) (
+ (comma(1)(::std::pair<OtherKey, OtherT> const&) other_value)
+ (default comma(1)(::std::pair<Key,T>(default_key, T())))
+ ) throw( (comma(1)(::std::pair<Key, T>)) )
+ precondition(
+ ((!full()))
+ )
+ postcondition(
+ (auto result = return)
+ (comma(1)(typename sizeable<OtherKey, OtherT>::size_type)
+ old_other_size = CONTRACT_OLDOF
+ (size<OtherKey, OtherT>()))
+ (((::sizeable<Key, T>::max_size)) >= size())
+ (size() == old_other_size + (result.second ? 1 : 0))
+ )
+ ) {
+ // ...
+//]
+ std::pair<Key, T> value(other_value.first, other_value.second);
+ std::pair<iterator, bool> result = map_.insert(value);
+ if(size() > sizeable<Key, T>::max_size) throw value;
+ return result;
+ }
+
+ public: bool full ( void ) const
+ { return size() == sizeable<Key, T>::max_size; }
+
+ public: typename sizeable<Key, T>::size_type size ( void ) const
+ { return map_.size(); }
+
+ public: template< typename OtherKey, typename OtherT >
+ typename sizeable<OtherKey, OtherT>::size_type size ( void ) const
+ { return map_.size(); }
+
+ public: T& operator[] ( Key const& key ) { return map_[key]; }
+
+ private: std::map<Key, T, std::less<Key>, Allocator> map_;
+};
+
+int main ( void )
+{
+ integral_map<char, int> m;
+ m.insert(std::make_pair(123, 'a'));
+ BOOST_TEST(m[char(123)] == int('a'));
+ m.insert<char, int>();
+ BOOST_TEST(m[char(-1)] == int());
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/macro_commas_symbols_integral_map_seq_nova.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/macro_commas_symbols_integral_map_seq_nova.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,10 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include "nova.hpp"
+#include "macro_commas_symbols_integral_map_seq.cpp"
+
Added: sandbox/contract/example/contracts/member_operator_string.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/member_operator_string.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,136 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <string>
+#include <vector>
+#include <new>
+
+//[member_operator_string
+CONTRACT_CLASS(
+ class (string)
+) {
+ CONTRACT_CLASS_INVARIANT(
+ static class( pointers >= 0, arrays >= 0 )
+ )
+
+ public: static int pointers;
+ public: static int arrays;
+
+ CONTRACT_CONSTRUCTOR(
+ public explicit (string) ( (char const*) c_str, default("") )
+ initialize( string_(c_str) )
+ ) {}
+
+ CONTRACT_DESTRUCTOR(
+ public (~string) ( void )
+ ) {}
+
+ CONTRACT_FUNCTION( // Symbolic operators: `(==)(equal)`, `(())(call)`, etc.
+ public bool operator(==)(equal) ( (string const&) right ) const
+ ) {
+ return string_ == right.string_;
+ }
+
+ CONTRACT_FUNCTION( // Implicit type conversion operator (keyword type).
+ public operator char const ( void ) const
+ ) {
+ return string_[0];
+ }
+
+ CONTRACT_FUNCTION( // Implicit type conversion operator (symbolic type).
+ public operator(char const*)(char_const_ptr) ( void ) const
+ ) {
+ return string_.c_str();
+ }
+
+ CONTRACT_FUNCTION( // Implicit type conversion operator (type with commas).
+ public template( typename T, class Allocator )
+ operator(std::vector<T, Allocator>)(std_vector) ( void ) const
+ ) {
+ std::vector<T, Allocator> v(string_.size());
+ for(size_t i = 0; i < string_.size(); ++i) v[i] = string_[i];
+ return v;
+ }
+
+ CONTRACT_FUNCTION( // Comma operator (use `comma` to diff. from above).
+ public (string&) operator comma ( (string const&) right )
+ ) {
+ string_ += right.string_;
+ return *this;
+ }
+
+ // All memory operators (new, delete, new[], and delete[]) must be
+ // explicitly `static` (because pp can't inspect new[] and delete[] that
+ // could be any symbolic operator like ==, +, etc).
+
+ CONTRACT_FUNCTION(
+ public static (void*) operator new ( size_t size )
+ ) {
+ void* p = malloc(size);
+ if(p == 0) throw std::bad_alloc();
+ pointers++;
+ return p;
+ }
+
+ CONTRACT_FUNCTION(
+ public static void operator delete ( (void*) pointer )
+ ) {
+ if(pointer) {
+ free(pointer);
+ pointers--;
+ }
+ }
+
+ CONTRACT_FUNCTION(
+ public static (void*) operator(new[])(new_array) ( size_t size )
+ ) {
+ void* a = malloc(size);
+ if(a == 0) throw std::bad_alloc();
+ arrays++;
+ return a;
+ }
+
+ CONTRACT_FUNCTION(
+ public static void operator(delete[])(delete_array) ( (void*) array )
+ ) {
+ if(array) {
+ free(array);
+ arrays--;
+ }
+ }
+
+ private: std::string string_;
+};
+
+int string::pointers = 0;
+int string::arrays = 0;
+//]
+
+int main ( void )
+{
+ string const xyz("xyz");
+
+ string s("abc"); BOOST_TEST(s == string("abc"));
+ BOOST_TEST((s, xyz) == string("abcxyz"));
+
+ char x = xyz; BOOST_TEST(x == 'x');
+ char const* c_xyz = xyz; BOOST_TEST(string(c_xyz) == xyz);
+
+ std::vector<char, std::allocator<char> > v = xyz;
+ BOOST_TEST(v[0] == 'x' && v[1] == 'y' && v[2] == 'z');
+
+ string* p = new string; BOOST_TEST(string::pointers == 1);
+ delete p; BOOST_TEST(string::pointers == 0);
+
+ string* a = new string[5]; BOOST_TEST(string::arrays == 1);
+ delete[] a; BOOST_TEST(string::arrays == 0);
+
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/nested_class_bitset.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/nested_class_bitset.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,112 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/concept_check.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+//[nested_class_bitset
+CONTRACT_CLASS( // Enclosing class.
+ template( size_t N )
+ class (bitset)
+) {
+ CONTRACT_CLASS_INVARIANT_TPL(
+ static class( size() == N )
+ )
+
+ CONTRACT_CLASS_TPL( // Nested class.
+ public class (reference)
+ ) {
+ CONTRACT_CLASS_INVARIANT_TPL( bitptr_ )
+
+ friend class bitset;
+
+ CONTRACT_CLASS_TPL( // Nested (twice) class template with concepts.
+ private template( typename T )
+ requires( boost::DefaultConstructible<T> )
+ class (bit)
+ ) {
+ CONTRACT_CLASS_INVARIANT_TPL( void )
+
+ CONTRACT_CONSTRUCTOR_TPL(
+ public (bit) ( void )
+ initialize( value_() )
+ ) {}
+
+ CONTRACT_FUNCTION_TPL(
+ public void (from_bool) ( bool value )
+ postcondition( to_bool() == value )
+ ) {
+ value_ = value;
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public bool (to_bool) ( void ) const
+ ) {
+ return value_;
+ }
+
+ private: T value_;
+ };
+
+ CONTRACT_CONSTRUCTOR_TPL(
+ private (reference) ( void )
+ postcondition( bitptr_->to_bool() == int() )
+ initialize(
+ bitptr_(boost::shared_ptr<bit<int> >(new bit<int>()))
+ )
+ ) {}
+
+ CONTRACT_DESTRUCTOR_TPL(
+ public (~reference) ( void )
+ ) {}
+
+ CONTRACT_FUNCTION_TPL(
+ public operator bool ( void ) const
+ ) {
+ return bitptr_->to_bool();
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public (reference&) operator(=)(assign) ( bool const bit_value )
+ postcondition( auto result = return, result == *this )
+ ) {
+ bitptr_->from_bool(bit_value);
+ return *this;
+ }
+
+ private: boost::shared_ptr<bit<int> > bitptr_;
+ };
+
+ CONTRACT_FUNCTION_TPL(
+ public (reference) operator([])(at) ( size_t index )
+ precondition( index < N )
+ ) {
+ return bitset_[index];
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public static size_t (size) ( void )
+ ) {
+ return N;
+ }
+
+ private: reference bitset_[N];
+};
+//]
+
+int main ( void )
+{
+ bitset<2> b;
+ b[0] = true;
+ BOOST_TEST(b[0]);
+ b[1] = false;
+ BOOST_TEST(not b[1]);
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/no_contract_ivector.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/no_contract_ivector.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,48 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <vector>
+
+//[no_contract_ivector
+class ivector
+{
+ // invariant: empty() == (size() == 0)
+ // size() <= capacity()
+ // capacity() <= max_size()
+ // std::distance(begin(), end()) == int(size())
+
+ public: typedef std::vector<int>::size_type size_type;
+
+ public: explicit ivector ( size_type count )
+ // precondition: count >= 0
+ // postcondition: size() == count
+ // boost::algorithm::all_of_equal(begin(), end(), 0)
+ : vector_(count)
+ {}
+
+ public: virtual ~ivector ( void ) {}
+
+ public: void push_back ( int const value )
+ // precondition: size() < max_size()
+ // postcondition: size() == oldof size() + 1
+ // capacity() >= oldof capacity()
+ // back() == value
+ {
+ vector_.push_back(value);
+ }
+
+ private: std::vector<int> vector_;
+};
+//]
+
+int main ( void )
+{
+ ivector v(1);
+ v.push_back(123);
+ return 0;
+}
+
Added: sandbox/contract/example/contracts/no_contract_postinc.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/no_contract_postinc.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,27 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <boost/detail/lightweight_test.hpp>
+
+//[no_contract_postinc
+int const postinc ( int& value )
+ // precondition: value < std::numeric_limits<int>::max()
+ // postcondition: value == oldof value + 1
+ // result == oldof valule
+{
+ return value++;
+}
+//]
+
+int main ( void )
+{
+ int value = 1;
+ BOOST_TEST(postinc(value) == 1);
+ BOOST_TEST(value == 2);
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/no_pre_post_postinc.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/no_pre_post_postinc.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,30 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <boost/detail/lightweight_test.hpp>
+
+//[no_pre_post_postinc
+#include <contract.hpp>
+
+CONTRACT_FUNCTION( // Declare free function (for programming contracts).
+ int const (postinc) ( (int&) value ) // Non-fundamental types in `()`.
+ // precondition: value < std::numeric_limits<int>::max()
+ // postcondition: value == oldof value + 1
+ // result == oldof value
+) {
+ return value++;
+}
+//]
+
+int main ( void )
+{
+ int value = 1;
+ BOOST_TEST(postinc(value) == 1);
+ BOOST_TEST(value == 2);
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/nova.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/nova.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef NOVA_HPP_
+#define NOVA_HPP_
+
+// WARNING: This file must be included first in each compilation unit.
+
+#include <boost/config.hpp>
+
+// Force no variadic macros but avoiding macro redefinition warnings/errors.
+#ifndef BOOST_NO_VARIADIC_MACROS
+# define BOOST_NO_VARIADIC_MACROS
+#endif
+
+#endif // #include guard
+
Added: sandbox/contract/example/contracts/params_funcptr_array_apply.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/params_funcptr_array_apply.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,50 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <iostream>
+
+//[params_funcptr_array_apply
+// Contracts cannot directly use array type syntax, use via `typedef` instead.
+typedef int array_2x3[2][3];
+typedef int (*func_ptr) ( int );
+
+CONTRACT_FUNCTION(
+ void (apply) ( (func_ptr) f, (array_2x3) m )
+ // precondition: f != NULL
+ // m != NULL
+) {
+ for ( size_t i = 0; i < 2; ++i)
+ for ( size_t j = 0; j < 3; ++j)
+ m[i][j] = f(m[i][j]);
+}
+
+int offset ( int i ) { return i + 10; }
+//]
+
+int main ( void )
+{
+ //[params_funcptr_array_apply_call
+ int x[2][3] = {
+ {1, 2, 3},
+ {4, 5, 6}
+ };
+ apply(offset, x);
+ //]
+
+ BOOST_TEST(x[0][0] == 11);
+ BOOST_TEST(x[0][1] == 12);
+ BOOST_TEST(x[0][2] == 13);
+
+ BOOST_TEST(x[1][0] == 14);
+ BOOST_TEST(x[1][1] == 15);
+ BOOST_TEST(x[1][2] == 16);
+
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/params_postinc.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/params_postinc.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,37 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+//[params_postinc
+CONTRACT_FUNCTION( // Overload, storage classifiers, and default parameters.
+ long const (postinc) ( (long&) value, register unsigned offset, default 1 )
+ // precondition: value < std::numeric_limits<long>::max()
+ // postcondition: value == oldof value + offset
+ // result == oldof value
+) {
+ long result = value;
+ if(offset > 0) {
+ value += 1;
+ postinc(value, offset - 1); // Recursive calls.
+ }
+ return result;
+}
+//]
+
+int main ( void )
+{
+ //[params_postinc_call
+ long value = 1;
+ BOOST_TEST(postinc(value) == 1); // Increment of 1 (it is 1).
+ BOOST_TEST(postinc(value, 4) == 2); // Increment of 4 (it is 2).
+ BOOST_TEST(value == 6); // Incremented of 4 (it was 2).
+ //]
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/post_also_postinc.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/post_also_postinc.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,34 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <limits>
+
+//[post_also_postinc
+CONTRACT_FUNCTION(
+ int const (postinc) ( (int&) value )
+ precondition( value < std::numeric_limits<int>::max() )
+ postcondition( // Postconditions.
+ auto result = return, // Result value.
+ auto old_value = CONTRACT_OLDOF value, // Old value(s).
+ value == old_value + 1, // Assertion(s)...
+ result == old_value
+ )
+) {
+ return value++;
+}
+//]
+
+int main ( void )
+{
+ int value = 1;
+ BOOST_TEST(postinc(value) == 1);
+ BOOST_TEST(value == 2);
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/pre_only_postinc.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/pre_only_postinc.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,30 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <limits>
+
+//[pre_only_postinc
+CONTRACT_FUNCTION(
+ int const (postinc) ( (int&) value )
+ precondition( value < std::numeric_limits<int>::max() ) // Precondition.
+ // postcondition: value == oldof value + 1
+ // result == oldof value
+) {
+ return value++;
+}
+//]
+
+int main ( void )
+{
+ int value = 1;
+ BOOST_TEST(postinc(value) == 1);
+ BOOST_TEST(value == 2);
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/push_back.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/push_back.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,57 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <boost/detail/lightweight_test.hpp>
+
+//[push_back
+#include <contract.hpp> // This library.
+#include <boost/concept_check.hpp>
+#include <vector>
+#include "pushable.hpp" // Some base class.
+
+CONTRACT_CLASS(
+ template( typename T ) requires( boost::CopyConstructible<T> ) // Concepts.
+ class (vector) extends( public pushable<T> ) // Subcontracting.
+) {
+ CONTRACT_CLASS_INVARIANT_TPL(
+ empty() == (size() == 0) // More class invariants here...
+ )
+
+ public: typedef typename std::vector<T>::size_type size_type;
+ public: typedef typename std::vector<T>::const_reference const_reference;
+
+ CONTRACT_FUNCTION_TPL(
+ public void (push_back) ( (T const&) value ) override
+ precondition(
+ size() < max_size() // More preconditions here...
+ )
+ postcondition(
+ auto old_size = CONTRACT_OLDOF size(), // Old-of values.
+ size() == old_size + 1 // More postconditions here...
+ )
+ ) {
+ vector_.push_back(value); // Original function body.
+ }
+
+ // Rest of class here (possibly with more contracts)...
+ public: bool empty ( void ) const { return vector_.empty(); }
+ public: size_type size ( void ) const { return vector_.size(); }
+ public: size_type max_size ( void ) const { return vector_.max_size(); }
+ public: const_reference back ( void ) const { return vector_.back(); }
+
+ private: std::vector<T> vector_;
+};
+//]
+
+int main ( void )
+{
+ vector<int> v;
+ v.push_back(123);
+ BOOST_TEST(v.size() == 1);
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/push_back_lines.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/push_back_lines.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,47 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[push_back_lines
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+//]
+
Added: sandbox/contract/example/contracts/push_back_npaper.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/push_back_npaper.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,47 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[push_back_npaper
+// Extra spaces, newlines, etc used to align text with this library code.
+#include <concept>
+#include <vector>
+#include "pushable.hpp" // Some base class.
+
+
+template< typename T > requires CopyConstructible<T> // Concepts.
+class vector : public pushable<T> // Subcontracting.
+{
+ invariant {
+ empty() == (size() == 0); // More class invariants here...
+ }
+
+ public: typedef typename std::vector<T>::size_type size_type;
+ public: typedef typename std::vector<T>::const_reference const_reference;
+
+
+ public: void push_back ( T const& value ) override
+ precondition {
+ size() < max_size(); // More preconditions here...
+ }
+ postcondition {
+ // Old-of values use `oldof` operator.
+ size() == oldof size() + 1; // More postconditions here...
+ }
+ {
+ vector_.push_back(value); // Original function body.
+ }
+
+ // Rest of class here (with possibly more contracts)...
+ public: bool empty ( void ) const { return vector_.empty(); }
+ public: size_type size ( void ) const { return vector_.size(); }
+ public: size_type max_size ( void ) const { return vector_.max_size(); }
+ public: const_reference back ( void ) const { return vector_.back(); }
+
+ private: std::vector<T> vector_;
+};
+//]
+
Added: sandbox/contract/example/contracts/pushable.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/pushable.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,40 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef PUSHABLE_HPP_
+#define PUSHABLE_HPP_
+
+#include <contract.hpp>
+#include <boost/type_traits/has_equal_to.hpp>
+#include <vector>
+
+//[pushable
+CONTRACT_CLASS(
+ template( typename T )
+ class (pushable)
+) {
+ // Subcontracting: In `and` with derived class invariants.
+ CONTRACT_CLASS_INVARIANT_TPL( void )
+
+ public: typedef typename std::vector<T>::const_reference const_reference;
+
+ CONTRACT_FUNCTION_TPL(
+ public virtual void (push_back) ( (T const&) value ) new
+ // Subcontracting: In `or` with overriding function preconditions.
+ precondition( false ) // Force check to overriding preconditions.
+ // Subcontracting: In `and` with overriding function postconditions.
+ postcondition(
+ back() == value, requires boost::has_equal_to<T>::value
+ )
+ ) = 0; // Contract for pure virtual function.
+
+ public: virtual const_reference back ( void ) const = 0;
+};
+//]
+
+#endif // #include guard
+
Added: sandbox/contract/example/contracts/pushable_seq.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/pushable_seq.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,40 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef PUSHABLE_HPP_
+#define PUSHABLE_HPP_
+
+#include <contract.hpp>
+#include <boost/type_traits/has_equal_to.hpp>
+#include <vector>
+
+//[pushable_seq
+CONTRACT_CLASS(
+ template( (typename T) )
+ class (pushable)
+) {
+ // Subcontracting: In `and` with derived class invariants.
+ CONTRACT_CLASS_INVARIANT_TPL( (void) )
+
+ public: typedef typename std::vector<T>::const_reference const_reference;
+
+ CONTRACT_FUNCTION_TPL(
+ public virtual void (push_back) ( ((T const&) value) ) new
+ // Subcontracting: In `or` with overriding function preconditions.
+ precondition( (false) ) // Force check to overriding preconditions.
+ // Subcontracting: In `and` with overriding function postconditions.
+ postcondition(
+ (back() == value)(requires boost::has_equal_to<T>::value)
+ )
+ ) = 0; // Contract for pure virtual function.
+
+ public: virtual const_reference back ( void ) const = 0;
+};
+//]
+
+#endif // #include guard
+
Added: sandbox/contract/example/contracts/select_assertion_factorial.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/select_assertion_factorial.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,37 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+//[select_assertion_factorial
+CONTRACT_FUNCTION(
+ int (factorial) ( int n )
+ precondition( n >= 0 )
+ postcondition(
+ auto result = return,
+ result >= 1,
+ if(n == 0 or n == 1) ( // Select assertion, if-then statement.
+ result == 1
+ ) else ( // Select assertion, else statement (optional).
+ // Assertions disabled within assertion so recursion OK.
+ result == n * factorial(n - 1)
+ )
+ )
+) {
+ if(n == 0 or n == 1) return 1;
+ else return n * factorial(n - 1);
+}
+//]
+
+int main ( void )
+{
+ BOOST_TEST(factorial(4) == 24);
+ return boost::report_errors();
+}
+
+
Added: sandbox/contract/example/contracts/static_assertion_memcopy.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/static_assertion_memcopy.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,43 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <cstring>
+
+//[static_assertion_memcopy
+CONTRACT_FUNCTION(
+ template( typename To, typename From )
+ (To*) (memcopy) ( (To*) to, (From*) from )
+ precondition( // Static assertions.
+ static_assert(sizeof(To) >= sizeof(From), "destination too small"),
+ // Wrapping parenthesis for asserted condition with commas.
+ static_assert((boost::is_convertible<From, To>::value),
+ "incompatible types"),
+ to, // pointer not null
+ from // pointer not null
+ )
+) ;
+//]
+
+template< typename To, typename From >
+To* CONTRACT_FREE_BODY(memcopy)( To* to, From* from )
+{
+ memcpy(to, from, sizeof(From));
+ return to;
+}
+
+int main ( void )
+{
+ int x = 0, y = 123;
+ memcopy(&x, &y);
+ BOOST_TEST(x == 123);
+ BOOST_TEST(y == 123);
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/static_contract_instance_counter.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/static_contract_instance_counter.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,77 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+//[static_contract_instance_counter
+CONTRACT_CLASS(
+ template( typename T )
+ class (instance_counter)
+) {
+ CONTRACT_CLASS_INVARIANT_TPL(
+ object(), // Non-static class invariants.
+ static class( // Static class invariants.
+ count() >= 0
+ // ...
+ )
+ )
+
+ CONTRACT_CONSTRUCTOR_TPL(
+ public explicit (instance_counter) ( (T*) the_object )
+ precondition( the_object )
+ postcondition(
+ auto old_count = CONTRACT_OLDOF count(),
+ count() == old_count + 1,
+ object() == the_object
+ )
+ initialize( object_(the_object) )
+ ) {
+ count_++;
+ }
+
+ CONTRACT_DESTRUCTOR_TPL(
+ public virtual (~instance_counter) ( void )
+ // FUTURE: Destructors could have static postconditions.
+ // postcondition: count() = oldof count() - 1
+ ) {
+ delete object_;
+ count_--;
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public (T const* const) (object) ( void ) const
+ ) {
+ return object_;
+ }
+
+ CONTRACT_FUNCTION_TPL( // Contract static member function.
+ public static int (count) ( void )
+ // No preconditions nor postconditions for this example but when
+ // present no object can be accessed by assertions (i.e., `static`).
+ ) {
+ return count_;
+ }
+
+ private: static int count_;
+ private: T* object_;
+};
+
+template< typename T >
+int instance_counter<T>::count_ = 0;
+//]
+
+int main ( void )
+{
+ instance_counter<int> i(new int(123)), j(new int(456));
+ BOOST_TEST(i.count() == 2);
+ BOOST_TEST(j.count() == 2);
+ BOOST_TEST(*(i.object()) == 123);
+ BOOST_TEST(*(j.object()) == 456);
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/subcontract_identifiers.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/subcontract_identifiers.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,115 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <vector>
+#include <algorithm>
+
+//[subcontract_identifiers_unique
+CONTRACT_CLASS(
+ class (unique_identifiers)
+) {
+ CONTRACT_CLASS_INVARIANT( size() >= 0 )
+
+ CONTRACT_CONSTRUCTOR(
+ public (unique_identifiers) ( void )
+ postcondition( size() == 0 )
+ ) {}
+
+ CONTRACT_DESTRUCTOR(
+ public virtual (~unique_identifiers) ( void )
+ ) {}
+
+ CONTRACT_FUNCTION(
+ public virtual void (add) ( int id )
+ precondition(
+ // Id not already present.
+ std::find(begin(), end(), id) == end()
+ )
+ postcondition(
+ auto old_size = CONTRACT_OLDOF size(),
+ auto old_found = CONTRACT_OLDOF
+ std::find(begin(), end(), id) != end(),
+ // If id was not already present, it was added now...
+ old_found ? true : std::find(begin(), end(), id) != end(),
+ // ...and size was increased of 1.
+ old_found ? true : size() == old_size + 1
+ )
+ ) {
+ identifiers_.push_back(id);
+ }
+
+ // ...
+//]
+
+ public: typedef std::vector<int>::const_iterator const_iterator;
+
+ // Should contract these members too...
+ public: int size ( void ) const { return identifiers_.size(); }
+ public: const_iterator begin ( void ) const { return identifiers_.begin(); }
+ public: const_iterator end ( void ) const { return identifiers_.end(); }
+
+ protected: std::vector<int> identifiers_;
+};
+
+//[subcontract_identifiers_duplicate
+CONTRACT_CLASS(
+ class (duplicate_identifiers)
+ extends( public unique_identifiers ) // Automatically subcontract.
+) {
+ CONTRACT_CLASS_INVARIANT(
+ size() >= 1 // Strengthened inherited class invariants (in `and`).
+ )
+
+ CONTRACT_CONSTRUCTOR(
+ public (duplicate_identifiers) ( int id )
+ postcondition( size() == 1 )
+ ) {
+ // As usual, constructor should not call virtual member `add`.
+ identifiers_.push_back(id);
+ }
+
+ CONTRACT_DESTRUCTOR(
+ public virtual (~duplicate_identifiers) ( void )
+ ) {}
+
+ CONTRACT_FUNCTION(
+ public virtual void (add) ( int id )
+ precondition( // Wakened inherited preconditions (in `or`).
+ // OK even if id is already present.
+ std::find(begin(), end(), id) != end()
+ )
+ postcondition( // Strengthened inherited postconditions (in `and`).
+ auto old_size = CONTRACT_OLDOF size(),
+ auto old_found = CONTRACT_OLDOF
+ std::find(begin(), end(), id) != end(),
+ // Inherited postconditions not checked because of
+ // select assertions, plus size unchanged if already present.
+ old_found ? size() == old_size : true
+ )
+ ) {
+ if(std::find(begin(), end(), id) == end()) { // Not already present.
+ // Unfortunately, must invoke base function via `BODY` macro.
+ unique_identifiers::CONTRACT_MEMBER_BODY(add)(id);
+ }
+ }
+};
+//]
+
+int main ( void )
+{
+ //[subcontract_identifiers_duplicate_add
+ duplicate_identifiers ids(123);
+ ids.add(123);
+ //]
+ BOOST_TEST(ids.size() == 1); // Not 2 because `add(123)` has no effect.
+ ids.add(456);
+ BOOST_TEST(ids.size() == 2);
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/subcontract_pre_natural_failure.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/subcontract_pre_natural_failure.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,69 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <string>
+
+//[subcontract_pre_natural_failure
+CONTRACT_CLASS(
+ class (integer)
+) {
+ CONTRACT_CLASS_INVARIANT( void )
+
+ CONTRACT_FUNCTION(
+ public virtual void (set) ( int value )
+ // No preconditions so this and all overrides can always be called.
+ postcondition( get() == value )
+ ) {
+ value_ = value;
+ }
+
+ CONTRACT_FUNCTION(
+ public virtual int (get) ( void ) const
+ ) {
+ return value_;
+ }
+
+ private: int value_;
+};
+
+CONTRACT_CLASS(
+ class (natural) extends( public integer ) // Subcontract.
+) {
+ CONTRACT_CLASS_INVARIANT( get() >= 0 )
+
+ CONTRACT_FUNCTION(
+ public virtual void (set) ( int value )
+ precondition( value >= 0 ) // NOTE: Will not fail because of base.
+ ) {
+ integer::CONTRACT_MEMBER_BODY(set)(value);
+ }
+};
+//]
+
+void throwing_handler ( contract::from const& context ) { throw; }
+
+int main ( void )
+{
+ contract::set_class_invariant_broken(&throwing_handler);
+ bool pass = false;
+ try {
+ //[subcontract_pre_natural_failure_call
+ natural n;
+ n.set(-123); // Error: Fails call invariants instead of preconditions.
+ //]
+ } catch(contract::broken& ex) {
+ if(std::string(ex.assertion_code()) == std::string("get() >= 0"))
+ pass = true;
+ }
+#ifndef CONTRACT_CONFIG_NO_CLASS_INVARIANTS
+ BOOST_TEST(pass);
+#endif
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/template_params.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/template_params.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,64 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+
+template<
+ typename X
+ , template< typename S, typename T = S > class Y
+ , class Z = int
+ , Z V = 0
+> struct x {};
+
+//[template_params_class
+CONTRACT_CLASS( // Class template parameters.
+ template(
+ typename A // Type template parameter.
+ , int B // Value template parameter.
+ , class C, default A // Optional type template parameter.
+ , (A) D, default B // Optional value template parameter.
+ , template( // Template template parameter: Outer template
+ typename X // uses `()` but rest uses usual syntax.
+ , template< typename S, typename T = S > class Y
+ , class Z = int
+ , Z V = 0
+ ) class E, default x // Optional template template parameter.
+ )
+ struct (a)
+) {
+ // ...
+//]
+ CONTRACT_CLASS_INVARIANT_TPL( void )
+};
+
+//[template_params_function
+CONTRACT_FUNCTION( // Function template parameters.
+ template( // As usual, no default template parameters allowed in functions.
+ typename A // Type template parameter.
+ , int B // Value template parameter.
+ , class C // Type template parameter.
+ , (A) D // Value template parameter.
+ , template( // Template template parameter: Outer template
+ typename X // uses `()` but rest uses usual syntax.
+ , template< typename S, typename T = S > class Y
+ , class Z = int
+ , Z V = 0
+ ) class E
+ )
+ void (f) ( void )
+) {
+ // ...
+//]
+}
+
+int main ( void )
+{
+ a<int, 0> aa;
+ f<int, 0, double, 123, x>();
+ return 0;
+};
+
Added: sandbox/contract/example/contracts/template_specializations_vector.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/template_specializations_vector.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,128 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include "pushable.hpp"
+#include <vector>
+#include <iostream>
+
+//[template_specializations_vector
+CONTRACT_CLASS( // Not even necessary to contract this template.
+ template( typename T, class Allocator, default std::allocator<T> )
+ class (vector) extends( public pushable<T> )
+) {
+ // ...
+//]
+ CONTRACT_CLASS_INVARIANT_TPL( empty() == (size() == 0) )
+
+ public: typedef typename std::vector<T, Allocator>::size_type size_type;
+ public: typedef typename std::vector<T, Allocator>::const_reference
+ const_reference;
+
+ CONTRACT_FUNCTION_TPL(
+ public void (push_back) ( (T const&) value )
+ precondition( size() < max_size() )
+ postcondition(
+ auto old_size = CONTRACT_OLDOF size(),
+ size() == old_size + 1
+ )
+ ) {
+ std::cout << "T, Allocator" << std::endl;
+ vector_.push_back(value);
+ }
+
+ public: bool empty ( void ) const { return vector_.empty(); }
+ public: size_type size ( void ) const { return vector_.size(); }
+ public: size_type max_size ( void ) const { return vector_.max_size(); }
+ public: const_reference back ( void ) const { return vector_.back(); }
+
+ private: std::vector<T, Allocator> vector_;
+};
+
+//[template_specializations_vector_bool
+CONTRACT_CLASS( // Template specialization (no template parameter).
+ template( void )
+ class (vector) ( bool ) extends( public pushable<bool> )
+) {
+ // ...
+//]
+ CONTRACT_CLASS_INVARIANT( empty() == (size() == 0) )
+
+ public: typedef std::vector<bool>::size_type size_type;
+ public: typedef std::vector<bool>::const_reference
+ const_reference;
+
+ CONTRACT_FUNCTION(
+ public void (push_back) ( (bool const&) value )
+ precondition( size() < max_size() )
+ postcondition(
+ auto old_size = CONTRACT_OLDOF size(),
+ size() == old_size + 1
+ )
+ ) {
+ std::cout << "bool" << std::endl;
+ vector_.push_back(value);
+ }
+
+ public: bool empty ( void ) const { return vector_.empty(); }
+ public: size_type size ( void ) const { return vector_.size(); }
+ public: size_type max_size ( void ) const { return vector_.max_size(); }
+ public: const_reference back ( void ) const { return vector_.back(); }
+
+ private: std::vector<bool> vector_;
+};
+
+//[template_specializations_vector_bool_allocator
+CONTRACT_CLASS( // Template specialization (one template parameter).
+ template( class Allocator )
+ class (vector) ( bool, Allocator ) extends( public pushable<bool> )
+) {
+ // ...
+//]
+ CONTRACT_CLASS_INVARIANT_TPL( empty() == (size() == 0) )
+
+ public: typedef typename std::vector<bool, Allocator>::size_type size_type;
+ public: typedef typename std::vector<bool, Allocator>::const_reference
+ const_reference;
+
+ CONTRACT_FUNCTION_TPL(
+ public void (push_back) ( (bool const&) value )
+ precondition( size() < max_size() )
+ postcondition(
+ auto old_size = CONTRACT_OLDOF size(),
+ size() == old_size + 1
+ )
+ ) {
+ std::cout << "bool, Allocator" << std::endl;
+ vector_.push_back(value);
+ }
+
+ public: bool empty ( void ) const { return vector_.empty(); }
+ public: size_type size ( void ) const { return vector_.size(); }
+ public: size_type max_size ( void ) const { return vector_.max_size(); }
+ public: const_reference back ( void ) const { return vector_.back(); }
+
+ private: std::vector<bool, Allocator> vector_;
+};
+
+int main ( void )
+{
+ vector<int> v;
+ v.push_back(123);
+ std::cout << v.size() << std::endl;
+
+ vector<bool> b;
+ b.push_back(true);
+ std::cout << b.size() << std::endl;
+
+ vector<bool, std::allocator<char> > bc;
+ bc.push_back(true);
+ std::cout << bc.size() << std::endl;
+
+ return 0;
+}
+
+
Added: sandbox/contract/example/contracts/typed_counter.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/typed_counter.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,41 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+//[typed_counter
+CONTRACT_CLASS(
+ class (counter)
+) {
+ CONTRACT_CLASS_INVARIANT( void )
+
+ public: static unsigned value;
+
+ CONTRACT_FUNCTION(
+ public static int (next) ( void )
+ postcondition( // Explicit types so no Boost.Typeof.
+ auto result = return,
+ unsigned const old_value = CONTRACT_OLDOF value,
+ const( unsigned value, unsigned const old_value )
+ value == old_value + 1,
+ result == int(value)
+ )
+ ) {
+ return ++value;
+ }
+};
+
+unsigned counter::value = 0;
+//]
+
+int main ( void )
+{
+ BOOST_TEST(counter::next() == 1);
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/contracts/volatile_contract_shared_instance.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/contracts/volatile_contract_shared_instance.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,63 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+//[volatile_contract_shared_instance
+CONTRACT_CLASS(
+ template( typename T )
+ class (shared_instance)
+) {
+ CONTRACT_CLASS_INVARIANT_TPL(
+ queries() >= 0, // Non-volatile class invariants.
+ volatile class( // Volatile class invariants.
+ object()
+ // ...
+ )
+ )
+
+ CONTRACT_CONSTRUCTOR_TPL(
+ public explicit (shared_instance) ( (T*) the_object )
+ precondition( the_object )
+ postcondition( object() == the_object )
+ initialize( object_(the_object), queries_(0) )
+ ) {}
+
+ CONTRACT_DESTRUCTOR_TPL(
+ public virtual (~shared_instance) ( void )
+ ) {
+ delete object_;
+ }
+
+ CONTRACT_FUNCTION_TPL( // Contracts for volatile member function.
+ public (T const volatile* const) (object) ( void ) const volatile
+ // No preconditions nor postconditions for this example but when
+ // present object is `const volatile` within assertions.
+ ) {
+ queries_++;
+ return object_;
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public int (queries) ( void ) const
+ ) {
+ return queries_;
+ }
+
+ private: T volatile* object_;
+ private: mutable int queries_;
+};
+//]
+
+int main ( void )
+{
+ shared_instance<int> volatile i(new int(123));
+ BOOST_TEST(*(i.object()) == 123);
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/meyer97/gcd.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/meyer97/gcd.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,42 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[meyer97_gcd
+// File: gcd.cpp
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <algorithm>
+
+CONTRACT_FUNCTION( // Great common divisor of given positive integers.
+ int (gcd) ( int a, int b )
+ precondition(
+ a > 0, b > 0
+ )
+) {
+ int x = a, y = b;
+
+ CONTRACT_LOOP( while(x != y) ) { // Loop contracted with a variant.
+ // Block invariant assert loop invariant.
+ CONTRACT_BLOCK_INVARIANT( const( x ) x > 0, const( y ) y > 0 )
+ // Loop variant is non-negative and monotonically decreasing.
+ CONTRACT_LOOP_VARIANT( const( x, y ) std::max(x, y) )
+
+ // `x` and `y` have the same GCD as `a` and `b`.
+
+ if(x > y) x = x - y; else y = y - x;
+ }
+ return x;
+}
+
+int main ( void )
+{
+ BOOST_TEST(gcd(12, 18) == 6);
+ BOOST_TEST(gcd(4, 14) == 2);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/meyer97/gcd.e
==============================================================================
--- (empty file)
+++ sandbox/contract/example/meyer97/gcd.e 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,42 @@
+
+-- Copyright (C) 2008-2012 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).
+-- Documentation at http://contractpp.sourceforge.net.
+
+//[meyer97_gcd_e
+-- File: gcd.e
+-- Extra spaces, newlines, etc used to align text with this library code.
+
+
+
+-- Greatest common divisor of a and b.
+gcd ( a, b : INTEGER ) : INTEGER is
+ require
+ a > 0; b > 0
+ local
+ x, y : INTEGER
+ do
+ from
+ x := a; y := b
+ invariant
+ x > 0; y > 0
+ variant
+ x.max(y)
+ until
+ x = y
+ loop
+ if x > y then x := x - y else y := y - x end
+ end
+ Result := x
+ end
+
+
+
+
+
+
+
+//]
+
Added: sandbox/contract/example/meyer97/maxarray.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/meyer97/maxarray.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,44 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[meyer97_maxarray
+// File: maxarray.cpp
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <algorithm>
+
+CONTRACT_FUNCTION(
+ int (maxarray) ( (int const* const) array, (size_t const&) size )
+ precondition(
+ array, // array allocated
+ size >= 1 // size in range
+ )
+) {
+ int maxnow = array[0];
+ CONTRACT_LOOP( for(size_t i = 0; i < (size - 1); ++i) ) {
+ // Nested loop (with variant) used to assert enclosing loop invariants.
+ CONTRACT_LOOP( for(size_t j = 0; j < i; ++j) ) {
+ CONTRACT_LOOP_VARIANT( const( i, j ) i - j )
+ CONTRACT_BLOCK_INVARIANT( const( maxnow, array, j )
+ maxnow >= array[j] )
+ }
+ // -2 because starts from 0 (not 1) and already done element at 0.
+ CONTRACT_LOOP_VARIANT( const( size, i ) size - i - 2 )
+
+ maxnow = std::max(maxnow, array[i]);
+ }
+ return maxnow;
+}
+
+int main ( void )
+{
+ int a[] = {1, 5, 3};
+ BOOST_TEST(maxarray(a, 3) == 5);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/meyer97/stack3.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/meyer97/stack3.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,164 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[meyer97_stack3
+// File: stack3.cpp
+#include "stack4.hpp"
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+CONTRACT_CLASS( // Dispenser LIFO and max capacity using error codes.
+ template( typename T )
+ class (stack3)
+) {
+ CONTRACT_CLASS_INVARIANT_TPL( void ) // no class invariant
+
+ public: enum Error { // Error codes.
+ NO_ERROR = 0,
+ OVERFLOW_ERROR,
+ UNDERFLOW_ERROR,
+ SIZE_ERROR
+ };
+
+ // Initialization.
+
+ // Create stack for max of n elements, if n < 0 set error (no precondition).
+ CONTRACT_CONSTRUCTOR_TPL(
+ public (stack3) ( (const int&) n, (const T&) none, default T() )
+ postcondition(
+ bool(n < 0) == (error() == SIZE_ERROR), // error if impossible
+ bool(n >= 0) == !error(), // no error if possible
+ if(bool(!error())) ( capacity() == n ) // created if no error
+ )
+ initialize( none_(none), representation_(0), error_(NO_ERROR) )
+ ) {
+ if(n >= 0) representation_ = stack4<T>(n);
+ else error_ = SIZE_ERROR;
+ }
+
+ CONTRACT_DESTRUCTOR_TPL( // Destroy stack.
+ public virtual (~stack3) ( void )
+ ) {}
+
+ // Access.
+
+ CONTRACT_FUNCTION_TPL( // Max number of stack elements.
+ public int (capacity) ( void ) const
+ ) {
+ return representation_.capacity();
+ }
+
+ CONTRACT_FUNCTION_TPL( // Number of stack elements.
+ public int (count) ( void ) const
+ ) {
+ return representation_.count();
+ }
+
+ // Top element if present, otherwise set error (no precondition).
+ CONTRACT_FUNCTION_TPL(
+ public (const T&) (item) ( void ) const
+ postcondition(
+ empty() == (error() == UNDERFLOW_ERROR), // error if impossible
+ bool(!empty() == !error()) // no error if possible
+ )
+ ) {
+ if(!empty()) {
+ error_ = NO_ERROR;
+ return representation_.item();
+ } else {
+ error_ = UNDERFLOW_ERROR;
+ return none_;
+ }
+ }
+
+ // Status report.
+
+ CONTRACT_FUNCTION_TPL( // Error indicator set by various operations.
+ public (Error) (error) ( void ) const
+ ) {
+ return error_;
+ }
+
+ CONTRACT_FUNCTION_TPL( // Is stack empty?
+ public bool (empty) ( void ) const
+ ) {
+ return representation_.empty();
+ }
+
+ CONTRACT_FUNCTION_TPL( // Is stack full?
+ public bool (full) ( void ) const
+ ) {
+ return representation_.full();
+ }
+
+ // Element change.
+
+ // Add x to top if capacity left, otherwise set error (no precondition).
+ CONTRACT_FUNCTION_TPL(
+ public void (put) ( (const T&) x )
+ postcondition(
+ auto old_full = CONTRACT_OLDOF full(),
+ auto old_count = CONTRACT_OLDOF count(),
+ old_full == (error() == OVERFLOW_ERROR), // error if impossible
+ not old_full == not error(), // no error if possible
+ if(not error()) (
+ not empty(), // not empty if no error
+ item() == x, // added to top is no error
+ count() == old_count + 1 // one more item if no error
+ )
+ )
+ ) {
+ if(full()) {
+ error_ = OVERFLOW_ERROR;
+ } else {
+ representation_.put(x);
+ error_ = NO_ERROR;
+ }
+ }
+
+ // Remove top item if possible, otherwise set error to (no precondition).
+ CONTRACT_FUNCTION_TPL(
+ public void (remove) ( void )
+ postcondition(
+ auto old_empty = CONTRACT_OLDOF empty(),
+ auto old_count = CONTRACT_OLDOF count(),
+ old_empty == (error() == UNDERFLOW_ERROR), // if impossible
+ not old_empty == not error(), // no error if possible
+ if(not error()) (
+ not full(), // not full is no error
+ count() == old_count - 1 // one fewer item if no error
+ )
+ )
+ ) {
+ if(empty()) {
+ error_ = UNDERFLOW_ERROR;
+ } else {
+ representation_.remove();
+ error_ = NO_ERROR;
+ }
+ }
+
+ private: const T none_;
+ private: stack4<T> representation_;
+ private: mutable Error error_; // Mutable for logic constantness.
+};
+
+int main ( void )
+{
+ stack3<int> s(3);
+ BOOST_TEST(s.capacity() == 3);
+ BOOST_TEST(s.count() == 0);
+ BOOST_TEST(s.empty());
+ BOOST_TEST(not s.full());
+ s.put(123);
+ BOOST_TEST(s.item() == 123);
+ s.remove();
+ BOOST_TEST(s.empty());
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/meyer97/stack4.e
==============================================================================
--- (empty file)
+++ sandbox/contract/example/meyer97/stack4.e 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,211 @@
+
+-- Copyright (C) 2008-2012 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).
+-- Documentation at http://contractpp.sourceforge.net.
+
+//[meyer97_stack4_e
+-- File: stack4.e
+-- Extra spaces, newlines, etc used to align text with this library code.
+
+
+
+
+
+
+indexing
+ destription: "Dispenser with LIFO access policy and a fixed max capacity."
+class interface STACK4[G] creation make
+
+invariant
+ count_non_negative: count >= 0
+ count_bounded: count <= capacity
+ empty_if_no_elements: empty = (count = 0)
+
+
+feature -- Initialization.
+
+ -- Allocate stack for a maximum of n elements.
+ make ( n : INTEGER ) is
+ require
+ non_negative_capacity: n >= 0
+
+ ensure
+ capacity_set: capacity = n
+
+ end
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+feature -- Access.
+
+ -- Max number of stack elements.
+ capacity : INTEGER
+
+
+ -- Number of stack elements.
+ count : INTEGER
+
+
+ -- Top element
+ item : G is
+ require
+ not_empty: not empty -- i.e., count > 0
+
+ end
+
+feature -- Status report.
+
+ -- Is stack empty?
+ empty : BOOLEAN is
+ ensure
+
+ empty_definition: result = (count = 0)
+
+ end
+
+ -- Is stack full?
+ full : BOOLEAN is
+ ensure
+
+ full_definition: result = (count = capacity)
+
+ end
+
+feature -- Element change.
+
+ -- Add x on top.
+ put ( x : G ) is
+ require
+ not_full: not full
+
+ ensure
+
+ not_empty: not empty
+ added_to_top: item = x
+ one_more_item: count = old count + 1
+
+ end
+
+ -- Remove top element.
+ remove is
+ require
+ not_empty: not empty -- i.e., count > 0
+
+ ensure
+
+ not_full: not full
+ one_fewer_item: count = old count - 1
+
+ end
+
+
+
+
+end -- class interface STACK4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+//]
+
Added: sandbox/contract/example/meyer97/stack4.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/meyer97/stack4.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,212 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[meyer97_stack4_header
+// File: stack4.hpp
+#ifndef STACK4_HPP_
+#define STACK4_HPP_
+
+#include <contract.hpp>
+
+// Specification.
+
+CONTRACT_CLASS( // Dispenser with LIFO access policy and a fixed max capacity.
+ template( typename T )
+ class (stack4)
+) {
+ CONTRACT_CLASS_INVARIANT_TPL(
+ count() >= 0, // count non negative
+ count() <= capacity(), // count bounded
+ empty() == (count() == 0) // empty if no elements
+ )
+
+ // Initialization.
+
+ CONTRACT_CONSTRUCTOR_TPL( // Allocate stack for a maximum of n elements.
+ public explicit (stack4) ( (const int&) n )
+ precondition(
+ n >= 0 // non negative capacity
+ )
+ postcondition(
+ capacity() == n // capacity set
+ )
+ ) ; // Deferred body definition (see bottom).
+
+ CONTRACT_CONSTRUCTOR_TPL( // Deep copy.
+ public (stack4) ( (const stack4&) right )
+ postcondition(
+ capacity() == right.capacity(),
+ count() == right.count()
+ // all items equal right's items one by one
+ )
+ ) ;
+
+ CONTRACT_FUNCTION_TPL( // Deep assignment.
+ public (stack4&) operator(=)(assign) ( (const stack4&) right )
+ postcondition(
+ capacity() == right.capacity(),
+ count() == right.count()
+ // all items equal right's items one by one
+ )
+ ) ;
+
+ CONTRACT_DESTRUCTOR_TPL( // Destroy this stack.
+ public virtual (~stack4) ( void )
+ ) ;
+
+ // Access.
+
+ CONTRACT_FUNCTION_TPL( // Max number of stack elements.
+ public int (capacity) ( void ) const
+ ) ;
+
+ CONTRACT_FUNCTION_TPL( // Number of stack elements.
+ public int (count) ( void ) const
+ ) ;
+
+ CONTRACT_FUNCTION_TPL( // Top element.
+ public (const T&) (item) ( void ) const
+ precondition(
+ not empty() // not empty (i.e., count > 0)
+ )
+ ) ;
+
+ // Status report.
+
+ CONTRACT_FUNCTION_TPL( // Is stack empty?
+ public bool (empty) ( void ) const
+ postcondition(
+ auto result = return,
+ result == (count() == 0) // empty definition
+ )
+ ) ;
+
+ CONTRACT_FUNCTION_TPL( // Is stack full?
+ public bool (full) ( void ) const
+ postcondition(
+ auto result = return,
+ result == (count() == capacity()) // full definition
+ )
+ ) ;
+
+ // Element change.
+
+ CONTRACT_FUNCTION_TPL( // Add x on top.
+ public void (put) ( (const T&) x )
+ precondition(
+ not full() // not full
+ )
+ postcondition(
+ auto old_count = CONTRACT_OLDOF count(),
+ not empty(), // not empty
+ item() == x, // added to top
+ count() == old_count + 1 // one more item
+ )
+ ) ;
+
+ CONTRACT_FUNCTION_TPL( // Remove top item.
+ public void (remove) ( void )
+ precondition(
+ not empty() // not empty (i.e., count > 0)
+ )
+ postcondition(
+ auto old_count = CONTRACT_OLDOF count(),
+ not full(), // not full
+ count() == old_count - 1 // one fewer item
+ )
+ ) ;
+
+ private: int capacity_;
+ private: int count_;
+ private: T* representation_; // Using C-style array.
+};
+
+// Implementation.
+
+template< typename T >
+CONTRACT_CONSTRUCTOR_BODY(stack4<T>, stack4) ( const int& n )
+{
+ capacity_ = n;
+ count_ = 0;
+ representation_ = new T[n];
+}
+
+template< typename T >
+CONTRACT_CONSTRUCTOR_BODY(stack4<T>, stack4) ( const stack4& right )
+{
+ capacity_ = right.capacity_;
+ count_ = right.count_;
+ representation_ = new T[right.capacity_];
+ for(int i = 0; i < right.count_; ++i)
+ representation_[i] = right.representation_[i];
+}
+
+template< typename T >
+stack4<T>& stack4<T>::CONTRACT_MEMBER_BODY(operator(=)(assign)) (
+ const stack4& right )
+{
+ delete[] representation_;
+ capacity_ = right.capacity_;
+ count_ = right.count_;
+ representation_ = new T[right.capacity_];
+ for(int i = 0; i < right.count_; ++i)
+ representation_[i] = right.representation_[i];
+ return *this;
+}
+
+template< typename T >
+CONTRACT_DESTRUCTOR_BODY(stack4<T>, ~stack4) ( void )
+{
+ delete[] representation_;
+}
+
+template< typename T >
+int stack4<T>::CONTRACT_MEMBER_BODY(capacity) ( void ) const
+{
+ return capacity_;
+}
+
+template< typename T >
+int stack4<T>::CONTRACT_MEMBER_BODY(count) ( void ) const
+{
+ return count_;
+}
+
+template< typename T >
+const T& stack4<T>::CONTRACT_MEMBER_BODY(item) ( void ) const
+{
+ return representation_[count() - 1];
+}
+
+template< typename T >
+bool stack4<T>::CONTRACT_MEMBER_BODY(empty) ( void ) const
+{
+ return count() == 0;
+}
+
+template< typename T >
+bool stack4<T>::CONTRACT_MEMBER_BODY(full) ( void ) const
+{
+ return count() == capacity();
+}
+
+template< typename T >
+void stack4<T>::CONTRACT_MEMBER_BODY(put) ( const T& x )
+{
+ representation_[count_++] = x;
+}
+
+template< typename T >
+void stack4<T>::CONTRACT_MEMBER_BODY(remove) ( void )
+{
+ --count_;
+}
+
+#endif // #include guard
+//]
+
+
Added: sandbox/contract/example/meyer97/stack4_main.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/meyer97/stack4_main.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,27 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[meyer97_stack4_main
+// File: stack4_main.cpp
+#include "stack4.hpp"
+#include <boost/detail/lightweight_test.hpp>
+
+int main ( void )
+{
+ stack4<int> s(3);
+ BOOST_TEST(s.capacity() == 3);
+ BOOST_TEST(s.count() == 0);
+ s.put(123);
+ BOOST_TEST(not s.empty());
+ BOOST_TEST(not s.full());
+ BOOST_TEST(s.item() == 123);
+ s.remove();
+ BOOST_TEST(s.empty());
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/mitchell02/counter/counter.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/mitchell02/counter/counter.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,59 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[mitchell02_counter_header
+// File: counter/counter.hpp
+#ifndef COUNTER_HPP_
+#define COUNTER_HPP_
+
+#include "../observer/subject.hpp"
+#include <contract.hpp>
+
+CONTRACT_CLASS( // Positive integer counter.
+ class (counter) extends( public subject )
+) {
+ CONTRACT_CLASS_INVARIANT( void ) // no invariants
+
+ // Creation.
+
+ CONTRACT_CONSTRUCTOR( // Construct counter with specified value.
+ public explicit (counter) ( int const a_value, default 10 )
+ postcondition( value() == a_value ) // value set
+ initialize( value_(a_value) )
+ ) {}
+
+ CONTRACT_DESTRUCTOR( // Destroy counter.
+ public virtual (~counter) ( void )
+ ) {}
+
+ // Queries.
+
+ CONTRACT_FUNCTION( // Current counter value.
+ public int (value) ( void ) const
+ ) {
+ return value_;
+ }
+
+ // Commands.
+
+ CONTRACT_FUNCTION( // Decrement counter value.
+ public void (decrement) ( void )
+ postcondition(
+ auto old_value = CONTRACT_OLDOF value(),
+ value() == old_value - 1 // decremented
+ )
+ ) {
+ --value_;
+ notify(); // Notifies all attached observers.
+ }
+
+ private: int value_;
+};
+
+#endif // #include guard
+//]
+
Added: sandbox/contract/example/mitchell02/counter/decrement_button.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/mitchell02/counter/decrement_button.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,76 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[mitchell02_decrement_button_header
+// File: counter/decrement_button.hpp
+#ifndef DECREMENT_BUTTON_HPP_
+#define DECREMENT_BUTTON_HPP_
+
+#include "push_button.hpp"
+#include "counter.hpp"
+#include "../observer/observer.hpp"
+#include <contract.hpp>
+#include <boost/utility.hpp>
+
+CONTRACT_CLASS( // Button that decrements counter.
+ class (decrement_button) final // Contract for final class.
+ extends( public push_button, protected observer, boost::noncopyable )
+) {
+ CONTRACT_CLASS_INVARIANT( void ) // no invariant
+
+ // Creation.
+
+ CONTRACT_CONSTRUCTOR( // Create button associated with given counter.
+ public explicit (decrement_button) ( (counter&) the_counter )
+ postcondition(
+ // enabled iff positive value
+ enabled() == (the_counter.value() > 0)
+ )
+ initialize( counter_ref_(the_counter) )
+ ) {
+ counter_ref_.attach(this);
+ }
+
+ CONTRACT_DESTRUCTOR( // Destroy button.
+ public (~decrement_button) ( void )
+ ) {}
+
+ // Commands.
+
+ CONTRACT_FUNCTION(
+ public void (on_bn_clicked) ( void ) override
+ postcondition(
+ old_value = CONTRACT_OLDOF counter_ref_.value(),
+ counter_ref_.value() == old_value - 1 // counter decremented
+ )
+ ) {
+ counter_ref_.decrement();
+ }
+
+ CONTRACT_FUNCTION(
+ private bool (up_to_date_with_subject) ( void ) const override
+ ) {
+ return true; // For simplicity, always up-to-date.
+ }
+
+ CONTRACT_FUNCTION(
+ private void (update) ( void ) override
+ postcondition(
+ // enabled if positive value
+ enabled() == (counter_ref_.value() > 0)
+ )
+ ) {
+ if(counter_ref_.value() == 0) disable();
+ else enable();
+ }
+
+ private: counter& counter_ref_;
+};
+
+#endif // #include guard
+//]
+
Added: sandbox/contract/example/mitchell02/counter/push_button.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/mitchell02/counter/push_button.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,66 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[mitchell02_push_button_header
+// File: counter/push_button.hpp
+#ifndef PUSH_BUTTON_HPP_
+#define PUSH_BUTTON_HPP_
+
+#include <contract.hpp>
+
+CONTRACT_CLASS( // Basic button.
+ class (push_button)
+) {
+ CONTRACT_CLASS_INVARIANT( void ) // no invariant
+
+ // Creation.
+
+ CONTRACT_CONSTRUCTOR( // Create an enabled button.
+ public (push_button) ( void )
+ postcondition( enabled() ) // enabled
+ initialize( enabled_(true) )
+ ) {}
+
+ CONTRACT_DESTRUCTOR( // Destroy button.
+ public virtual (~push_button) ( void )
+ ) {}
+
+ // Queries.
+
+ CONTRACT_FUNCTION( // If button enabled.
+ public bool (enabled) ( void ) const
+ ) {
+ return enabled_;
+ }
+
+ // Commands.
+
+ CONTRACT_FUNCTION( // Enable this button.
+ public void (enable) ( void )
+ postcondition( enabled() ) // enabled
+ ) {
+ enabled_ = true;
+ }
+
+ CONTRACT_FUNCTION( // Disable this button.
+ public void (disable) ( void )
+ postcondition( not enabled() ) // disabled
+ ) {
+ enabled_ = false;
+ }
+
+ CONTRACT_FUNCTION( // Invoked externally when this button is clicked.
+ public virtual void (on_bn_clicked) ( void ) new
+ precondition( enabled() ) // enabled
+ ) = 0; // Contract for pure virtual function.
+
+ private: bool enabled_;
+};
+
+#endif // #include guard
+//]
+
Added: sandbox/contract/example/mitchell02/counter_main.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/mitchell02/counter_main.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,64 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[mitchell02_counter_main
+// File: counter_main.cpp
+#include "counter/counter.hpp"
+#include "counter/decrement_button.hpp"
+#include "observer/observer.hpp"
+#include <boost/detail/lightweight_test.hpp>
+
+int counter_check;
+
+CONTRACT_CLASS( // Show current value of associated counter.
+ class (view_of_counter) extends( private observer )
+) {
+ CONTRACT_CLASS_INVARIANT( void ) // no invariant
+
+ // Creation.
+
+ CONTRACT_CONSTRUCTOR( // Create viewer associated with given counter.
+ public explicit (view_of_counter) ( (counter&) the_counter )
+ initialize( counter_ref_(the_counter) )
+ ) {
+ counter_ref_.attach(this);
+ BOOST_TEST(counter_ref_.value() == counter_check);
+ }
+
+ CONTRACT_DESTRUCTOR( // Destroy viewer.
+ public virtual (~view_of_counter) ( void )
+ ) {}
+
+ CONTRACT_FUNCTION(
+ private bool (up_to_date_with_subject) ( void ) const override final
+ ) {
+ return true; // For simplicity, always up-to-date.
+ }
+
+ CONTRACT_FUNCTION(
+ private void (update) ( void ) override final // Contract final func.
+ ) {
+ BOOST_TEST(counter_ref_.value() == counter_check);
+ }
+
+ private: counter& counter_ref_;
+};
+
+int main ( void )
+{
+ counter count(counter_check = 1);
+ view_of_counter view(count);
+ decrement_button decrement(count);
+ BOOST_TEST(decrement.enabled());
+
+ counter_check--;
+ decrement.on_bn_clicked();
+ BOOST_TEST(not decrement.enabled());
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/mitchell02/courier.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/mitchell02/courier.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,49 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[mitchell02_courier
+// File: courier.cpp
+#include "courier.hpp"
+
+// Courier.
+
+double courier::min_insurance_dollar = 10.0e+6;
+
+CONTRACT_CONSTRUCTOR_BODY(courier, courier) (
+ double const an_insurance_cover_dollar )
+{
+ insurance_cover_dollar_ = an_insurance_cover_dollar;
+}
+
+CONTRACT_DESTRUCTOR_BODY(courier, ~courier) ( void ) {}
+
+double courier::CONTRACT_MEMBER_BODY(insurance_cover_dollar) ( void ) const
+ { return insurance_cover_dollar_; }
+
+void courier::CONTRACT_MEMBER_BODY(deliver) ( package& the_package,
+ std::string const destination )
+{
+ the_package.location = destination;
+ // Delivery takes 2.5 hours.
+ the_package.delivered_hour = the_package.accepted_hour + 2.5;
+}
+
+// Different courier.
+
+double different_courier::different_insurance_dollar = 20.0e+6;
+
+CONTRACT_DESTRUCTOR_BODY(different_courier, ~different_courier) ( void ) {}
+
+void different_courier::CONTRACT_MEMBER_BODY(deliver) ( package& the_package,
+ std::string const destination )
+{
+ the_package.location = destination;
+ // Delivery takes only 0.5 hours.
+ the_package.delivered_hour = the_package.accepted_hour + 0.5;
+}
+//]
+
Added: sandbox/contract/example/mitchell02/courier.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/mitchell02/courier.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,133 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[mitchell02_courier_header
+// File: courier.hpp
+#ifndef COURIER_HPP_
+#define COURIER_HPP_
+
+#include <contract.hpp>
+#include <string>
+
+struct package // Basic package information.
+{
+ public: double weight_kg; // Weight in kilograms.
+ public: std::string location; // Current location.
+ public: double accepted_hour; // Hour when it was accepted for delivery.
+ public: double delivered_hour; // Hour when it was delivered.
+
+ public: explicit package (
+ double const a_weight_kg,
+ std::string const a_location = "",
+ double const an_accepted_hour = 0.0,
+ double const a_delivered_hour = 0.0
+ )
+ : weight_kg(a_weight_kg),
+ location(a_location),
+ accepted_hour(an_accepted_hour),
+ delivered_hour(a_delivered_hour)
+ {}
+};
+
+CONTRACT_CLASS( // Basic courier for package delivery.
+ class (courier)
+) {
+ CONTRACT_CLASS_INVARIANT(
+ insurance_cover_dollar() >= min_insurance_dollar, // above min insur.
+ static class( // Static class invariants.
+ min_insurance_dollar > 0.0 // positive min insurance
+ )
+ )
+
+ public: static double min_insurance_dollar;
+
+ // Creation.
+
+ CONTRACT_CONSTRUCTOR( // Create courier with specified insurance value.
+ public explicit (courier) (
+ double const an_insurance_cover_dollar,
+ default min_insurance_dollar
+ )
+ precondition( an_insurance_cover_dollar > 0.0 ) // positive insur.
+ ) ; // Deferred body definition.
+
+ CONTRACT_DESTRUCTOR( // Destroy courier.
+ public virtual (~courier) ( void )
+ ) ;
+
+ // Queries.
+
+ CONTRACT_FUNCTION( // Return insurance cover.
+ public double (insurance_cover_dollar) ( void ) const
+ ) ;
+
+ // Commands.
+
+ CONTRACT_FUNCTION( // Deliver package to destination.
+ public virtual void (deliver) ( (package&) the_package,
+ (std::string const) destination )
+ precondition(
+ the_package.weight_kg < 5.0 // within max wight
+ )
+ postcondition(
+ double(the_package.delivered_hour - the_package.accepted_hour)
+ <= 3.0, // within max delivery time
+ the_package.location == destination // delivered at destination
+ )
+ ) ;
+
+ private: double insurance_cover_dollar_;
+};
+
+CONTRACT_CLASS( // Different courier for package delivery.
+ class (different_courier) extends( public courier )
+) {
+ CONTRACT_CLASS_INVARIANT(
+ insurance_cover_dollar() >= different_insurance_dollar,
+ static class(
+ different_insurance_dollar >= courier::min_insurance_dollar
+ )
+ )
+
+ public: static double different_insurance_dollar;
+
+ // Creation.
+
+ CONTRACT_CONSTRUCTOR( // Create currier with specified insurance value.
+ public explicit (different_courier) (
+ double const insurance_cover_dollar,
+ default different_insurance_dollar
+ )
+ precondition( insurance_cover_dollar > 0.0 )
+ initialize( courier(insurance_cover_dollar) )
+ ) {} // Cannot separated body definition because has member initializers.
+
+ CONTRACT_DESTRUCTOR( // Destroy courier.
+ public virtual (~different_courier) ( void )
+ ) ;
+
+ // Commands.
+
+ CONTRACT_FUNCTION(
+ public virtual void (deliver) ( (package&) the_package,
+ (std::string const) destination ) override final
+ precondition(
+ // Weaker precondition on weight (it can weight more).
+ the_package.weight_kg <= 8.0
+ )
+ postcondition(
+ // Stronger postcondition on delivery time (faster delivery).
+ double(the_package.delivered_hour - the_package.accepted_hour)
+ <= 2.0
+ // Inherits "delivered at destination" postcondition.
+ )
+ ) ;
+};
+
+#endif // #include guard
+//]
+
Added: sandbox/contract/example/mitchell02/courier_main.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/mitchell02/courier_main.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,23 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[mitchell02_courier_main
+// File: courier_main.cpp
+#include "courier.hpp"
+
+int main ( void )
+{
+ courier c;
+ different_courier dc;
+ package cups(3.6, "store");
+ package desk(7.2, "store");
+ c.deliver(cups, "home");
+ dc.deliver(desk, "office");
+ return 0;
+}
+//]
+
Added: sandbox/contract/example/mitchell02/customer_manager.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/mitchell02/customer_manager.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,45 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[mitchell02_customer_manager
+// File: customer_manager.cpp
+#include "customer_manager.hpp"
+#include <utility>
+
+CONTRACT_CONSTRUCTOR_BODY(customer_manager, customer_manager) ( void ) {}
+
+CONTRACT_DESTRUCTOR_BODY(customer_manager, ~customer_manager) ( void ) {}
+
+int customer_manager::CONTRACT_MEMBER_BODY(count) ( void ) const
+ { return customers_.size(); }
+
+bool customer_manager::CONTRACT_MEMBER_BODY(id_active) (
+ basic_customer_details::identifier const& id) const
+{
+ return customers_.find(id) != customers_.end();
+}
+
+std::string const& customer_manager::CONTRACT_MEMBER_BODY(name_for) (
+ basic_customer_details::identifier const& id) const
+{
+ // Find != end because of `id_active()` pre so no defensive programming.
+ return customers_.find(id)->second.name;
+}
+
+void customer_manager::CONTRACT_MEMBER_BODY(add) (
+ basic_customer_details const& details )
+ { customers_.insert(std::make_pair(details.id, customer(details))); }
+
+void customer_manager::CONTRACT_MEMBER_BODY(set_name) (
+ basic_customer_details::identifier const& id,
+ std::string const& name )
+{
+ // Find != end because of `id_active()` pre so no defensive programming.
+ customers_.find(id)->second.name = name;
+}
+//]
+
Added: sandbox/contract/example/mitchell02/customer_manager.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/mitchell02/customer_manager.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,109 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[mitchell02_customer_manager_header
+// File: customer_manager.hpp
+#ifndef CUSTOMER_MANAGER_HPP_
+#define CUSTOMER_MANAGER_HPP_
+
+#include <contract.hpp>
+#include <string>
+#include <map>
+
+class basic_customer_details // Basic customer information.
+{
+ friend class customer_manager;
+
+ public: typedef std::string identifier;
+
+ public: explicit basic_customer_details ( identifier const& an_id )
+ : id(an_id), name(), address(), birthday()
+ {}
+
+ protected: identifier id; // Customer identifier.
+ protected: std::string name; // Customer name.
+ protected: std::string address; // Customer address.
+ protected: std::string birthday; // Customer date of birth.
+};
+
+CONTRACT_CLASS( // Manage customers.
+ class (customer_manager)
+) {
+ CONTRACT_CLASS_INVARIANT( count() >= 0 ) // non-negative count
+
+ // Creation.
+
+ CONTRACT_CONSTRUCTOR(
+ public (customer_manager) ( void )
+ // LIMITATION: Cannot use member initializes because deferring
+ // body definition.
+ ) ; // Deferred body definition.
+
+ CONTRACT_DESTRUCTOR(
+ public virtual (~customer_manager) ( void )
+ ) ;
+
+ // Basic queries.
+
+ CONTRACT_FUNCTION(
+ public int (count) ( void ) const
+ // postcondition: non-negative count asserted by class invariants
+ ) ;
+
+ CONTRACT_FUNCTION( // There is a customer with given identifier.
+ public bool (id_active) (
+ (basic_customer_details::identifier const&) id ) const
+ ) ;
+
+ // Derived queries.
+
+ CONTRACT_FUNCTION( // Name of customer with given identifier.
+ public (std::string const&) (name_for) (
+ (basic_customer_details::identifier const&) id ) const
+ precondition( id_active(id) ) // id active
+ ) ;
+
+ // Commands.
+
+ CONTRACT_FUNCTION( // Add given customer.
+ public void (add) ( (basic_customer_details const&) details )
+ precondition( not id_active(details.id) ) // id not active
+ postcondition(
+ auto old_count = CONTRACT_OLDOF count(),
+ count() == old_count + 1, // count increased
+ id_active(details.id) // id active
+ )
+ ) ;
+
+ CONTRACT_FUNCTION( // Set name of customer with given identifier.
+ public void (set_name) (
+ (basic_customer_details::identifier const&) id,
+ (std::string const&) name
+ )
+ precondition( id_active(id) ) // id active
+ postcondition( name_for(id) == name ) // name set
+ ) ;
+
+ private: class agent {}; // Customer agent.
+
+ private: struct customer : basic_customer_details // Basic customer.
+ {
+ public: agent managing_agent; // Customer agent.
+ public: std::string last_contact; // Customer last contacted.
+
+ public: explicit customer ( basic_customer_details const& details )
+ : basic_customer_details(details), managing_agent(),
+ last_contact()
+ {}
+ };
+
+ private: std::map<basic_customer_details::identifier, customer> customers_;
+};
+
+#endif // #include guard
+//]
+
Added: sandbox/contract/example/mitchell02/customer_manager_main.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/mitchell02/customer_manager_main.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,26 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[mitchell02_customer_manager_main
+// File: customer_manager_main.cpp
+#include "customer_manager.hpp"
+#include <boost/detail/lightweight_test.hpp>
+
+int main ( void )
+{
+ customer_manager mgr;
+ basic_customer_details d("id1");
+
+ mgr.add(d);
+ mgr.set_name("id1", "abc");
+ BOOST_TEST(mgr.name_for("id1") == "abc");
+ BOOST_TEST(mgr.count() == 1);
+ BOOST_TEST(mgr.id_active("id1"));
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/mitchell02/dictionary.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/mitchell02/dictionary.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,98 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[mitchell02_dictionary
+// File: dictionary.cpp
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <utility>
+#include <map>
+
+CONTRACT_CLASS( // Simple dictionary.
+ template( typename Key, typename Value )
+ class (dictionary)
+) {
+ CONTRACT_CLASS_INVARIANT_TPL( count() >= 0 ) // non-negative count
+
+ // Creation.
+
+ CONTRACT_CONSTRUCTOR_TPL( // Create empty dictionary.
+ public (dictionary) ( void )
+ postcondition( count() == 0 ) // empty
+ ) {}
+
+ CONTRACT_DESTRUCTOR_TPL( // Destroy dictionary.
+ public virtual (~dictionary) ( void )
+ ) {}
+
+ // Basic queries.
+
+ CONTRACT_FUNCTION_TPL( // Number of key entires.
+ public int (count) ( void ) const
+ // postcondition: non-negative count asserted by class invariants
+ ) {
+ return items_.size();
+ }
+
+ CONTRACT_FUNCTION_TPL( // Has entry for key?
+ public bool (has) ( (Key const&) key ) const
+ postcondition(
+ auto result = return,
+ if(count() == 0) ( not result ) // empty has no key
+ )
+ ) {
+ return items_.find(key) != items_.end();
+ }
+
+ CONTRACT_FUNCTION_TPL( // Value for given key.
+ public (Value const&) (value_for) ( (Key const&) key ) const
+ precondition( has(key) ) // has key
+ ) {
+ return items_.find(key)->second;
+ }
+
+ // Commands.
+
+ CONTRACT_FUNCTION_TPL( // Put value for given key.
+ public void (put) ( (Key const&) key, (Value const&) value )
+ postcondition(
+ auto old_count = CONTRACT_OLDOF count(),
+ count() == old_count + 1, // count increased
+ has(key), // has key
+ value_for(key) == value // value for key set
+ )
+ ) {
+ items_.insert(std::make_pair(key, value));
+ }
+
+ CONTRACT_FUNCTION_TPL( // Remove value for given key.
+ public void (remove) ( (Key const&) key )
+ precondition( has(key) ) // has key
+ postcondition(
+ auto old_count = CONTRACT_OLDOF count(),
+ count() == old_count - 1, // count decreased
+ not has(key) // does not have key
+ )
+ ) {
+ items_.erase(key);
+ }
+
+ private: std::map<Key, Value> items_;
+};
+
+int main ( void )
+{
+ dictionary<std::string, int> ages;
+ BOOST_TEST(not ages.has("john"));
+ ages.put("john", 23);
+ BOOST_TEST(ages.value_for("john") == 23);
+ ages.remove("john");
+ BOOST_TEST(ages.count() == 0);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/mitchell02/name_list.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/mitchell02/name_list.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,40 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[mitchell02_name_list
+// File: name_list.cpp
+#include "name_list.hpp"
+#include <algorithm>
+
+// name_list
+
+CONTRACT_CONSTRUCTOR_BODY(name_list, name_list) ( void ) {}
+
+CONTRACT_DESTRUCTOR_BODY(name_list, ~name_list) ( void ) {}
+
+int name_list::CONTRACT_MEMBER_BODY(count) ( void ) const
+ { return names_.size(); }
+
+bool name_list::CONTRACT_MEMBER_BODY(has) ( std::string const& name ) const
+ { return names_.end() != std::find(names_.begin(), names_.end(), name); }
+
+void name_list::CONTRACT_MEMBER_BODY(put) ( std::string const& name )
+ { names_.push_back(name); }
+
+// relaxed_name_list
+
+CONTRACT_CONSTRUCTOR_BODY(relaxed_name_list, relaxed_name_list) ( void ) {}
+
+CONTRACT_DESTRUCTOR_BODY(relaxed_name_list, ~relaxed_name_list) ( void ) {}
+
+void relaxed_name_list::CONTRACT_MEMBER_BODY(put) ( std::string const& name )
+{
+ // Must use `BODY` to call base functions (to avoid infinite recursion).
+ if(!has(name)) name_list::CONTRACT_MEMBER_BODY(put)(name);
+}
+//]
+
Added: sandbox/contract/example/mitchell02/name_list.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/mitchell02/name_list.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,99 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[mitchell02_name_list_header
+// File: name_list.hpp
+#ifndef NAME_LIST_HPP_
+#define NAME_LIST_HPP_
+
+#include <contract.hpp>
+#include <string>
+#include <list>
+
+CONTRACT_CLASS( // List of names.
+ class (name_list)
+) {
+ CONTRACT_CLASS_INVARIANT( count() >= 0 ) // non-negative count
+
+ CONTRACT_CONSTRUCTOR( // Create an empty list.
+ public (name_list) ( void )
+ postcondition( count() == 0 ) // empty list
+ ) ; // Deferred body definition.
+
+ CONTRACT_DESTRUCTOR( // Destroy list.
+ public virtual (~name_list) ( void )
+ ) ;
+
+ CONTRACT_FUNCTION( // Number of names in list.
+ public int (count) ( void ) const
+ // postcondition: non-negative count already in class invariants
+ ) ;
+
+ CONTRACT_FUNCTION( // Is name in list?
+ public bool (has) ( (std::string const&) name ) const
+ postcondition(
+ auto result = return,
+ if(count() == 0) ( not result ) // does not have is empty
+ )
+ ) ;
+
+ CONTRACT_FUNCTION( // Add name to list.
+ public virtual void (put) ( (std::string const&) name )
+ precondition(
+ not has(name) // not already in list
+ )
+ postcondition(
+ auto old_has_name = CONTRACT_OLDOF has(name),
+ auto old_count = CONTRACT_OLDOF count(),
+ // Following if-guard allows to relax subcontracts.
+ if(not old_has_name) (
+ has(name), // name on list
+ count() == old_count + 1 // number of names increased
+ )
+ )
+ ) ;
+
+ private: std::list<std::string> names_;
+};
+
+CONTRACT_CLASS( // List of names that allows for duplicates.
+ class (relaxed_name_list) extends( public name_list ) // Subcontracting.
+) {
+ CONTRACT_CLASS_INVARIANT( void ) // no subcontracted invariants
+
+ // Creation.
+
+ CONTRACT_CONSTRUCTOR( // Create an empty list.
+ public (relaxed_name_list) ( void )
+ postcondition( count() == 0 )
+ ) ;
+
+ CONTRACT_DESTRUCTOR( // Destroy list.
+ public virtual (~relaxed_name_list) ( void )
+ ) ;
+
+ // Commands.
+
+ CONTRACT_FUNCTION( // Add name to list.
+ public void (put) ( (std::string const&) name )
+ precondition( // Relax inherited precondition.
+ has(name) // already in list
+ )
+ postcondition(
+ auto old_has_name = CONTRACT_OLDOF has(name),
+ auto old_count = CONTRACT_OLDOF count(),
+ // Inherited postconditions not checked because of its if-guard.
+ if(old_has_name) (
+ count() == old_count // unchanged if name already in list
+ )
+ )
+ ) ;
+};
+
+#endif // #include guard
+//]
+
Added: sandbox/contract/example/mitchell02/name_list_main.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/mitchell02/name_list_main.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,27 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[mitchell02_name_list_main
+// File: name_list_main.cpp
+#include "name_list.hpp"
+#include <boost/detail/lightweight_test.hpp>
+
+int main ( void )
+{
+ relaxed_name_list rl;
+ rl.put("abc");
+ BOOST_TEST(rl.has("abc"));
+ rl.put("abc"); // Note: Can call `put("abc")` this gain.
+
+ name_list nl;
+ nl.put("abc");
+ BOOST_TEST(nl.has("abc"));
+ // Note: Cannot call `put("abc")` again.
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/mitchell02/observer/observer.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/mitchell02/observer/observer.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,46 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[mitchell02_observer_header
+// File: observer/observer.hpp
+#ifndef OBSERVER_HPP_
+#define OBSERVER_HPP_
+
+#include <contract.hpp>
+
+CONTRACT_CLASS( // Observer.
+ class (observer)
+) {
+ CONTRACT_CLASS_INVARIANT( void ) // no invariant
+
+ friend class subject;
+
+ // Creation.
+
+ CONTRACT_CONSTRUCTOR( // Create observer.
+ public (observer) ( void )
+ ) {}
+
+ CONTRACT_DESTRUCTOR( // Destroy observer.
+ public virtual (~observer) ( void )
+ ) {}
+
+ // Commands.
+
+ CONTRACT_FUNCTION( // If up to date with its subject.
+ protected virtual bool (up_to_date_with_subject) ( void ) const new
+ ) = 0;
+
+ CONTRACT_FUNCTION( // Update and inform its subject.
+ protected virtual void (update) ( void ) new
+ postcondition( up_to_date_with_subject() ) // up-to-date
+ ) = 0;
+};
+
+#endif // #include guard
+//]
+
Added: sandbox/contract/example/mitchell02/observer/subject.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/mitchell02/observer/subject.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,151 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[mitchell02_subject_header
+// File: observer/subject.hpp
+#ifndef SUBJECT_HPP_
+#define SUBJECT_HPP_
+
+#include "observer.hpp"
+#include <contract.hpp>
+#include <list>
+#include <algorithm>
+
+// Assertion requirements used to model assertion computational complexity.
+#define O_1 0 // O(1) constant (default)
+#define O_N 1 // O(n) linear
+#define COMPLEXITY_MAX O_1
+
+CONTRACT_CLASS( // Subject for observer design pattern.
+ class (subject)
+) {
+ CONTRACT_CLASS_INVARIANT(
+ all_observers_valid(observers()), // observes valid
+ requires O_N <= COMPLEXITY_MAX
+ )
+
+ // Creation.
+
+ CONTRACT_CONSTRUCTOR( // Construct subject with no observer.
+ public (subject) ( void )
+ ) {}
+
+ CONTRACT_DESTRUCTOR( // Destroy subject.
+ public virtual (~subject) ( void )
+ ) {}
+
+ // Queries.
+
+ CONTRACT_FUNCTION( // If given observer is attached.
+ public bool (attached) ( (observer const* const) obs ) const
+ precondition( obs ) // not null
+ ) {
+ return std::find(observers_.begin(), observers_.end(), obs) !=
+ observers_.end();
+ }
+
+ // Commands.
+
+ CONTRACT_FUNCTION( // Remember given object as an observer.
+ public void (attach) ( (observer* const) obs )
+ precondition(
+ obs, // not null
+ not attached(obs) // not already attached
+ )
+ postcondition(
+ auto old_observers = CONTRACT_OLDOF observers(),
+ attached(obs), // attached
+ other_observers_unchanged(old_observers, observers(), obs),
+ // others not changed (frame rule)
+ requires O_N <= COMPLEXITY_MAX
+ )
+ ) {
+ observers_.push_back(obs);
+ }
+
+ // Queries.
+
+ CONTRACT_FUNCTION( // All observers attached to this subject.
+ protected (std::list<observer const*>) (observers) ( void ) const
+ ) {
+ // Create list of pointers to const observers.
+ std::list<const observer*> obs;
+ for(std::list<observer*>::const_iterator
+ i = observers_.begin(); i != observers_.end(); ++i) {
+ obs.push_back(*i);
+ }
+ return obs;
+ }
+
+ // Commands.
+
+ CONTRACT_FUNCTION( // Update all attached observers.
+ protected void (notify) ( void )
+ postcondition( all_observers_updated(observers()) ) // all updated
+ ) {
+ for(std::list<observer*>::iterator
+ i = observers_.begin(); i != observers_.end(); ++i) {
+ // Class invariant ensures no null pointers in observers but
+ // class invariants not checked for non-public members so check.
+ CONTRACT_BLOCK_INVARIANT( const( i ) 0 != *i ) // pointer not null
+ (*i)->update();
+ }
+ }
+
+ // Contract helpers.
+
+ CONTRACT_FUNCTION(
+ private static bool (all_observers_valid) (
+ (std::list<observer const*> const&) observers )
+ ) {
+ for(std::list<observer const*>::const_iterator
+ i = observers.begin(); i != observers.end(); ++i) {
+ if(!(*i)) return false;
+ }
+ return true;
+ }
+
+ CONTRACT_FUNCTION(
+ private bool (other_observers_unchanged) (
+ (std::list<observer const*> const&) old,
+ (std::list<observer const*> const&) now,
+ (observer const*) obs
+ ) const
+ precondition( obs ) // not null
+ ) {
+ std::list<observer const*> remaining = now;
+ std::remove(remaining.begin(), remaining.end(), obs);
+
+ std::list<observer const*>::const_iterator
+ remaining_it = remaining.begin();
+ std::list<observer const*>::const_iterator old_it = old.begin();
+ while(remaining.end() != remaining_it && old.end() != old_it) {
+ if(*remaining_it != *old_it) return false;
+ ++remaining_it;
+ ++old_it;
+ }
+ return true;
+ }
+
+ CONTRACT_FUNCTION(
+ private bool (all_observers_updated) (
+ (std::list<observer const*> const&) observers ) const
+ ) {
+ for(std::list<observer const*>::const_iterator
+ i = observers.begin(); i != observers.end(); ++i) {
+ if(!(*i)) return false;
+ if(!(*i)->up_to_date_with_subject()) return false;
+ }
+ return true;
+ }
+
+ private: std::list<observer*> observers_;
+};
+
+#endif // #include guard
+//]
+
Added: sandbox/contract/example/mitchell02/observer_main.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/mitchell02/observer_main.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,74 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[mitchell02_observer_main
+// File: observer_main.cpp
+#include "observer/observer.hpp"
+#include "observer/subject.hpp"
+#include <boost/detail/lightweight_test.hpp>
+#include <contract.hpp>
+
+int state_check; // For unit testing.
+
+class concrete_subject : public subject // Implement an actual subject.
+{
+ public: typedef int state; // Some state being observed.
+
+ public: concrete_subject ( void ) : state_() {}
+
+ public: void set_state (state const& the_state) {
+ state_ = the_state;
+ BOOST_TEST(state_ == state_check);
+ notify(); // Notify observers.
+ }
+
+ public: state get_state ( void ) const { return state_; }
+
+ private: state state_;
+};
+
+CONTRACT_CLASS( // Implement of actual observer.
+ class (concrete_observer) extends( public observer )
+) {
+ CONTRACT_CLASS_INVARIANT( void )
+
+ CONTRACT_CONSTRUCTOR( // Create concrete observer.
+ public explicit (concrete_observer) (
+ (concrete_subject const&) the_subject )
+ initialize( subject_(the_subject), observed_state_() )
+ ) {}
+
+ // Implement base virtual functions.
+
+ CONTRACT_FUNCTION(
+ private bool (up_to_date_with_subject) ( void ) const override final
+ ) {
+ return true; // For simplicity, always up-to-date.
+ }
+
+ CONTRACT_FUNCTION(
+ private void (update) ( void ) override final
+ ) {
+ observed_state_ = subject_.get_state();
+ BOOST_TEST(observed_state_ == state_check);
+ }
+
+ private: concrete_subject const& subject_;
+ private: concrete_subject::state observed_state_;
+};
+
+int main ( void )
+{
+ concrete_subject sbj;
+ concrete_observer ob(sbj);
+ sbj.attach(&ob);
+ sbj.set_state(state_check = 123);
+ sbj.set_state(state_check = 456);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/mitchell02/simple_queue.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/mitchell02/simple_queue.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,170 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[mitchell02_simple_queue
+// File: simple_queue.cpp
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <vector>
+
+// Assertion requirements used to model assertion computational complexity.
+#define O_1 0 // O(1) constant (default)
+#define O_N 1 // O(n) linear
+#define COMPLEXITY_MAX O_1
+
+CONTRACT_CLASS(
+ template( typename T )
+ class (simple_queue)
+) {
+ CONTRACT_CLASS_INVARIANT( count() >= 0 ) // non-negative count
+
+ // Creation.
+
+ CONTRACT_CONSTRUCTOR_TPL( // Create empty queue.
+ public explicit (simple_queue) ( int const the_capacity )
+ precondition( the_capacity > 0 ) // positive capacity
+ postcondition(
+ capacity() == the_capacity, // capacity set
+ is_empty() // empty
+ )
+ ) {
+ items_.reserve(the_capacity);
+ }
+
+ CONTRACT_DESTRUCTOR_TPL( // Destroy queue.
+ public virtual (~simple_queue) ( void )
+ ) {}
+
+ // Basic queries.
+
+ CONTRACT_FUNCTION_TPL( // Items in the queue (in their order).
+ public (std::vector<T> const&) (items) ( void ) const
+ ) {
+ return items_;
+ }
+
+ CONTRACT_FUNCTION_TPL( // Max number of items queue can hold.
+ public int (capacity) ( void ) const
+ ) {
+ return items_.capacity();
+ }
+
+ // Derived queries.
+
+ CONTRACT_FUNCTION_TPL( // Number of items.
+ public int (count) ( void ) const
+ postcondition(
+ auto result = return,
+ result == int(items().size()) // return items count
+ )
+ ) {
+ return items_.size();
+ }
+
+ CONTRACT_FUNCTION_TPL( // Item at head.
+ public (T const&) (head) ( void ) const
+ precondition( not is_empty() )
+ postcondition(
+ auto result = return,
+ result == items().at(0) // return item on top
+ )
+ ) {
+ return items_.at(0);
+ }
+
+ CONTRACT_FUNCTION_TPL( // If queue contains no item.
+ public bool (is_empty) ( void ) const
+ postcondition(
+ auto result = return,
+ result == (count() == 0) // consistent with count
+ )
+ ) {
+ return items_.size() == 0;
+ }
+
+ CONTRACT_FUNCTION_TPL( // If queue has no room for another item.
+ public bool (is_full) ( void ) const
+ postcondition(
+ auto result = return,
+ // consistent with size and capacity
+ result == (capacity() == int(items().size()))
+ )
+ ) {
+ return items_.size() == items_.capacity();
+ }
+
+ // Commands.
+
+ CONTRACT_FUNCTION_TPL( // Remove head item and shift all other items.
+ public void (remove) ( void )
+ precondition( not is_empty() )
+ postcondition(
+ auto old_count = CONTRACT_OLDOF count(),
+ auto old_items = CONTRACT_OLDOF items(),
+ count() == old_count - 1, // count decreased
+ // Expensive assertion to check so marked with its complexity.
+ all_equal(items(), old_items, 1 /* shifted */),
+ requires O_N <= COMPLEXITY_MAX
+ )
+ ) {
+ items_.erase(items_.begin());
+ }
+
+ CONTRACT_FUNCTION_TPL( // Add item to tail.
+ public void (put) ( (T const&) item )
+ precondition( count() < capacity() )
+ postcondition(
+ auto old_count = CONTRACT_OLDOF count(),
+ auto old_items = CONTRACT_OLDOF items(),
+ count() == old_count + 1, // count increased
+ items().at(count() - 1) == item, // second last item
+ if(count() >= 2) (
+ // Computationally expensive assertion to check.
+ all_equal(items(), old_items),
+ requires O_N <= COMPLEXITY_MAX
+ )
+ )
+ ) {
+ items_.push_back(item);
+ }
+
+ CONTRACT_FUNCTION_TPL( // Contract helper.
+ private static bool (all_equal) (
+ (std::vector<T> const&) left,
+ (std::vector<T> const&) right,
+ size_t offset, default 0
+ )
+ precondition(
+ right.size() == left.size() + offset // correct offset
+ )
+ ) {
+ for(size_t i = offset; i < right.size(); ++i)
+ if(left.at(i - offset) != right.at(i)) return false;
+ return true;
+ }
+
+ private: std::vector<T> items_;
+};
+
+int main ( void )
+{
+ simple_queue<int> q(10);
+ q.put(123);
+ q.put(456);
+ std::vector<int> const& items = q.items();
+ BOOST_TEST(items[0] == 123);
+ BOOST_TEST(items[1] == 456);
+ BOOST_TEST(q.capacity() == 10);
+ BOOST_TEST(q.head() == 123);
+ BOOST_TEST(not q.is_empty());
+ BOOST_TEST(not q.is_full());
+ q.remove();
+ BOOST_TEST(q.count() == 1);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/mitchell02/stack.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/mitchell02/stack.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,110 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[mitchell02_stack
+// File: stack.cpp
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <vector>
+
+CONTRACT_CLASS( // Simple stack.
+ template( typename T )
+ class (stack)
+) {
+ CONTRACT_CLASS_INVARIANT_TPL( count() >= 0 ) // non-negative count
+
+ // Creation.
+
+ CONTRACT_CONSTRUCTOR_TPL( // Create empty stack.
+ public (stack) ( void )
+ postcondition( count() == 0 ) // empty
+ ) {}
+
+ CONTRACT_DESTRUCTOR_TPL( // Destroy stack.
+ public virtual (~stack) ( void )
+ ) {}
+
+ // Basic queries.
+
+ CONTRACT_FUNCTION_TPL( // Number of items.
+ public int (count) ( void ) const
+ ) {
+ return items_.size();
+ }
+
+ CONTRACT_FUNCTION_TPL( // Item at index in [1, count()] (as in Eiffel).
+ public (T const&) (item_at) ( int const index ) const
+ precondition(
+ index > 0, // positive index
+ index <= count() // index within count
+ )
+ ) {
+ return items_.at(index - 1);
+ }
+
+ // Derived queries.
+
+ CONTRACT_FUNCTION_TPL( // If no items.
+ public bool (is_empty) ( void ) const
+ postcondition(
+ auto result = return,
+ result == (count() == 0) // consistent with count
+ )
+ ) {
+ return count() == 0;
+ }
+
+ CONTRACT_FUNCTION_TPL( // Top item.
+ public (T const&) (item) ( void ) const
+ precondition( count() > 0 ) // not empty
+ postcondition(
+ auto result = return,
+ result == item_at(count()) // item on top
+ )
+ ) {
+ return item_at(count());
+ }
+
+ // Commands.
+
+ CONTRACT_FUNCTION_TPL( // Push item to the top.
+ public void (put) ( (T const&) new_item )
+ postcondition(
+ auto old_count = CONTRACT_OLDOF count(),
+ count() == old_count + 1, // count increased
+ item() == new_item // item set
+ )
+ ) {
+ items_.push_back(new_item);
+ }
+
+ CONTRACT_FUNCTION_TPL( // Pop top item.
+ public void (remove) ( void )
+ precondition( count() > 0 ) // not empty
+ postcondition(
+ auto old_count = CONTRACT_OLDOF count(),
+ count() == old_count - 1 // count decreased
+ )
+ ) {
+ items_.resize(items_.size() - 1);
+ }
+
+ private: std::vector<T> items_;
+};
+
+int main ( void )
+{
+ stack<int> s;
+ BOOST_TEST(s.count() == 0);
+ s.put(123);
+ BOOST_TEST(s.item_at(1) == 123);
+ s.remove();
+ BOOST_TEST(s.is_empty());
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/n1962/block_invariant.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n1962/block_invariant.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,25 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n1962_block_invariant
+// File: block_invariant.cpp
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <iostream>
+
+int main ( void )
+{
+ int i = 0;
+ for(i = 0; i < 100; ++i)
+ {
+ CONTRACT_BLOCK_INVARIANT( const( i ) i >= 0 )
+ }
+ BOOST_TEST(i == 100);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/n1962/circle.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n1962/circle.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,57 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n1962_circle
+// File: circle.cpp
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+CONTRACT_CLASS(
+ class (shape)
+) {
+ CONTRACT_CLASS_INVARIANT( void ) // Must always specify class invariants.
+
+ CONTRACT_DESTRUCTOR(
+ public virtual (~shape) ( void )
+ ) {}
+
+ CONTRACT_FUNCTION(
+ public virtual int (compute_area) ( void ) const
+ // No base preconditions so all derived preconditions true.
+ postcondition( auto result = return, result > 0 )
+ ) = 0; // Contract for pure virtual function.
+};
+
+CONTRACT_CLASS(
+ class (circle) extends( public shape ) // Subcontract from base `shape`.
+) {
+ CONTRACT_CLASS_INVARIANT( void ) // In AND with base class invariants.
+
+ public: int radius() const { return 2; }
+
+ CONTRACT_FUNCTION( // Also using `override` specifier (optional).
+ public virtual int (compute_area) ( void ) const override
+ // Eventual preconditions in OR with base function preconditions.
+ postcondition( // In AND with base function postconditions.
+ auto result = return,
+ result == pi * radius() * radius()
+ )
+ ) {
+ return pi * radius() * radius();
+ }
+
+ private: static const int pi = 3; // Truncated from 3.14...
+};
+
+int main ( void )
+{
+ circle c;
+ BOOST_TEST(c.compute_area() == 12);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/n1962/equal.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n1962/equal.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,29 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n1962_equal_header
+// File: equal.hpp
+#ifndef EQUAL_HPP_
+#define EQUAL_HPP_
+
+#include "equal_not.hpp"
+#include <contract.hpp>
+
+CONTRACT_FUNCTION_TPL(
+ template( typename T )
+ bool operator(==)(equal) ( (T const&) left, (T const&) right )
+ postcondition(
+ auto result = return,
+ result == !(left != right)
+ )
+) {
+ return left.value == right.value;
+}
+
+#endif // #include guard
+//]
+
Added: sandbox/contract/example/n1962/equal_main.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n1962/equal_main.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,26 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n1962_equal_main
+// File: equal_main.cpp
+#include "equal.hpp"
+#include "equal_not.hpp"
+#include <boost/detail/lightweight_test.hpp>
+
+struct number { int value; };
+
+int main ( void )
+{
+ number n;
+ n.value = 123;
+
+ BOOST_TEST((n == n) == true);
+ BOOST_TEST((n != n) == false);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/n1962/equal_not.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n1962/equal_not.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,29 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n1962_equal_not_header
+// File: equal_not.hpp
+#ifndef EQUAL_NOT_HPP_
+#define EQUAL_NOT_HPP_
+
+#include "equal.hpp"
+#include <contract.hpp>
+
+CONTRACT_FUNCTION_TPL(
+ template( typename T )
+ bool operator(!=)(not_equal) ( (T const&) left, (T const&) right )
+ postcondition(
+ auto result = return,
+ result == !(left == right)
+ )
+) {
+ return left.value != right.value;
+}
+
+#endif // #include guard
+//]
+
Added: sandbox/contract/example/n1962/factorial.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n1962/factorial.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,56 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n1962_factorial
+// File: factorial.cpp
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+// Assertion requirements used to model assertion computational complexity.
+#define O_1 0 // O(1) constant (default).
+#define O_N 1 // O(n) linear.
+#define O_NN 2 // O(n * n) quadratic.
+#define O_NX 3 // O(n^x) polynomial.
+#define O_FACTN 4 // O(n!) factorial.
+#define O_EXPN 5 // O(e^n) exponential.
+#define O_ALL 10
+#define COMPLEXITY_MAX O_ALL
+
+CONTRACT_FUNCTION(
+ int (factorial) ( int n )
+ precondition(
+ n >= 0, // Non-negative natural number.
+ n <= 12 // Max function input.
+ )
+ postcondition(
+ auto result = return,
+ result >= 1,
+ if(n < 2) ( // Select assertion.
+ result == 1
+ ) else (
+ // Assertions automatically disabled within other assertions.
+ // Therefore, this postcondition can recursively call the
+ // function without causing infinite recursion.
+ result == n * factorial(n - 1),
+ // This assertion introduces significant run-time
+ // overhead (same as the function body) so assertion
+ // requirements are used to selectively disable it.
+ requires O_FACTN <= COMPLEXITY_MAX
+ )
+ )
+) {
+ if(n < 2) return 1;
+ else return n * factorial(n - 1);
+}
+
+int main ( void )
+{
+ BOOST_TEST(factorial(4) == 24);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/n1962/sqrt.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n1962/sqrt.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,31 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n1962_sqrt
+// File: sqrt.cpp
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <cmath>
+
+CONTRACT_FUNCTION( // Default value for `precision` parameter.
+ double (mysqrt) ( double x, double precision, default(1e-6) )
+ precondition( x >= 0.0 )
+ postcondition(
+ auto root = return, // Result value named `root`.
+ fabs(root * root - x) <= precision // Equal within precision.
+ )
+) {
+ return sqrt(x);
+}
+
+int main ( void )
+{
+ BOOST_TEST(fabs(mysqrt(4.0) - 2.0) <= 1e-6);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/n1962/sqrt.d
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n1962/sqrt.d 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,31 @@
+
+// Copyright (C) 2008-2012 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).
+// Documentation at http://contractpp.sourceforge.net.
+
+//[n1962_sqrt_d
+// File: sqrt.d
+// Extra spaces, newlines, etc used to align text with this library code.
+
+
+
+
+real mysqrt ( real x ) // No default parameters in D.
+ in { assert(x >= 0); }
+ out(root) {
+
+ assert(std.math.fabs(root * root - x) <= 1e6);
+ }
+body {
+ return std.math.sqrt(x);
+}
+
+
+
+
+
+
+//]
+
Added: sandbox/contract/example/n1962/sum.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n1962/sum.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,18 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n1962_sum
+// File: sum.cpp
+#include "sum.hpp"
+
+int CONTRACT_FREE_BODY(sum) ( int count, int* array ) {
+ int total = 0;
+ for(int i = 0; i < count; ++i) total += array[i];
+ return total;
+}
+//]
+
Added: sandbox/contract/example/n1962/sum.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n1962/sum.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,22 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n1962_sum_header
+// File: sum.hpp
+#ifndef SUM_HPP_
+#define SUM_HPP_
+
+#include <contract.hpp>
+
+CONTRACT_FUNCTION(
+ int (sum)( int count, (int*) array )
+ precondition( count % 4 == 0 )
+) ; // Separate body definition from function declaration (see ".cpp" file).
+
+#endif // #include guard
+//]
+
Added: sandbox/contract/example/n1962/sum_main.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n1962/sum_main.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,20 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n1962_sum_main
+// File: sum_main.cpp
+#include "sum.hpp"
+#include <boost/detail/lightweight_test.hpp>
+
+int main ( void )
+{
+ int a[8] = {1, 1, 1, 1, 1, 1, 1, 1};
+ BOOST_TEST(sum(8, a) == 8);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/n1962/vector.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n1962/vector.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,39 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n1962_vector_main
+// File: vector.cpp
+#include "vector.hpp"
+#include <boost/detail/lightweight_test.hpp>
+
+int main ( void )
+{
+ // Run a few of the operations (could test more of them...).
+ vector<char> v(3);
+ BOOST_TEST(v.size() == 3);
+ BOOST_TEST(boost::algorithm::all_of_equal(v, '\0'));
+ const vector<char>& cv = v; // A reference so no copy.
+
+ vector<char> w(v);
+ BOOST_TEST(w == v);
+
+ vector<char>::iterator b = v.begin();
+ BOOST_TEST(*b == '\0');
+
+ vector<char>::const_iterator cb = cv.begin();
+ BOOST_TEST(*cb == '\0');
+
+ v.insert(b, 2, 'a');
+ BOOST_TEST(v[0] == 'a');
+ BOOST_TEST(v[1] == 'a');
+
+ v.push_back('b');
+ BOOST_TEST(v.back() == 'b');
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/n1962/vector.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n1962/vector.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,499 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n1962_vector
+// File: vector.hpp
+#include <contract.hpp>
+#include <boost/utility.hpp>
+#include <boost/type_traits/has_equal_to.hpp>
+#include <boost/algorithm/cxx11/all_of.hpp>
+#include <boost/concept_check.hpp>
+#include <iterator>
+#include <vector>
+
+CONTRACT_CLASS( // Vector wrapper with contracts.
+ template( class T, class Allocator, default std::allocator<T> )
+ class (vector) // No base classes so no subcontracting for this example.
+) {
+ CONTRACT_CLASS_INVARIANT_TPL( // At very beginning of the class declaration.
+ empty() == (size() == 0),
+ std::distance(begin(), end()) == int(size()),
+ std::distance(rbegin(), rend()) == int(size()),
+ size() <= capacity(),
+ capacity() <= max_size()
+ ) // No static or volatile class invariants for this example.
+
+ public: typedef typename std::vector<T, Allocator>::allocator_type
+ allocator_type;
+ public: typedef typename std::vector<T, Allocator>::pointer pointer;
+ public: typedef typename std::vector<T, Allocator>::const_pointer
+ const_pointer;
+ public: typedef typename std::vector<T, Allocator>::reference reference;
+ public: typedef typename std::vector<T, Allocator>::const_reference
+ const_reference;
+ public: typedef typename std::vector<T, Allocator>::value_type value_type;
+ public: typedef typename std::vector<T, Allocator>::iterator iterator;
+ public: typedef typename std::vector<T, Allocator>::const_iterator
+ const_iterator;
+ public: typedef typename std::vector<T, Allocator>::size_type size_type;
+ public: typedef typename std::vector<T, Allocator>::difference_type
+ difference_type;
+ public: typedef typename std::vector<T, Allocator>::reverse_iterator
+ reverse_iterator;
+ public: typedef typename std::vector<T, Allocator>::const_reverse_iterator
+ const_reverse_iterator;
+
+ CONTRACT_CONSTRUCTOR_TPL(
+ public (vector) ( void ) // Always specify access level `public`, etc.
+ postcondition( not empty() )
+ initialize( vector_() ) // Member initializers.
+ ) {}
+
+ CONTRACT_CONSTRUCTOR_TPL(
+ public explicit (vector) ( (const Allocator&) allocator )
+ postcondition(
+ empty(),
+ allocator == get_allocator()
+ )
+ initialize( vector_(allocator) )
+ ) {}
+
+ CONTRACT_CONSTRUCTOR_TPL(
+ public explicit (vector) ( (size_type) count )
+ postcondition(
+ size() == count,
+ boost::algorithm::all_of_equal(begin(), end(), T()),
+ requires boost::has_equal_to<T>::value // Requirements.
+ )
+ initialize( vector_(count) )
+ ) {}
+
+ CONTRACT_CONSTRUCTOR_TPL(
+ public (vector) ( (size_type) count, (const T&) value )
+ postcondition(
+ size() == count,
+ boost::algorithm::all_of_equal(begin(), end(), value),
+ requires boost::has_equal_to<T>::value
+ )
+ initialize( vector_(count, value) )
+ ) {}
+
+ CONTRACT_CONSTRUCTOR_TPL(
+ public (vector) ( (size_type) count, (const T&) value,
+ (const Allocator&) allocator )
+ postcondition(
+ size() == count,
+ boost::algorithm::all_of_equal(begin(), end(), value),
+ requires boost::has_equal_to<T>::value,
+ allocator == get_allocator()
+ )
+ initialize( vector_(count, value, allocator) )
+ ) {}
+
+ CONTRACT_CONSTRUCTOR_TPL( // Contract with concepts.
+ public template( class Iterator )
+ requires( boost::InputIterator<Iterator> )
+ (vector) ( (Iterator) first, (Iterator) last )
+ postcondition( std::distance(first, last) == int(size()) )
+ initialize( vector_(first, last) )
+ ) {}
+
+ CONTRACT_CONSTRUCTOR_TPL(
+ public template( class Iterator )
+ requires( boost::InputIterator<Iterator> )
+ (vector) ( (Iterator) first, (Iterator) last,
+ (const Allocator&) allocator )
+ postcondition(
+ std::distance(first, last) == int(size()),
+ allocator == get_allocator()
+ )
+ initialize( vector_(first, last, allocator) )
+ ) {}
+
+ CONTRACT_CONSTRUCTOR_TPL(
+ public (vector) ( (const vector&) right )
+ postcondition(
+ right == *this, requires boost::has_equal_to<T>::value
+ )
+ initialize( vector_(right.vector_) )
+ ) {}
+
+ CONTRACT_FUNCTION_TPL( // Operator symbol and (arbitrary) name `copy`.
+ public (vector&) operator(=)(copy) ( (const vector&) right )
+ postcondition(
+ auto result = return, // Return value.
+ result == *this, requires boost::has_equal_to<T>::value,
+ result == right, requires boost::has_equal_to<T>::value
+ )
+ ) {
+ return vector_ = right.vector_;
+ }
+
+ CONTRACT_DESTRUCTOR_TPL( // Destruct contract (check class invariant).
+ public virtual (~vector) ( void )
+ ) {}
+
+ CONTRACT_FUNCTION_TPL(
+ // Wrapping parenthesis optional for keyword types `void`, `bool`, etc.
+ public void (reserve) ( (size_type) count )
+ precondition( count < max_size() )
+ postcondition( capacity() >= count )
+ ) {
+ vector_.reserve(count);
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public (size_type) (capacity) ( void ) const // Constant member.
+ postcondition( auto result = return, result >= size() )
+ ) {
+ return vector_.capacity();
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public (iterator) (begin) ( void )
+ postcondition(
+ auto result = return,
+ if(empty()) ( // Select assertions `if(...) ( ...)`.
+ result == end()
+ ) // Omitted optional `else( ... )`.
+ )
+ ) {
+ return vector_.begin();
+ }
+
+ CONTRACT_FUNCTION_TPL( // Contract overloaded function (see above).
+ public (const_iterator) (begin) ( void ) const
+ postcondition(
+ auto result = return,
+ if(empty()) ( result == end() )
+ )
+ ) {
+ return vector_.begin();
+ }
+
+ CONTRACT_FUNCTION_TPL( // Contract with no pre/post checks class invariants.
+ public (iterator) (end) ( void )
+ ) {
+ return vector_.end();
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public (const_iterator) (end) ( void ) const
+ ) {
+ return vector_.end();
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public (reverse_iterator) (rbegin) ( void )
+ postcondition(
+ auto result = return,
+ if(empty()) ( result == rend() )
+ )
+ ) {
+ return vector_.rbegin();
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public (const_reverse_iterator) (rbegin) ( void ) const
+ postcondition(
+ auto result = return,
+ if(empty()) ( result == rend() )
+ )
+ ) {
+ return vector_.rbegin();
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public (reverse_iterator) (rend) ( void )
+ ) {
+ return vector_.rend();
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public (const_reverse_iterator) (rend) ( void ) const
+ ) {
+ return vector_.rend();
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public void (resize) ( (size_type) count )
+ postcondition(
+ auto old_size = CONTRACT_OLDOF size(), // Old value (at entry).
+ size() == count,
+ if(count > old_size) (
+ boost::algorithm::all_of_equal(begin() + old_size, end(),
+ T()), requires boost::has_equal_to<T>::value
+ )
+ )
+ ) {
+ vector_.resize(count);
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public void (resize) ( (size_type) count, (T) value )
+ postcondition(
+ (size_type) old_size = CONTRACT_OLDOF size(), // With old type.
+ size() == count,
+ count > old_size ? // Ternary operator.
+ boost::algorithm::all_of_equal(begin() + old_size, end(),
+ value)
+ :
+ true
+ , requires boost::has_equal_to<T>::value
+ )
+ ) {
+ vector_.resize(count, value);
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public (size_type) (size) ( void ) const
+ postcondition( auto result = return, result <= capacity() )
+ ) {
+ return vector_.size();
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public (size_type) (max_size) ( void ) const
+ postcondition( auto result = return, result >= capacity() )
+ ) {
+ return vector_.max_size();
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public bool (empty) ( void ) const
+ postcondition(
+ auto result = return,
+ result == (size() == 0)
+ )
+ ) {
+ return vector_.empty();
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public (Allocator) (get_allocator) ( void ) const
+ ) {
+ return vector_.get_allocator();
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public (reference) (at) ( (size_type) index )
+ precondition( index < size() )
+ ) {
+ return vector_.at(index);
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public (const_reference) (at) ( (size_type) index ) const
+ precondition( index < size() )
+ ) {
+ return vector_.at(index);
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public (reference) operator([])(at) ( (size_type) index )
+ precondition( index < size() )
+ ) {
+ return vector_[index];
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public (const_reference) operator([])(at) ( (size_type) index ) const
+ precondition( index < size() )
+ ) {
+ return vector_[index];
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public (reference) (front) ( void )
+ precondition( not empty() ) // `not` instead of symbol `!`.
+ ) {
+ return vector_.front();
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public (const_reference) (front) ( void ) const
+ precondition( bool(!empty()) ) // Or, `bool` to wrap symbol `!`.
+ ) {
+ return vector_.front();
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public (reference) (back) ( void )
+ precondition( not empty() )
+ ) {
+ return vector_.back();
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public (const_reference) (back) ( void ) const
+ precondition( not empty() )
+ ) {
+ return vector_.back();
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public void (push_back) ( (const T&) value )
+ precondition( size() < max_size() )
+ postcondition(
+ auto old_size = CONTRACT_OLDOF size(),
+ auto old_capacity = CONTRACT_OLDOF capacity(),
+ back() == value, requires boost::has_equal_to<T>::value,
+ size() == old_size + 1,
+ capacity() >= old_capacity
+ )
+ ) {
+ vector_.push_back(value);
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public void (pop_back) ( void )
+ precondition( not empty() )
+ postcondition(
+ auto old_size = CONTRACT_OLDOF size(),
+ size() == old_size - 1
+ )
+ ) {
+ vector_.pop_back();
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public template( class Iterator )
+ requires( boost::InputIterator<Iterator> )
+ void (assign) ( (Iterator) first, (Iterator) last )
+ // precondition: [begin(), end()) does not contain [first, last)
+ postcondition( std::distance(first, last) == int(size()) )
+ ) {
+ vector_.assign(first, last);
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public void (assign) ( (size_type) count, (const T&) value )
+ precondition( count <= max_size() )
+ postcondition(
+ boost::algorithm::all_of_equal(begin(), end(), value),
+ requires boost::has_equal_to<T>::value
+ )
+ ) {
+ vector_.assign(count, value);
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public (iterator) (insert) ( (iterator) where, (const T&) value )
+ precondition( size() < max_size() )
+ postcondition(
+ auto result = return,
+ auto old_size = CONTRACT_OLDOF size(),
+ value == *result, requires boost::has_equal_to<T>::value,
+ size() == old_size + 1
+ // if(capacity() > oldof capacity())
+ // [begin(), end()) is invalid
+ // else
+ // [where, end()) is invalid
+ )
+ ) {
+ return vector_.insert(where, value);
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public void (insert) ( (iterator) where, (size_type) count,
+ (const T&) value )
+ precondition( size() + count < max_size() )
+ postcondition(
+ using boost::prior,
+ auto old_size = CONTRACT_OLDOF size(),
+ auto old_capacity = CONTRACT_OLDOF capacity(),
+ auto old_where = CONTRACT_OLDOF where,
+ size() == old_size + count,
+ capacity() >= old_capacity,
+ if(capacity() == old_capacity) (
+ boost::algorithm::all_of_equal(prior(old_where),
+ prior(old_where) + count, value),
+ requires boost::has_equal_to<T>::value
+ // [where, end()) is invalid
+ ) // else [begin(), end()) is invalid
+ )
+ ) {
+ vector_.insert(where, count, value);
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public template( class Iterator )
+ requires( boost::InputIterator<Iterator> )
+ void (insert) ( (iterator) where, (Iterator) first, (Iterator) last )
+ precondition(
+ // [first, last) is not contained in [begin(), end())
+ size() + std::distance(first, last) < max_size()
+ )
+ postcondition(
+ auto old_size = CONTRACT_OLDOF size(),
+ auto old_capacity = CONTRACT_OLDOF capacity(),
+ size() == old_size + std::distance(first, last),
+ capacity() >= old_capacity
+ )
+ ) {
+ vector_.insert(where, first, last);
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public (iterator) (erase) ( (iterator) where )
+ precondition(
+ not empty(),
+ where != end()
+ )
+ postcondition(
+ auto result = return,
+ auto old_size = CONTRACT_OLDOF size(),
+ size() == old_size - 1,
+ if(empty()) ( result == end() )
+ // [where, end()) is invalid
+ )
+ ) {
+ return vector_.erase(where);
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public (iterator) (erase) ( (iterator) first, (iterator) last )
+ precondition( size() >= std::distance(first, last) )
+ postcondition(
+ auto result = return,
+ auto old_size = CONTRACT_OLDOF size(),
+ size() == old_size - std::distance(first, last),
+ if(empty()) ( result == end() )
+ // [first, last) is invalid
+ )
+ ) {
+ return vector_.erase(first, last);
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public void (clear) ( void )
+ postcondition( empty() )
+ ) {
+ vector_.clear();
+ }
+
+ CONTRACT_FUNCTION_TPL(
+ public void (swap) ( (vector&) right )
+ postcondition(
+ auto old_self = CONTRACT_OLDOF *this,
+ auto old_right = CONTRACT_OLDOF right,
+ right == old_self, requires boost::has_equal_to<T>::value,
+ old_right == *this, requires boost::has_equal_to<T>::value
+ )
+ ) {
+ vector_.swap(right);
+ }
+
+ friend bool operator== ( vector const& left, vector const& right )
+ {
+ return left.vector_ == right.vector_;
+ }
+
+ private: std::vector<T, Allocator> vector_;
+};
+//]
+
Added: sandbox/contract/example/n1962/vector_npaper.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n1962/vector_npaper.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,499 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n1962_vector_npaper
+// File: vector_npaper.cpp
+// Extra spaces, newlines, etc used to align text with this library code.
+
+#include <boost/utility.hpp>
+#include <boost/algorithm/cxx11/all_of.hpp>
+#include <concepts>
+#include <iterator>
+#include <vector>
+
+
+template< class T, class Allocator = std::allocator<T> >
+class vector
+{
+ invariant {
+ empty() == (size() == 0);
+ std::distance(begin(), end()) == int(size());
+ std::distance(rbegin(), rend()) == int(size());
+ size() <= capacity();
+ capacity() <= max_size();
+ }
+
+ public: typedef typename std::vector<T, Allocator>::allocator_type
+ allocator_type;
+ public: typedef typename std::vector<T, Allocator>::pointer pointer;
+ public: typedef typename std::vector<T, Allocator>::const_pointer
+ const_pointer;
+ public: typedef typename std::vector<T, Allocator>::reference reference;
+ public: typedef typename std::vector<T, Allocator>::const_reference
+ const_reference;
+ public: typedef typename std::vector<T, Allocator>::value_type value_type;
+ public: typedef typename std::vector<T, Allocator>::iterator iterator;
+ public: typedef typename std::vector<T, Allocator>::const_iterator
+ const_iterator;
+ public: typedef typename std::vector<T, Allocator>::size_type size_type;
+ public: typedef typename std::vector<T, Allocator>::difference_type
+ difference_type;
+ public: typedef typename std::vector<T, Allocator>::reverse_iterator
+ reverse_iterator;
+ public: typedef typename std::vector<T, Allocator>::const_reverse_iterator
+ const_reverse_iterator;
+
+
+ public: vector ( void )
+ postcondition { not empty(); }
+ : vector_()
+ {}
+
+
+ public: explicit vector ( const Allocator& alllocator )
+ postcondition {
+ empty();
+ allocator == get_allocator();
+ }
+ : vector_(allocator)
+ {}
+
+
+ public: explicit vector ( size_type count )
+ postcondition {
+ size() == count;
+ boost::algorithm::all_of_equal(begin(), end(), T());
+ // Assertion requirements not supported by [N1962].
+ }
+ : vector_(count)
+ {}
+
+
+ public: vector ( size_type count, const T& value )
+ postcondition {
+ size() == count;
+ boost::algorithm::all_of_equal(begin(), end(), value);
+
+ }
+ : vector_(count, value)
+ {}
+
+
+ public: vector ( size_type count, const T& value,
+ const Allocator& allocator )
+ postcondition {
+ size() == count;
+ boost::algorithm::all_of_equal(begin(), end(), value);
+
+ allocator == get_allocator();
+ }
+ : vector_(count, value, allocator)
+ {}
+
+
+ public: template< class Iterator >
+ requires std::InputIterator<Iterator>
+ vector ( Iterator first, Iterator last )
+ postcondition { std::distance(first, last) == int(size()); }
+ : vector_(first, last)
+ {}
+
+
+ public: template< class Iterator >
+ requires std::InputIterator<Iterator>
+ vector ( Iterator first, Iterator last,
+ const Allocator& allocator )
+ postcondition {
+ std::distance(first, last) == int(size());
+ allocator == get_allocator();
+ }
+ : vector_(first, last, allocator)
+ {}
+
+
+ public: vector ( const vector& right )
+ postcondition {
+ right == *this;
+ }
+ : vector_(right.vector_)
+ {}
+
+
+ public: vector& operator= ( const vector& right )
+ postcondition(result) {
+
+ right == *this;
+ result == *this;
+ }
+ {
+ return vect_ = right.vect_;
+ }
+
+
+ public: virtual ~vector ( void )
+ {}
+
+
+
+ public: void reserve ( size_type count )
+ precondition { count < max_size(); }
+ postcondition { capacity() >= count; }
+ {
+ vector_.reserve(count);
+ }
+
+
+ public: size_type capacity ( void ) const
+ postcondition(result) { result >= size(); }
+ {
+ return vector_.capacity();
+ }
+
+
+ public: iterator begin ( void )
+ postcondition {
+
+ if(empty()) {
+ result == end();
+ }
+ }
+ {
+ return vector_.begin();
+ }
+
+
+ public: const_iterator begin ( void ) const
+ postcondition(result) {
+
+ if(empty()) { result == end(); }
+ }
+ {
+ return vector_.begin();
+ }
+
+
+ public: iterator end ( void )
+ {
+ return vector_.end();
+ }
+
+
+ public: const_iterator end ( void ) const
+ {
+ return vector_.end();
+ }
+
+
+ public: reverse_iterator rbegin ( void )
+ postcondition(result) {
+
+ if(empty()) { result == rend(); }
+ }
+ {
+ return vector_.rbegin();
+ }
+
+
+ public: const_reverse_iterator rbegin ( void ) const
+ postcondition(result) {
+
+ if(empty()) { result == rend(); }
+ }
+ {
+ return vector_.rbegin();
+ }
+
+
+ public: reverse_iterator rend ( void )
+ {
+ return vector_.rend();
+ }
+
+
+ public: const_reverse_iterator rend ( void ) const
+ {
+ return vector_.rend();
+ }
+
+
+ public: void resize ( size_type count )
+ postcondition {
+
+ size() == count;
+ if(count > oldof size()) {
+ boost::algorithm::all_of_equal(begin() + oldof size(), end(),
+ T());
+ }
+ }
+ {
+ vectcor_.resize(count);
+ }
+
+
+ public: void resize ( size_type count, T value )
+ postcondition {
+
+ size() == count;
+ count > oldof size() ?
+ boost::algorithm::all_of_equal(begin() + oldof size(), end(),
+ value)
+ :
+ true
+ ;
+ }
+ {
+ vector_.resize(count, value);
+ }
+
+
+ public: size_type size ( void ) const
+ postcondition(result) { result <= capacity(); }
+ {
+ return vector_.size();
+ }
+
+
+ public: size_type max_size ( void ) const
+ postcondition(result) { result >= capacity(); }
+ {
+ return vector_.max_size();
+ }
+
+
+ public: bool empty ( void ) const
+ postcondition(result) {
+
+ result == (size() == 0);
+ }
+ {
+ return vector_.empty();
+ }
+
+
+ public: Alloctor get_allocator ( void ) const
+ {
+ return vector_.get_allocator();
+ }
+
+
+ public: reference at ( size_type index )
+ precondition { index < size(); }
+ {
+ return vectcor_.at(index);
+ }
+
+
+ public: const_reference at ( size_type index ) const
+ precondition { index < size(); }
+ {
+ return vector_.at(index);
+ }
+
+
+ public: reference operator[] ( size_type index )
+ precondition { index < size(); }
+ {
+ return vector_[index];
+ }
+
+
+ public: const_reference operator[] ( size_type index ) const
+ precondition { index < size(); }
+ {
+ return vectcor_[index];
+ }
+
+
+ public: reference front ( void )
+ precondition { not empty(); }
+ {
+ return vectcor_.front();
+ }
+
+
+ public: const_reference front ( void ) const
+ precondition { bool(!empty()); }
+ {
+ return vector_.front();
+ }
+
+
+ public: reference back ( void )
+ precondition { not empty(); }
+ {
+ return vector_.back();
+ }
+
+
+ public: const_reference back ( void ) const
+ precondition { not empty(); }
+ {
+ return vector_.back();
+ }
+
+
+ public void push_back ( const T& value )
+ precondition { size() < max_size() }
+ postcondition {
+
+
+ static if(boost::has_equal_to<T>::value) { back() == value; }
+ size() == oldof size() + 1;
+ capacity() >= oldof capacity()
+ }
+ {
+ vector_.push_back(value);
+ }
+
+
+ public: void pop_back ( void )
+ precondition { not empty(); }
+ postcondition {
+
+ size() == oldof size() - 1;
+ }
+ {
+ vector_.pop_back();
+ }
+
+
+ public: template< class Iterator >
+ requires std::InputIterator<Iterator>
+ void assign ( Iterator first, Iterator last )
+ // precondition: [begin(), end()) does not contain [first, last)
+ postcondition { std::distance(first, last) == int(size()); }
+ {
+ vector_.assign(first, last);
+ }
+
+
+ public: void assign ( size_type count, const T& vallue )
+ precondition { count <= max_size(); }
+ postcondition {
+ boost::algorithm::all_of_equal(begin(), end(), value);
+
+ }
+ {
+ vector_.assign(count, value);
+ }
+
+
+ public: iterator insert ( iterator where, const T& value )
+ precondition { size() < max_size(); }
+ postcondition(result) {
+
+
+ value == *result;
+ size() == oldof size() + 1;
+ // if(capacity() > oldof capacity())
+ // [begin(), end()) is invalid
+ // else
+ // [where, end()) is invalid
+ }
+ {
+ return vector_.insert(where, value);
+ }
+
+
+ public: void insert ( iterator where, size_type count,
+ const T& value )
+ precondition { size() + count < max_size(); }
+ postcondition {
+
+
+
+
+ size() == oldof size() + count;
+ capacity() >= oldof capacity();
+ if(capacity() == oldof capacity()) {
+ boost::algorithm::all_of_equal(boost::prior(oldof where),
+ boost::prior(oldof where) + count, value);
+
+ // [where, end()) is invalid
+ } // else [begin(), end()) is invalid
+ }
+ {
+ vector_.insert(where, count, value);
+ }
+
+
+ public: template< class Iterator >
+ requires std::InputIterator<Iterator>
+ void insert ( iterator where, Iterator first, Iterator last )
+ precondition {
+ // [first, last) is not contained in [begin(), end())
+ size() + std::distance(first, last) < max_size();
+ }
+ postcondition {
+
+
+ size() == oldof size() + std::distance(first, last);
+ capacity() >= oldof capacity();
+ }
+ {
+ vector_.insert(where, first, last);
+ }
+
+
+ public: iterator erase ( iterator where )
+ precondition {
+ not empty();
+ where != end();
+ }
+ postcondition(result) {
+
+
+ size() == oldod size() - 1;
+ if(empty()) { result == end(); }
+ // [where, end()) is invalid
+ }
+ {
+ return vector_.erase(where);
+ }
+
+
+ public: iterator erase ( iterator first, iterator last )
+ precondition { size() >= std::distance(first, lasst); }
+ postcondition(result) {
+
+
+ size() == oldof size() - std::distance(first, last);
+ if(empty()) { result == end(); }
+ // [first, last) is invalid
+ }
+ {
+ return vector_.erase(first, last);
+ }
+
+
+ public: void clear ( void )
+ postcondition( empty() )
+ {
+ vector_.clear();
+ }
+
+
+ public: void swap ( vector& right )
+ postcondition {
+
+
+ right == oldof *this;
+ oldof right == *this;
+ }
+ {
+ vector_.swap(right);
+ }
+
+ friend bool operator== ( vector const& left, vector const& right )
+ {
+ return left.vector_ == right.vector_;
+ }
+
+ private: std::vector<T, Allocator> vector_;
+};
+//]
+
Added: sandbox/contract/example/n2081/add.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n2081/add.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,20 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n2081_add
+// File: add.cpp
+#include "add.hpp"
+#include <boost/detail/lightweight_test.hpp>
+
+int main ( void )
+{
+ int x = 10, y = 20;
+ BOOST_TEST(add(x, y) == 30);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/n2081/add.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n2081/add.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,45 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n2081_add_header
+// File: add.hpp
+#ifndef ADD_HPP
+#define ADD_HPP
+
+#include <contract.hpp>
+#include <boost/concept_check.hpp>
+#include <boost/type_traits/has_equal_to.hpp>
+
+template< typename T >
+struct Addable // User-defined concept.
+{
+ BOOST_CONCEPT_USAGE(Addable)
+ {
+ return_type(x + y); // Check addition `T operator+(T x, T y)`.
+ }
+
+private:
+ void return_type ( T const& ) {} // Used to check addition returns type `T`.
+
+ T const& x;
+ T const& y;
+};
+
+CONTRACT_FUNCTION(
+ template( typename T ) requires( Addable<T> )
+ (T) (add) ( (T const&) x, (T const&) y )
+ postcondition(
+ auto result = return,
+ result == x + y, requires boost::has_equal_to<T>::value
+ )
+) {
+ return x + y;
+}
+
+#endif // #include guard
+//]
+
Added: sandbox/contract/example/n2081/add_error.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n2081/add_error.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,25 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n2081_add_error
+// File: add_error.cpp
+#include "add.hpp"
+
+struct num
+{
+ int value;
+ num ( int v = 0 ) : value(v) {};
+};
+
+int main ( void )
+{
+ num n(10), m(20);
+ add(n, m); // Error: Correctly fails `add` concept requirements.
+ return 0;
+}
+//]
+
Added: sandbox/contract/example/n2081/advance.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n2081/advance.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,98 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n2081_advance
+// File: advance.cpp
+#include <contract.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <vector>
+#include <list>
+#include <iterator>
+
+namespace aux { // Tag dispatch helpers (in a private namespace).
+
+template< typename InputIterator, typename Distance >
+void myadvance_dispatch ( InputIterator& i, Distance n,
+ std::input_iterator_tag )
+{
+ CONTRACT_LOOP( while(n--) ) {
+ CONTRACT_LOOP_VARIANT_TPL( const( n ) n )
+ ++i;
+ }
+}
+
+template< typename BidirectionalIterator, typename Distance >
+void myadvance_dispatch ( BidirectionalIterator& i, Distance n,
+ std::bidirectional_iterator_tag )
+{
+ if(n >= 0) {
+ CONTRACT_LOOP( while(n--) ) {
+ CONTRACT_LOOP_VARIANT_TPL( const( n ) n )
+ ++i;
+ }
+ } else {
+#ifndef CONTRACT_CONFIG_NO_LOOP_VARIANTS
+ // Avoid unused variable warning when loop invariants are disabled.
+ Distance n_max = n;
+#endif
+ CONTRACT_LOOP( while(n++) ) {
+ CONTRACT_LOOP_VARIANT_TPL( const( n_max, n ) n_max - n )
+ --i;
+ }
+ }
+}
+
+template< typename RandomAccessIterator, typename Distance >
+void myadvance_dispatch ( RandomAccessIterator& i, Distance n,
+ std::random_access_iterator_tag )
+{
+ i += n;
+}
+
+} // namespace aux
+
+// Contract helper meta-function.
+template< typename T > struct is_input_iterator : boost::mpl::false_ {};
+template< > struct is_input_iterator<std::input_iterator_tag> :
+ boost::mpl::true_ {};
+
+CONTRACT_FUNCTION(
+ template( typename InputIterator, typename Distance )
+ void (myadvance) ( (InputIterator&) i, (Distance) n )
+ precondition(
+ // range [i, i + n] is non-singular.
+ if(is_input_iterator<typename std::iterator_traits<InputIterator>::
+ iterator_category>::value) (
+ n > 0 // if input iterator, n positive
+ )
+ )
+ postcondition(
+ auto old_i = CONTRACT_OLDOF i,
+ std::distance(old_i, i) == n // iterator advanced of n
+ )
+) {
+ aux::myadvance_dispatch(i, n, typename
+ std::iterator_traits<InputIterator>:: iterator_category());
+}
+
+int main ( void )
+{
+ std::vector<int> v(10);
+ v[2] = 123; v[3] = -123;
+ std::vector<int>::iterator r = v.begin(); // Random iterator.
+ myadvance(r, 3);
+ BOOST_TEST(*r == -123);
+
+ std::list<int> l(v.begin(), v.end());
+ std::list<int>::iterator b = l.begin(); // Bidirectional and not random.
+ myadvance(b, 2);
+ BOOST_TEST(*b == 123);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/n2081/apply.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n2081/apply.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,70 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n2081_apply
+// File: apply.cpp
+#include <contract.hpp>
+#include <boost/type_traits/has_equal_to.hpp>
+#include <boost/concept_check.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+// Use assertion requirements to model assertion computational complexity.
+#define O_1 0 // constant computational complexity O(1)
+#define O_BODY 10 // same computation complexity of the body
+#define COMPLEXITY_MAX O_1 // only check assertions with complexity within O(1)
+
+CONTRACT_FUNCTION( // Invoke unary functors.
+ template( typename Result, typename Argument0, typename Function )
+ requires( (boost::UnaryFunction<Function, Result, Argument0>) )
+ (Result) (apply) ( (Function) function, (Argument0) argument0,
+ (Result&) result )
+ postcondition(
+ auto return_value = return,
+ result == function(argument0),
+ requires O_BODY <= COMPLEXITY_MAX &&
+ boost::has_equal_to<Result>::value,
+ return_value == result,
+ requires boost::has_equal_to<Result>::value
+ )
+) {
+ return result = function(argument0);
+}
+
+CONTRACT_FUNCTION( // Overload to invoke binary functors.
+ template( typename Result, typename Argument0, typename Argument1,
+ typename Function )
+ requires( (boost::BinaryFunction<Function, Result, Argument0,
+ Argument1>) )
+ (Result) (apply) ( (Function) function, (Argument0) argument0,
+ (Argument1) argument1, (Result&) result )
+ postcondition(
+ auto return_value = return,
+ result == function(argument0, argument1),
+ requires O_BODY <= COMPLEXITY_MAX &&
+ boost::has_equal_to<Result>::value,
+ return_value == result,
+ requires boost::has_equal_to<Result>::value
+ )
+) {
+ return result = function(argument0, argument1);
+}
+
+int complement ( int x ) { return -x; }
+int add ( int x, int y ) { return x + y; }
+
+int main ( void )
+{
+ int r = 0;
+ apply(complement, 1, r);
+ BOOST_TEST(r == -1);
+
+ apply(add, 1, 2, r);
+ BOOST_TEST(r == 3);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/n2081/convert.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n2081/convert.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,19 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n2081_convert
+// File: convert.cpp
+#include "convert.hpp"
+#include <boost/detail/lightweight_test.hpp>
+
+int main ( void )
+{
+ BOOST_TEST(convert<int>('\0') == 0);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/n2081/convert.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n2081/convert.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,26 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n2081_convert_header
+// File: convert.hpp
+#ifndef CONVERT_HPP_
+#define CONVERT_HPP_
+
+#include <contract.hpp>
+#include <boost/concept_check.hpp>
+
+CONTRACT_FUNCTION(
+ template( typename To, typename From )
+ requires( (boost::Convertible<From, To>) )
+ (To) (convert) ( (From const&) from )
+) {
+ return from;
+}
+
+#endif // #include guard
+//]
+
Added: sandbox/contract/example/n2081/convert_error.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n2081/convert_error.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,18 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n2081_convert_error
+// File: convert_error.cpp
+#include "convert.hpp"
+
+int main ( void )
+{
+ convert<int*>(10); // Error: Correctly cannot convert type.
+ return 0;
+}
+//]
+
Added: sandbox/contract/example/n2081/count.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n2081/count.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,48 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n2081_count
+// File: count.cpp
+#include <contract.hpp>
+#include <boost/concept_check.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <vector>
+
+CONTRACT_FUNCTION(
+ template( typename Iterator )
+ requires(
+ boost::InputIterator<Iterator>,
+ boost::EqualityComparable<Iterator>,
+ boost::EqualityComparable<
+ typename boost::InputIterator<Iterator>::value_type>
+ )
+ (typename boost::InputIterator<Iterator>::difference_type) (mycount) (
+ (Iterator) first, (Iterator) last,
+ (typename boost::InputIterator<Iterator>::value_type const&) value )
+ // precondition: range [first, last) is valid
+ postcondition( auto result = return, result >= 0 )
+) {
+ typename boost::InputIterator<Iterator>::difference_type result = 0;
+ CONTRACT_LOOP( while(first != last) ) { // OK: Iterator has `==`.
+ CONTRACT_LOOP_VARIANT_TPL(
+ const( first, last ) std::distance(first, last) )
+ if(*first == value) // OK: Value is equality comparable.
+ ++result;
+ ++first; // OK: Iterator is input iterator.
+ }
+ return result; // OK: Input iterator difference is copy constructible.
+}
+
+int main ( void )
+{
+ std::vector<int> v(3);
+ v[0] = -1; v[1] = 0; v[2] = -1;
+ BOOST_TEST(mycount(v.begin(), v.end(), -1) == 2);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/n2081/deref.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n2081/deref.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,43 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n2081_deref
+// File: deref.cpp
+#include <contract.hpp>
+#include <boost/type_traits/has_equal_to.hpp>
+#include <boost/concept_check.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <vector>
+
+CONTRACT_FUNCTION(
+ template( typename Iterator )
+ requires(
+ boost::InputIterator<Iterator>,
+ boost::CopyConstructible<
+ typename boost::InputIterator<Iterator>::value_type>
+ )
+ (typename boost::InputIterator<Iterator>::value_type) (deref) (
+ (Iterator) iterator )
+ // precondition: iterator is non-singular
+ postcondition(
+ auto result = return,
+ result == *iterator, requires boost::has_equal_to<
+ typename boost::InputIterator<Iterator>::value_type>::value
+ )
+) {
+ return *iterator;
+}
+
+int main ( void )
+{
+ std::vector<int> v(1);
+ v[0] = 123;
+ BOOST_TEST(deref(v.begin()) == 123);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/n2081/equal.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n2081/equal.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,20 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n2081_equal
+// File: equal.cpp
+#include "equal.hpp"
+#include <boost/detail/lightweight_test.hpp>
+
+int main ( void)
+{
+ BOOST_TEST(equal(1, 1) == true);
+ BOOST_TEST(equal(1, 2) == false);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/n2081/equal.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n2081/equal.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,27 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n2081_equal_header
+// File: equal.hpp
+#ifndef EQUAL_HPP_
+#define EQUAL_HPP_
+
+#include <contract.hpp>
+#include <boost/concept_check.hpp>
+
+CONTRACT_FUNCTION(
+ template( typename T )
+ requires( boost::EqualityComparable<T> )
+ bool (equal) ( (T const&) left, (T const&) right )
+ postcondition( auto result = return, result == (left == right) )
+) {
+ return left == right;
+}
+
+#endif // #include guard
+//]
+
Added: sandbox/contract/example/n2081/equal_error.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n2081/equal_error.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,24 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n2081_equal_error
+// File: equal_error.cpp
+#include "equal.hpp"
+
+struct num
+{
+ int value;
+ explicit num ( int v = 0 ) : value(v) {}
+};
+
+int main ( void )
+{
+ equal(num(1), num(1)); // Compiler error.
+ return 0;
+}
+//]
+
Added: sandbox/contract/example/n2081/find.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n2081/find.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,22 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n2081_find
+// File: find.cpp
+#include "find.hpp"
+#include <boost/detail/lightweight_test.hpp>
+#include <vector>
+
+int main ( void )
+{
+ std::vector<int> ints(3);
+ ints[0] = 1; ints[1] = 2; ints[2] = 3;
+ BOOST_TEST(*myfind(ints.begin(), ints.end(), 2) == 2);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/n2081/find.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n2081/find.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,43 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n2081_find_header
+// File: find.hpp
+#ifndef FIND_HPP_
+#define FIND_HPP_
+
+#include <contract.hpp>
+#include <boost/concept_check.hpp>
+
+CONTRACT_FUNCTION(
+ template( typename Iterator )
+ requires(
+ boost::InputIterator<Iterator>,
+ boost::EqualityComparable< // Equality needed to find value.
+ typename boost::InputIterator<Iterator>::value_type>
+ )
+ (Iterator) (myfind) ( (Iterator) first, (Iterator) last,
+ (typename boost::InputIterator<Iterator>::value_type const&) value )
+ // precondition: range [first, last) is valid
+ postcondition(
+ auto result = return,
+ if(result != last) (
+ value == *result // if result not last, value found
+ )
+ )
+) {
+ CONTRACT_LOOP( while(first != last && *first != value) ) {
+ CONTRACT_LOOP_VARIANT_TPL(
+ const( first, last ) std::distance(first, last) )
+ ++first;
+ }
+ return first;
+}
+
+#endif // #include guard
+//]
+
Added: sandbox/contract/example/n2081/find_error.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n2081/find_error.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,28 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n2081_find_error
+// File: find_error.cpp
+#include "find.hpp"
+#include <vector>
+
+struct num
+{
+ int value;
+ explicit num ( int v = 0 ) : value(v) {}
+};
+
+int main ( void )
+{
+ std::vector<num> nums(3);
+ nums[0] = num(1); nums[1] = num(2); nums[2] = num(3);
+ // Error: Correctly, num does not meet concept requirements.
+ myfind(nums.begin(), nums.end(), num(2));
+ return 0;
+}
+//]
+
Added: sandbox/contract/example/n2081/for_each.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n2081/for_each.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,52 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n2081_for_each
+// File: for_each.cpp
+#include <contract.hpp>
+#include <boost/type_traits/has_equal_to.hpp>
+#include <boost/concept_check.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <vector>
+
+CONTRACT_FUNCTION(
+ template( typename Iterator, typename Function )
+ requires(
+ boost::InputIterator<Iterator>,
+ (boost::UnaryFunction<Function, void, typename
+ boost::InputIterator<Iterator>::value_type>)
+ )
+ (Function) (my_for_each) ( (Iterator) first, (Iterator) last,
+ (Function) function )
+ // precondition: range [first, last) is valid
+ postcondition(
+ auto result = return,
+ result == function, requires boost::has_equal_to<Function>::value
+ )
+) {
+ CONTRACT_LOOP( while(first < last) ) { // OK: Iterator is InputIterator.
+ CONTRACT_LOOP_VARIANT_TPL(
+ const( first, last ) std::distance(first, last) )
+ function(*first); // OK: Function is UnaryFunction.
+ ++first; // OK: Iterator is InputIterator.
+ }
+ return function;
+}
+
+int total = 0;
+void add ( int i ) { total += i; }
+
+int main ( void )
+{
+ std::vector<int> v(3);
+ v[0] = 1; v[1] = 2; v[2] = 3;
+ my_for_each(v.begin(), v.end(), add);
+ BOOST_TEST(total == 6);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/n2081/less_eq.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n2081/less_eq.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,36 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n2081_less_eq
+// File: less_eq.cpp
+#include <contract.hpp>
+#include <boost/concept_check.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+CONTRACT_FUNCTION(
+ template( typename T )
+ requires(
+ boost::EqualityComparable<T>,
+ boost::LessThanComparable<T>
+ )
+ bool (less_eq) ( (T) left, (T) right )
+ postcondition(
+ auto result = return,
+ result == (left < right || left == right)
+ )
+) {
+ return left < right || left == right;
+}
+
+int main ( void )
+{
+ BOOST_TEST(less_eq(1, 2) == true);
+ BOOST_TEST(less_eq(2, 1) == false);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/n2081/min.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n2081/min.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,20 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n2081_min
+// File: min.cpp
+#include "min.hpp"
+#include <boost/detail/lightweight_test.hpp>
+
+int main ( void )
+{
+ BOOST_TEST(min(1, 2) == 1);
+ BOOST_TEST(min(-1, -2) == -2);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/n2081/min.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n2081/min.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,31 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n2081_min_header
+// File: min.hpp
+#ifndef MIN_HPP_
+#define MIN_HPP_
+
+#include <contract.hpp>
+#include <boost/type_traits/has_equal_to.hpp>
+#include <boost/concept_check.hpp>
+
+CONTRACT_FUNCTION(
+ template( typename T ) requires( boost::LessThanComparable<T> )
+ (T const&) (min) ( (T const&) x, (T const&) y )
+ postcondition(
+ auto result = return,
+ x < y ? result == x : result == y,
+ requires boost::has_equal_to<T>::value
+ )
+) {
+ return x < y ? x : y; // OK: T is less than comparable `<`.
+}
+
+#endif // #include guard
+//]
+
Added: sandbox/contract/example/n2081/min_error.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n2081/min_error.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,24 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n2081_min_error
+// File: min_error.cpp
+#include "min.hpp"
+
+struct num
+{
+ int value;
+ explicit num ( int v = 0 ) : value(v) {}
+};
+
+int main ( void )
+{
+ min(num(1), num(2)); // Compiler error: Fail concept requirements.
+ return 0;
+}
+//]
+
Added: sandbox/contract/example/n2081/transform.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/n2081/transform.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,68 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[n2081_transform
+// File: transform.cpp
+
+#define CONTRACT_CONFIG_FUNCTION_ARITY_MAX 5 // Support for 5 parameters.
+#include <contract.hpp>
+
+#include <boost/type_traits/has_equal_to.hpp>
+#include <boost/concept_check.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <vector>
+#include <algorithm>
+
+CONTRACT_FUNCTION(
+ template(
+ typename Iterator1,
+ typename Iterator2,
+ typename ResultIterator,
+ typename Function
+ )
+ requires(
+ boost::InputIterator<Iterator1>,
+ boost::InputIterator<Iterator2>,
+ (boost::OutputIterator<ResultIterator, typename
+ boost::InputIterator<Iterator1>::value_type>),
+ (boost::BinaryFunction<Function,
+ typename boost::InputIterator<Iterator1>::value_type,
+ typename boost::InputIterator<Iterator1>::value_type,
+ typename boost::InputIterator<Iterator2>::value_type>)
+ )
+ (ResultIterator) (mytransform) (
+ (Iterator1) first1,
+ (Iterator1) last1,
+ (Iterator2) first2,
+ (ResultIterator) result,
+ (Function) function
+ )
+ // precondition: [first1, last1) is valid
+ // precondition: [first2, first2 + (last1 - first1)) is valid
+ // precondition: result is not an iterator within [first1 + 1, last1)
+ // or [first2 + 1, first2 + (last1 - first1))
+ // precondition: [result, result + (last1 - first1)) is valid
+) {
+ return std::transform(first1, last1, first2, result, function);
+}
+
+int main ( void )
+{
+ std::vector<int> v(3);
+ v[0] = 1; v[1] = 2; v[2] = 3;
+ std::vector<int> w(3);
+ w[0] = 10; w[1] = 20; w[2] = 30;
+
+ mytransform(v.begin(), v.end(), w.begin(), v.begin(), std::plus<int>());
+
+ BOOST_TEST(v[0] == 11);
+ BOOST_TEST(v[1] == 22);
+ BOOST_TEST(v[2] == 33);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/named_parameters/constructor_named_params_family.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/constructor_named_params_family.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,120 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/mpl/placeholders.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <string>
+#include <vector>
+
+namespace family {
+
+struct person
+{
+ std::string name;
+ int age;
+ double weight;
+
+ template< typename Name, typename Age, typename Weight >
+ person ( Name the_name, Age the_age, Weight the_weight )
+ : name(the_name), age(the_age), weight(the_weight)
+ {}
+
+ person& operator= ( person const& right )
+ {
+ name = right.name; age = right.age; weight = right.weight;
+ return *this;
+ }
+};
+
+} // namespace
+
+//[constructor_named_params_family
+namespace family {
+
+CONTRACT_PARAMETER(name)
+CONTRACT_PARAMETER(age)
+CONTRACT_PARAMETER(relatives)
+CONTRACT_PARAMETER(weight)
+
+CONTRACT_CLASS(
+ struct (member) extends( public person )
+) {
+ CONTRACT_CLASS_INVARIANT( void )
+
+ CONTRACT_CONSTRUCTOR(
+ public (member) (
+ in auto name,
+ in out auto age, //default 32,
+ deduce out (std::vector<person>) relatives,
+ deduce in requires(
+ boost::is_convertible<boost::mpl::_, double>
+ ) weight //, default(75.0)
+ ) // Preconditions, body, etc access arguments as usual...
+ precondition( std::string(name) != "", age >= 0, weight >= 0.0 )
+ postcondition(
+ auto old_relatives_size = CONTRACT_OLDOF relatives.size(),
+ relatives.size() == old_relatives_size + 1
+ )
+ initialize( // ... but initializers must use the `..._ARG` macro.
+ person(CONTRACT_CONSTRUCTOR_ARG(name),
+ CONTRACT_CONSTRUCTOR_ARG(age),
+ CONTRACT_CONSTRUCTOR_ARG(weight)),
+ family_(CONTRACT_CONSTRUCTOR_ARG(relatives))
+ )
+ ) {
+ relatives.push_back(*this);
+ }
+
+ private: std::vector<person>& family_;
+};
+
+} // namespace
+//]
+
+int main ( void )
+{
+ //[constructor_named_params_family_call
+ std::vector<family::person> r;/*
+ family::member m1(family::name_ = "Mary", family::relatives_ = r);
+ //]
+ BOOST_TEST(m1.name == "Mary");
+ BOOST_TEST(r.size() == 1);
+
+ family::member m2(family::relatives_ = r, family::name_ = "Mike");
+ BOOST_TEST(m2.name == "Mike");
+ BOOST_TEST(r.size() == 2);
+*/
+ int a = 23;/*
+ family::member m3(family::relatives_ = r, family::name_ = "Lisa",
+ family::age_ = a);
+ BOOST_TEST(m3.name == "Lisa");
+ BOOST_TEST(m3.age == a);
+ BOOST_TEST(r.size() == 3);
+
+ family::member m4(family::relatives_ = r, family::weight_ = 65.0,
+ family::name_ = "John");
+ BOOST_TEST(m4.name == "John");
+ BOOST_TEST(int(m4.weight) == 65);
+ BOOST_TEST(r.size() == 4);
+ */
+ family::member m5(family::age_ = a, family::relatives_ = r,
+ family::weight_ = 65.0, family::name_ = "July");
+// BOOST_TEST(m5.name == "July");
+// BOOST_TEST(int(m5.weight) == 65);
+// BOOST_TEST(r.size() == 5);
+/*
+ family::member m6("Paul", a, r, 65.0);
+ BOOST_TEST(m6.name == "Paul");
+ BOOST_TEST(m6.age == a);
+ BOOST_TEST(int(m6.weight) == 65);
+ BOOST_TEST(r.size() == 6);*/
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/named_parameters/deduced_params_pydef.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/deduced_params_pydef.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,116 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <boost/python.hpp> // First include (a bug uses and, or, etc keywords).
+#include <contract.hpp>
+#include <boost/concept_check.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/mpl/placeholders.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/regex.hpp>
+#include <iostream>
+
+namespace py {
+
+// Helpers.
+
+template< class P >
+struct CallPolicies
+{
+ // Following concepts could also be programmed:
+ // BOOST_CONCEPT_ASSERT((ResultConverterGenerator<P::result_converter>));
+ // BOOST_CONCEPT_ASSERT((Metafunction<P::extract_return_type>));
+
+ BOOST_CONCEPT_USAGE(CallPolicies)
+ {
+ convertible_to_bool(x.precall(a));
+ convertible_to_pyobject(x.postcall(a, r));
+ }
+
+private:
+ void convertible_to_bool ( bool );
+ void convertible_to_pyobject ( PyObject* );
+
+ P x;
+ PyObject* a;
+ PyObject* r;
+};
+
+bool is_identifier ( char const* name )
+{
+ static const boost::regex re("(\\l|\\u|_)(\\l|\\u|\\d|_)*");
+ return boost::regex_match(name, re);
+}
+
+template< typename T > struct is_keyword_expression :
+ boost::mpl::bool_< boost::python::detail::is_keywords<T>::value >
+{};
+
+boost::python::detail::keywords<0> no_keywords ( void )
+ { return boost::python::detail::keywords<0>(); }
+
+} // namespace
+
+//[deduced_params_pydef_decl
+namespace py {
+
+CONTRACT_PARAMETER(name)
+CONTRACT_PARAMETER(func)
+CONTRACT_PARAMETER(docstring)
+CONTRACT_PARAMETER(keywords)
+CONTRACT_PARAMETER(policies)
+
+CONTRACT_FUNCTION(
+ void (def) (
+ // Non-deduced (and also required) named parameters.
+ in (char const*) name,
+ in auto func,
+ // Deduced (and also optional) named parameters.
+ deduce in (char const*) docstring, default (""),
+ deduce in requires(is_keyword_expression<boost::mpl::_>) keywords,
+ default no_keywords(),
+ // Type requirements also used to uniquely deduce parameters.
+ deduce in requires(
+ boost::mpl::not_<
+ boost::mpl::or_<
+ boost::is_convertible<boost::mpl::_, char const*>
+ , is_keyword_expression<boost::mpl::_>
+ >
+ >
+ ) policies, default boost::python::default_call_policies()
+ // Concepts for named parameters.
+ ) requires( CallPolicies<CONTRACT_PARAMETER_TYPEOF(policies)> )
+ precondition( is_identifier(name) ) // Contracts.
+) {
+ boost::python::def(name, func, docstring, keywords, policies);
+}
+
+} // namespace
+//]
+
+template< char Name >
+void print ( void ) { std::cout << "called " << Name << std::endl; }
+
+#ifndef PYMODULE
+# error "PYMODULE must define a valid Boost.Python module name"
+#endif
+
+// Python module, in a Python shell from this directory run:
+// >>> from <PYMODULE> import * # Check contracts (preconditions, etc).
+// >>> help("<PYMODULE>"), f(), g(), h()
+BOOST_PYTHON_MODULE(PYMODULE)
+{
+ boost::python::default_call_policies nonstring_policies, string_policies;
+ //[deduced_params_pydef_calls
+ py::def("f", print<'f'>, nonstring_policies, "Documentation for f");
+ py::def("g", print<'g'>, "Documentation for g", nonstring_policies);
+ py::def("h", print<'h'>, py::policies_ = string_policies,
+ "Documentation for h");
+ //]
+}
+
Added: sandbox/contract/example/named_parameters/deduced_params_pydef.py
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/deduced_params_pydef.py 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,37 @@
+
+# Copyright (C) 2008-2012 Lorenzo Caminiti
+# Distributed under 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)
+# Home at http://sourceforge.net/projects/contractpp
+
+import sys
+
+print 'Importing module:', sys.argv[1]
+pydef = __import__(sys.argv[1]) # Import checks contracts (preconditions, etc).
+
+# Check that function can be called successfully.
+pydef.f()
+pydef.g()
+pydef.h()
+
+# Check that docs were set correctly.
+assert pydef.f.__doc__ == '''
+f() -> None :
+ Documentation for f
+
+ C++ signature :
+ void f()'''
+assert pydef.g.__doc__ == '''
+g() -> None :
+ Documentation for g
+
+ C++ signature :
+ void g()'''
+assert pydef.h.__doc__ == '''
+h() -> None :
+ Documentation for h
+
+ C++ signature :
+ void h()'''
+
Added: sandbox/contract/example/named_parameters/deduced_params_pydef_module/named_parameters_deduced_params_pydef_module.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/deduced_params_pydef_module/named_parameters_deduced_params_pydef_module.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,10 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#define PYMODULE named_parameters_deduced_params_pydef_module
+#include "../deduced_params_pydef.cpp"
+
Added: sandbox/contract/example/named_parameters/deduced_params_pydef_module/nob_named_parameters_deduced_params_pydef_module.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/deduced_params_pydef_module/nob_named_parameters_deduced_params_pydef_module.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,10 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#define PYMODULE nob_named_parameters_deduced_params_pydef_module
+#include "../deduced_params_pydef.cpp"
+
Added: sandbox/contract/example/named_parameters/deduced_params_pydef_module/nobl_named_parameters_deduced_params_pydef_module.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/deduced_params_pydef_module/nobl_named_parameters_deduced_params_pydef_module.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,10 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#define PYMODULE nobl_named_parameters_deduced_params_pydef_module
+#include "../deduced_params_pydef.cpp"
+
Added: sandbox/contract/example/named_parameters/deduced_params_pydef_module/noe_named_parameters_deduced_params_pydef_module.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/deduced_params_pydef_module/noe_named_parameters_deduced_params_pydef_module.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,10 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#define PYMODULE noe_named_parameters_deduced_params_pydef_module
+#include "../deduced_params_pydef.cpp"
+
Added: sandbox/contract/example/named_parameters/deduced_params_pydef_module/noei_named_parameters_deduced_params_pydef_module.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/deduced_params_pydef_module/noei_named_parameters_deduced_params_pydef_module.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,10 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#define PYMODULE noei_named_parameters_deduced_params_pydef_module
+#include "../deduced_params_pydef.cpp"
+
Added: sandbox/contract/example/named_parameters/deduced_params_pydef_module/noeo_named_parameters_deduced_params_pydef_module.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/deduced_params_pydef_module/noeo_named_parameters_deduced_params_pydef_module.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,10 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#define PYMODULE noeo_named_parameters_deduced_params_pydef_module
+#include "../deduced_params_pydef.cpp"
+
Added: sandbox/contract/example/named_parameters/deduced_params_pydef_module/noeoi_named_parameters_deduced_params_pydef_module.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/deduced_params_pydef_module/noeoi_named_parameters_deduced_params_pydef_module.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,10 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#define PYMODULE noeoi_named_parameters_deduced_params_pydef_module
+#include "../deduced_params_pydef.cpp"
+
Added: sandbox/contract/example/named_parameters/deduced_params_pydef_module/noeoibl_named_parameters_deduced_params_pydef_module.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/deduced_params_pydef_module/noeoibl_named_parameters_deduced_params_pydef_module.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,10 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#define PYMODULE noeoibl_named_parameters_deduced_params_pydef_module
+#include "../deduced_params_pydef.cpp"
+
Added: sandbox/contract/example/named_parameters/deduced_params_pydef_module/noi_named_parameters_deduced_params_pydef_module.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/deduced_params_pydef_module/noi_named_parameters_deduced_params_pydef_module.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,10 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#define PYMODULE noi_named_parameters_deduced_params_pydef_module
+#include "../deduced_params_pydef.cpp"
+
Added: sandbox/contract/example/named_parameters/deduced_params_pydef_module/nol_named_parameters_deduced_params_pydef_module.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/deduced_params_pydef_module/nol_named_parameters_deduced_params_pydef_module.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,10 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#define PYMODULE nol_named_parameters_deduced_params_pydef_module
+#include "../deduced_params_pydef.cpp"
+
Added: sandbox/contract/example/named_parameters/deduced_params_pydef_module/noo_named_parameters_deduced_params_pydef_module.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/deduced_params_pydef_module/noo_named_parameters_deduced_params_pydef_module.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,10 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#define PYMODULE noo_named_parameters_deduced_params_pydef_module
+#include "../deduced_params_pydef.cpp"
+
Added: sandbox/contract/example/named_parameters/deduced_params_pydef_module/nooi_named_parameters_deduced_params_pydef_module.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/deduced_params_pydef_module/nooi_named_parameters_deduced_params_pydef_module.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,10 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#define PYMODULE nooi_named_parameters_deduced_params_pydef_module
+#include "../deduced_params_pydef.cpp"
+
Added: sandbox/contract/example/named_parameters/member_named_params_callable2.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/member_named_params_callable2.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,70 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+//[member_named_params_callable2
+namespace calls {
+
+CONTRACT_PARAMETER(arg1)
+CONTRACT_PARAMETER(arg2)
+
+CONTRACT_CLASS(
+ struct (callable2)
+) {
+ CONTRACT_CLASS_INVARIANT( void )
+
+ CONTRACT_FUNCTION( // Member function with named parameters.
+ public void (call) ( in int arg1, in int arg2 )
+ ) ; // Body definition can be separated...
+
+ CONTRACT_FUNCTION( // Constant member with named parameters.
+ public void (call) ( in int arg1, in int arg2 ) const
+ ) {
+ total = arg1 + arg2;
+ }
+
+ CONTRACT_FUNCTION( // Static member with named parameters.
+ public static void (static_call) ( in int arg1, in int arg2 )
+ ) {
+ total = arg1 + arg2;
+ }
+
+ static int total;
+};
+
+// ... but body definition uses template parameters and special `BODY` macro.
+template< typename Arg1, typename Arg2 >
+void callable2::CONTRACT_PARAMETER_BODY(call)( Arg1 arg1, Arg2 arg2 )
+{
+ total = arg1 + arg2;
+}
+
+int callable2::total = 0;
+
+} // namespace
+//]
+
+int main ( void )
+{
+ //[member_named_params_callable2_calls
+ calls::callable2::static_call(calls::arg2_ = 2, calls::arg1_ = 1);
+ BOOST_TEST(calls::callable2::total == 3);
+
+ calls::callable2 c;
+ c.call(calls::arg2_ = 3, calls::arg1_ = 4);
+ BOOST_TEST(calls::callable2::total == 7);
+
+ calls::callable2 const& cc = c;
+ cc.call(calls::arg2_ = 5, calls::arg1_ = 6);
+ BOOST_TEST(calls::callable2::total == 11);
+ //]
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/named_parameters/named_param_identifiers_failure.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/named_param_identifiers_failure.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,42 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+struct too_old {};
+
+//[named_param_identifiers_failure
+CONTRACT_PARAMETER( (name) name ) // Both parameter and argument
+CONTRACT_PARAMETER( (age) age ) // have same name, but...
+
+CONTRACT_FUNCTION(
+ void (print) ( in auto name, default("bob"), in auto age, default 42 )
+ precondition( age > 0 )
+) {
+ if(age >= 40) throw too_old(); // Will throw because age defaulted to 42.
+}
+
+void f ( int age ) // Another parameter with the same name.
+{
+ print(age = 3); // So incorrect call but no compiler-error.
+}
+//]
+
+int main ( void )
+{
+ try {
+ f(123);
+ BOOST_TEST(false);
+ } catch(too_old&) {
+ BOOST_TEST(true); // Test threw error as expected.
+ } catch(...) {
+ BOOST_TEST(false);
+ }
+ return boost::report_errors();
+}
+
Added: sandbox/contract/example/named_parameters/named_param_identifiers_positive.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/named_param_identifiers_positive.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,53 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+// Declare parameter identifiers within `params` namespace (this should never
+// be necessary) and argument identifiers ...Arg / ..._arg instead of ..._.
+//[named_param_identifiers_positive_keywords
+CONTRACT_TEMPLATE_PARAMETER( namespace(params) (NumberArg) Number )
+CONTRACT_PARAMETER( namespace(params) (value_arg) value )
+//]
+
+//[named_param_identifiers_positive
+CONTRACT_CLASS(
+ // Named template parameters must specify `params` namespace.
+ template( using namespace params, in typename Number )
+ struct (positive)
+) {
+ CONTRACT_CLASS_INVARIANT_TPL( get() > 0 )
+
+ CONTRACT_CONSTRUCTOR_TPL(
+ // Named parameters must specify `params` namespace.
+ public (positive) ( using namespace params, in (Number) value )
+ precondition( value > 0 )
+ postcondition( get() == value )
+ initialize( value_(CONTRACT_CONSTRUCTOR_ARG(value)) )
+ ) { }
+
+ CONTRACT_FUNCTION_TPL(
+ public (Number const&) (get) ( void ) const
+ ) {
+ return value_;
+ }
+
+ private: Number value_;
+};
+//]
+
+int main ( void )
+{
+ //[named_param_identifiers_positive_call
+ positive<NumberArg<int> > n(value_arg = 123); // Use ...Arg and ..._arg.
+ //]
+ BOOST_TEST(n.get() == 123);
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/named_parameters/named_params_dfs.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/named_params_dfs.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,195 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract.hpp>
+#include <boost/graph/adjacency_list.hpp>
+#include <boost/graph/depth_first_search.hpp>
+#include <boost/graph/graph_traits.hpp>
+#include <boost/range/irange.hpp>
+#include <boost/pending/indirect_cmp.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/property_map/property_map.hpp>
+#include <boost/property_map/shared_array_property_map.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/placeholders.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+namespace graphs {
+
+// Helpers.
+
+template< typename G >
+struct vertex_descriptor
+{
+ typedef typename boost::graph_traits<G>::vertex_descriptor type;
+};
+
+template< typename T >
+struct is_incidence_and_vertex_list_graph :
+ boost::mpl::and_<
+ boost::is_convertible<
+ typename boost::graph_traits<T>::traversal_category
+ , boost::incidence_graph_tag
+ >
+ , boost::is_convertible<
+ typename boost::graph_traits<T>::traversal_category
+ , boost::vertex_list_graph_tag
+ >
+ >
+{};
+
+template< typename T, typename Key >
+struct is_property_map_of_key :
+ boost::is_same<Key, typename boost::property_traits<T>::key_type>
+{};
+
+template< typename T, typename Key >
+struct is_integral_property_map_of_key :
+ boost::mpl::and_<
+ boost::is_integral<typename boost::property_traits<T>::value_type>
+ , is_property_map_of_key<T, typename Key::type>
+ >
+{};
+
+template< typename Size, typename IndexMap >
+boost::shared_array_property_map<boost::default_color_type, IndexMap>
+default_color_map ( Size const& num_vertices, IndexMap const& index_map )
+{
+ return boost::make_shared_array_property_map(num_vertices,
+ boost::default_color_type(), index_map);
+}
+
+} // namespace
+
+// Function with named parameters.
+
+//[named_params_dfs_keywords
+namespace graphs {
+
+CONTRACT_PARAMETER(graph)
+CONTRACT_PARAMETER(visitor)
+CONTRACT_PARAMETER(root_vertex)
+CONTRACT_PARAMETER(index_map)
+CONTRACT_PARAMETER(color_map)
+
+} // namespace
+//]
+
+//[named_params_dfs_decl
+namespace graphs {
+
+CONTRACT_FUNCTION(
+ void (depth_first_search) (
+ // Required parameter (no default value) with requirement predicate.
+ in requires(is_incidence_and_vertex_list_graph<boost::mpl::_>)
+ graph,
+ // Optional (default value) of any type (auto).
+ in auto visitor, default boost::dfs_visitor<>(),
+ // Exact type specified.
+ in (vertex_descriptor<CONTRACT_PARAMETER_TYPEOF(graph)>)
+ root_vertex, default (*boost::vertices(graph).first),
+ // Any type matching requirement predicate (unary meta-function).
+ in requires(
+ is_integral_property_map_of_key<
+ boost::mpl::_
+ , vertex_descriptor<CONTRACT_PARAMETER_TYPEOF(graph)>
+ >
+ ) index_map, default boost::get(boost::vertex_index, graph),
+ // In-out parameter.
+ in out requires(
+ is_property_map_of_key<
+ boost::mpl::_
+ , vertex_descriptor<CONTRACT_PARAMETER_TYPEOF(graph)>
+ >
+ ) color_map, default default_color_map(boost::num_vertices(graph),
+ index_map)
+ )
+ // No `precondition(...)` or `postcondition(...)` in this example.
+) {
+ // Also function definition can use `PARAMETER_TYPEOF`.
+ typedef CONTRACT_PARAMETER_TYPEOF(graph)& graph_ref; // Unused by example.
+ boost::depth_first_search(graph, boost::visitor(visitor).
+ color_map(color_map).root_vertex(root_vertex).
+ vertex_index_map(index_map));
+}
+
+} // namespace
+//]
+
+// Main program.
+
+template< typename TimeMap >
+class dfs_time_visitor : public boost::default_dfs_visitor
+{
+public:
+ typedef typename boost::property_traits<TimeMap>::value_type T;
+
+ dfs_time_visitor ( TimeMap dmap, TimeMap fmap, T& t )
+ : dmap_(dmap), fmap_(fmap), time_(t)
+ {}
+
+ template< typename V, typename G >
+ void discover_vertex ( V u, G const& g ) const { put(dmap_, u, time_++); }
+
+ template< typename V, typename G >
+ void finish_vertex ( V u, G const& g ) const { put(fmap_, u, time_++); }
+
+private:
+ TimeMap dmap_;
+ TimeMap fmap_;
+ T& time_;
+};
+
+int main ( void )
+{
+ typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS> G;
+ typedef boost::graph_traits<G>::vertices_size_type size_type;
+
+ enum {u, v, w, x, y, z, N};
+ char names[] = {'u', 'v', 'w', 'x', 'y', 'z'};
+ typedef std::pair<int, int> E;
+ E edges[] = {E(u, v), E(u, x), E(x, v), E(y, x), E(v, y), E(w, y), E(w, z),
+ E(z, z)};
+ G g(edges, edges + sizeof(edges) / sizeof(E), N);
+
+ std::vector<size_type> dtime(boost::num_vertices(g));
+ std::vector<size_type> ftime(boost::num_vertices(g));
+ size_type t = 0;
+ dfs_time_visitor<size_type*> vis(&dtime[0], &ftime[0], t);
+
+ //[named_params_dfs_call
+ graphs::depth_first_search(graphs::visitor_ = vis, graphs::graph_ = g);
+ //]
+
+ std::vector<size_type> dorder(N);
+ boost::integer_range<size_type> r(0, N);
+ std::copy(r.begin(), r.end(), dorder.begin());
+ std::sort(dorder.begin(), dorder.end(),
+ boost::indirect_cmp<size_type*, std::less<size_type> >(&dtime[0]));
+ BOOST_TEST(names[dorder[0]] == 'u');
+ BOOST_TEST(names[dorder[1]] == 'v');
+ BOOST_TEST(names[dorder[2]] == 'y');
+ BOOST_TEST(names[dorder[3]] == 'x');
+ BOOST_TEST(names[dorder[4]] == 'w');
+ BOOST_TEST(names[dorder[5]] == 'z');
+
+ std::vector<size_type> forder(N);
+ std::copy(r.begin(), r.end(), forder.begin());
+ std::sort(forder.begin(), forder.end(),
+ boost::indirect_cmp<size_type*, std::less<size_type> >(&ftime[0]));
+ BOOST_TEST(names[forder[0]] == 'x');
+ BOOST_TEST(names[forder[1]] == 'y');
+ BOOST_TEST(names[forder[2]] == 'v');
+ BOOST_TEST(names[forder[3]] == 'u');
+ BOOST_TEST(names[forder[4]] == 'z');
+ BOOST_TEST(names[forder[5]] == 'w');
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/named_parameters/named_template_params_pyclass.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/named_template_params_pyclass.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,136 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <boost/python.hpp> // First include (a bug uses and, or, etc keywords).
+#include <contract.hpp>
+#include <boost/concept_check.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/mpl/placeholders.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/noncopyable.hpp>
+#include <boost/regex.hpp>
+
+namespace py {
+
+bool is_identifier ( char const* name ) // Contract helper.
+{
+ static const boost::regex re("(\\l|\\u|_)(\\l|\\u|\\d|_)*");
+ return boost::regex_match(name, re);
+}
+
+} // namespace
+
+//[named_template_params_pyclass_keywords
+namespace py {
+
+CONTRACT_TEMPLATE_PARAMETER(ClassType)
+CONTRACT_TEMPLATE_PARAMETER(Bases)
+CONTRACT_TEMPLATE_PARAMETER(HeldType)
+CONTRACT_TEMPLATE_PARAMETER(Copyable)
+CONTRACT_PARAMETER(name)
+
+} // namespace
+//]
+
+//[named_template_params_pyclass
+namespace py {
+
+CONTRACT_CLASS(
+ template(
+ // Required named template parameter.
+ in typename requires(boost::is_class<boost::mpl::_>) ClassType,
+ // Optional deduced named template parameters with requirements.
+ deduce in typename requires(
+ boost::python::detail::specifies_bases<boost::mpl::_>
+ ) Bases, default boost::python::bases<>,
+ deduce in typename requires(
+ boost::mpl::not_<
+ boost::mpl::or_<
+ boost::python::detail::specifies_bases<boost::mpl::_>
+ , boost::is_same<boost::noncopyable, boost::mpl::_>
+ >
+ >
+ ) HeldType, default boost::python::detail::not_specified,
+ deduce in typename requires(
+ boost::is_same<boost::noncopyable, boost::mpl::_>
+ ) Copyable, default boost::python::detail::not_specified
+ // Unfortunately, non-type named template parameters are not supported.
+ // Concepts named template parameters.
+ ) requires( boost::DefaultConstructible<ClassType> )
+ class (class_)
+ extends( (boost::python::class_<ClassType, Bases, HeldType, Copyable>) )
+) {
+ CONTRACT_CLASS_INVARIANT_TPL( void ) // Contracts.
+
+ public: typedef ClassType class_type;
+ public: typedef Bases bases;
+ public: typedef HeldType held_type;
+ public: typedef Copyable copyable;
+
+ CONTRACT_CONSTRUCTOR_TPL(
+ public explicit (class_) ( in (char const*) name )
+ precondition( is_identifier(name) )
+ initialize(
+ (boost::python::class_<ClassType, Bases, HeldType, Copyable>(
+ CONTRACT_CONSTRUCTOR_ARG(name)))
+ )
+ ) {}
+};
+
+} // namespace
+//]
+
+struct bx { virtual ~bx ( void ) {} };
+struct x : bx {};
+
+struct by { virtual ~by ( void ) {} };
+struct y : by {};
+
+
+typedef py::class_<py::ClassType_<bx>, py::Copyable_<boost::noncopyable> > c1;
+BOOST_MPL_ASSERT((boost::is_same<c1::class_type, bx>));
+BOOST_MPL_ASSERT((boost::is_same<c1::copyable, boost::noncopyable>));
+
+typedef py::class_<x, py::HeldType_<boost::shared_ptr<x> >,
+ py::Bases_<boost::python::bases<bx> > > c2;
+BOOST_MPL_ASSERT((boost::is_same<c2::class_type, x>));
+BOOST_MPL_ASSERT((boost::is_same<c2::held_type, boost::shared_ptr<x> >));
+BOOST_MPL_ASSERT((boost::is_same<c2::bases, boost::python::bases<bx> >));
+
+typedef py::class_<by, boost::noncopyable> c3;
+BOOST_MPL_ASSERT((boost::is_same<c3::class_type, by>));
+BOOST_MPL_ASSERT((boost::is_same<c3::copyable, boost::noncopyable>));
+
+typedef py::class_<y, boost::shared_ptr<y>, boost::python::bases<by> > c4;
+BOOST_MPL_ASSERT((boost::is_same<c4::class_type, y>));
+BOOST_MPL_ASSERT((boost::is_same<c4::held_type, boost::shared_ptr<y> >));
+BOOST_MPL_ASSERT((boost::is_same<c4::bases, boost::python::bases<by> >));
+
+#ifndef PYMODULE
+# error "PYMODULE must define a valid Boost.Python module name"
+#endif
+
+// Python module, in a Python shell from this directory run:
+// >>> from <PYMODULE> import * # Check contracts (preconditions, etc).
+// >>> help("<PYMODULE>"), xx = x(), yy = y()
+BOOST_PYTHON_MODULE(PYMODULE)
+{
+ //[named_template_params_pyclass_calls
+ // Named parameters.
+ py::class_<py::ClassType_<bx>, py::Copyable_<boost::noncopyable> >("bx");
+ py::class_<x, py::HeldType_<boost::shared_ptr<x> >,
+ py::Bases_<boost::python::bases<bx> > >("x");
+ // Deduced parameters.
+ py::class_<by, boost::noncopyable>("by");
+ py::class_<y, boost::shared_ptr<y>, boost::python::bases<by> >(
+ py::name_ = "y");
+ //]
+}
+
Added: sandbox/contract/example/named_parameters/named_template_params_pyclass.py
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/named_template_params_pyclass.py 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,16 @@
+
+# Copyright (C) 2008-2012 Lorenzo Caminiti
+# Distributed under 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)
+# Home at http://sourceforge.net/projects/contractpp
+
+import sys
+
+print 'Importing module:', sys.argv[1]
+pyclass = __import__(sys.argv[1]) # Import checks contracts (preconditions,etc).
+
+# Check that objects are constructed successfully.
+pyclass.x()
+pyclass.y()
+
Added: sandbox/contract/example/named_parameters/named_template_params_pyclass_module/named_parameters_named_template_params_pyclass_module.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/named_template_params_pyclass_module/named_parameters_named_template_params_pyclass_module.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,10 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#define PYMODULE named_parameters_named_template_params_pyclass_module
+#include "../named_template_params_pyclass.cpp"
+
Added: sandbox/contract/example/named_parameters/named_template_params_pyclass_module/nob_named_parameters_named_template_params_pyclass_module.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/named_template_params_pyclass_module/nob_named_parameters_named_template_params_pyclass_module.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,10 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#define PYMODULE nob_named_parameters_named_template_params_pyclass_module
+#include "../named_template_params_pyclass.cpp"
+
Added: sandbox/contract/example/named_parameters/named_template_params_pyclass_module/nobl_named_parameters_named_template_params_pyclass_module.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/named_template_params_pyclass_module/nobl_named_parameters_named_template_params_pyclass_module.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,10 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#define PYMODULE nobl_named_parameters_named_template_params_pyclass_module
+#include "../named_template_params_pyclass.cpp"
+
Added: sandbox/contract/example/named_parameters/named_template_params_pyclass_module/noe_named_parameters_named_template_params_pyclass_module.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/named_template_params_pyclass_module/noe_named_parameters_named_template_params_pyclass_module.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,10 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#define PYMODULE noe_named_parameters_named_template_params_pyclass_module
+#include "../named_template_params_pyclass.cpp"
+
Added: sandbox/contract/example/named_parameters/named_template_params_pyclass_module/noei_named_parameters_named_template_params_pyclass_module.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/named_template_params_pyclass_module/noei_named_parameters_named_template_params_pyclass_module.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,10 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#define PYMODULE noei_named_parameters_named_template_params_pyclass_module
+#include "../named_template_params_pyclass.cpp"
+
Added: sandbox/contract/example/named_parameters/named_template_params_pyclass_module/noeo_named_parameters_named_template_params_pyclass_module.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/named_template_params_pyclass_module/noeo_named_parameters_named_template_params_pyclass_module.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,10 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#define PYMODULE noeo_named_parameters_named_template_params_pyclass_module
+#include "../named_template_params_pyclass.cpp"
+
Added: sandbox/contract/example/named_parameters/named_template_params_pyclass_module/noeoi_named_parameters_named_template_params_pyclass_module.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/named_template_params_pyclass_module/noeoi_named_parameters_named_template_params_pyclass_module.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,10 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#define PYMODULE noeoi_named_parameters_named_template_params_pyclass_module
+#include "../named_template_params_pyclass.cpp"
+
Added: sandbox/contract/example/named_parameters/named_template_params_pyclass_module/noeoibl_named_parameters_named_template_params_pyclass_module.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/named_template_params_pyclass_module/noeoibl_named_parameters_named_template_params_pyclass_module.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,10 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#define PYMODULE noeoibl_named_parameters_named_template_params_pyclass_module
+#include "../named_template_params_pyclass.cpp"
+
Added: sandbox/contract/example/named_parameters/named_template_params_pyclass_module/noi_named_parameters_named_template_params_pyclass_module.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/named_template_params_pyclass_module/noi_named_parameters_named_template_params_pyclass_module.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,10 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#define PYMODULE noi_named_parameters_named_template_params_pyclass_module
+#include "../named_template_params_pyclass.cpp"
+
Added: sandbox/contract/example/named_parameters/named_template_params_pyclass_module/nol_named_parameters_named_template_params_pyclass_module.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/named_template_params_pyclass_module/nol_named_parameters_named_template_params_pyclass_module.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,10 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#define PYMODULE nol_named_parameters_named_template_params_pyclass_module
+#include "../named_template_params_pyclass.cpp"
+
Added: sandbox/contract/example/named_parameters/named_template_params_pyclass_module/noo_named_parameters_named_template_params_pyclass_module.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/named_template_params_pyclass_module/noo_named_parameters_named_template_params_pyclass_module.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,10 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#define PYMODULE noo_named_parameters_named_template_params_pyclass_module
+#include "../named_template_params_pyclass.cpp"
+
Added: sandbox/contract/example/named_parameters/named_template_params_pyclass_module/nooi_named_parameters_named_template_params_pyclass_module.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/named_parameters/named_template_params_pyclass_module/nooi_named_parameters_named_template_params_pyclass_module.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,10 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#define PYMODULE nooi_named_parameters_named_template_params_pyclass_module
+#include "../named_template_params_pyclass.cpp"
+
Added: sandbox/contract/example/stroustrup97/string.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/stroustrup97/string.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,33 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[stroustrup97_string
+// File: string.cpp
+#include "string.hpp"
+
+CONTRACT_CONSTRUCTOR_BODY(string, string) ( const char* chars )
+ { init(chars); }
+
+CONTRACT_CONSTRUCTOR_BODY(string, string) ( const string& other )
+ { init(other.chars_); }
+
+CONTRACT_DESTRUCTOR_BODY(string, ~string) ( void )
+ { delete[] chars_; }
+
+char& string::CONTRACT_MEMBER_BODY(operator([])(at)) ( int index )
+ { return chars_[index]; }
+
+int string::CONTRACT_MEMBER_BODY(size) ( void ) const { return size_; }
+
+void string::CONTRACT_MEMBER_BODY(init) ( const char* chars ) {
+ size_ = strlen(chars);
+ chars_ = new char[size_ + 1];
+ for(int i = 0; i < size_; ++i) chars_[i] = chars[i];
+ chars_[size_] = '\0';
+}
+//]
+
Added: sandbox/contract/example/stroustrup97/string.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/stroustrup97/string.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,81 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[stroustrup97_string_header
+// File: string.hpp
+#ifndef STRING_HPP_
+#define STRING_HPP_
+
+#include <contract.hpp>
+#include <cstring>
+
+// Adapted from an example presented in [Stroustrup1997] to illustrate
+// importance of class invariants. Simple preconditions were added where it
+// made sense. This should be compiled with postconditions checking turned off
+// (define the `CONTRACT_CONFIG_NO_POSTCONDITIONS` macro) because
+// postconditions are deliberately not used.
+// See [Stroustrup1997] for a discussion on the importance of class invariants,
+// and on pros and cons of using pre and post conditions.
+CONTRACT_CLASS(
+ class (string)
+) {
+ CONTRACT_CLASS_INVARIANT(
+ // It would be better to assert conditions separately so to generate
+ // more informative error in case they fail.
+ chars_ ? true : throw invariant_error(),
+ size_ >= 0 ? true : throw invariant_error(),
+ too_large >= size_ ? true : throw invariant_error(),
+ chars_[size_] == '\0' ? true : throw invariant_error()
+ )
+
+ // Broken contracts throw user defined exceptions.
+ public: class range_error {};
+ public: class invariant_error {};
+ public: class null_error {};
+ public: class too_large_error {};
+
+ public: enum { too_large = 16000 }; // Length limit.
+
+ CONTRACT_CONSTRUCTOR(
+ public (string) ( (const char*) chars )
+ precondition(
+ chars ? true : throw null_error(),
+ strlen(chars) <= too_large ? true : throw too_large_error()
+ )
+ ) ; // Deferred body definition.
+
+ CONTRACT_CONSTRUCTOR(
+ public (string) ( (const string&) other )
+ ) ;
+
+ CONTRACT_DESTRUCTOR(
+ public (~string) ( void )
+ ) ;
+
+ CONTRACT_FUNCTION(
+ public (char&) operator([])(at) ( int index )
+ precondition(
+ index >= 0 ? true : throw range_error(),
+ size_ > index ? true : throw range_error()
+ )
+ ) ;
+
+ CONTRACT_FUNCTION(
+ public int (size) ( void ) const
+ ) ;
+
+ CONTRACT_FUNCTION( // Not public so it does not check class invariants.
+ private void (init) ( (const char*) q )
+ ) ;
+
+ private: int size_;
+ private: char* chars_;
+};
+
+#endif // #include guard
+//]
+
Added: sandbox/contract/example/stroustrup97/string_main.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/stroustrup97/string_main.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,47 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+//[stroustrup97_string_main
+// File: string_main.cpp
+#include "string.hpp"
+#include <boost/detail/lightweight_test.hpp>
+
+// Handler that re-throws contract broken exceptions instead of terminating.
+void throwing_handler ( contract::from const& context )
+{
+ if(context == contract::FROM_DESTRUCTOR) {
+ // Destructor cannot throw for STL exception safety (ignore error).
+ std::clog << "Ignored destructor contract failure" << std::endl;
+ } else {
+ // Failure handlers always called with active an exception.
+ throw; // Re-throw active exception thrown by precondition.
+ }
+}
+
+int main ( void )
+{
+ // Setup all contract failure handlers to throw (instead of terminate).
+ contract::set_precondition_broken(&throwing_handler);
+ contract::set_postcondition_broken(&throwing_handler);
+ contract::set_class_invariant_broken(&throwing_handler);
+ contract::set_block_invariant_broken(&throwing_handler);
+ contract::set_loop_variant_broken(&throwing_handler);
+
+ string s("abc");
+ BOOST_TEST(s[0] == 'a');
+
+#ifndef CONTRACT_CONFIG_NO_PRECONDITIONS
+ bool pass = false;
+ try { s[3]; } // Out of range.
+ catch(string::range_error) { pass = true; }
+ BOOST_TEST(pass);
+#endif
+
+ return boost::report_errors();
+}
+//]
+
Added: sandbox/contract/example/virtual_specifiers/final_class.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/virtual_specifiers/final_class.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,14 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include "final_class.hpp"
+
+int main ( void ) {
+ x();
+ return 0;
+}
+
Added: sandbox/contract/example/virtual_specifiers/final_class.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/virtual_specifiers/final_class.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,22 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef FINCAL_CLASS_HPP_
+#define FINCAL_CLASS_HPP_
+
+#include <contract.hpp>
+
+//[final_class
+CONTRACT_CLASS(
+ class (x) final // A final class.
+) {
+ CONTRACT_CLASS_INVARIANT( void )
+};
+//]
+
+#endif // #include guard
+
Added: sandbox/contract/example/virtual_specifiers/final_class_error.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/virtual_specifiers/final_class_error.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,20 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include "final_class.hpp"
+#include <contract.hpp>
+
+//[final_class_error
+CONTRACT_CLASS(
+ class (y) extends( public x ) // Correctly errors because `x` is final.
+) {
+ CONTRACT_CLASS_INVARIANT( void )
+};
+//]
+
+int main ( void ) { return 0; }
+
Added: sandbox/contract/example/virtual_specifiers/final_member.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/virtual_specifiers/final_member.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,16 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include "final_member.hpp"
+
+int main ( void )
+{
+ x().f();
+ y().f();
+ return 0;
+}
+
Added: sandbox/contract/example/virtual_specifiers/final_member.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/virtual_specifiers/final_member.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,36 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef FINAL_MEMBER_HPP_
+#define FINAL_MEMBER_HPP_
+
+#include <contract.hpp>
+
+//[final_member
+CONTRACT_CLASS(
+ class (x)
+) {
+ CONTRACT_CLASS_INVARIANT( void )
+
+ CONTRACT_FUNCTION(
+ public virtual void (f) ( void )
+ ) {}
+};
+
+CONTRACT_CLASS(
+ class (y) extends( public x )
+) {
+ CONTRACT_CLASS_INVARIANT( void )
+
+ CONTRACT_FUNCTION(
+ public void (f) ( void ) final // Final member function.
+ ) {}
+};
+//]
+
+#endif // #include guard
+
Added: sandbox/contract/example/virtual_specifiers/final_member_error.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/virtual_specifiers/final_member_error.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,28 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include "final_member.hpp"
+#include <contract.hpp>
+
+#ifdef CONTRACT_CONFIG_NO_CLASS_INVARIANTS
+# error "virtual specifiers require appropriate contracts to be enabled"
+#endif
+
+//[final_member_error
+CONTRACT_CLASS(
+ class (z) extends( public y )
+) {
+ CONTRACT_CLASS_INVARIANT( void )
+
+ CONTRACT_FUNCTION(
+ public void (f) ( void ) // Correctly errors because `y::f` is final.
+ ) {}
+};
+//]
+
+int main ( void ) { return 0; }
+
Added: sandbox/contract/example/virtual_specifiers/new_member.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/virtual_specifiers/new_member.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,16 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include "new_member.hpp"
+
+int main ( void )
+{
+ x().f();
+ y().g();
+ return 0;
+}
+
Added: sandbox/contract/example/virtual_specifiers/new_member.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/virtual_specifiers/new_member.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,36 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef NEW_MEMBER_HPP_
+#define NEW_MEMBER_HPP_
+
+#include <contract.hpp>
+
+//[new_member
+CONTRACT_CLASS(
+ class (x)
+) {
+ CONTRACT_CLASS_INVARIANT( void )
+
+ CONTRACT_FUNCTION(
+ public virtual void (f) ( void ) new // OK, no base so no `f` override.
+ ) {}
+};
+
+CONTRACT_CLASS(
+ class (y) extends( public x )
+) {
+ CONTRACT_CLASS_INVARIANT( void )
+
+ CONTRACT_FUNCTION(
+ public virtual void (g) ( void ) new // OK, there is no `x::g`.
+ ) {}
+};
+//]
+
+#endif // #include guard
+
Added: sandbox/contract/example/virtual_specifiers/new_member_error.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/virtual_specifiers/new_member_error.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,29 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include "new_member.hpp"
+
+#if defined(CONTRACT_CONFIG_NO_PRECONDITIONS) && \
+ defined(CONTRACT_CONFIG_NO_POSTCONDITIONS) && \
+ defined(CONTRACT_CONFIG_NO_CLASS_INVARIANTS)
+# error "virtual specifiers require appropriate contracts to be enabled"
+#endif
+
+//[new_member_error
+CONTRACT_CLASS(
+ class (z) extends( public y )
+) {
+ CONTRACT_CLASS_INVARIANT( void )
+
+ CONTRACT_FUNCTION(
+ public virtual void (g) ( void ) new // Correctly errors because `y::g`.
+ ) {}
+};
+//]
+
+int main ( void ) { return 0; }
+
Added: sandbox/contract/example/virtual_specifiers/override_member.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/virtual_specifiers/override_member.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,15 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include "override_member.hpp"
+
+int main ( void ) {
+ x().f();
+ y().f();
+ return 0;
+}
+
Added: sandbox/contract/example/virtual_specifiers/override_member.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/virtual_specifiers/override_member.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,41 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef OVERRIDE_MEMBER_HPP_
+#define OVERRIDE_MEMBER_HPP_
+
+#include <contract.hpp>
+
+//[override_member
+CONTRACT_CLASS(
+ class (x)
+) {
+ CONTRACT_CLASS_INVARIANT( void )
+
+ CONTRACT_FUNCTION(
+ public virtual void (f) ( void ) // Virtual so it can be overridden.
+ ) {}
+
+ CONTRACT_FUNCTION(
+ public void (g) ( void ) // Not virtual so it cannot be overridden.
+ ) {}
+};
+
+CONTRACT_CLASS(
+ class (y) extends( public x )
+) {
+ CONTRACT_CLASS_INVARIANT( void )
+
+ CONTRACT_FUNCTION(
+ public void (f) ( void ) override // OK, overriding virtual `x::f`.
+ ) {}
+};
+//]
+
+#endif // #include guard
+
+
Added: sandbox/contract/example/virtual_specifiers/override_member_error.cpp
==============================================================================
--- (empty file)
+++ sandbox/contract/example/virtual_specifiers/override_member_error.cpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,29 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include "override_member.hpp"
+
+#if defined(CONTRACT_CONFIG_NO_PRECONDITIONS) && \
+ defined(CONTRACT_CONFIG_NO_POSTCONDITIONS) && \
+ defined(CONTRACT_CONFIG_NO_CLASS_INVARIANTS)
+# error "virtual specifiers require appropriate contracts to be enabled"
+#endif
+
+//[override_member_error
+CONTRACT_CLASS(
+ class (z) extends( public x )
+) {
+ CONTRACT_CLASS_INVARIANT( void )
+
+ CONTRACT_FUNCTION(
+ public void (g) ( void ) override // Correctly errors, cannot override.
+ ) {}
+};
+//]
+
+int main ( void ) { return 0; }
+
Added: sandbox/contract/include/contract.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,41 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_HPP_
+#define CONTRACT_HPP_
+
+#include <contract/limits.hpp>
+#include <contract/config.hpp>
+
+#include <contract/broken.hpp>
+
+#include <contract/oldof.hpp>
+#include <contract/copy.hpp>
+
+#include <contract/class.hpp>
+#include <contract/class_invariant.hpp>
+
+#include <contract/constructor.hpp>
+#include <contract/destructor.hpp>
+#include <contract/function.hpp>
+#include <contract/body.hpp>
+
+#include <contract/block_invariant.hpp>
+#include <contract/loop_variant.hpp>
+
+#include <contract/parameter.hpp>
+
+// NOTE: This header allows to use the alternative operator spelling `not`, etc
+// so user code can write assertions starting with alphanumeric symbols as
+// `not ...` instead of `! ...`. This header is NOT used by the library
+// implementation, it is included here only to allow the operator keywords in
+// the user contract code. This header is required on MSVC but it has no effect
+// on C++ compliant compilers like GCC that correctly define `not`, etc.
+#include <ciso646>
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/arg_const.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/arg_const.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,156 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_ARG_CONST_HPP_
+#define CONTRACT_AUX_ARG_CONST_HPP_
+
+#include <contract/config.hpp>
+#include <boost/type_traits/add_const.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/type_traits/add_pointer.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/repetition/enum.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+#include <boost/preprocessor/repetition/repeat_from_to.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+#include <boost/preprocessor/control/expr_iif.hpp>
+
+namespace contract { namespace aux {
+
+// To ensure CONSTANT-CORRECTNESS:
+// 1) Arguments are usually passed by const& -- this makes sure that
+// the referenced object is const and cannot be modified but the
+// reference could be modified. This is the way C++ usually uses
+// reference for const because eventual modifications to the
+// reference will have local scope plus they are usually not
+// possible because copy operators and constructors operatorate on
+// const&. (The reference could be made const& const to absolutely
+// avoid any modification also to the reference itself...)
+// 2) Pointers are passed as const* -- this makes sure that the
+// pointed object is const and cannot be modified but the pointer
+// itself can still be modified. This is the way C++ usually uses
+// pointers for const because eventual modification to the pointer
+// only have local scope so do not violate const correctness. (The
+// pointer could be passed as const* const to also prevent
+// modification to the pointer itself...)
+// 3) noold is passed by value (this does not affect
+// constant-correctness because noold has no member so it cannot
+// be used to do anything.
+
+template< typename T >
+struct arg_const {
+ typedef typename boost::add_reference< typename
+ boost::add_const< T >::type >::type type; // T const&
+};
+
+// Specializations for Pointers //
+
+template< typename T >
+struct arg_const< T* > {
+ typedef typename boost::add_pointer< typename
+ boost::add_const< T >::type >::type type; // T const*
+};
+
+// Keep outer const for ptr if specified by user (but do not add it).
+template< typename T >
+struct arg_const< T* const > {
+ typedef typename boost::add_pointer< typename
+ boost::add_const< T >::type >::type const type; // T const* const
+};
+
+// Specializations for References //
+
+// Avoid adding a reference to a reference (which gives an error).
+template< typename T >
+struct arg_const< T& > {
+ typedef typename boost::add_reference< typename
+ boost::add_const< T >::type >::type type; // T const&
+};
+
+// Specializations for Functions //
+
+#define CONTRACT_AUX_ARG_CONST_func_A(z, n, typename01) \
+ BOOST_PP_EXPR_IIF(typename01, typename) BOOST_PP_CAT(A, n)
+
+// Const qualifier cannot be applied to function types.
+// template< typename R, typename A0, ... >
+// struct arg_const< R [(*|&)](A0, ...) > {
+// typedef R ([*|&] type)(A0, ...); // Just relay type without const.
+// };
+#define CONTRACT_AUX_ARG_CONST_func(z, arity, spec_type) \
+ template< \
+ typename R BOOST_PP_COMMA_IF(arity) \
+ BOOST_PP_ENUM_ ## z(arity, CONTRACT_AUX_ARG_CONST_func_A, 1) \
+ > \
+ struct arg_const< \
+ R BOOST_PP_TUPLE_ELEM(2, 0, spec_type)(/* expand EMPTY */) \
+ ( BOOST_PP_ENUM_ ## z(arity, CONTRACT_AUX_ARG_CONST_func_A, 0) ) \
+ > { \
+ typedef \
+ R BOOST_PP_TUPLE_ELEM(2, 1, spec_type) \
+ ( BOOST_PP_ENUM_ ## z(arity, CONTRACT_AUX_ARG_CONST_func_A, 0) ) \
+ ; \
+ };
+
+// Function types.
+BOOST_PP_REPEAT(CONTRACT_CONFIG_FUNCTION_ARITY_MAX,
+ CONTRACT_AUX_ARG_CONST_func, (BOOST_PP_EMPTY, (type)) )
+
+// Function pointers.
+BOOST_PP_REPEAT(CONTRACT_CONFIG_FUNCTION_ARITY_MAX,
+ CONTRACT_AUX_ARG_CONST_func, ((*) BOOST_PP_EMPTY, (* type)) )
+
+// Function references.
+BOOST_PP_REPEAT(CONTRACT_CONFIG_FUNCTION_ARITY_MAX,
+ CONTRACT_AUX_ARG_CONST_func, ((&) BOOST_PP_EMPTY, (& type)) )
+
+// #Undefine all local macros (mixed capital names).
+#undef CONTRACT_AUX_ARG_CONST_func_A
+#undef CONTRACT_AUX_ARG_CONST_func
+
+// Specializations for Arrays //
+
+#define CONTRACT_AUX_ARG_CONST_array_I(z, n, unsigned01) \
+ BOOST_PP_EXPR_IIF(unsigned01, unsigned) BOOST_PP_CAT(I, n)
+
+#define CONTRACT_AUX_ARG_CONST_array_dim(z, n, unused) \
+ [ CONTRACT_AUX_ARG_CONST_array_I(z, n, 0) ]
+
+#define CONTRACT_AUX_ARG_CONST_array(z, dim, const01) \
+ template< \
+ typename T, \
+ BOOST_PP_ENUM_ ## z(dim, CONTRACT_AUX_ARG_CONST_array_I, 1) \
+ > \
+ struct arg_const< \
+ T BOOST_PP_EXPR_IIF(const01, const) \
+ BOOST_PP_REPEAT_ ## z(dim, CONTRACT_AUX_ARG_CONST_array_dim, ~) \
+ > { \
+ typedef \
+ typename boost::add_const<T>::type \
+ type \
+ BOOST_PP_REPEAT_ ## z(dim, CONTRACT_AUX_ARG_CONST_array_dim, ~) \
+ ; \
+ };
+
+// For non-const array types `T[]...[]`.
+BOOST_PP_REPEAT_FROM_TO(1, BOOST_PP_INC(CONTRACT_CONFIG_ARRAY_DIMENSION_MAX),
+ CONTRACT_AUX_ARG_CONST_array, 0 /* no const */)
+
+// For const array types `T const[]...[]`.
+BOOST_PP_REPEAT_FROM_TO(1, BOOST_PP_INC(CONTRACT_CONFIG_ARRAY_DIMENSION_MAX),
+ CONTRACT_AUX_ARG_CONST_array, 1 /* const */)
+
+#undef CONTRACT_AUX_ARG_CONST_array_I
+#undef CONTRACT_AUX_ARG_CONST_array_dim
+#undef CONTRACT_AUX_ARG_CONST_array
+
+}} // namespace contract::aux
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/bind_old.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/bind_old.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,237 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#if !BOOST_PP_IS_ITERATING
+# ifndef CONTRACT_AUX_BIND_OLD_HPP_
+# define CONTRACT_AUX_BIND_OLD_HPP_
+
+#include <contract/copy.hpp>
+#include <contract/config.hpp>
+#include <contract/aux_/mpl_assert.hpp>
+#include <contract/aux_/arg_const.hpp>
+#include <contract/aux_/result_const.hpp>
+#include <contract/aux_/preprocessor/iteration/params.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/noncopyable.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/arithmetic/inc.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/control/expr_iif.hpp>
+#include <boost/preprocessor/comparison/greater.hpp>
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/repetition/enum.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+#include <boost/preprocessor/iteration/iterate.hpp>
+
+// Old-ofs.
+#define CONTRACT_comma_Old(z, n, unused) \
+ , BOOST_PP_CAT(Old, n)
+#define CONTRACT_comma_typename_Old(z, n, unused) \
+ , typename BOOST_PP_CAT(Old, n)
+#define CONTRACT_comma_typename_Old_default(z, n, unused) \
+ , typename BOOST_PP_CAT(Old, n) = void_old
+#define CONTRACT_comma_arg_const_Old(z, n, unused) \
+ , typename arg_const< BOOST_PP_CAT(Old, n) >::type
+#define CONTRACT_comma_arg_const_Old_old(z, n, unused) \
+ CONTRACT_comma_arg_const_Old(z, n, ~) BOOST_PP_CAT(old, n)
+#define CONTRACT_comma_old_value(z, n, unused) \
+ , BOOST_PP_CAT(_old, n)->value()
+// Arguments.
+#define CONTRACT_Arg(z, n, unused) \
+ BOOST_PP_CAT(Arg, n)
+#define CONTRACT_comma_typename_Arg(z, n, unused) \
+ , typename BOOST_PP_CAT(Arg, n)
+#define CONTRACT_comma_arg_const_Arg(z, n, unused) \
+ , typename arg_const< BOOST_PP_CAT(Arg, n) >::type
+#define CONTRACT_arg_const_Arg_arg(z, n, unused) \
+ typename arg_const< BOOST_PP_CAT(Arg, n) >::type BOOST_PP_CAT(arg, n)
+#define CONTRACT_comma_arg(z, n, unused) \
+ , BOOST_PP_CAT(arg, n)
+// Typedefs.
+#define CONTRACT_typedef_postcondition_type(z, n, unused) \
+ typedef \
+ void \
+ ( BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_ITERATION_IS_MEMBER, Class::) \
+ * BOOST_PP_CAT(postcondition_type, n) ) \
+ ( \
+ function_type \
+ BOOST_PP_REPEAT_ ## z(CONTRACT_AUX_PP_ITERATION_ARITY, \
+ CONTRACT_comma_arg_const_Arg, ~) \
+ BOOST_PP_REPEAT_ ## z(n, CONTRACT_comma_arg_const_Old, ~) \
+ , typename result_const< Result >::type \
+ ) \
+ /* post func always const for members (for const-correctness) */ \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_ITERATION_IS_MEMBER, const) \
+ CONTRACT_AUX_PP_ITERATION_MEMBER_VOLATILE \
+ ;
+// Constructor.
+#define CONTRACT_comma_init_old(z, n, current_n) \
+ , \
+ BOOST_PP_CAT(_old, n)( \
+ BOOST_PP_IIF(BOOST_PP_GREATER(current_n, n), \
+ BOOST_PP_IDENTITY( \
+ new copy< BOOST_PP_CAT(Old, n) >(BOOST_PP_CAT(old, n)) \
+ ) \
+ , \
+ BOOST_PP_EMPTY \
+ )() \
+ )
+#define CONTRACT_init_post_enum(z, n, current_n) \
+ BOOST_PP_COMMA_IF(n) \
+ BOOST_PP_CAT(_post, n)( \
+ BOOST_PP_EXPR_IIF(BOOST_PP_EQUAL(n, current_n), post) \
+ )
+#define CONTRACT_constructor(z, n, unused) \
+ explicit bind_old(BOOST_PP_CAT(postcondition_type, n) post \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_PP_ITERATION_IS_MEMBER) \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_ITERATION_IS_MEMBER, \
+ Class const CONTRACT_AUX_PP_ITERATION_MEMBER_VOLATILE* const obj \
+ ) \
+ BOOST_PP_REPEAT_ ## z(n, CONTRACT_comma_arg_const_Old_old, ~) \
+ ) : \
+ BOOST_PP_REPEAT_ ## z(BOOST_PP_INC(CONTRACT_CONFIG_OLDOF_MAX), \
+ CONTRACT_init_post_enum, n) \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_PP_ITERATION_IS_MEMBER) \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_ITERATION_IS_MEMBER, _obj(obj)) \
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_OLDOF_MAX, CONTRACT_comma_init_old, n) \
+ {}
+// Call operator implementation.
+#define CONTRACT_call_post(z, n, unused) \
+ if(BOOST_PP_CAT(_post, n)) { \
+ ( BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_ITERATION_IS_MEMBER, _obj->*) \
+ BOOST_PP_CAT(_post, n) ) \
+ ( \
+ function_type() \
+ BOOST_PP_REPEAT_ ## z(CONTRACT_AUX_PP_ITERATION_ARITY, \
+ CONTRACT_comma_arg, ~) \
+ BOOST_PP_REPEAT_ ## z(n, CONTRACT_comma_old_value, ~) \
+ , result \
+ ); \
+ return; /* call made, exit */ \
+ }
+// Member variables declarations.
+#define CONTRACT_decl_post(z, n, unused) \
+ BOOST_PP_CAT(postcondition_type, n) const BOOST_PP_CAT(_post, n) ;
+#define CONTRACT_decl_old(z, n, unused) \
+ boost::shared_ptr< copy< BOOST_PP_CAT(Old, n) > const > const \
+ BOOST_PP_CAT(_old, n) ;
+
+namespace contract { namespace aux {
+
+// Specify tparam Old = void_old if smaller number of olds (all olds always
+// given to avoid permutations of all possible args with all possible olds).
+// Non-copyable because bind_old should be used so to never copy void_old.
+class void_old: private boost::noncopyable {};
+
+template<
+ typename F
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_OLDOF_MAX,
+ CONTRACT_comma_typename_Old_default, ~)
+>
+class bind_old {
+ CONTRACT_AUX_MPL_ASSERT_MSG(sizeof(F) == 0,
+ INTERNAL_ERROR_template_instantiated_with_invalid_parameters,
+ (types< F, Old0, Old1 >));
+};
+
+}} // namespace contract::aux
+
+# define BOOST_PP_ITERATION_PARAMS_1 \
+ CONTRACT_AUX_PP_ITERATION_PARAMS_ARITY( \
+ "contract/aux_/bind_old.hpp")
+# include BOOST_PP_ITERATE()
+# undef CONTRACT_comma_Old
+# undef CONTRACT_comma_typename
+# undef CONTRACT_comma_typename_Old_default
+# undef CONTRACT_comma_arg_const_Old
+# undef CONTRACT_comma_arg_const_Old_old
+# undef CONTRACT_comma_old_value
+# undef CONTRACT_Arg
+# undef CONTRACT_comma_typename_Arg
+# undef CONTRACT_comma_arg_const_Arg
+# undef CONTRACT_arg_const_Arg_arg
+# undef CONTRACT_comma_arg
+# undef CONTRACT_typedef_postcondition_type
+# undef CONTRACT_comma_init_old
+# undef CONTRACT_init_post_enum
+# undef CONTRACT_constructor
+# undef CONTRACT_call_post
+# undef CONTRACT_decl_post
+# undef CONTRACT_decl_old
+# endif // #include guard
+#elif BOOST_PP_ITERATION_DEPTH() == 1
+# define BOOST_PP_ITERATION_PARAMS_2 \
+ CONTRACT_AUX_PP_ITERATION_PARAMS_CV_MEMBER( \
+ "contract/aux_/bind_old.hpp")
+# include BOOST_PP_ITERATE()
+#elif BOOST_PP_ITERATION_DEPTH() == 2
+// Define CONTRACT_AUX_PP_ITERATION_ARITY (from iteration frame 1).
+# include <contract/aux_/preprocessor/iteration/arity_1.hpp>
+// Define ..._IS_MEMBER, ..._MEMBER_CONST, and ..._MEMBER_VOLATILE (iter 2).
+# include <contract/aux_/preprocessor/iteration/cv_member_2.hpp>
+
+namespace contract { namespace aux {
+
+template<
+ typename Result
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_PP_ITERATION_IS_MEMBER)
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_ITERATION_IS_MEMBER, class Class)
+ BOOST_PP_REPEAT(CONTRACT_AUX_PP_ITERATION_ARITY,
+ CONTRACT_comma_typename_Arg, ~)
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_OLDOF_MAX, CONTRACT_comma_typename_Old, ~)
+>
+class bind_old<
+ Result
+ ( BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_ITERATION_IS_MEMBER,
+ Class::) * )
+ ( BOOST_PP_ENUM(CONTRACT_AUX_PP_ITERATION_ARITY,
+ CONTRACT_Arg, ~) )
+ CONTRACT_AUX_PP_ITERATION_MEMBER_CONST
+ CONTRACT_AUX_PP_ITERATION_MEMBER_VOLATILE
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_OLDOF_MAX, CONTRACT_comma_Old, ~)
+> {
+public:
+ typedef
+ Result
+ ( BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_ITERATION_IS_MEMBER, Class::)
+ * function_type )
+ ( BOOST_PP_ENUM(CONTRACT_AUX_PP_ITERATION_ARITY, CONTRACT_Arg, ~) )
+ CONTRACT_AUX_PP_ITERATION_MEMBER_CONST
+ CONTRACT_AUX_PP_ITERATION_MEMBER_VOLATILE
+ ;
+ BOOST_PP_REPEAT(BOOST_PP_INC(CONTRACT_CONFIG_OLDOF_MAX),
+ CONTRACT_typedef_postcondition_type, ~)
+
+ BOOST_PP_REPEAT(BOOST_PP_INC(CONTRACT_CONFIG_OLDOF_MAX),
+ CONTRACT_constructor, ~)
+
+ void operator()(
+ BOOST_PP_ENUM(CONTRACT_AUX_PP_ITERATION_ARITY,
+ CONTRACT_arg_const_Arg_arg, ~)
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_PP_ITERATION_ARITY)
+ typename result_const< Result >::type result
+ ) const {
+ BOOST_PP_REPEAT(BOOST_PP_INC(CONTRACT_CONFIG_OLDOF_MAX),
+ CONTRACT_call_post, ~)
+ }
+
+private:
+ BOOST_PP_REPEAT(BOOST_PP_INC(CONTRACT_CONFIG_OLDOF_MAX),
+ CONTRACT_decl_post, ~)
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_ITERATION_IS_MEMBER,
+ Class const CONTRACT_AUX_PP_ITERATION_MEMBER_VOLATILE* const _obj;
+ )
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_OLDOF_MAX, CONTRACT_decl_old, ~)
+};
+
+}} // namespace contract::aux
+
+#else // iteration
+# error "INTERNAL ERROR: iteration index out-of-range"
+#endif // iteration
+
Added: sandbox/contract/include/contract/aux_/call/constructor_entry.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/call/constructor_entry.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,56 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#if !BOOST_PP_IS_ITERATING
+# ifndef CONTRACT_AUX_CALL_CONSTRUCTOR_ENTRY_HPP_
+# define CONTRACT_AUX_CALL_CONSTRUCTOR_ENTRY_HPP_
+# include <contract/aux_/call/impl_/include.hpp>
+# include <contract/aux_/preprocessor/iteration/params.hpp>
+# include <boost/preprocessor/iteration/iterate.hpp>
+# include <contract/aux_/call/impl_/define.hpp>
+
+namespace contract { namespace aux {
+
+// NOTE: The Class tparam is necessary to make this a new type to inherit from
+// for each new class (to avoid inheritance ambiguity errors-- virtual
+// inheritance cannot be used to resolve ambiguity because it will create only
+// one call_constructor_entry base object and therefore check constructor entry
+// contracts only for one of the base classes).
+template< class Class >
+struct call_constructor_entry {
+ // NOTE: This default constructor is necessary to allow for eventual user
+ // constructors without a contract (i.e., not wrapped by this lib macros).
+ call_constructor_entry() {}
+
+ // Only defines additional constructors so it does not clash with member
+ // func/var names defined by user deriving from this class.
+
+# define BOOST_PP_ITERATION_PARAMS_1 \
+ CONTRACT_AUX_PP_ITERATION_PARAMS_ARITY( \
+ "contract/aux_/call/constructor_entry.hpp")
+# include BOOST_PP_ITERATE()
+
+};
+
+}} // namespace contract::aux
+
+# include <contract/aux_/call/impl_/undef.hpp>
+# endif // #include guard
+#elif BOOST_PP_ITERATION_DEPTH() == 1
+// Define CONTRACT_AUX_PP_ITERATION_ARITY (from iteration frame 1).
+# include <contract/aux_/preprocessor/iteration/arity_1.hpp>
+# define CONTRACT_AUX_CALL_ARITY CONTRACT_AUX_PP_ITERATION_ARITY
+# define CONTRACT_AUX_CALL_IS_MEMBER 1
+# define CONTRACT_AUX_CALL_IS_STATIC 0
+# define CONTRACT_AUX_CALL_IS_DESTRUCTOR 0
+# define CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY 1
+# define CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT 0
+# include <contract/aux_/call/impl_/function.hpp> // Generate func code.
+#else // iteration
+# error "INTERNAL ERROR: iteration index out-of-range"
+#endif // iteration
+
Added: sandbox/contract/include/contract/aux_/call/constructor_exit.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/call/constructor_exit.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,40 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#if !BOOST_PP_IS_ITERATING
+# ifndef CONTRACT_AUX_CALL_CONSTRUCTOR_EXIT_HPP_
+# define CONTRACT_AUX_CALL_CONSTRUCTOR_EXIT_HPP_
+# include <contract/aux_/call/impl_/include.hpp>
+# include <contract/aux_/preprocessor/iteration/params.hpp>
+# include <boost/preprocessor/iteration/iterate.hpp>
+# include <contract/aux_/call/impl_/define.hpp>
+
+namespace contract { namespace aux {
+
+# define BOOST_PP_ITERATION_PARAMS_1 \
+ CONTRACT_AUX_PP_ITERATION_PARAMS_ARITY( \
+ "contract/aux_/call/constructor_exit.hpp")
+# include BOOST_PP_ITERATE()
+
+}} // namespace contract::aux
+
+# include <contract/aux_/call/impl_/undef.hpp>
+# endif // #include guard
+#elif BOOST_PP_ITERATION_DEPTH() == 1
+// Define CONTRACT_AUX_PP_ITERATION_ARITY (from iteration frame 1).
+# include <contract/aux_/preprocessor/iteration/arity_1.hpp>
+# define CONTRACT_AUX_CALL_ARITY CONTRACT_AUX_PP_ITERATION_ARITY
+# define CONTRACT_AUX_CALL_IS_MEMBER 1
+# define CONTRACT_AUX_CALL_IS_STATIC 0
+# define CONTRACT_AUX_CALL_IS_DESTRUCTOR 0
+# define CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY 0
+# define CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT 1
+# include <contract/aux_/call/impl_/function.hpp> // Generate func code.
+#else // iteration
+# error "INTERNAL ERROR: iteration index out-of-range"
+#endif // iteration
+
Added: sandbox/contract/include/contract/aux_/call/destructor.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/call/destructor.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,27 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CALL_DESTRUCTOR_HPP_
+# define CONTRACT_AUX_CALL_DESTRUCTOR_HPP_
+# include <contract/aux_/call/impl_/include.hpp>
+# include <contract/aux_/call/impl_/define.hpp>
+
+namespace contract { namespace aux {
+
+# define CONTRACT_AUX_CALL_ARITY 0 // Destructors have no argument.
+# define CONTRACT_AUX_CALL_IS_MEMBER 1
+# define CONTRACT_AUX_CALL_IS_STATIC 0
+# define CONTRACT_AUX_CALL_IS_DESTRUCTOR 1
+# define CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY 0
+# define CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT 0
+# include <contract/aux_/call/impl_/function.hpp> // Generate func code.
+
+}} // namespace contract::aux
+
+# include <contract/aux_/call/impl_/undef.hpp>
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/call/free_function.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/call/free_function.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,40 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#if !BOOST_PP_IS_ITERATING
+# ifndef CONTRACT_AUX_CALL_FREE_FUNCTION_HPP_
+# define CONTRACT_AUX_CALL_FREE_FUNCTION_HPP_
+# include <contract/aux_/call/impl_/include.hpp>
+# include <contract/aux_/preprocessor/iteration/params.hpp>
+# include <boost/preprocessor/iteration/iterate.hpp>
+# include <contract/aux_/call/impl_/define.hpp>
+
+namespace contract { namespace aux {
+
+# define BOOST_PP_ITERATION_PARAMS_1 \
+ CONTRACT_AUX_PP_ITERATION_PARAMS_ARITY( \
+ "contract/aux_/call/free_function.hpp")
+# include BOOST_PP_ITERATE()
+
+}} // namespace contract::aux
+
+# include <contract/aux_/call/impl_/undef.hpp>
+# endif // #include guard
+#elif BOOST_PP_ITERATION_DEPTH() == 1
+// Define CONTRACT_AUX_PP_ITERATION_ARITY (from iteration frame 1).
+# include <contract/aux_/preprocessor/iteration/arity_1.hpp>
+# define CONTRACT_AUX_CALL_ARITY CONTRACT_AUX_PP_ITERATION_ARITY
+# define CONTRACT_AUX_CALL_IS_MEMBER 0
+# define CONTRACT_AUX_CALL_IS_STATIC 0
+# define CONTRACT_AUX_CALL_IS_DESTRUCTOR 0
+# define CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY 0
+# define CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT 0
+# include <contract/aux_/call/impl_/function.hpp> // Generate func code.
+#else // iteration
+# error "INTERNAL ERROR: iteration index out-of-range"
+#endif // iteration
+
Added: sandbox/contract/include/contract/aux_/call/globals.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/call/globals.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,35 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CALL_GLOBALS_HPP_
+#define CONTRACT_AUX_CALL_GLOBALS_HPP_
+
+#include <contract/aux_/thread_variable.hpp>
+
+namespace contract { namespace aux {
+
+// NOTE: A template is used to wrap these variables so they can be defined in
+// this header (instead of requiring to link a pre-compiled .cpp for these
+// definitions) without causing a multiple definition error (static or extern
+// specifiers cannot be used here because static creates a different variable
+// copy for each translation unit when these variables need to globally have
+// the same value for the entire program, and extern still requires the
+// definitions somewhere in a .cpp which we wanted to avoid).
+template<int Unused = 0>
+struct call_globals {
+ // POLICY: Used to globally disable contract checking while already
+ // checking another contract.
+ static thread_variable<bool> is_checking_contract;
+};
+
+template<int Unused>
+thread_variable<bool> call_globals<Unused>::is_checking_contract = false;
+
+}} // namespace contract::aux
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/call/impl_/define.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/call/impl_/define.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,112 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#define CONTRACT_comma_arg_param(z, n, unused) \
+ , typename SignTraits::BOOST_PP_CAT(arg_type, n) BOOST_PP_CAT(arg, n)
+
+#define CONTRACT_arg(z, n, unused) \
+ BOOST_PP_CAT(arg, n)
+
+#define CONTRACT_comma_arg(z, n, unused) \
+ , BOOST_PP_CAT(arg, n)
+
+#define CONTRACT_from \
+ BOOST_PP_IIF(BOOST_PP_COMPL(CONTRACT_AUX_CALL_IS_MEMBER), \
+ FROM_FREE_FUNCTION \
+ , BOOST_PP_IIF(CONTRACT_AUX_CALL_IS_STATIC, \
+ FROM_STATIC_MEMBER_FUNCTION \
+ , BOOST_PP_IIF(CONTRACT_AUX_CALL_IS_DESTRUCTOR, \
+ FROM_DESTRUCTOR \
+ , BOOST_PP_IIF(BOOST_PP_BITOR(CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY, \
+ CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT), \
+ FROM_CONSTRUCTOR \
+ , \
+ FROM_NONSTATIC_MEMBER_FUNCTION \
+ ))))
+
+#define CONTRACT_func \
+ BOOST_PP_IIF(BOOST_PP_COMPL(CONTRACT_AUX_CALL_IS_MEMBER), \
+ call_free_function \
+ , BOOST_PP_IIF(CONTRACT_AUX_CALL_IS_STATIC, \
+ call_static_member_function \
+ , BOOST_PP_IIF(CONTRACT_AUX_CALL_IS_DESTRUCTOR, \
+ call_destructor \
+ , BOOST_PP_IIF(CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY, \
+ call_constructor_entry \
+ , BOOST_PP_IIF(CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT, \
+ call_constructor_exit \
+ , \
+ call_nonstatic_member_function \
+ )))))
+
+#define CONTRACT_entry_class_inv_func \
+ BOOST_PP_IIF(CONTRACT_AUX_CALL_IS_STATIC, \
+ (*sub_static_class_inv) \
+ , BOOST_PP_IIF(CONTRACT_AUX_CALL_IS_DESTRUCTOR, \
+ (obj->*this_class_inv) \
+ , BOOST_PP_IIF(CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY, \
+ (*this_static_class_inv) \
+ , \
+ (obj->*sub_class_inv) \
+ )))
+
+#define CONTRACT_exit_class_inv_func \
+ BOOST_PP_IIF(CONTRACT_AUX_CALL_IS_STATIC, \
+ (*sub_static_class_inv) \
+ , BOOST_PP_IIF(CONTRACT_AUX_CALL_IS_DESTRUCTOR, \
+ (*this_static_class_inv) \
+ , BOOST_PP_IIF(CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT, \
+ (obj->*this_class_inv) \
+ , \
+ (obj->*sub_class_inv) \
+ )))
+
+#define CONTRACT_throw_class_inv_func \
+ BOOST_PP_IIF(CONTRACT_AUX_CALL_IS_STATIC, \
+ (*sub_static_class_inv) \
+ , BOOST_PP_IIF(CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT, \
+ (*this_static_class_inv) \
+ , \
+ (obj->*sub_class_inv) /* also for throwing destructors */ \
+ ))
+
+#define CONTRACT_pre_func \
+ BOOST_PP_IIF(BOOST_PP_BITAND(CONTRACT_AUX_CALL_IS_MEMBER, \
+ BOOST_PP_BITAND(BOOST_PP_COMPL(CONTRACT_AUX_CALL_IS_STATIC), \
+ BOOST_PP_COMPL(CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY))), \
+ (obj->*sub_pre) \
+ , \
+ (*this_pre) \
+ )
+
+#define CONTRACT_oldof_assignment_func \
+ BOOST_PP_IIF(CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT, \
+ this_post = (*this_cons_oldof) \
+ , BOOST_PP_IIF(BOOST_PP_BITAND(CONTRACT_AUX_CALL_IS_MEMBER, \
+ BOOST_PP_COMPL(CONTRACT_AUX_CALL_IS_STATIC)), \
+ sub_post = (obj->*sub_oldof) \
+ , \
+ this_post = (*this_oldof) \
+ ))
+
+#define CONTRACT_post_func \
+ BOOST_PP_IIF(BOOST_PP_BITAND(CONTRACT_AUX_CALL_IS_MEMBER, \
+ BOOST_PP_BITAND(BOOST_PP_COMPL(CONTRACT_AUX_CALL_IS_STATIC), \
+ BOOST_PP_COMPL(CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT))), \
+ subcontract_postcondition<SignTraits> \
+ , \
+ this_post \
+ )
+
+#define CONTRACT_body_func \
+ BOOST_PP_IIF(BOOST_PP_BITAND(CONTRACT_AUX_CALL_IS_MEMBER, \
+ BOOST_PP_COMPL(CONTRACT_AUX_CALL_IS_STATIC)), \
+ (obj->*body) \
+ , \
+ (*body) \
+ )
+
Added: sandbox/contract/include/contract/aux_/call/impl_/function.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/call/impl_/function.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,538 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CALL_ARITY
+# error "INTERNAL ERROR: must define CONTRACT_AUX_CALL_ARITY"
+#endif
+#ifndef CONTRACT_AUX_CALL_IS_MEMBER
+# error "INTERNAL ERROR: must define CONTRACT_AUX_CALL_IS_MEMBER"
+#endif
+#ifndef CONTRACT_AUX_CALL_IS_STATIC
+# error "INTERNAL ERROR: must define CONTRACT_AUX_CALL_IS_STATIC"
+#endif
+#ifndef CONTRACT_AUX_CALL_IS_DESTRUCTOR
+# error "INTERNAL ERROR: must define CONTRACT_AUX_CALL_IS_DESTRUCTOR"
+#endif
+#ifndef CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY
+# error "INTERNAL ERROR: must define CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY"
+#endif
+#ifndef CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT
+# error "INTERNAL ERROR: must define CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT"
+#endif
+
+// The following code is fairly complex and hard to read due to the amount of
+// preprocessor metaprogramming that is used. This code was programmed this
+// way so this one piece of code can generate *all* the call functions in order
+// to *completely* avoid any code duplication in their implementations.
+// Previous revisions or this code used to duplicate code among different call
+// functions implementations but while these older revisions were more
+// readable, they were very difficult to maintain because bug fixes and changes
+// needed to be propagated among different part of the code. Therefore, all the
+// call code was incorporated into this one metaprogram (and it should be kept
+// this way).
+//
+// The following code in general follows the conventions that #if-directives
+// are used to turn on/off contract code blocks (via CONFIG macros) while
+// PP-macros are used to pp-metaprogram the function code (this distinction was
+// found to make this code a bit more readable).
+//
+// See also: include_.hpp, define_.hpp, undef_.hpp
+
+template< class SignTraits >
+BOOST_PP_EXPR_IIF(BOOST_PP_COMPL(CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY),
+ // This generates a cons for constructor entry so no result allowed.
+ typename SignTraits::result_type
+)
+CONTRACT_func
+(
+#if CONTRACT_AUX_CONFIG_DEBUG_01
+ char const* file, unsigned long const& line, // Trailing comma `,`.
+#endif
+ BOOST_PP_IIF(CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY,
+ // NOTE: Need to deduce this param because ISO C++ does not allow to
+ // specify tparams for const (because invoked without a name).
+ SignTraits
+ ,
+ typename SignTraits::body_type const body
+ )
+ BOOST_PP_REPEAT(CONTRACT_AUX_CALL_ARITY, CONTRACT_comma_arg_param, ~)
+ BOOST_PP_COMMA_IF(BOOST_PP_BITAND(CONTRACT_AUX_CALL_IS_MEMBER,
+ BOOST_PP_BITAND(BOOST_PP_COMPL(CONTRACT_AUX_CALL_IS_STATIC),
+ BOOST_PP_COMPL(CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY))))
+ BOOST_PP_EXPR_IIF(BOOST_PP_BITAND(CONTRACT_AUX_CALL_IS_MEMBER,
+ BOOST_PP_BITAND(BOOST_PP_COMPL(CONTRACT_AUX_CALL_IS_STATIC),
+ BOOST_PP_COMPL(CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY))),
+ typename SignTraits::cv_qualified_obj_type const obj
+ )
+#if CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01 && CONTRACT_AUX_CALL_IS_MEMBER
+ BOOST_PP_COMMA_IF(BOOST_PP_BITOR(CONTRACT_AUX_CALL_IS_DESTRUCTOR,
+ BOOST_PP_BITOR(CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY,
+ CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT)))
+ BOOST_PP_EXPR_IIF(BOOST_PP_BITOR(CONTRACT_AUX_CALL_IS_DESTRUCTOR,
+ BOOST_PP_BITOR(CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY,
+ CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT)),
+ typename SignTraits::static_class_invariant_type const
+ this_static_class_inv
+ )
+# if !CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY
+ BOOST_PP_COMMA_IF(BOOST_PP_BITOR(CONTRACT_AUX_CALL_IS_DESTRUCTOR,
+ CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT))
+ BOOST_PP_EXPR_IIF(BOOST_PP_BITOR(CONTRACT_AUX_CALL_IS_DESTRUCTOR,
+ CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT),
+ typename SignTraits::class_invariant_type const this_class_inv
+ )
+# if !CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT
+ , typename SignTraits::
+ BOOST_PP_IIF(CONTRACT_AUX_CALL_IS_STATIC,
+ static_class_invariant_type const sub_static_class_inv
+ ,
+ class_invariant_type const sub_class_inv
+ )
+# endif
+# endif
+#endif
+#if CONTRACT_AUX_CONFIG_PRECONDITIONS_01 && !CONTRACT_AUX_CALL_IS_DESTRUCTOR \
+ && !CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT
+ , typename SignTraits::
+ BOOST_PP_IIF(CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY,
+ static_precondition_type
+ ,
+ precondition_type
+ )
+ const
+ BOOST_PP_IIF(BOOST_PP_BITAND(CONTRACT_AUX_CALL_IS_MEMBER,
+ BOOST_PP_BITAND(BOOST_PP_COMPL(
+ CONTRACT_AUX_CALL_IS_STATIC), BOOST_PP_COMPL(
+ CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY))),
+ sub_pre
+ ,
+ this_pre
+ )
+#endif
+#if CONTRACT_AUX_CONFIG_POSTCONDITIONS_01 && !CONTRACT_AUX_CALL_IS_DESTRUCTOR \
+ && !CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY
+ , typename SignTraits::
+ BOOST_PP_IIF(CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT,
+ constructor_oldof_type const this_cons_oldof
+ , BOOST_PP_IIF(BOOST_PP_BITAND(CONTRACT_AUX_CALL_IS_MEMBER,
+ BOOST_PP_COMPL(CONTRACT_AUX_CALL_IS_STATIC)),
+ subcontracted_oldof_type const sub_oldof
+ ,
+ oldof_type const this_oldof
+ ))
+#endif
+) {
+ if(call_globals<>::is_checking_contract) {
+ CONTRACT_AUX_DEBUGN(file, line, CONTRACT_func, dbg <<
+ "Entering, executing body, and exiting function contract " <<
+ "without checking contracts because assertions disabled " <<
+ "within assertions " << BOOST_PP_STRINGIZE(CONTRACT_body_func))
+ return
+#if !CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY
+ CONTRACT_body_func(
+ BOOST_PP_ENUM(CONTRACT_AUX_CALL_ARITY, CONTRACT_arg, ~)
+ )
+#endif
+ ;
+ }
+ CONTRACT_AUX_DEBUGN(file, line, CONTRACT_func, dbg <<
+ "Entering function contract")
+
+ // POLICY: For constructors and destructors, subcontracting is realized by
+ // the automatic invocation of all base constructor and destructor
+ // contracts via C++ object creation and disposal mechanism so here we
+ // just check this class constructor and destructor contract (not bases').
+
+#if CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01 && CONTRACT_AUX_CALL_IS_MEMBER && \
+ !CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY
+ bool calling_body = false; // Used only for class inv.
+ try {
+#endif
+
+ // Check class invariants on entry.
+#if CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01 && CONTRACT_AUX_CALL_IS_MEMBER && \
+ !CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT
+ // POLICY: Class inv are checked on entry/exit before pre/post so
+ // pre/post assertions can be simplified assuming inv are true (e.g.,
+ // don't check a ptr for nullity because inv already checked).
+ // POLICY: Class inv are not checked if class inv func ptr is null so
+ // caller can disable class inv checking for non public members.
+ // POLICY: Destructor check this class inv (and not subcontracted ones)
+ // because base class inv will be automatically invoked by C++ when
+ // calling base destructors.
+ if(
+ BOOST_PP_IIF(CONTRACT_AUX_CALL_IS_STATIC,
+ sub_static_class_inv
+ , BOOST_PP_IIF(CONTRACT_AUX_CALL_IS_DESTRUCTOR,
+ this_class_inv
+ , BOOST_PP_IIF(CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY,
+ this_static_class_inv
+ ,
+ sub_class_inv
+ )))
+ ) {
+ try {
+ CONTRACT_AUX_DEBUGN(file, line, CONTRACT_func, dbg <<
+ "Checking class invariants on entry " <<
+ BOOST_PP_STRINGIZE(CONTRACT_entry_class_inv_func))
+ call_globals<>::is_checking_contract = true;
+ CONTRACT_entry_class_inv_func();
+ call_globals<>::is_checking_contract = false;
+ } catch(...) {
+ CONTRACT_AUX_DEBUGN(file, line, CONTRACT_from, dbg <<
+ "Calling class invariant broken handler on entry")
+ call_globals<>::is_checking_contract = false;
+ class_invariant_broken_on_entry(CONTRACT_from);
+ }
+ }
+# if CONTRACT_AUX_CONFIG_DEBUG_01
+ else {
+ CONTRACT_AUX_DEBUGN(file, line, CONTRACT_func, dbg <<
+ "Class invariant checking disabled on entry for " <<
+ "non-public member")
+ }
+# endif
+#endif
+
+ // Check preconditions.
+#if CONTRACT_AUX_CONFIG_PRECONDITIONS_01 && !CONTRACT_AUX_CALL_IS_DESTRUCTOR \
+ && !CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT
+ try {
+ // POLICY: By default, pre disable assertion checking globally like
+ // any other contract checking func to avoid infinite recursion but
+ // this can be changed for pre to comply with N1962.
+# if !CONTRACT_AUX_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION_01
+ CONTRACT_AUX_DEBUGN(file, line, CONTRACT_func, dbg <<
+ "Checking preconditions " <<
+ BOOST_PP_STRINGIZE(CONTRACT_pre_func))
+ call_globals<>::is_checking_contract = true;
+# else
+ CONTRACT_AUX_DEBUGN(file, line, CONTRACT_func, dbg <<
+ "Checking preconditions configured to not disable " <<
+ "other assertions " <<
+ BOOST_PP_STRINGIZE(CONTRACT_pre_func))
+# endif
+ CONTRACT_pre_func(
+ // NOTE: Body func ptr is also passed to the contract checking
+ // functions (pre, old-of, and post) to handle overloading.
+ typename SignTraits::body_type()
+ BOOST_PP_REPEAT(CONTRACT_AUX_CALL_ARITY, CONTRACT_comma_arg, ~)
+ );
+# if !CONTRACT_AUX_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION_01
+ call_globals<>::is_checking_contract = false;
+# endif
+ } catch(...) {
+ CONTRACT_AUX_DEBUGN(file, line, CONTRACT_func, dbg <<
+ "Calling precondition broken handler")
+# if !CONTRACT_AUX_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION_01
+ call_globals<>::is_checking_contract = false;
+# endif
+ precondition_broken(CONTRACT_from);
+ }
+#endif
+
+ // Copy old-ofs.
+#if CONTRACT_AUX_CONFIG_POSTCONDITIONS_01 && !CONTRACT_AUX_CALL_IS_DESTRUCTOR \
+ && !CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY
+ // POLICY: An exception thrown while evaluating and copying old-ofs
+ // is threated as a post failure (while keeping the same active
+ // exception that failed the old-of) because (1) class inv at entry and
+ // pre passed so body can/should be executed but (2) old-ofs were not
+ // copied so post cannot be checked.
+ BOOST_PP_IIF(BOOST_PP_BITAND(CONTRACT_AUX_CALL_IS_MEMBER,
+ BOOST_PP_BITAND(BOOST_PP_COMPL(CONTRACT_AUX_CALL_IS_STATIC),
+ BOOST_PP_COMPL(CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT))),
+ std::list< typename SignTraits::bound_postcondition_type > sub_post;
+ ,
+ typename SignTraits::bound_postcondition_type this_post;
+ )
+ bool oldof_failed = true;
+ try {
+ CONTRACT_AUX_DEBUGN(file, line, CONTRACT_func, dbg <<
+ "Evaluating and coping postcondition old-ofs (" <<
+ BOOST_PP_STRINGIZE(CONTRACT_oldof_assignment_func) << ")")
+ // POLICY: Disable all assertions also during old-of evaluation and
+ // copy to prevent infinite recursion.
+ call_globals<>::is_checking_contract = true;
+ CONTRACT_oldof_assignment_func(
+ typename SignTraits::body_type()
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT)
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT,
+ obj
+ )
+ BOOST_PP_REPEAT(CONTRACT_AUX_CALL_ARITY, CONTRACT_comma_arg, ~)
+ );
+ call_globals<>::is_checking_contract = false;
+ // NOTE: Following throw is used to jump to catch below (this trick
+ // is necessary to keep eventual old-of error in active exception
+ // to re-throw it later.
+ throw oldof_failed = false;
+ } catch(...) {
+ // NOTE: Got here with oldof_failed == false iff no old-of error,
+ // or with oldof_failed == true iff old-of error (in which case the
+ // error is in the active exception).
+ call_globals<>::is_checking_contract = false;
+#endif
+
+ // Call body (and copy result).
+#if CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01 && CONTRACT_AUX_CALL_IS_MEMBER && \
+ !CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY
+ calling_body = true;
+#endif
+# if CONTRACT_AUX_IS_CONSTRUCTOR_EXIT
+ // POLICY: Only exceptions thrown by the body are handled by the
+ // function (and constructor) try-block. In particular, contract
+ // assertions and this library implementation code is executed
+ // outside the function (and constructor) try-block (see N1962).
+ // Function-try-blocks for functions other than constructors are
+ // programmed outside the macros and just around the body
+ // (constructors need special care because their member
+ // initializers are programmed within the macros and constructor
+ // try-blocks need to handle exceptions thrown by initializers).
+ // NOTE: This enables constructor try-blocks also during
+ // copy_result so eventual copy_result constructor exceptions
+ // will also be handled by the try-block while ideally the
+ // try-block will only handle body exceptions. However, copy_result
+ // constructor simply calls the body and copies the result so no
+ // exception but the one thrown by the body should be thrown.
+ dynamic_cast< constructor_try_block_guard< typename
+ SignTraits::class_type > >(obj)->
+ CONTRACT_AUX_SYMBOL((enable))();
+# endif
+#if !CONTRACT_AUX_CONFIG_POSTCONDITIONS_01 && \
+ !CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01 && \
+ !CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY
+ CONTRACT_AUX_DEBUGN(file, line, CONTRACT_func, dbg <<
+ "Executing body and returning without copying result " <<
+ BOOST_PP_STRINGIZE(CONTRACT_body_func))
+ // Optimization if no post (don't copy result).
+ return CONTRACT_body_func(
+ BOOST_PP_ENUM(CONTRACT_AUX_CALL_ARITY, CONTRACT_arg, ~)
+ );
+#elif !CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY
+ CONTRACT_AUX_DEBUGN(file, line, CONTRACT_func, dbg <<
+ "Executing body and copying eventual result " <<
+ BOOST_PP_STRINGIZE(CONTRACT_body_func))
+ copy_result<
+ typename SignTraits::result_type
+ BOOST_PP_COMMA_IF(BOOST_PP_BITAND(CONTRACT_AUX_CALL_IS_MEMBER,
+ BOOST_PP_COMPL(CONTRACT_AUX_CALL_IS_STATIC)))
+ BOOST_PP_EXPR_IIF(BOOST_PP_BITAND(CONTRACT_AUX_CALL_IS_MEMBER,
+ BOOST_PP_COMPL(CONTRACT_AUX_CALL_IS_STATIC)),
+ typename SignTraits::cv_qualified_obj_type
+ )
+ > result(
+ body // Result copy will call actual body.
+ BOOST_PP_COMMA_IF(BOOST_PP_BITAND(CONTRACT_AUX_CALL_IS_MEMBER,
+ BOOST_PP_COMPL(CONTRACT_AUX_CALL_IS_STATIC)))
+ BOOST_PP_EXPR_IIF(BOOST_PP_BITAND(CONTRACT_AUX_CALL_IS_MEMBER,
+ BOOST_PP_COMPL(CONTRACT_AUX_CALL_IS_STATIC)),
+ obj
+ )
+ BOOST_PP_REPEAT(CONTRACT_AUX_CALL_ARITY, CONTRACT_comma_arg, ~)
+ );
+# if CONTRACT_AUX_IS_CONSTRUCTOR_EXIT
+ dynamic_cast< constructor_try_block_guard< typename
+ SignTraits::class_type > >(obj)->
+ CONTRACT_AUX_SYMBOL((disable))();
+# endif
+
+ // Check class invariants on exit.
+# if CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01 && CONTRACT_AUX_CALL_IS_MEMBER
+ calling_body = false;
+
+ // POLICY: For destructors, cannot check dynamic class inv because
+ // there is no longer an object here after destructor body
+ // execution but we can still check this static class inv (again,
+ // do not check subcontracted static class inv because base static
+ // class inv will be automatically invoked by C++ when calling base
+ // destructors).
+ if(
+ BOOST_PP_IIF(CONTRACT_AUX_CALL_IS_STATIC,
+ sub_static_class_inv
+ , BOOST_PP_IIF(CONTRACT_AUX_CALL_IS_DESTRUCTOR,
+ this_static_class_inv
+ , BOOST_PP_IIF(CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT,
+ this_class_inv
+ ,
+ sub_class_inv
+ )))
+ ) {
+ CONTRACT_AUX_DEBUGN(file, line, CONTRACT_func, dbg <<
+ "Checking class invariants on exit " <<
+ BOOST_PP_STRINGIZE(CONTRACT_exit_class_inv_func))
+ try {
+ call_globals<>::is_checking_contract = true;
+ CONTRACT_exit_class_inv_func();
+ call_globals<>::is_checking_contract = false;
+ } catch(...) {
+ CONTRACT_AUX_DEBUGN(file, line, CONTRACT_func, dbg <<
+ "Calling class invariant on exit broken handler")
+ call_globals<>::is_checking_contract = false;
+ class_invariant_broken_on_exit(CONTRACT_from);
+ }
+ }
+# if CONTRACT_AUX_CONFIG_DEBUG_01
+ else {
+ CONTRACT_AUX_DEBUGN(file, line, CONTRACT_func, dbg <<
+ "Class invariant checking on exit disabled for " <<
+ "non-public member")
+ }
+# endif
+# endif
+
+ // Check postconditions.
+# if CONTRACT_AUX_CONFIG_POSTCONDITIONS_01 && !CONTRACT_AUX_CALL_IS_DESTRUCTOR
+ try {
+ if(oldof_failed) {
+ CONTRACT_AUX_DEBUGN(file, line, CONTRACT_func, dbg <<
+ "Unable to evaluate or copy old-of expressions (" <<
+ BOOST_PP_STRINGIZE(CONTRACT_oldof_assignment_func)
+ << ")")
+ throw; // Re-throw old-of error (from active exception).
+ }
+ CONTRACT_AUX_DEBUGN(file, line, CONTRACT_func, dbg <<
+ "Checking postconditions (" <<
+ BOOST_PP_STRINGIZE(CONTRACT_post_func) << ")")
+ call_globals<>::is_checking_contract = true;
+ CONTRACT_post_func(
+ BOOST_PP_EXPR_IIF(BOOST_PP_BITAND(
+ CONTRACT_AUX_CALL_IS_MEMBER,
+ BOOST_PP_BITAND(BOOST_PP_COMPL(
+ CONTRACT_AUX_CALL_IS_STATIC),
+ BOOST_PP_COMPL(
+ CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT))),
+ sub_post
+ )
+ BOOST_PP_COMMA_IF(BOOST_PP_AND(CONTRACT_AUX_CALL_ARITY,
+ BOOST_PP_BITAND(CONTRACT_AUX_CALL_IS_MEMBER,
+ BOOST_PP_BITAND(BOOST_PP_COMPL(
+ CONTRACT_AUX_CALL_IS_STATIC),
+ BOOST_PP_COMPL(
+ CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT)))))
+ BOOST_PP_ENUM(CONTRACT_AUX_CALL_ARITY, CONTRACT_arg, ~)
+ BOOST_PP_COMMA_IF(BOOST_PP_OR(CONTRACT_AUX_CALL_ARITY,
+ BOOST_PP_BITAND(CONTRACT_AUX_CALL_IS_MEMBER,
+ BOOST_PP_BITAND(BOOST_PP_COMPL(
+ CONTRACT_AUX_CALL_IS_STATIC),
+ BOOST_PP_COMPL(
+ CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT)))))
+ result.param()
+ );
+ call_globals<>::is_checking_contract = false;
+ } catch(...) {
+ CONTRACT_AUX_DEBUGN(file, line, CONTRACT_func, dbg <<
+ "Calling postcondition broken handler")
+ call_globals<>::is_checking_contract = false;
+ postcondition_broken(CONTRACT_from);
+ }
+# endif
+
+ CONTRACT_AUX_DEBUGN(file, line, CONTRACT_func, dbg <<
+ "Exiting function contract normally")
+ return result.value();
+
+# if CONTRACT_AUX_CONFIG_POSTCONDITIONS_01 && !CONTRACT_AUX_CALL_IS_DESTRUCTOR
+ } // old-of catch
+# endif
+
+#endif // !post01 && !inv && !cons_entry
+
+ // Check class invariants on throw.
+#if CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01 && CONTRACT_AUX_CALL_IS_MEMBER && \
+ !CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY
+ } catch(...) {
+# if CONTRACT_AUX_IS_CONSTRUCTOR_EXIT
+ // Make sure to disable try-block before checking invariants on exit.
+ dynamic_cast< constructor_try_block_guard< typename
+ SignTraits::class_type > >(obj)->
+ CONTRACT_AUX_SYMBOL((disable))();
+# endif
+ // POLICY: Following exception safety guarantees, class inv (but not
+ // post) are checked also when body throws.
+ // If constructor body throws, only static class invariants can be
+ // checked here (because constructor body was not able to create the
+ // object).
+ // If a destructor body throws (but note that following C++ STL
+ // exception safety guarantees, destructors should be programmed to
+ // never throw), subcontracted (to check that also base objects are in a
+ // consistent state) class dynamic (because the destructor body failed
+ // so the object was not destructed and it still exists) inv are
+ // checked. However, if a destructor of one of the base classes throw
+ // there is no way to go back and check the class invariants of the
+ // derived classes (plus the derived constructor did not throw so the
+ // derived part of the object is actually destructed) and in this case
+ // the overall object is left only partially destructed and in an
+ // undefined state (again, following exception safety rule destructors
+ // should never throw so this should never happen).
+ if(
+ BOOST_PP_IIF(CONTRACT_AUX_CALL_IS_STATIC,
+ sub_static_class_inv
+ , BOOST_PP_IIF(CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT,
+ this_static_class_inv
+ ,
+ sub_class_inv
+ ))
+ && calling_body
+ ) {
+ try {
+ try {
+ CONTRACT_AUX_DEBUGN(file, line, CONTRACT_func, dbg <<
+ "Checking class invariants on throw " <<
+ BOOST_PP_STRINGIZE(CONTRACT_throw_class_inv_func))
+ call_globals<>::is_checking_contract = true;
+ CONTRACT_throw_class_inv_func();
+ call_globals<>::is_checking_contract = false;
+ } catch(...) {
+ CONTRACT_AUX_DEBUGN(file, line, CONTRACT_func, dbg <<
+ "Calling class invariant on throw broken handler")
+ call_globals<>::is_checking_contract = false;
+ class_invariant_broken_on_throw(CONTRACT_from);
+ }
+ } catch(...) {
+ // NOTE: Re-throw eventual inv broken exception (this is needed
+ // to allow the user to reprogram the contract handlers to
+ // throw and exception instead of terminating).
+ throw;
+ }
+
+ CONTRACT_AUX_DEBUGN(file, line, CONTRACT_func, dbg <<
+ "Exiting function contract on throw")
+ throw; // If invariant passed, re-throw body exception.
+ }
+# if CONTRACT_AUX_CONFIG_DEBUG_01
+ else if(calling_body) {
+ CONTRACT_AUX_DEBUGN(file, line, CONTRACT_func, dbg <<
+ "Class invariant checking on throw disabled for " <<
+ "non-public member")
+ }
+# endif
+ CONTRACT_AUX_DEBUGN(file, line, CONTRACT_func, dbg <<
+ "Exiting function contract on throw")
+# if CONTRACT_AUX_IS_CONSTRUCTOR_EXIT
+ if(calling_body) {
+ // Enable constructor-try-block before re-throwing body exception.
+ dynamic_cast< constructor_try_block_guard< typename
+ SignTraits::class_type > >(obj)->
+ CONTRACT_AUX_SYMBOL((enable))();
+ }
+# endif
+ throw; // Re-throw (if no body call or no invariant checking).
+ }
+#endif
+ CONTRACT_AUX_DEBUGN(file, line, CONTRACT_func, dbg <<
+ "Exiting function contract normally")
+}
+
+// Undefine named external arg macros (similar to BOOST_PP_ITERATION_PARAMS).
+#undef CONTRACT_AUX_CALL_ARITY
+#undef CONTRACT_AUX_CALL_IS_MEMBER
+#undef CONTRACT_AUX_CALL_IS_STATIC
+#undef CONTRACT_AUX_CALL_IS_DESTRUCTOR
+#undef CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY
+#undef CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT
+
Added: sandbox/contract/include/contract/aux_/call/impl_/include.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/call/impl_/include.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,29 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#include <contract/broken.hpp>
+#include <contract/aux_/config.hpp>
+#include <contract/aux_/copy_result.hpp>
+#include <contract/aux_/debug.hpp>
+#include <contract/aux_/constructor_try_block_guard.hpp>
+#include <contract/aux_/call/globals.hpp>
+#include <contract/aux_/subcontract/postcondition.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/stringize.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/logical/or.hpp>
+#include <boost/preprocessor/logical/bitor.hpp>
+#include <boost/preprocessor/logical/and.hpp>
+#include <boost/preprocessor/logical/bitand.hpp>
+#include <boost/preprocessor/logical/bitand.hpp>
+#include <boost/preprocessor/logical/compl.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/control/expr_iif.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+#include <boost/preprocessor/repetition/enum.hpp>
+#include <list>
+
Added: sandbox/contract/include/contract/aux_/call/impl_/undef.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/call/impl_/undef.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,20 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#undef CONTRACT_comma_arg_param
+#undef CONTRACT_arg
+#undef CONTRACT_comma_arg
+#undef CONTRACT_from
+#undef CONTRACT_func
+#undef CONTRACT_entry_class_inv_func
+#undef CONTRACT_exit_class_inv_func
+#undef CONTRACT_throw_class_inv_func
+#undef CONTRACT_pre_func
+#undef CONTRACT_oldof_assignment_func
+#undef CONTRACT_post_func
+#undef CONTRACT_body_func
+
Added: sandbox/contract/include/contract/aux_/call/nonstatic_member_function.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/call/nonstatic_member_function.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,40 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#if !BOOST_PP_IS_ITERATING
+# ifndef CONTRACT_AUX_CALL_NONSTATIC_MEMBER_FUNCTION_HPP_
+# define CONTRACT_AUX_CALL_NONSTATIC_MEMBER_FUNCTION_HPP_
+# include <contract/aux_/call/impl_/include.hpp>
+# include <contract/aux_/preprocessor/iteration/params.hpp>
+# include <boost/preprocessor/iteration/iterate.hpp>
+# include <contract/aux_/call/impl_/define.hpp>
+
+namespace contract { namespace aux {
+
+# define BOOST_PP_ITERATION_PARAMS_1 \
+ CONTRACT_AUX_PP_ITERATION_PARAMS_ARITY( \
+ "contract/aux_/call/nonstatic_member_function.hpp")
+# include BOOST_PP_ITERATE()
+
+}} // namespace contract::aux
+
+# include <contract/aux_/call/impl_/undef.hpp>
+# endif // #include guard
+#elif BOOST_PP_ITERATION_DEPTH() == 1
+// Define CONTRACT_AUX_PP_ITERATION_ARITY (from iteration frame 1).
+# include <contract/aux_/preprocessor/iteration/arity_1.hpp>
+# define CONTRACT_AUX_CALL_ARITY CONTRACT_AUX_PP_ITERATION_ARITY
+# define CONTRACT_AUX_CALL_IS_MEMBER 1
+# define CONTRACT_AUX_CALL_IS_STATIC 0
+# define CONTRACT_AUX_CALL_IS_DESTRUCTOR 0
+# define CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY 0
+# define CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT 0
+# include <contract/aux_/call/impl_/function.hpp> // Generate func code.
+#else // iteration
+# error "INTERNAL ERROR: iteration index out-of-range"
+#endif // iteration
+
Added: sandbox/contract/include/contract/aux_/call/static_member_function.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/call/static_member_function.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,40 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#if !BOOST_PP_IS_ITERATING
+# ifndef CONTRACT_AUX_CALL_STATIC_MEMBER_FUNCTION_HPP_
+# define CONTRACT_AUX_CALL_STATIC_MEMBER_FUNCTION_HPP_
+# include <contract/aux_/call/impl_/include.hpp>
+# include <contract/aux_/preprocessor/iteration/params.hpp>
+# include <boost/preprocessor/iteration/iterate.hpp>
+# include <contract/aux_/call/impl_/define.hpp>
+
+namespace contract { namespace aux {
+
+# define BOOST_PP_ITERATION_PARAMS_1 \
+ CONTRACT_AUX_PP_ITERATION_PARAMS_ARITY( \
+ "contract/aux_/call/static_member_function.hpp")
+# include BOOST_PP_ITERATE()
+
+}} // namespace contract::aux
+
+# include <contract/aux_/call/impl_/undef.hpp>
+# endif // #include guard
+#elif BOOST_PP_ITERATION_DEPTH() == 1
+// Define CONTRACT_AUX_PP_ITERATION_ARITY (from iteration frame 1).
+# include <contract/aux_/preprocessor/iteration/arity_1.hpp>
+# define CONTRACT_AUX_CALL_ARITY CONTRACT_AUX_PP_ITERATION_ARITY
+# define CONTRACT_AUX_CALL_IS_MEMBER 1
+# define CONTRACT_AUX_CALL_IS_STATIC 1
+# define CONTRACT_AUX_CALL_IS_DESTRUCTOR 0
+# define CONTRACT_AUX_CALL_IS_CONSTRUCTOR_ENTRY 0
+# define CONTRACT_AUX_CALL_IS_CONSTRUCTOR_EXIT 0
+# include <contract/aux_/call/impl_/function.hpp> // Generate func code.
+#else // iteration
+# error "INTERNAL ERROR: iteration index out-of-range"
+#endif // iteration
+
Added: sandbox/contract/include/contract/aux_/concept_assert.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/concept_assert.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,45 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CONCEPT_ASSERT_HPP_
+#define CONTRACT_AUX_CONCEPT_ASSERT_HPP_
+
+#include <boost/concept/requires.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+// PRIVATE //
+
+// Add support for more compilers copying Boost.ConceptCheck implementation.
+#if BOOST_MSVC
+# if BOOST_WORKAROUND(BOOST_MSVC, == 1310)
+# define CONTRACT_AUX_CONCEPT_ASSERT_FN_(model_fn_ptr, id) \
+ enum { \
+ BOOST_PP_CAT(boost_concept_bheck, id) = \
+ sizeof(::boost::concepts::require< model_fn_ptr >) \
+ }
+# else // Not vc-7.1
+# define CONTRACT_AUX_CONCEPT_ASSERT_FN_(model_fn_ptr, id) \
+ enum { \
+ BOOST_PP_CAT(boost_concept_check, id) = \
+ sizeof(::boost::concepts::require_((model_fn_ptr)0)) \
+ }
+# endif
+#else
+# define CONTRACT_AUX_CONCEPT_ASSERT_FN_(model_fn_ptr, id) \
+ typedef ::boost::concepts::detail::instantiate< \
+ &::boost::concepts::requirement_< model_fn_ptr >::failed > \
+ BOOST_PP_CAT(boost_concept_check, id)
+#endif
+
+// PUBLIC //
+
+// Same as `BOOST_CONCEPT_ASSERT` but with id (for same line macro expansion).
+#define CONTRACT_AUX_CONCEPT_ASSERT(paren_model, id) \
+ CONTRACT_AUX_CONCEPT_ASSERT_FN_(void (*) paren_model, id)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/config.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/config.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,84 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CONFIG_HPP_
+#define CONTRACT_AUX_CONFIG_HPP_
+
+#include <contract/config.hpp>
+#include <boost/config.hpp>
+
+// Internal option to enable debug prints to `clog` (programmers should never
+// need to access this).
+#ifdef CONTRACT_AUX_CONFIG_DEBUG
+# define CONTRACT_AUX_CONFIG_DEBUG_01 1
+#else
+# define CONTRACT_AUX_CONFIG_DEBUG_01 0
+#endif
+
+// Internal option to change named parameter tag namespace (programmers
+// should never need to access this).
+#ifndef CONTRACT_AUX_CONFIG_NAMED_PARAMETER_TAG_NAMESPACE_DEFAULT
+# define CONTRACT_AUX_CONFIG_NAMED_PARAMETER_TAG_NAMESPACE_DEFAULT \
+ CONTRACT_AUX_SYMBOL( (params) )
+#endif
+
+#ifdef CONTRACT_CONFIG_THREAD_SAFE
+# define CONTRACT_AUX_CONFIG_THREAD_SAFE_01 1
+#else
+# define CONTRACT_AUX_CONFIG_THREAD_SAFE_01 0
+#endif
+
+#ifdef CONTRACT_CONFIG_NO_PRECONDITIONS
+# define CONTRACT_AUX_CONFIG_PRECONDITIONS_01 0
+#else
+# define CONTRACT_AUX_CONFIG_PRECONDITIONS_01 1
+#endif
+
+#ifdef CONTRACT_CONFIG_NO_POSTCONDITIONS
+# define CONTRACT_AUX_CONFIG_POSTCONDITIONS_01 0
+#else
+# define CONTRACT_AUX_CONFIG_POSTCONDITIONS_01 1
+#endif
+
+#ifdef CONTRACT_CONFIG_NO_CLASS_INVARIANTS
+# define CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01 0
+#else
+# define CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01 1
+#endif
+
+#ifdef CONTRACT_CONFIG_NO_BLOCK_INVARIANTS
+# define CONTRACT_AUX_CONFIG_BLOCK_INVARIANTS_01 0
+#else
+# define CONTRACT_AUX_CONFIG_BLOCK_INVARIANTS_01 1
+#endif
+
+#ifdef CONTRACT_CONFIG_NO_LOOP_VARIANTS
+# define CONTRACT_AUX_CONFIG_LOOP_VARIANTS_01 0
+#else
+# define CONTRACT_AUX_CONFIG_LOOP_VARIANTS_01 1
+#endif
+
+#ifdef CONTRACT_CONFIG_DO_NOT_OVERRIDE_PRECONDITIONS
+# define CONTRACT_AUX_CONFIG_PRECONDITION_OVERRIDE_01 0
+#else
+# define CONTRACT_AUX_CONFIG_PRECONDITION_OVERRIDE_01 1
+#endif
+
+#ifdef CONTRACT_CONFIG_REPORT_OVERRIDDEN_PRECONDITION_FAILURE
+# define CONTRACT_AUX_CONFIG_REPORT_OVERRIDDEN_PRECONDITION_FAILURE_01 1
+#else
+# define CONTRACT_AUX_CONFIG_REPORT_OVERRIDDEN_PRECONDITION_FAILURE_01 0
+#endif
+
+#ifdef CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION
+# define CONTRACT_AUX_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION_01 1
+#else
+# define CONTRACT_AUX_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION_01 0
+#endif
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/constructor_inits_eval.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/constructor_inits_eval.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,36 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CONSTRUCTOR_INITS_EVAL_HPP_
+#define CONTRACT_AUX_CONSTRUCTOR_INITS_EVAL_HPP_
+
+namespace contract { namespace aux {
+
+// Predefined Ids for constructor inits evaluation expressions (defined in one
+// place here so to make sure they are different).
+static const unsigned constructor_inits_eval_try_block_set = 0;
+static const unsigned constructor_inits_eval_named_params_args_set = 1;
+
+// Allows to evaluate an expression within member initializers.
+// Need Class and Id tparam to make this a unique base type for each new class.
+template< class Class, unsigned Id >
+struct constructor_inits_eval {
+ // Default constructor for when there is no expression to evaluate.
+ constructor_inits_eval ( ) {}
+
+ // Constructor allows to evaluate the specified expr within initializers.
+ template< typename ExprResult >
+ explicit constructor_inits_eval ( ExprResult const& ) {}
+
+ // Only defines constructors so no clash with member func/var names in
+ // user-defined derived class.
+};
+
+}} // namespace contract::aux
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/constructor_try_block_guard.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/constructor_try_block_guard.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,39 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CONSTRUCTOR_TRY_BLOCK_GUARD_HPP_
+#define CONTRACT_AUX_CONSTRUCTOR_TRY_BLOCK_GUARD_HPP_
+
+#include <contract/aux_/symbol.hpp>
+
+namespace contract { namespace aux {
+
+// Need Class tparam to make this a unique base type for each new class.
+template< class Class >
+struct constructor_try_block_guard {
+ // Default constructor also handles constructor with no try-block.
+ constructor_try_block_guard ( ) : enabled_(false) {}
+
+ // These need to be named with library reserved symbols to not clash
+ // with member func/var names in user-defined derived class.
+
+ bool CONTRACT_AUX_SYMBOL( (enabled) ) ( ) const { return enabled_; }
+
+ // NOTE: These need to return a value to be used within member inits set.
+ bool CONTRACT_AUX_SYMBOL( (enable) ) ( ) { return enabled_ = true; }
+ bool CONTRACT_AUX_SYMBOL( (disable) ) ( ) { return enabled_ = false; }
+
+private:
+ // Constructors never const or volatile so no need to make this mutable,
+ // provide volatile access members, etc.
+ bool enabled_;
+};
+
+}} // namespace contract::aux
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/copy_result.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/copy_result.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,121 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_COPY_RESULT_HPP_
+#define CONTRACT_AUX_COPY_RESULT_HPP_
+
+#include <contract/config.hpp>
+#include <contract/copy.hpp>
+#include <contract/aux_/result_const.hpp> // For void_result.
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/control/expr_iif.hpp>
+#include <boost/preprocessor/repetition/enum.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+#include <boost/type_traits/add_reference.hpp>
+
+#define CONTRACT_comma_typename_Arg(z, n, unused) \
+ , typename BOOST_PP_CAT(Arg, n)
+#define CONTRACT_comma_arg_param(z, n, unused) \
+ /* NOTE: this param type must be a ref to avoid copying the arg (which */ \
+ /* might not have a copy cons, ref is OK because caller always uses a */ \
+ /* var to hold this param) plus add_reference can't be used otherwise */ \
+ /* Arg type cannot be deduced (and cons cannot specify tparams) */ \
+ , BOOST_PP_CAT(Arg, n) & \
+ BOOST_PP_CAT(arg, n)
+#define CONTRACT_arg(z, n, unused) \
+ BOOST_PP_CAT(arg, n)
+
+#define CONTRACT_call_func(z, n, is_member) \
+ BOOST_PP_IIF(is_member, \
+ (obj->*func) \
+ , \
+ (*func) \
+ )( \
+ BOOST_PP_ENUM_ ## z(n, CONTRACT_arg, ~) \
+ )
+
+#define CONTRACT_cons_decl(z, n, is_member) \
+ template< typename Func \
+ BOOST_PP_REPEAT_ ## z(n, CONTRACT_comma_typename_Arg, ~) \
+ > \
+ explicit copy_result(Func const func \
+ BOOST_PP_COMMA_IF(is_member) \
+ BOOST_PP_EXPR_IIF(is_member, CVQualifiedObj const obj) \
+ BOOST_PP_REPEAT_ ## z(n, CONTRACT_comma_arg_param, ~) \
+ )
+#define CONTRACT_cons(z, n, is_member) \
+ CONTRACT_cons_decl(z, n, is_member) \
+ : result_(CONTRACT_call_func(z, n, is_member)) {}
+#define CONTRACT_void_cons(z, n, is_member) \
+ CONTRACT_cons_decl(z, n, is_member) \
+ { CONTRACT_call_func(z, n, is_member) ; }
+
+namespace contract { namespace aux {
+
+// Copy result of non-void non-static mem func.
+template< typename Result, class CVQualifiedObj = void >
+struct copy_result {
+ BOOST_PP_REPEAT(BOOST_PP_INC(CONTRACT_CONFIG_FUNCTION_ARITY_MAX),
+ CONTRACT_cons, 1 /* member */) // INC(ARITY) for no arg.
+
+ typename copy<Result>::const_reference_type value() const
+ { return result_.value(); }
+ typename copy<Result>::const_reference_type param() const
+ { return result_.value(); }
+private:
+ copy<Result> const result_; // Use copy<> so user can customize.
+};
+
+// Copy result of non-void free func and static member func.
+template< typename Result >
+struct copy_result< Result, void > {
+ BOOST_PP_REPEAT(BOOST_PP_INC(CONTRACT_CONFIG_FUNCTION_ARITY_MAX),
+ CONTRACT_cons, 0 /* not member */) // INC(ARITY) for no arg.
+
+ typename copy<Result>::const_reference_type value() const
+ { return result_.value(); }
+ typename copy<Result>::const_reference_type param() const
+ { return result_.value(); }
+private:
+ copy<Result> const result_; // Use copy<> so user can customize.
+};
+
+// Handle Void Result //
+
+// Copy result of void non-static member func.
+template< class CVQualifiedObj >
+struct copy_result< void, CVQualifiedObj > {
+ BOOST_PP_REPEAT(BOOST_PP_INC(CONTRACT_CONFIG_FUNCTION_ARITY_MAX),
+ CONTRACT_void_cons, 1 /* member */) // INC(ARITY) for no arg.
+
+ void value() const {} // There is no result to return (return void).
+ void_result param() const { return void_result(); }
+};
+
+// Copy result of void non-static member func.
+template< >
+struct copy_result< void, void > {
+ BOOST_PP_REPEAT(BOOST_PP_INC(CONTRACT_CONFIG_FUNCTION_ARITY_MAX),
+ CONTRACT_void_cons, 0 /* not member */) // INC(ARITY) for no arg.
+
+ void value() const {} // There is no result to return (return void).
+ void_result param() const { return void_result(); }
+};
+
+}} // namespace contract::aux
+
+#undef CONTRACT_comma_typename_Arg
+#undef CONTRACT_comma_arg_param
+#undef CONTRACT_arg
+#undef CONTRACT_call_func
+#undef CONTRACT_cons_decl
+#undef CONTRACT_cons
+#undef CONTRACT_void_cons
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/debug.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/debug.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,52 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_DEBUG_HPP_
+#define CONTRACT_AUX_DEBUG_HPP_
+
+#include <contract/aux_/config.hpp>
+
+#if CONTRACT_AUX_CONFIG_DEBUG_01
+
+#include <boost/preprocessor/stringize.hpp>
+#include <typeinfo>
+#include <sstream>
+#include <iostream>
+
+// IMPORTANT: In order to remove *any* logging overhead when debug
+// is turned off, *all* code used to generate the debug message must
+// be passed as the 'code' param of the macro below (because that
+// code is executed by the macro expansion only when debug is on).
+#define CONTRACT_AUX_DEBUG(file, line, code) \
+ { \
+ std::ostringstream dbg; /* decl special stream named `dbg` */ \
+ { code; } /* code shall set dbg stream */ \
+ std::clog << file << ":" << line << " " << dbg.str() << std::endl; \
+ }
+
+#define CONTRACT_AUX_DEBUGN(file, line, name, code) \
+ CONTRACT_AUX_DEBUG(file, line, \
+ dbg << "[" << BOOST_PP_STRINGIZE(name) << "] "; \
+ code; \
+ )
+
+#define CONTRACT_AUX_DEBUGT(file, line, type, code) \
+ CONTRACT_AUX_DEBUG(file, line, \
+ dbg << "[" << typeid(type).name() << "] "; \
+ code; \
+ )
+
+#else // debug
+
+#define CONTRACT_AUX_DEBUG(file, line, code) /* nothing */
+#define CONTRACT_AUX_DEBUGN(file, line, name, code) /* nothing */
+#define CONTRACT_AUX_DEBUGT(file, line, type, code) /* nothing */
+
+#endif // debug
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/has_xxx_member_function.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/has_xxx_member_function.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,66 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_HAS_XXX_MEMBER_FUNCTION_HPP_
+#define CONTRACT_AUX_HAS_XXX_MEMBER_FUNCTION_HPP_
+
+#include <boost/config.hpp>
+#include <boost/mpl/at.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/quote.hpp>
+#include <boost/function_types/parameter_types.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <boost/type_traits/detail/yes_no_type.hpp>
+
+// PRIVATE //
+
+// Adapted from BOOST_TTI_DETAIL_TRAIT_HAS_COMP_MEMBER_FUNCTION (see Boost.TTI).
+#define CONTRACT_AUX_HAS_XXX_MEMBER_FUNCTION_(id, trait, name) \
+ template< class CONTRACT_AUX_SYMBOL( (IntroHasMemberFuncT)(id) ) > \
+ struct trait { \
+ template< class CONTRACT_AUX_SYMBOL( (IntroHasMemberFuncF)(id) ) > \
+ struct class_type { \
+ typedef \
+ typename boost::remove_const< \
+ typename boost::mpl::at< \
+ typename boost::function_types::parameter_types< \
+ CONTRACT_AUX_SYMBOL( (IntroHasMemberFuncF)(id) ) \
+ , boost::mpl::quote1< boost::mpl::identity > \
+ >::type \
+ , boost::mpl::int_<0> \
+ >::type \
+ >::type \
+ type \
+ ; \
+ }; \
+ template< CONTRACT_AUX_SYMBOL( (IntroHasMemberFuncT)(id) ) > \
+ struct helper; \
+ template< class CONTRACT_AUX_SYMBOL( (IntroHasMemberFuncU)(id) ) > \
+ static ::boost::type_traits::yes_type check( \
+ helper<& CONTRACT_AUX_SYMBOL( (IntroHasMemberFuncU)(id) ) ::name>* \
+ ); \
+ template< class CONTRACT_AUX_SYMBOL( (IntroHasMemberFuncU)(id) ) > \
+ static ::boost::type_traits::no_type check(...); \
+ BOOST_STATIC_CONSTANT( \
+ bool, value = \
+ sizeof(check<typename class_type< \
+ CONTRACT_AUX_SYMBOL( (IntroHasMemberFuncT)(id) ) \
+ >::type>(0)) \
+ == sizeof(::boost::type_traits::yes_type) \
+ ); \
+ typedef boost::mpl::bool_<value> type; \
+ }; \
+
+// PUBLIC //
+
+#define CONTRACT_AUX_HAS_XXX_MEMBER_FUNCTION(trait, name) \
+ CONTRACT_AUX_HAS_XXX_MEMBER_FUNCTION_(__LINE__, trait, name)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/identity_equal.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/identity_equal.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,24 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_IDENTITY_EQUAL_HPP_
+#define CONTRACT_AUX_IDENTITY_EQUAL_HPP_
+
+namespace contract { namespace aux {
+
+// Used to internally deal with old-of value assignment symbol `var =`.
+struct identity_equal {};
+
+template< typename Left >
+Left const& operator== ( Left const& left, identity_equal const& ) {
+ return left;
+}
+
+} } // namespace
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/loop_variant.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/loop_variant.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,57 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_LOOP_VARIANT_HPP_
+#define CONTRACT_AUX_LOOP_VARIANT_HPP_
+
+#include <contract/aux_/macro/code_/loop_variant.hpp>
+
+namespace contract { namespace aux { namespace loop_variant {
+
+// NOTE: Loop variant must be >= 0 however that property is asserted instead of
+// using unsigned type here because C++ will still allow to assign signed
+// numbers to unsigned variables causing the variable to silently overflow
+// (instead of generating a compile-time error).
+typedef long value_type;
+
+static const value_type uninitialized = -1;
+
+// Declared/undeclared trick to handle duplicate decl (from Boost.ScopeExit).
+// NOTE: This declared/undeclared mechanism cannot be made generic with respect
+// to value_type because otherwise sizeof used for tpl spec below will depend
+// of the tparam used instead of value_type.
+template< int DUMMY = 0 > struct declared {
+ value_type 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; }; };
+
+}}} // namespace contract::aux::loop_variant
+
+// This must be decl extern and in global namepsace (so visible to any later
+// decl of OLD_VAR in any namespace or local context). Later decl should be of
+// the form `declared<resolve<sizeof(OLD_VAR)>::cmp1<0>::cmp2> OLD_VAR` which
+// will decl OLD_VAR in a given context iff OLD_VAR not previously decl in that
+// context (such duplicate decl will have no effect and will not error).
+// NOTE: This declared/undeclared mechanism is used for loop variants so to
+// avoid the introduction of another macro LOOP_END (that could be used to
+// close a local block used to make the loop variant decl local). This way
+// there is one less macro plus the library doesn't use _END macros for CLASS,
+// FUNCTION, etc (so the macro API is more symmetric without LOOP_END).
+extern contract::aux::loop_variant::undeclared
+ CONTRACT_AUX_CODE_LOOP_VARIANT_OLD_VAR;
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/block_invariant.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/block_invariant.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,46 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_BLOCK_INVARIANT_HPP_
+#define CONTRACT_AUX_BLOCK_INVARIANT_HPP_
+
+#include <contract/aux_/call/globals.hpp>
+#include <contract/aux_/macro/code_/assert.hpp>
+#include <contract/detail/preprocessor/traits/assertion.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_BLOCK_INVARIANT_ASSERTION_FUNC_CALL_( \
+ d, id, tpl, unused, a) \
+ ERROR_requires_not_allowed_for_block_invariant_assertions \
+ (); /* fake function call will generate compiler-error */
+
+#define CONTRACT_AUX_BLOCK_INVARIANT_(id, tpl, assertion_seq) \
+ try { \
+ ::contract::aux::call_globals<>::is_checking_contract = true; \
+ /* following assertion throw contract::broken on failure */ \
+ CONTRACT_AUX_CODE_ASSERT(id, tpl, block_invariant, \
+ CONTRACT_AUX_BLOCK_INVARIANT_ASSERTION_FUNC_CALL_, ~, \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS( \
+ CONTRACT_DETAIL_PP_SEQ_TO_LIST_NEVER_EMPTY(assertion_seq))) \
+ ::contract::aux::call_globals<>::is_checking_contract = false; \
+ } catch(...) { \
+ ::contract::aux::call_globals<>::is_checking_contract = false; \
+ ::contract::block_invariant_broken(::contract::FROM_BODY); \
+ }
+
+// PUBLIC //
+
+#define CONTRACT_AUX_BLOCK_INVARIANT(id, tpl, assertion_seq) \
+ BOOST_PP_IIF(CONTRACT_AUX_CONFIG_BLOCK_INVARIANTS_01, \
+ CONTRACT_AUX_BLOCK_INVARIANT_ \
+ , \
+ BOOST_PP_TUPLE_EAT(3) \
+ )(id, tpl, assertion_seq)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/body.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/body.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,71 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_BODY_HPP_
+#define CONTRACT_AUX_BODY_HPP_
+
+#include <contract/detail/preprocessor/traits/body.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_BODY_FUNCTION_(body_traits) \
+ CONTRACT_AUX_CODE_NAME( \
+ CONTRACT_DETAIL_PP_BODY_TRAITS_OPERATOR(body_traits), \
+ CONTRACT_DETAIL_PP_BODY_TRAITS_NAME(body_traits))
+
+#define CONTRACT_AUX_BODY_FUNCTION_CONTRACTED_(body_traits) \
+ CONTRACT_AUX_CODE_NAME_POSTFIXED( \
+ 0, /* not constructor */ \
+ 0, /* not destructor */ \
+ CONTRACT_DETAIL_PP_BODY_TRAITS_OPERATOR(body_traits), \
+ CONTRACT_DETAIL_PP_BODY_TRAITS_NAME(body_traits), \
+ (body))
+
+// PUBLIC //
+
+#define CONTRACT_AUX_BODY_CLASS_TYPE(class_type) \
+ /* handle possible extra parenthesis to wrap commas within class_type */ \
+ BOOST_PP_ARRAY_ENUM(CONTRACT_DETAIL_PP_BODY_TRAITS_CLASS_TYPE(class_type))
+
+#define CONTRACT_AUX_BODY_FUNCTION(name) \
+ CONTRACT_AUX_BODY_FUNCTION_(CONTRACT_DETAIL_PP_BODY_TRAITS( \
+ 0 /* not constructor */, 0 /* not destructor */, name))
+
+#define CONTRACT_AUX_BODY_FUNCTION_CONTRACTED(name) \
+ CONTRACT_AUX_BODY_FUNCTION_CONTRACTED_(CONTRACT_DETAIL_PP_BODY_TRAITS( \
+ 0 /* not constructor */, 0 /* not destructor */, name))
+
+#define CONTRACT_AUX_BODY_CONSTRUCTOR_CONTRACTED(body_traits) \
+ CONTRACT_AUX_CODE_NAME_POSTFIXED( \
+ 1, /* constructor */ \
+ 0, /* not destructor */ \
+ (0, ()), /* no operator traits */ \
+ BOOST_PP_EMPTY, /* no name traits */ \
+ (body))
+
+#define CONTRACT_AUX_BODY_DESTRUCTOR_CONTRACTED(body_traits) \
+ CONTRACT_AUX_CODE_NAME_POSTFIXED( \
+ 0, /* constructor */ \
+ 1, /* not destructor */ \
+ (0, ()), /* no operator traits */ \
+ BOOST_PP_EMPTY, /* no name traits */ \
+ (body))
+
+// Only body of functions with named parameters can be deferred (because
+// constructor body cannot be deferred without delegating constructors, and
+// destructors have no parameter so no named parameter). The class type is
+// pulled out so the same macro can be used for both free and member functions.
+#define CONTRACT_AUX_BODY_PARAMETER_FUNCTION_CONTRACTED(func_name) \
+ CONTRACT_AUX_CODE_NAME_POSTFIXED( \
+ 0, /* not constructor */ \
+ 0, /* not destructor */ \
+ (0, ()), /* not operator (named params n/a for operators now) */ \
+ func_name, \
+ (body))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/class.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/class.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,301 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CLASS_HPP_
+#define CONTRACT_AUX_CLASS_HPP_
+
+#include <contract/aux_/debug.hpp>
+#include <contract/aux_/config.hpp>
+#include <contract/aux_/symbol.hpp>
+#include <contract/aux_/constructor_inits_eval.hpp>
+#include <contract/aux_/constructor_try_block_guard.hpp>
+#include <contract/aux_/call/constructor_entry.hpp>
+#include <contract/aux_/macro/code_/typename.hpp>
+#include <contract/aux_/macro/code_/template.hpp>
+#include <contract/aux_/macro/code_/named_params_class_template.hpp>
+#include <contract/aux_/macro/code_/class_concept.hpp>
+#include <contract/aux_/macro/code_/base.hpp>
+#include <contract/aux_/macro/code_/class.hpp>
+#include <contract/aux_/macro/code_/class_final.hpp>
+#include <contract/aux_/macro/code_/class_invariant_const.hpp>
+#include <contract/aux_/macro/code_/class_invariant_const_volatile.hpp>
+#include <contract/aux_/macro/code_/class_invariant_static.hpp>
+#include <contract/detail/preprocessor/traits/class.hpp> // c
+#include <contract/detail/preprocessor/traits/base.hpp> // b
+#include <contract/detail/preprocessor/keyword/class.hpp>
+#include <boost/utility/identity_type.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/control/expr_iif.hpp>
+#include <boost/preprocessor/comparison/greater.hpp>
+#include <boost/preprocessor/comparison/less.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/logical/bitand.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+#include <boost/preprocessor/facilities/is_empty.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/seq/cat.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/seq/seq.hpp> // For SEQ_TAIL.
+#include <boost/preprocessor/seq/enum.hpp>
+#include <boost/preprocessor/list/adt.hpp>
+#include <boost/preprocessor/list/size.hpp>
+#include <boost/preprocessor/list/at.hpp>
+#include <boost/preprocessor/list/enum.hpp>
+#include <boost/preprocessor/list/for_each.hpp>
+#include <boost/preprocessor/list/for_each_i.hpp>
+
+// PRIVATE //
+
+// Bases.
+
+// Precondition: size(nilseq) > 1.
+#define CONTRACT_AUX_CLASS_BASES_FROM_NILSEQ_ENUM_(nilseq) \
+ BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_TAIL(nilseq)) // TAIL ignores leading NIL.
+
+#define CONTRACT_AUX_CLASS_BASES_FROM_NILSEQ_(nilseq) \
+ BOOST_PP_IIF(BOOST_PP_GREATER(BOOST_PP_SEQ_SIZE(nilseq), 1), \
+ : /* inherit symbol */ \
+ CONTRACT_AUX_CLASS_BASES_FROM_NILSEQ_ENUM_ \
+ , \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(nilseq)
+
+#define CONTRACT_AUX_CLASS_TEMPALTE_SPECIALIZATION_(c) \
+ /* template specialization params */ \
+ BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_SPECIALIZATIONS(c)), \
+ < \
+ ) \
+ BOOST_PP_LIST_ENUM(CONTRACT_DETAIL_PP_CLASS_TRAITS_SPECIALIZATIONS(c)) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_SPECIALIZATIONS(c)), \
+ > \
+ )
+
+#define CONTRACT_AUX_CLASS_TYPE_(tpl, c) \
+ CONTRACT_AUX_CODE_CLASS_TYPENAME(tpl, c) \
+ /* remove and then add reference to handle abstract types */ \
+ ::boost::remove_reference< \
+ CONTRACT_AUX_CODE_CLASS_TYPENAME(tpl, c) \
+ /* use IDENTITY_TYPE because eventual tparams separated by commas */ \
+ BOOST_IDENTITY_TYPE(( \
+ CONTRACT_AUX_CODE_CLASS_TYPENAME(tpl, c) \
+ ::boost::add_reference< \
+ /* the actual class type (with eventual tparams) */ \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_NAME(c) \
+ /* either template specialization types... */ \
+ BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_SPECIALIZATIONS(c)), \
+ CONTRACT_AUX_CLASS_TEMPALTE_SPECIALIZATION_ \
+ , \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(c) \
+ /* ... or, template parameter types */ \
+ BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_SPECIALIZATIONS(c)), \
+ BOOST_PP_TUPLE_EAT(1) \
+ , \
+ CONTRACT_AUX_CODE_TEMPLATE_INSTANCE \
+ )(CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_PARAMS(c))) \
+ >::type \
+ )) \
+ >::type
+
+#define CONTRACT_AUX_CLASS_INVARIANTS_(id, tpl, c) \
+ /* subcontract only from base classes that have been also contracted */ \
+ public: CONTRACT_AUX_CODE_SUBCONTRACT_CLASS_INVARIANT_FROM_BASES( \
+ id, tpl, c) \
+ /* class invariant (const, volatile, and static) functions must be */ \
+ /* def here because they need to be public for subcontracting and for */ \
+ /* class INVARIANT macro will always expand in private context (because */ \
+ /* INVARIANT macro does not know enclosing scope access level) */ \
+ public: CONTRACT_AUX_CODE_SUBCONTRACTED_CLASS_INVARIANT_STATIC(id, tpl) \
+ public: CONTRACT_AUX_CODE_SUBCONTRACTED_CLASS_INVARIANT_CONST_VOLATILE(id, \
+ tpl) \
+ public: CONTRACT_AUX_CODE_SUBCONTRACTED_CLASS_INVARIANT_CONST(id, tpl)
+
+#define CONTRACT_AUX_CODE_CLASS_TEMPLATE_POSITIONAL_DECL_(template01, tparams) \
+ CONTRACT_AUX_CODE_TEMPLATE_DECL(template01, \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL(tparams))
+
+// Precondition: c must only contain positional template params.
+#define CONTRACT_AUX_CLASS_(id, tpl, c, maybe_named_c) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_COMPL(BOOST_PP_IS_EMPTY( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_ACCESS(c))), \
+ /* if nested class (has access) then nested concepts, etc private */ \
+ private: \
+ ) \
+ /* base class to check concepts */ \
+ BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_CONCEPTS(c)), \
+ CONTRACT_AUX_CODE_CLASS_CONCEPT \
+ , \
+ BOOST_PP_TUPLE_EAT(3) \
+ )(id, tpl, c) \
+ /* access level (for nested classes only) */ \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_ACCESS(c) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_COMPL(BOOST_PP_IS_EMPTY( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_ACCESS(c))), \
+ : \
+ ) \
+ /* template params (either positional or named) */ \
+ BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(BOOST_PP_LIST_APPEND( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_NAMED( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_PARAMS( \
+ maybe_named_c)), \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_DEDUCED( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_PARAMS( \
+ maybe_named_c)))), \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_DECL \
+ , \
+ CONTRACT_AUX_CODE_CLASS_TEMPLATE_POSITIONAL_DECL_ \
+ )(CONTRACT_DETAIL_PP_CLASS_TRAITS_IS_TEMPLATE(c), \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_PARAMS(maybe_named_c)) \
+ /* class or struct plus name */ \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_KIND(c) \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_NAME(c) \
+ CONTRACT_AUX_CLASS_TEMPALTE_SPECIALIZATION_(c) \
+ /* base classes */ \
+ CONTRACT_AUX_CLASS_BASES_FROM_NILSEQ_( \
+ (BOOST_PP_NIL) /* nil-seq (handle empty seq)*/ \
+ /* named params initialization for constructors, must be 1st base */ \
+ /* because params can be used in constructor-try-block (always */ \
+ /* present because named params used independently from contracts) */ \
+ ( /* seq elem */ \
+ /* private inheritance because impl detail and virtual to */ \
+ /* avoid that user virtual bases be init before this one */ \
+ /* (no typename here, bases always types) */ \
+ private virtual BOOST_IDENTITY_TYPE(( \
+ ::contract::aux::constructor_inits_eval< \
+ CONTRACT_AUX_CLASS_TYPE_(tpl, c) \
+ , ::contract::aux::constructor_inits_eval_named_params_args_set\
+ >)) \
+ ) \
+ /* enable/disable constructor-try-blocks, must be 2nd base because */ \
+ /* used when base initializers fail) */ \
+ BOOST_PP_EXPR_IIF(BOOST_PP_BITOR(CONTRACT_AUX_CONFIG_PRECONDITIONS_01, \
+ BOOST_PP_BITOR(CONTRACT_AUX_CONFIG_POSTCONDITIONS_01, \
+ CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01)), \
+ ( /* seq elem */ \
+ /* private inheritance because impl detail and virtual to */ \
+ /* avoid that user virtual bases be init before this one */ \
+ private virtual ::contract::aux::constructor_try_block_guard< \
+ CONTRACT_AUX_CLASS_TYPE_(tpl, c) > \
+ ) \
+ ) \
+ /* check concepts (after constructor-try-block just in case of some */ \
+ /* run-time error even if there should not be any because this */ \
+ /* class only performs compile-time static checks for concepts) */ \
+ BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_CONCEPTS(c)), \
+ CONTRACT_AUX_CODE_CLASS_CONCEPT_BASE_SEQ \
+ , \
+ BOOST_PP_TUPLE_EAT(3) \
+ )(id, tpl, c) \
+ /* constr inv/pre must be 1st base so to check constr inv/pre 1st */ \
+ /* (but after concepts because they are static checks) */ \
+ BOOST_PP_EXPR_IIF(BOOST_PP_BITOR(CONTRACT_AUX_CONFIG_PRECONDITIONS_01, \
+ CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01), \
+ /* this also takes the class type so to be a unique base type */ \
+ /* when also base classes have contracts (virtual bases cannot */ \
+ /* be used here because they are constructed only one time for */ \
+ /* the entire inheritance tree so preventing bases from */ \
+ /* they constructor contract entry (preconditions, etc) */ \
+ ( /* seq elem */ \
+ /* private inheritance because impl detail and virtual to */ \
+ /* avoid that user virtual bases be init before this one */ \
+ private virtual ::contract::aux::call_constructor_entry< \
+ CONTRACT_AUX_CLASS_TYPE_(tpl, c) > \
+ ) \
+ ) \
+ /* must be before user-defined bases (so if they throw, constructor */ \
+ /* try-block will catch) */ \
+ BOOST_PP_EXPR_IIF(BOOST_PP_BITOR(CONTRACT_AUX_CONFIG_PRECONDITIONS_01, \
+ BOOST_PP_BITOR(CONTRACT_AUX_CONFIG_POSTCONDITIONS_01, \
+ CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01)), \
+ ( /* seq elem */ \
+ /* private inheritance because impl detail and virtual to */ \
+ /* avoid that user virtual bases be init before this one */ \
+ /* (no typename here, bases always types) */ \
+ private virtual BOOST_IDENTITY_TYPE(( \
+ ::contract::aux::constructor_inits_eval< \
+ CONTRACT_AUX_CLASS_TYPE_(tpl, c) \
+ , ::contract::aux::constructor_inits_eval_try_block_set \
+ >)) \
+ ) \
+ ) \
+ /* user specified base classes (if any) */ \
+ BOOST_PP_LIST_FOR_EACH(CONTRACT_AUX_CODE_BASE_SEQ_R, \
+ CONTRACT_AUX_CODE_CLASS_TYPENAME(tpl, c), \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_BASES(c)) \
+ ) \
+ { /* class definition */ \
+ /* this class typedef (needed by named params even if no contracts) */ \
+ private: typedef CONTRACT_DETAIL_PP_CLASS_TRAITS_NAME(c) \
+ CONTRACT_AUX_CODE_CLASS_TYPE; \
+ /* base typedefs for other contract macros (only if contracts) */ \
+ BOOST_PP_IIF(BOOST_PP_BITOR(CONTRACT_AUX_CONFIG_PRECONDITIONS_01, \
+ BOOST_PP_BITOR(CONTRACT_AUX_CONFIG_POSTCONDITIONS_01, \
+ CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01)), \
+ BOOST_PP_REPEAT \
+ , \
+ BOOST_PP_TUPLE_EAT(3) \
+ )(CONTRACT_CONFIG_INHERITANCE_MAX, CONTRACT_AUX_CODE_BASE_TYPEDEF_Z, c)\
+ BOOST_PP_IIF(BOOST_PP_GREATER( \
+ BOOST_PP_LIST_SIZE(CONTRACT_DETAIL_PP_CLASS_TRAITS_BASES(c)), \
+ CONTRACT_CONFIG_INHERITANCE_MAX),\
+ CONTRACT_AUX_MPL_ASSERT_MSG \
+ , \
+ BOOST_PP_TUPLE_EAT(3) \
+ )( \
+ false \
+ , ERROR_too_many_base_classes_see_CONTRACT_CONFIG_INHERITANCE_MAX \
+ , () \
+ ); /* need trailing `;` */ \
+ /* class invariants */ \
+ BOOST_PP_IIF(CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01, \
+ CONTRACT_AUX_CLASS_INVARIANTS_ \
+ , \
+ BOOST_PP_TUPLE_EAT(3) \
+ )(id, tpl, c) \
+ /* handle final classes */ \
+ CONTRACT_AUX_CODE_CLASS_FINAL(id, tpl, c) \
+ /* restore class/struct private/public access level */ \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_CLASS_FRONT( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_KIND(c)), \
+ private: /* class ... */\
+ , \
+ public : /* struct ... */ \
+ ) \
+ /* terminate with struct to allow user to follow macro with { */ \
+ /* (enum could be used too but struct gives better errors if */ \
+ /* INVARIANT macro is not used, unnamed struct so it cannot be */ \
+ /* used by mistake) */ \
+ struct /* CONTRACT_CLASS_INVARIANT macro must follow */
+
+// PUBLIC //
+
+#define CONTRACT_AUX_CLASS(id, tpl, c) \
+ CONTRACT_AUX_CLASS_( \
+ id \
+ , tpl \
+ , BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(BOOST_PP_LIST_APPEND( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_NAMED( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_PARAMS(c)), \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_DEDUCED( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_PARAMS(c)))), \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_POSITIONAL_C \
+ , \
+ BOOST_PP_TUPLE_REM(1) \
+ )(c) \
+ , c \
+ )
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/class_invariant.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/class_invariant.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,43 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CLASS_INVARIANT_HPP_
+#define CONTRACT_AUX_CLASS_INVARIANT_HPP_
+
+#include <contract/aux_/macro/code_/class_invariant_const.hpp>
+#include <contract/aux_/macro/code_/class_invariant_const_volatile.hpp>
+#include <contract/aux_/macro/code_/class_invariant_static.hpp>
+#include <contract/detail/preprocessor/traits/class_invariant.hpp> // v
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CLASS_INVARIANT_(id, tpl, v) \
+ /* NOTE: subcontracted invariants must be decl by CLASS macro because */ \
+ /* they always need to be public while this macro expand in private */ \
+ /* context for class (and in public for struct) so it cannot always */ \
+ /* decl subcontracted invariants public (following non-subcontracted */ \
+ /* inv can instead be decl here because they do not need to be public) */ \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_STATIC(id, tpl, v) \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE(id, tpl, v) \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST(id, tpl, v)
+
+#define CONTRACT_AUX_CLASS_INVARIANT_SEQ_(id, tpl, assertion_seq) \
+ CONTRACT_AUX_CLASS_INVARIANT_(id, tpl, \
+ CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS(assertion_seq))
+
+// PUBLIC //
+
+#define CONTRACT_AUX_CLASS_INVARIANT(id, tpl, assertion_seq) \
+ }; /* close `{` entered by the user after CONTRACT_CLASS macro */ \
+ BOOST_PP_IIF(CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01, \
+ CONTRACT_AUX_CLASS_INVARIANT_SEQ_ \
+ , \
+ BOOST_PP_TUPLE_EAT(3) \
+ )(id, tpl, assertion_seq)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/assert.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/assert.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,250 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_ASSERT_HPP_
+#define CONTRACT_AUX_CODE_ASSERT_HPP_
+
+#include <contract/broken.hpp>
+#include <contract/detail/preprocessor/traits/assertion.hpp> // a
+#include <contract/detail/preprocessor/traits/static_assert.hpp>
+#include <contract/detail/preprocessor/traits/const_expr.hpp>
+#include <contract/detail/preprocessor/punctuation/curly.hpp>
+#include <contract/detail/preprocessor/keyword/const.hpp>
+#include <contract/detail/preprocessor/keyword/if.hpp>
+#include <contract/detail/preprocessor/keyword/else.hpp>
+#include <contract/detail/preprocessor/keyword/static.hpp>
+#include <boost/preprocessor/selection/max.hpp>
+#include <boost/preprocessor/stringize.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CODE_ASSERT_DEF_(d, const_tokens, assertion_token) \
+ (( \
+ /* the pp-list size or 1 (for just assertion_token) is size is 0 */ \
+ BOOST_PP_MAX(1, BOOST_PP_LIST_SIZE(const_tokens)) \
+ , ( \
+ BOOST_PP_LIST_ENUM(const_tokens) \
+ assertion_token \
+ )))
+
+#define CONTRACT_AUX_CODE_ASSERT_STATEMENT_(d, id, tpl, a, \
+ underscored_name, assertion_func_call_macro, data) \
+ CONTRACT_AUX_CODE_ASSERT_DEF_(d, \
+ BOOST_PP_NIL, /* no const tokens */ \
+ /* following trailing `;` ends statement */ \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_INSTRUCTION(a) ; )
+
+#define CONTRACT_AUX_CODE_ASSERT_IF_CONDITION_FUNC_(id, number) \
+ CONTRACT_AUX_SYMBOL( (select_assertion_if)(id)(number) )
+
+#define CONTRACT_AUX_CODE_ASSERT_IF_CONDITION_(d, id, tpl, a, \
+ underscored_name, if_condition) \
+ CONTRACT_AUX_CODE_ASSERT_DEF_(d \
+ /* expand to empty list if condition is not `const ...` */ \
+ , CONTRACT_AUX_CODE_CONST_EXPR_TOKENS(id, tpl, bool, \
+ CONTRACT_AUX_CODE_ASSERT_IF_CONDITION_FUNC_(id, \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_NUMBER(a)), \
+ if_condition) \
+ , /* actual code to start if-block */ \
+ if( \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_CONST_FRONT( \
+ if_condition), \
+ /* call local func def by tokens above */ \
+ CONTRACT_AUX_CODE_ASSERT_IF_CONDITION_FUNC_(id, \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_NUMBER(a)) \
+ () /* parenthesis call if-condition local func */ \
+ , \
+ if_condition /* just the condition (not const) */ \
+ ) \
+ ) { /* left-curly starts select assertion if block */ \
+ )
+
+#define CONTRACT_AUX_CODE_ASSERT_IF_(d, id, tpl, a, \
+ underscored_name, assertion_func_call_macro, data) \
+ CONTRACT_AUX_CODE_ASSERT_IF_CONDITION_(d, id, tpl, a, \
+ underscored_name, \
+ /* extract condition from `if( condition )` */ \
+ BOOST_PP_TUPLE_ELEM(1, 0, \
+ CONTRACT_DETAIL_PP_KEYWORD_IF_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_INSTRUCTION(a))))
+
+#define CONTRACT_AUX_CODE_ASSERT_FUNC_(d, id, tpl, a, \
+ underscored_name, assertion_func_call_macro, data) \
+ CONTRACT_AUX_CODE_ASSERT_DEF_(d, \
+ BOOST_PP_NIL, /* no const tokens */ \
+ assertion_func_call_macro(d, id, tpl, data, a))
+
+#define CONTRACT_AUX_CODE_ASSERT_STATIC_(d, id, tpl, a, \
+ underscored_name, assertion_func_call_macro, data) \
+ CONTRACT_AUX_CODE_ASSERT_DEF_(d, \
+ BOOST_PP_NIL, /* no const tokens */ \
+ CONTRACT_AUX_CODE_ASSERT_STATIC(id, tpl, a, underscored_name))
+
+#define CONTRACT_AUX_CODE_ASSERT_CONST_LOCAL_FUNC_(id, number) \
+ CONTRACT_AUX_SYMBOL( (const_assertion)(id)(number) )
+
+#define CONTRACT_AUX_CODE_ASSERT_CONST_(d, id, tpl, a, \
+ underscored_name, assertion_func_call_macro, data) \
+ CONTRACT_AUX_CODE_ASSERT_DEF_(d, \
+ CONTRACT_AUX_CODE_ASSERT_CONST_DEF_TOKENS(id, tpl, a, \
+ underscored_name), \
+ CONTRACT_AUX_CODE_ASSERT_CONST(id, tpl, a, \
+ underscored_name))
+
+#define CONTRACT_AUX_CODE_ASSERT_BOOL_(d, id, tpl, a, \
+ underscored_name, assertion_func_call_macro, data) \
+ CONTRACT_AUX_CODE_ASSERT_DEF_(d, \
+ BOOST_PP_NIL, /* no const tokens */ \
+ CONTRACT_AUX_CODE_ASSERT_BOOL(id, tpl, a, underscored_name))
+
+#define CONTRACT_AUX_CODE_ASSERT_(d, id, tpl, a, \
+ underscored_name, assertion_func_call_macro, data) \
+ /* NOTE: The order of this if conditions matters */ \
+ BOOST_PP_IIF(BOOST_PP_EXPAND( /* EXPAND for MSVC */ \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_IS_STATEMENT(a)), \
+ CONTRACT_AUX_CODE_ASSERT_STATEMENT_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_IF_FRONT( \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_INSTRUCTION(a)), \
+ CONTRACT_AUX_CODE_ASSERT_IF_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_ELSE_FRONT( \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_INSTRUCTION(a)), \
+ /* select assertion else block (with its left-curly) */ \
+ ((1, ( else { ))) BOOST_PP_TUPLE_EAT(7) \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_IS_RCURLY_MACRO( \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_INSTRUCTION(a)), \
+ /* right-curly ends select assertion if and/or else blocks */ \
+ ((1, ( } ))) BOOST_PP_TUPLE_EAT(7) \
+ , BOOST_PP_IIF(BOOST_PP_COMPL(BOOST_PP_IS_EMPTY( \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_REQUIREMENT(a))), \
+ CONTRACT_AUX_CODE_ASSERT_FUNC_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_STATIC_ASSERT_FRONT( \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_INSTRUCTION(a)), \
+ CONTRACT_AUX_CODE_ASSERT_STATIC_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_CONST_FRONT( \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_INSTRUCTION(a)), \
+ CONTRACT_AUX_CODE_ASSERT_CONST_ \
+ , \
+ CONTRACT_AUX_CODE_ASSERT_BOOL_ \
+ )))))))(d, id, tpl, a, underscored_name, assertion_func_call_macro, data)
+
+#define CONTRACT_AUX_CODE_ASSERT_TUPLE_( \
+ d, id_tpl_name_call_data_code, a) \
+ ( \
+ BOOST_PP_TUPLE_ELEM(6, 0, id_tpl_name_call_data_code) \
+ , \
+ BOOST_PP_TUPLE_ELEM(6, 1, id_tpl_name_call_data_code) \
+ , \
+ BOOST_PP_TUPLE_ELEM(6, 2, id_tpl_name_call_data_code) \
+ , \
+ BOOST_PP_TUPLE_ELEM(6, 3, id_tpl_name_call_data_code) \
+ , \
+ BOOST_PP_TUPLE_ELEM(6, 4, id_tpl_name_call_data_code) \
+ , \
+ BOOST_PP_TUPLE_ELEM(6, 5, id_tpl_name_call_data_code) \
+ /* seq append */ \
+ CONTRACT_AUX_CODE_ASSERT_( \
+ d \
+ , BOOST_PP_TUPLE_ELEM(6, 0, id_tpl_name_call_data_code) \
+ , BOOST_PP_TUPLE_ELEM(6, 1, id_tpl_name_call_data_code) \
+ , a \
+ , BOOST_PP_TUPLE_ELEM(6, 2, id_tpl_name_call_data_code) \
+ , BOOST_PP_TUPLE_ELEM(6, 3, id_tpl_name_call_data_code) \
+ , BOOST_PP_TUPLE_ELEM(6, 4, id_tpl_name_call_data_code) \
+ ) \
+ )
+
+#define CONTRACT_AUX_CODE_ASSERT_FROM_ARRAY_(r, unused, code_array) \
+ BOOST_PP_LIST_ENUM_R(r, BOOST_PP_TUPLE_TO_LIST( \
+ BOOST_PP_ARRAY_SIZE(code_array), BOOST_PP_ARRAY_DATA(code_array)))
+
+#define CONTRACT_AUX_CODE_ASSERT_FROM_SEQ_(code_seq) \
+ BOOST_PP_SEQ_FOR_EACH(CONTRACT_AUX_CODE_ASSERT_FROM_ARRAY_, ~, \
+ BOOST_PP_SEQ_TAIL(code_seq))
+
+#define CONTRACT_AUX_CODE_ASSERT_GET_(code_seq) \
+ BOOST_PP_IIF(BOOST_PP_EQUAL(BOOST_PP_SEQ_SIZE(code_seq), 1), \
+ BOOST_PP_TUPLE_EAT(1) /* no assertion func definition code */ \
+ , \
+ CONTRACT_AUX_CODE_ASSERT_FROM_SEQ_ \
+ )(code_seq)
+
+// PUBLIC //
+
+// NOTE: underscored_name is kept for all these macros if it is actually only
+// used by static assertion (it can be used with number as unique ID if needed).
+
+#define CONTRACT_AUX_CODE_ASSERT_CONDITION( \
+ condition, underscored_name, number, print_code) \
+ if(!(condition)) { /* no bool conversion, use more general operator! */ \
+ throw ::contract::broken(__FILE__, __LINE__, \
+ BOOST_PP_STRINGIZE(print_code), /* print assertion code */ \
+ number); \
+ }
+
+#define CONTRACT_AUX_CODE_ASSERT_BOOL(id, tpl, a, underscored_name) \
+ CONTRACT_AUX_CODE_ASSERT_CONDITION( \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_INSTRUCTION(a), \
+ underscored_name, \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_NUMBER(a), \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_INSTRUCTION(a))
+
+#define CONTRACT_AUX_CODE_ASSERT_CONST_DEF_TOKENS( \
+ id, tpl, a, underscored_name) \
+ CONTRACT_AUX_CODE_CONST_EXPR_TOKENS( \
+ /* unique symbol using both id and number to avoid name clashes */ \
+ BOOST_PP_SEQ_CAT( (id)(CONTRACT_AUX_SYMBOL_INFIX) \
+ (CONTRACT_DETAIL_PP_ASSERTION_TRAITS_NUMBER(a)) ), \
+ tpl, bool, \
+ CONTRACT_AUX_CODE_ASSERT_CONST_LOCAL_FUNC_(id, \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_NUMBER(a)), \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_INSTRUCTION(a))
+
+#define CONTRACT_AUX_CODE_ASSERT_CONST(id, tpl, a, underscored_name) \
+ CONTRACT_AUX_CODE_ASSERT_CONDITION( \
+ CONTRACT_AUX_CODE_ASSERT_CONST_LOCAL_FUNC_(id, \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_NUMBER(a)) \
+ () /* parenthesis to call local function */, \
+ underscored_name, \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_NUMBER(a), \
+ CONTRACT_DETAIL_PP_CONST_EXPR_TRAITS_EXPR( \
+ CONTRACT_DETAIL_PP_CONST_EXPR_TRAITS( \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_INSTRUCTION(a))))
+
+#define CONTRACT_AUX_CODE_ASSERT_STATIC(id, tpl, a, underscored_name) \
+ { \
+ /* within a block {} to avoid name clashes when expanding multiple */ \
+ /* MPL_ASSERT on same line (i.e., from same contract macro) */ \
+ CONTRACT_AUX_MPL_ASSERT_MSG( \
+ CONTRACT_DETAIL_PP_STATIC_ASSERT_TRAITS_CONDITION( \
+ CONTRACT_DETAIL_PP_STATIC_ASSERT_TRAITS( \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_INSTRUCTION(a))) \
+ , BOOST_PP_SEQ_CAT((ERROR_statically_checked_)\
+ (underscored_name)(_number_) \
+ (CONTRACT_DETAIL_PP_ASSERTION_TRAITS_NUMBER(a)) \
+ (_failed_at_line_)(id)) \
+ /* ideally, I'd print the static assertion message msg here */ \
+ /* but a string cannot be printed as a type in C++03... */ \
+ , () \
+ ); /* MPL assert requires trailing `;` */ \
+ }
+
+// Where `assertion_func_call_macro(d, id, tpl, data, a)` expands to
+// assertion function call (single token, func call can be wrapped within ()).
+#define CONTRACT_AUX_CODE_ASSERT(id, tpl, underscored_name, \
+ assertion_func_call_macro, data, assertions) \
+ /* can't use LIST_FOR_EACH here instead of FOLD_LEFT because it doesn't */ \
+ /* reenter correctly on MSVC (not even if FOR_EACH_R is used) because */ \
+ /* many of the alg used to expand the assert func also use LIST_FOR_EACH */\
+ CONTRACT_AUX_CODE_ASSERT_GET_(BOOST_PP_TUPLE_ELEM(6, 5, \
+ BOOST_PP_LIST_FOLD_LEFT(CONTRACT_AUX_CODE_ASSERT_TUPLE_, \
+ ( id, tpl, underscored_name, \
+ /* code in seq of array to handle unwrapped commas */ \
+ assertion_func_call_macro, data, ((1, (;))) ), \
+ assertions)))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/assertion_func.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/assertion_func.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,189 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_ASSERTION_FUNC_HPP_
+#define CONTRACT_AUX_CODE_ASSERTION_FUNC_HPP_
+
+#include <contract/aux_/macro/code_/assert.hpp>
+#include <contract/detail/preprocessor/traits/assertion.hpp> // a
+#include <contract/detail/preprocessor/keyword/const.hpp>
+#include <contract/detail/preprocessor/keyword/static.hpp>
+#include <boost/mpl/bool.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CODE_ASSERTION_FUNC_DEF_(d, \
+ false_decl_tokens, true_decl_tokens, \
+ true_def_statements_token, true_def_const_tokens, true_def_check_token)\
+ (( /* seq of array to handle unwrapped commas */ \
+ /* total number of tokens */ \
+ BOOST_PP_SUB(BOOST_PP_LIST_SIZE(BOOST_PP_LIST_APPEND( \
+ false_decl_tokens, BOOST_PP_LIST_APPEND(true_decl_tokens, \
+ true_def_const_tokens))), \
+ /* when 2 lists -1, when 3 lists -2 (trim list joint point) */ \
+ BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(true_def_const_tokens),2,1))\
+ , ( /* wrap all tokens within the array's tuple */ \
+ BOOST_PP_LIST_ENUM(false_decl_tokens) \
+ { \
+ /* POLICY: do nothing, silently pass the assertion if the */ \
+ /* assertion requirements are not met */ \
+ } \
+ BOOST_PP_LIST_ENUM(true_decl_tokens) \
+ { \
+ true_def_statements_token \
+ BOOST_PP_LIST_ENUM(true_def_const_tokens) \
+ true_def_check_token \
+ } \
+ )))
+
+#define CONTRACT_AUX_CODE_ASSERTION_FUNC_PREV_STATEMENT_(d, number_code, a) \
+ ( \
+ BOOST_PP_TUPLE_ELEM(2, 0, number_code) /* code so far */ \
+ , \
+ BOOST_PP_TUPLE_ELEM(2, 1, number_code) /* code so far */ \
+ /* append instruction code (if apply) */ \
+ BOOST_PP_EXPR_IIF(BOOST_PP_BITAND( \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_IS_STATEMENT(a), \
+ BOOST_PP_LESS(CONTRACT_DETAIL_PP_ASSERTION_TRAITS_NUMBER(a), \
+ BOOST_PP_TUPLE_ELEM(2, 0, number_code))), \
+ /* NOTE: if this is an assertion statement (using, etc) with a */ \
+ /* number smaller (<) than spec number, then the statement */ \
+ /* preceded the assertion being coded (i.e., with the spec */ \
+ /* number) so its scope affects the coded assertion and the */ \
+ /* statement is programmed into the assertion function */ \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_INSTRUCTION(a) \
+ ; /* trailing `;` ends statement */ \
+ ) \
+ )
+
+#define CONTRACT_AUX_CODE_ASSERTION_FUNC_PREV_STATEMENTS_( \
+ d, id, tpl, a, assertions) \
+ BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_LIST_FOLD_LEFT_ ## d( \
+ CONTRACT_AUX_CODE_ASSERTION_FUNC_PREV_STATEMENT_, \
+ (CONTRACT_DETAIL_PP_ASSERTION_TRAITS_NUMBER(a), ;), assertions))
+
+#define CONTRACT_AUX_CODE_ASSERTION_FUNC_REQUIREMENT_(d, id, tpl, a, \
+ underscored_name, decl_tokens_macro, data, assertions, \
+ true_def_const_tokens, true_def_check_token) \
+ CONTRACT_AUX_CODE_ASSERTION_FUNC_DEF_(d \
+ , decl_tokens_macro(d, id, tpl, data, \
+ ::boost::mpl::false_ const&, a) \
+ , decl_tokens_macro(d, id, tpl, data, \
+ ::boost::mpl::true_ const&, a) \
+ , CONTRACT_AUX_CODE_ASSERTION_FUNC_PREV_STATEMENTS_(d, id, tpl, a, \
+ assertions) \
+ , true_def_const_tokens \
+ , true_def_check_token \
+ )
+
+#define CONTRACT_AUX_CODE_ASSERTION_FUNC_CONST_(d, id, tpl, a, \
+ underscored_name, decl_tokens_macro, data, assertions) \
+ CONTRACT_AUX_CODE_ASSERTION_FUNC_REQUIREMENT_(d, id, tpl, a, \
+ underscored_name, decl_tokens_macro, data, assertions, \
+ /* tokens that define the const-assertion local function */ \
+ CONTRACT_AUX_CODE_ASSERT_CONST_DEF_TOKENS(id, tpl, a, \
+ underscored_name), \
+ /* single token checking const assertion (calling loc func) */ \
+ CONTRACT_AUX_CODE_ASSERT_CONST(id, tpl, a, \
+ underscored_name))
+
+#define CONTRACT_AUX_CODE_ASSERTION_FUNC_STATIC_(d, id, tpl, a, \
+ underscored_name, decl_tokens_macro, data, assertions) \
+ CONTRACT_AUX_CODE_ASSERTION_FUNC_REQUIREMENT_(d, id, tpl, a, \
+ underscored_name, decl_tokens_macro, data, assertions, \
+ BOOST_PP_NIL, /* no const tokens (this is not const-assertion */ \
+ /* single token checking static assertion */ \
+ CONTRACT_AUX_CODE_ASSERT_STATIC(id, tpl, a, underscored_name))
+
+#define CONTRACT_AUX_CODE_ASSERTION_FUNC_BOOL_(d, id, tpl, a, \
+ underscored_name, decl_tokens_macro, data, assertions) \
+ CONTRACT_AUX_CODE_ASSERTION_FUNC_REQUIREMENT_(d, id, tpl, a, \
+ underscored_name, decl_tokens_macro, data, assertions, \
+ BOOST_PP_NIL, /* no const tokens (this is not const-assertion */ \
+ /* single token checking bool assertion */ \
+ CONTRACT_AUX_CODE_ASSERT_BOOL(id, tpl, a, underscored_name))
+
+#define CONTRACT_AUX_CODE_ASSERTION_FUNC_( \
+ d, id_tpl_name_decl_data_assertions_code, a) \
+ ( \
+ BOOST_PP_TUPLE_ELEM(7, 0, id_tpl_name_decl_data_assertions_code) \
+ , \
+ BOOST_PP_TUPLE_ELEM(7, 1, id_tpl_name_decl_data_assertions_code) \
+ , \
+ BOOST_PP_TUPLE_ELEM(7, 2, id_tpl_name_decl_data_assertions_code) \
+ , \
+ BOOST_PP_TUPLE_ELEM(7, 3, id_tpl_name_decl_data_assertions_code) \
+ , \
+ BOOST_PP_TUPLE_ELEM(7, 4, id_tpl_name_decl_data_assertions_code) \
+ , \
+ BOOST_PP_TUPLE_ELEM(7, 5, id_tpl_name_decl_data_assertions_code) \
+ , \
+ BOOST_PP_TUPLE_ELEM(7, 6, id_tpl_name_decl_data_assertions_code) \
+ /* append seq */ \
+ BOOST_PP_IIF(BOOST_PP_COMPL(BOOST_PP_IS_EMPTY( \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_REQUIREMENT(a))), \
+ /* NOTE: assertion functions are used for assertion requirements */\
+ /* so the assertion compilation is skipped when the assertion */ \
+ /* requirements are not met (because the assertion func is a tpl)*/\
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_STATIC_ASSERT_FRONT( \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_INSTRUCTION(a)), \
+ CONTRACT_AUX_CODE_ASSERTION_FUNC_STATIC_ \
+ , \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_CONST_FRONT( \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_INSTRUCTION(a)), \
+ CONTRACT_AUX_CODE_ASSERTION_FUNC_CONST_ \
+ , \
+ CONTRACT_AUX_CODE_ASSERTION_FUNC_BOOL_ \
+ )) \
+ , \
+ BOOST_PP_TUPLE_EAT(8) /* skip this assertion (no requirement) */\
+ )( \
+ d \
+ , BOOST_PP_TUPLE_ELEM(7, 0, id_tpl_name_decl_data_assertions_code) \
+ , BOOST_PP_TUPLE_ELEM(7, 1, id_tpl_name_decl_data_assertions_code) \
+ , a \
+ , BOOST_PP_TUPLE_ELEM(7, 2, id_tpl_name_decl_data_assertions_code) \
+ , BOOST_PP_TUPLE_ELEM(7, 3, id_tpl_name_decl_data_assertions_code) \
+ , BOOST_PP_TUPLE_ELEM(7, 4, id_tpl_name_decl_data_assertions_code) \
+ , BOOST_PP_TUPLE_ELEM(7, 5, id_tpl_name_decl_data_assertions_code) \
+ ) \
+ )
+
+#define CONTRACT_AUX_CODE_ASSERTION_FUNC_DEF_FROM_ARRAY_( \
+ r, unused, code_array) \
+ BOOST_PP_LIST_ENUM_R(r, BOOST_PP_TUPLE_TO_LIST( \
+ BOOST_PP_ARRAY_SIZE(code_array), BOOST_PP_ARRAY_DATA(code_array)))
+
+#define CONTRACT_AUX_CODE_ASSERTION_FUNC_DEF_FROM_SEQ_(code_seq) \
+ BOOST_PP_SEQ_FOR_EACH(CONTRACT_AUX_CODE_ASSERTION_FUNC_DEF_FROM_ARRAY_, ~, \
+ BOOST_PP_SEQ_TAIL(code_seq))
+
+#define CONTRACT_AUX_CODE_ASSERTION_FUNC_DEF_GET_(code_seq) \
+ BOOST_PP_IIF(BOOST_PP_EQUAL(BOOST_PP_SEQ_SIZE(code_seq), 1), \
+ BOOST_PP_TUPLE_EAT(1) /* no assertion func definition code */ \
+ , \
+ CONTRACT_AUX_CODE_ASSERTION_FUNC_DEF_FROM_SEQ_ \
+ )(code_seq)
+
+// PUBLIC //
+
+// Where `decl_tokens_macro(d, id, tpl, data, dispatch_param, a)`
+// expands to token list (data is optional, pass ~ or similar if not needed).
+#define CONTRACT_AUX_CODE_ASSERTION_FUNC_DEF(id, tpl, \
+ underscored_name, decl_tokens_macro, data, assertions) \
+ /* can't use LIST_FOR_EACH here instead of FOLD_LEFT because it doesn't */ \
+ /* reenter correctly on MSVC (not even if FOR_EACH_R is used) because */ \
+ /* many of the alg used to expand the assert func also use LIST_FOR_EACH */\
+ CONTRACT_AUX_CODE_ASSERTION_FUNC_DEF_GET_(BOOST_PP_TUPLE_ELEM(7, 6, \
+ BOOST_PP_LIST_FOLD_LEFT(CONTRACT_AUX_CODE_ASSERTION_FUNC_, \
+ /* code in seq of array to handle unwrapped commas */ \
+ ( id, tpl, underscored_name, decl_tokens_macro, \
+ data, assertions, ((1, (;))) ), \
+ assertions)))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/base.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/base.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,65 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_BASE_HPP_
+#define CONTRACT_AUX_CODE_BASE_HPP_
+
+#include <boost/mpl/identity.hpp>
+
+// Bases.
+
+// Expand to void_base if should not subcontract from base n-th.
+// Precondition: n < size(bases).
+#define CONTRACT_AUX_CODE_BASE_SUBCONTRACT_(z, n, c) \
+ /* subcontract from all specified bases (valid n) as per [N1962] policy */ \
+ /* (A++ policy would instead be to not subcontract from private bases */ \
+ /* and subcontract pre and post but not inv from protected bases) */ \
+ BOOST_PP_ARRAY_ENUM(CONTRACT_DETAIL_PP_BASE_TRAITS_TYPE(BOOST_PP_LIST_AT( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_BASES(c), n)))
+
+#define CONTRACT_AUX_CODE_BASE_SELECT_(z, n, c) \
+ BOOST_PP_IIF(BOOST_PP_LESS(n, BOOST_PP_LIST_SIZE( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_BASES(c))), \
+ CONTRACT_AUX_CODE_BASE_SUBCONTRACT_ \
+ , \
+ CONTRACT_AUX_CODE_CLASS_TYPE \
+ BOOST_PP_TUPLE_EAT(3) \
+ )(z, n, c)
+
+// PUBLIC //
+
+#define CONTRACT_AUX_CODE_BASE_TYPE(n) \
+ CONTRACT_AUX_SYMBOL( (base)(n) )
+
+#define CONTRACT_AUX_CODE_BASE_SEQ_R(r, typename_keyword, b) \
+ ( /* seq elem */ \
+ CONTRACT_DETAIL_PP_BASE_TRAITS_ACCESS(b) \
+ CONTRACT_DETAIL_PP_BASE_TRAITS_VIRTUAL(b) \
+ /* no outer typename here because base list requires no typename */ \
+ /* (bases known to be types), IDENTITY with add/remove reference */ \
+ /* to handle unwrapped commas */ \
+ ::boost::remove_reference< \
+ typename_keyword \
+ BOOST_IDENTITY_TYPE(( \
+ typename_keyword \
+ ::boost::add_reference< \
+ BOOST_PP_ARRAY_ENUM( \
+ CONTRACT_DETAIL_PP_BASE_TRAITS_TYPE(b)) \
+ >::type \
+ )) \
+ >::type \
+ )
+
+#define CONTRACT_AUX_CODE_BASE_TYPEDEF_Z(z, n, c) \
+ typedef \
+ CONTRACT_AUX_CODE_BASE_SELECT_(z, n, c) \
+ CONTRACT_AUX_CODE_BASE_TYPE(n) \
+ ;
+
+#endif // #include
+
+
Added: sandbox/contract/include/contract/aux_/macro/code_/body.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/body.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,42 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_BODY_HPP_
+#define CONTRACT_AUX_CODE_BODY_HPP_
+
+#include <contract/aux_/symbol.hpp>
+#include <contract/aux_/macro/code_/func.hpp>
+#include <contract/detail/preprocessor/traits/func.hpp> // f
+
+// PUBLIC //
+
+#define CONTRACT_AUX_CODE_BODY_DECL(id, tpl, k, f, body_func) \
+ BOOST_PP_IIF(CONTRACT_AUX_PP_FUNC_KIND_IS_MEMBER(k, f), \
+ /* NOTE: virtual func might need (and will need if pure virtual) */ \
+ /* override the body so the body must keep func orig access level */ \
+ /* furthermore body needs to be called directly when derived class */ \
+ /* calls its base class function */ \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_ACCESS(f) : BOOST_PP_EMPTY \
+ , /* else, free function */ \
+ /* NOTE: it is not possible to decl free func body static here */ \
+ /* otherwise body def cannot be separated from its decl */ \
+ BOOST_PP_EMPTY /* do nothing */ \
+ )() \
+ CONTRACT_AUX_CODE_FUNC_NAMED_DECL( \
+ id, tpl, k, f, body_func \
+ /* body must have same access level as contracted function to */ \
+ /* properly allow to define pure virtual functions */ \
+ , 0 /* no access level (already handled above) */ \
+ , 0 /* body not friend (only contracted func is friend, rest static) */\
+ , 0 /* no explicit (body never a constructor) */ \
+ , 0 /* don't force inline */ \
+ , 1 /* force (void) result type (for constructors) */ \
+ , 0 /* no param defaults (only func needs defaults) */ \
+ )
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/class.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/class.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,22 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_CLASS_HPP_
+#define CONTRACT_AUX_CODE_CLASS_HPP_
+
+#include <contract/aux_/config.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/logical/bitand.hpp>
+#include <boost/preprocessor/list/adt.hpp>
+
+// PUBLIC //
+
+#define CONTRACT_AUX_CODE_CLASS_TYPE \
+ ERROR_missing_class_contract /* name also used to report error */
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/class_concept.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/class_concept.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,65 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_CLASS_CONCEPT_HPP_
+#define CONTRACT_AUX_CODE_CLASS_CONCEPT_HPP_
+
+#include <contract/aux_/concept_assert.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CODE_CLASS_CONCEPT_ASSERT_(r, id, i, concept) \
+ /* can expand multiple of this macros on same line because of id */ \
+ CONTRACT_AUX_CONCEPT_ASSERT( (BOOST_PP_ARRAY_ENUM(concept)), \
+ /* pp-cat infix because Boost.ConceptCheck will cat it again */ \
+ CONTRACT_AUX_SYMBOL( (concept_check)(id)(i) ) \
+ ) ; /* `;` ends concept assertion */
+
+// PUBLIC //
+
+#define CONTRACT_AUX_CODE_CLASS_CONCEPT_TYPE(id, c) \
+ CONTRACT_AUX_SYMBOL( (CONTRACT_DETAIL_PP_CLASS_TRAITS_NAME(c)) \
+ (check_class_concepts) (id) )
+
+#define CONTRACT_AUX_CODE_CLASS_CONCEPT(id, tpl, c) \
+ CONTRACT_AUX_CODE_TEMPLATE_DECL( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_IS_TEMPLATE(c), \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_PARAMS(c))) \
+ struct CONTRACT_AUX_CODE_CLASS_CONCEPT_TYPE(id, c) \
+ { \
+ BOOST_PP_LIST_FOR_EACH_I(CONTRACT_AUX_CODE_CLASS_CONCEPT_ASSERT_, id, \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_CONCEPTS(c)) \
+ };
+
+#define CONTRACT_AUX_CODE_CLASS_CONCEPT_BASE_SEQ(id, tpl, c) \
+ ( /* seq elem */ \
+ /* NOTE: inheritance is private because impl detail and it has to */ \
+ /* be virtual because otherwise eventual other virtual bases will */ \
+ /* be initialized before this one */ \
+ private virtual \
+ /* IDENTITY_TYPE is needed here because this code passes multiple */ \
+ /* tparams separated by unwrapped commas to the enclosing macro */ \
+ /* (but no outer typename in base class list) plus add/remove ref */ \
+ /* to handle abstract types */ \
+ ::boost::remove_reference< \
+ CONTRACT_AUX_CODE_CLASS_TYPENAME(tpl, c) \
+ BOOST_IDENTITY_TYPE(( \
+ CONTRACT_AUX_CODE_CLASS_TYPENAME(tpl, c) \
+ ::boost::add_reference< \
+ CONTRACT_AUX_CODE_CLASS_CONCEPT_TYPE(id, c) \
+ CONTRACT_AUX_CODE_TEMPLATE_INSTANCE( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_PARAMS( \
+ c))) \
+ >::type \
+ )) \
+ >::type \
+ )
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/class_final.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/class_final.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,94 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_CLASS_FINAL_HPP_
+#define CONTRACT_AUX_CODE_CLASS_FINAL_HPP_
+
+#include <contract/aux_/has_xxx_member_function.hpp>
+#include <contract/aux_/mpl_assert.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/or.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CODE_CLASS_FINAL_TAG_FUNC_ \
+ CONTRACT_AUX_SYMBOL( (final_class_tag) ) /* no class name, id, etc */
+
+#define CONTRACT_AUX_CODE_CLASS_FINAL_TAG_FUNC_SIGNATURE_(name) \
+ /* NOTE: final classes decl this member func tag then derived classes */ \
+ /* statically assert (using introspection) that none of their base */ \
+ /* classes have the final tag member func (i.e., they were decl final) */ \
+ void name ( )
+
+#define CONTRACT_AUX_CODE_CLASS_FINAL_TAG_DECL_ \
+ public: /* must be public to be accessed from introspection metafunc */ \
+ CONTRACT_AUX_CODE_CLASS_FINAL_TAG_FUNC_SIGNATURE_( \
+ CONTRACT_AUX_CODE_CLASS_FINAL_TAG_FUNC_) \
+ ; /* no tag func definition needed for SFINAE so `;` */
+
+#define CONTRACT_AUX_CODE_CLASS_FINAL_TAG_(c) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_COMPL(BOOST_PP_IS_EMPTY( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_FINAL(c))), \
+ CONTRACT_AUX_CODE_CLASS_FINAL_TAG_DECL_ \
+ )
+
+#define CONTRACT_AUX_CODE_CLASS_FINAL_CHECK_BASE_(r, id_tpl_c, i, b) \
+ CONTRACT_AUX_MPL_ASSERT_MSG( \
+ /* use introspection metafunc has_... decl below in this file */ \
+ (!::contract::aux::has_final_class_tag< \
+ CONTRACT_AUX_CODE_CLASS_FINAL_TAG_FUNC_SIGNATURE_( \
+ ( \
+ /* no outer typename here because constructor */ \
+ /* requires no typename (known to be a type), IDENTITY */ \
+ /* with add/remove reference to handle unwrapped commas */ \
+ ::boost::remove_reference< \
+ CONTRACT_AUX_CODE_CLASS_TYPENAME( \
+ BOOST_PP_TUPLE_ELEM(3, 1, id_tpl_c), \
+ BOOST_PP_TUPLE_ELEM(3, 2, id_tpl_c)) \
+ BOOST_IDENTITY_TYPE(( \
+ CONTRACT_AUX_CODE_CLASS_TYPENAME( \
+ BOOST_PP_TUPLE_ELEM(3, 1, id_tpl_c), \
+ BOOST_PP_TUPLE_ELEM(3, 2, id_tpl_c)) \
+ ::boost::add_reference< \
+ BOOST_PP_ARRAY_ENUM( \
+ CONTRACT_DETAIL_PP_BASE_TRAITS_TYPE(b))\
+ >::type \
+ )) \
+ >::type \
+ ::* \
+ ) \
+ ) \
+ >::value) \
+ , BOOST_PP_SEQ_CAT( (ERROR_cannot_extend_final_base_class_number_) \
+ (BOOST_PP_INC(i))(_at_line_) \
+ (BOOST_PP_TUPLE_ELEM(3, 0, id_tpl_c)) ) \
+ , (types< \
+ /* keep eventual typename prefix here and no need for IDENTITY */ \
+ BOOST_PP_ARRAY_ENUM(CONTRACT_DETAIL_PP_BASE_TRAITS_TYPE(b)) \
+ >) \
+ ); /* MPL assert requires trailing `;` */
+
+#define CONTRACT_AUX_CODE_CLASS_FINAL_CHECK_(id, tpl, c) \
+ BOOST_PP_LIST_FOR_EACH_I(CONTRACT_AUX_CODE_CLASS_FINAL_CHECK_BASE_, \
+ (id, tpl, c), CONTRACT_DETAIL_PP_CLASS_TRAITS_BASES(c))
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CODE_CLASS_FINAL(id, tpl, c) \
+ CONTRACT_AUX_CODE_CLASS_FINAL_TAG_(c) \
+ CONTRACT_AUX_CODE_CLASS_FINAL_CHECK_(id, tpl, c)
+
+namespace contract { namespace aux {
+
+CONTRACT_AUX_HAS_XXX_MEMBER_FUNCTION(has_final_class_tag,
+ CONTRACT_AUX_CODE_CLASS_FINAL_TAG_FUNC_)
+
+}} // namespace contract::aux
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/class_invariant_const.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/class_invariant_const.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,119 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_HPP_
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_HPP_
+
+#include <contract/aux_/symbol.hpp>
+#include <contract/aux_/subcontract/has_class_invariant.hpp>
+#include <contract/aux_/subcontract/class_invariant.hpp>
+#include <contract/aux_/subcontract/static_class_invariant.hpp>
+#include <contract/aux_/macro/code_/assert.hpp>
+#include <contract/detail/preprocessor/traits/class_invariant.hpp> // v
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_COMMA_BASE_TYPE_(z, n, id) \
+ , CONTRACT_AUX_CODE_SUBCONTRACTED_BASE_TYPE(id, n)
+
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_COMMA_BASE_(z, n, id) \
+ , dynamic_cast< \
+ CONTRACT_AUX_CODE_SUBCONTRACTED_BASE_TYPE(id, n) const* const \
+ >(this) \
+ , & CONTRACT_AUX_CODE_SUBCONTRACTED_BASE_TYPE(id, n) :: \
+ CONTRACT_AUX_CODE_SUBCONTRACTED_CLASS_INVARIANT_CONST_FUNC \
+
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_DECL_TOKENS_(id, tpl, \
+ function_name, is_assertion, dispatch_param) \
+ ( /* pp-list */ \
+ /* unused tparam to delay assertion-func compilation */ \
+ BOOST_PP_EXPR_IIF(is_assertion, \
+ template< typename CONTRACT_AUX_SYMBOL( (Unused)(id) ) > \
+ ) \
+ void function_name( \
+ /* extra param for type-dispatching based on ass. requirements */ \
+ /* (can't go at the end because of default parameters) */\
+ BOOST_PP_EXPR_IIF(is_assertion, dispatch_param) \
+ ) const \
+ , \
+ BOOST_PP_NIL \
+ )
+
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_ASSERTION_FUNC_(id, a) \
+ CONTRACT_AUX_SYMBOL( (class_invariant_assertion) \
+ (CONTRACT_DETAIL_PP_ASSERTION_TRAITS_NUMBER(a)) (id) )
+
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_ASSERTION_FUNC_DECL_TOKENS_( \
+ d, id, tpl, unused, dispatch_param, a) \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_DECL_TOKENS_(id, tpl, \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_ASSERTION_FUNC_(id, a), \
+ 1 /* yes for assertion */, dispatch_param)
+
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_ASSERTION_FUNC_CALL_( \
+ d, id, tpl, unused, a) \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_ASSERTION_FUNC_(id, a) \
+ <void> /* unused tparam to delay assertion func compilation */ \
+ ( \
+ BOOST_PP_EXPR_IIF(tpl, typename) \
+ /* NOTE: extra param for assertion func dispatch based on */ \
+ /* requirements-- mpl::true_ iff assertion requirements */ \
+ /* are met at compile-time */ \
+ ::boost::mpl::bool_< \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_REQUIREMENT(a) \
+ >::type() \
+ );
+
+// PUBLIC //
+
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_FUNC \
+ /* func name also used to report error when INVARIANT macro is missing */ \
+ ERROR_missing_class_invariant
+
+#define CONTRACT_AUX_CODE_SUBCONTRACTED_CLASS_INVARIANT_CONST_FUNC \
+ /* NOTE: must use this exact func name for introspection check to work */ \
+ CONTRACT_AUX_CODE_SUBCONTRACT_HAS_CLASS_INVARIANT_FUNC
+
+#define CONTRACT_AUX_CODE_SUBCONTRACTED_CLASS_INVARIANT_CONST(id, tpl) \
+ void CONTRACT_AUX_CODE_SUBCONTRACTED_CLASS_INVARIANT_CONST_FUNC() const { \
+ ::contract::aux::subcontract_class_invariant< \
+ CONTRACT_AUX_CODE_CLASS_TYPE \
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX, \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_COMMA_BASE_TYPE_, \
+ id) \
+ >( \
+ this \
+ , & CONTRACT_AUX_CODE_CLASS_TYPE :: \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_FUNC \
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX, \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_COMMA_BASE_, id) \
+ ); \
+ }
+
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST(id, tpl, v) \
+ CONTRACT_AUX_CODE_ASSERTION_FUNC_DEF(id, tpl, class_invariant, \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_ASSERTION_FUNC_DECL_TOKENS_, \
+ ~, CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_CONST(v)) \
+ BOOST_PP_LIST_ENUM(CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_DECL_TOKENS_( \
+ id, tpl, CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_FUNC, \
+ 0 /* not for assertion */, ~ /* no dispatch param */)) \
+ { \
+ /* first always check static class invariants */ \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_STATIC_FUNC(); \
+ /* then check dynamic class invariants (in AND) */ \
+ CONTRACT_AUX_CODE_ASSERT(id, tpl, class_invariant, \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_ASSERTION_FUNC_CALL_, \
+ ~, CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_CONST(v)) \
+ /* then check volatile class inv but only if diff from dyn (in AND) */ \
+ BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS( \
+ CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_VOLATILE(v)), \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE_FUNC< \
+ false /* don't check static class inv (again) */>(); \
+ ) \
+ }
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/class_invariant_const_volatile.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/class_invariant_const_volatile.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,159 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE_HPP_
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE_HPP_
+
+#include <contract/aux_/symbol.hpp>
+#include <contract/aux_/subcontract/class_invariant.hpp>
+#include <contract/aux_/subcontract/static_class_invariant.hpp>
+#include <contract/aux_/macro/code_/assert.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE_COMMA_BASE_TYPE_( \
+ z, n, id) \
+ , CONTRACT_AUX_CODE_SUBCONTRACTED_BASE_TYPE(id, n)
+
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE_COMMA_BASE_( \
+ z, n, id_tpl) \
+ , dynamic_cast< \
+ CONTRACT_AUX_CODE_SUBCONTRACTED_BASE_TYPE(BOOST_PP_TUPLE_ELEM( \
+ 2, 0, id_tpl), n) \
+ const volatile* const \
+ >(this) \
+ , & CONTRACT_AUX_CODE_SUBCONTRACTED_BASE_TYPE(BOOST_PP_TUPLE_ELEM( \
+ 2, 0, id_tpl), n) :: \
+ BOOST_PP_EXPR_IIF(BOOST_PP_TUPLE_ELEM(2, 1, id_tpl), \
+ template \
+ ) \
+ CONTRACT_AUX_CODE_SUBCONTRACTED_CLASS_INVARIANT_CONST_VOLATILE_FUNC< \
+ void> /* extra template param to delay compilation */
+
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE_TRAITS_(v) \
+ /* POLICY: by default, volatile class inv same as dyn if not specified */ \
+ /* (this is likely what the user would want but it could generate */ \
+ /* compile-time error because dyn inv use non volatile obj in which */ \
+ /* case user will specify volatile inv */ \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_HAS_CONST_VOLATILE( \
+ v), /* has_volatile iff volatile are specified */ \
+ CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_CONST_VOLATILE \
+ , \
+ CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_CONST \
+ )(v)
+
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE_CHECK_STATIC_VAR_(id) \
+ CONTRACT_AUX_SYMBOL( (check_static_class_invariant)(id) )
+
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE_DECL_TOKENS_( \
+ id, tpl, function_name, is_assertion, dispatch_param) \
+ ( /* pp-list */ \
+ /* NOTE: this tparam is also used to disable compilation */ \
+ /* of the volatile class invariant lazily until an actual volatile */ \
+ /* member function is used (this is because volatile class inv */ \
+ /* are defined to match the normal class inv by default and that */ \
+ /* errors at compile-time but only when volatile member are used */ \
+ template< bool \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE_CHECK_STATIC_VAR_(id) \
+ > \
+ void function_name( \
+ /* extra param for type-dispatching based on ass. requirements */ \
+ /* (can't go at the end because of default parameters) */\
+ BOOST_PP_EXPR_IIF(is_assertion, dispatch_param) \
+ ) const volatile \
+ , \
+ BOOST_PP_NIL \
+ )
+
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE_ASSERTION_FUNC_( \
+ id, a) \
+ CONTRACT_AUX_SYMBOL( (volatile_class_invariant_assertion) \
+ (CONTRACT_DETAIL_PP_ASSERTION_TRAITS_NUMBER(a)) (id) )
+
+#define \
+CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE_ASSERTION_FUNC_DECL_TOKENS_( \
+ d, id, tpl, unused, dispatch_param, a) \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE_DECL_TOKENS_( \
+ id, tpl, \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE_ASSERTION_FUNC_( \
+ id, a), \
+ 1 /* yes for assertion */, dispatch_param)
+
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE_ASSERTION_FUNC_CALL_( \
+ d, id, tpl, unused, a) \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE_ASSERTION_FUNC_(id, a) \
+ <false> /* unused tparam to delay assertion func compilation */ \
+ ( \
+ BOOST_PP_EXPR_IIF(tpl, typename) \
+ /* NOTE: extra param for assertion func dispatch based on */ \
+ /* requirements-- mpl::true_ iff assertion requirements */ \
+ /* are met at compile-time */ \
+ ::boost::mpl::bool_< \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_REQUIREMENT(a) \
+ >::type() \
+ );
+
+// PUBLIC //
+
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE_FUNC \
+ CONTRACT_AUX_SYMBOL( (volatile_class_invariant) )
+
+#define CONTRACT_AUX_CODE_SUBCONTRACTED_CLASS_INVARIANT_CONST_VOLATILE_FUNC \
+ CONTRACT_AUX_SYMBOL( (subcontracted_volatile_class_invariant) )
+
+#define CONTRACT_AUX_CODE_SUBCONTRACTED_CLASS_INVARIANT_CONST_VOLATILE( \
+ id, tpl) \
+ /* NOTE: volatile subcontracted class invariants must be a template so */ \
+ /* to not compile unless volatile member actually contracted so to */ \
+ /* avoid volatile qualifier errors until because volatile class */ \
+ /* invariants defaulted to dynamic ones if not specified (so tpl = 1 */ \
+ /* forced here) */ \
+ template< typename CONTRACT_AUX_SYMBOL( (Unused) ) > /* always template */ \
+ void CONTRACT_AUX_CODE_SUBCONTRACTED_CLASS_INVARIANT_CONST_VOLATILE_FUNC() \
+ const volatile { \
+ ::contract::aux::subcontract_class_invariant< \
+ CONTRACT_AUX_CODE_CLASS_TYPE \
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX, \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE_COMMA_BASE_TYPE_, \
+ id) \
+ >( \
+ this \
+ , & CONTRACT_AUX_CODE_CLASS_TYPE :: \
+ template /* always a template (tpl = 1 forced) */ \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE_FUNC< \
+ true /* check static class inv */> \
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX, \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE_COMMA_BASE_, \
+ (id, 1 /* always a template (tpl = 1 forced) */)) \
+ ); \
+ }
+
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE(id, tpl, v) \
+ CONTRACT_AUX_CODE_ASSERTION_FUNC_DEF(id, tpl, \
+ volatile_class_invariant, \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE_ASSERTION_FUNC_DECL_TOKENS_,\
+ ~, CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE_TRAITS_(v)) \
+ BOOST_PP_LIST_ENUM( \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE_DECL_TOKENS_( \
+ id, tpl, \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE_FUNC, \
+ 0 /* not for assertion */, ~ /* no dispatch param */)) \
+ { \
+ /* first always check static class invariants (bool var is used */ \
+ /* to not check static inv twice when dyn inv call volatile inv) */ \
+ if(CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE_CHECK_STATIC_VAR_( \
+ id)) { \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_STATIC_FUNC(); \
+ } \
+ /* then check volatile class invariants (in AND with static) */ \
+ CONTRACT_AUX_CODE_ASSERT(id, tpl, volatile_class_invariant, \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE_ASSERTION_FUNC_CALL_, \
+ ~, CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_VOLATILE_TRAITS_(v))\
+ }
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/class_invariant_static.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/class_invariant_static.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,109 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_CLASS_INVARIANT_STATIC_HPP_
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_STATIC_HPP_
+
+#include <contract/aux_/symbol.hpp>
+#include <contract/aux_/subcontract/class_invariant.hpp>
+#include <contract/aux_/subcontract/static_class_invariant.hpp>
+#include <contract/aux_/macro/code_/assert.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_STATIC_COMMA_BASE_TYPE_(z, n, id) \
+ , CONTRACT_AUX_CODE_SUBCONTRACTED_BASE_TYPE(id, n)
+
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_STATIC_COMMA_BASE_FUNC_( \
+ z, n, id) \
+ , & CONTRACT_AUX_CODE_SUBCONTRACTED_BASE_TYPE(id, n) :: \
+ CONTRACT_AUX_CODE_SUBCONTRACTED_CLASS_INVARIANT_STATIC_FUNC
+
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_STATIC_DECL_TOKENS_( \
+ id, tpl, function_name, is_assertion, dispatch_param) \
+ ( /* pp-list */ \
+ /* unused tparam to delay assertion-func compilation */ \
+ BOOST_PP_EXPR_IIF(is_assertion, \
+ template< typename CONTRACT_AUX_SYMBOL( (Unused)(id) ) > \
+ ) \
+ static void function_name( \
+ /* extra param for type-dispatching based on ass. requirements */ \
+ /* (can't go at the end because of default parameters) */\
+ BOOST_PP_EXPR_IIF(is_assertion, dispatch_param) \
+ ) \
+ , \
+ BOOST_PP_NIL \
+ )
+
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_STATIC_ASSERTION_FUNC_(id, a) \
+ CONTRACT_AUX_SYMBOL( (static_class_invariant_assertion) \
+ (CONTRACT_DETAIL_PP_ASSERTION_TRAITS_NUMBER(a)) (id) )
+
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_STATIC_ASSERTION_FUNC_DECL_TOKENS_(\
+ d, id, tpl, unused, dispatch_param, a) \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_STATIC_DECL_TOKENS_( \
+ id, tpl, \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_STATIC_ASSERTION_FUNC_(a, id), \
+ 1 /* yes for assertion */, dispatch_param)
+
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_STATIC_ASSERTION_FUNC_CALL_( \
+ d, id, tpl, unused, a) \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_STATIC_ASSERTION_FUNC_(id, a) \
+ <void> /* unused tparam to delay assertion func compilation */ \
+ ( \
+ BOOST_PP_EXPR_IIF(tpl, typename) \
+ /* NOTE: extra param for assertion func dispatch based on */ \
+ /* requirements-- mpl::true_ iff assertion requirements */ \
+ /* are met at compile-time */ \
+ ::boost::mpl::bool_< \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_REQUIREMENT(a) \
+ >::type() \
+ );
+
+// PUBLIC //
+
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_STATIC_FUNC \
+ CONTRACT_AUX_SYMBOL( (static_class_invariant) )
+
+#define CONTRACT_AUX_CODE_SUBCONTRACTED_CLASS_INVARIANT_STATIC_FUNC \
+ CONTRACT_AUX_SYMBOL( (subcontracted_static_class_invariant) )
+
+#define CONTRACT_AUX_CODE_SUBCONTRACTED_CLASS_INVARIANT_STATIC(id, tpl) \
+ static void CONTRACT_AUX_CODE_SUBCONTRACTED_CLASS_INVARIANT_STATIC_FUNC() \
+ { \
+ ::contract::aux::subcontract_static_class_invariant< \
+ CONTRACT_AUX_CODE_CLASS_TYPE \
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX, \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_STATIC_COMMA_BASE_TYPE_, \
+ id) \
+ >( \
+ & CONTRACT_AUX_CODE_CLASS_TYPE :: \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_STATIC_FUNC \
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX, \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_STATIC_COMMA_BASE_FUNC_, \
+ id) \
+ ); \
+ }
+
+#define CONTRACT_AUX_CODE_CLASS_INVARIANT_STATIC(id, tpl, v) \
+ CONTRACT_AUX_CODE_ASSERTION_FUNC_DEF(id, tpl, \
+ static_class_invariant, \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_STATIC_ASSERTION_FUNC_DECL_TOKENS_,\
+ ~, CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_STATIC(v)) \
+ BOOST_PP_LIST_ENUM(CONTRACT_AUX_CODE_CLASS_INVARIANT_STATIC_DECL_TOKENS_( \
+ id, tpl, \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_STATIC_FUNC, \
+ 0 /* not for assertion */, ~ /* no dispatch param */)) \
+ { \
+ CONTRACT_AUX_CODE_ASSERT(id, tpl, static_class_invariant, \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_STATIC_ASSERTION_FUNC_CALL_, \
+ /* POLICY: by default, no static class inv if not specified */ \
+ ~, CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_STATIC(v)) \
+ }
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/const_expr.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/const_expr.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,134 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_CONST_EXPR_HPP_
+#define CONTRACT_AUX_CODE_CONST_EXPR_HPP_
+
+#include <contract/detail/preprocessor/traits/const_expr.hpp>
+#include <contract/detail/preprocessor/keyword/const.hpp>
+#include <boost/local_function.hpp>
+#include <boost/preprocessor/arithmetic/mul.hpp>
+
+// PRIVATE //
+
+// Precondition: SIZE(TYPE(var_traits)) > 1.
+// NOTE: The implementation of this macro seems to confuse most compilers
+// because of the use of BOOST_IDENTITY_TYPE (so explicit types with commas
+// don't work, as a workaround users can use a typedef assertion statement).
+// It /seems/ that fixing this would ultimately require a better overload of
+// Boost.ScopeExit deref function template but that's outside the scope of this
+// library.
+#define CONTRACT_AUX_CODE_CONST_EXPR_BIND_VAR_EXPLICT_TYPE_COMMAS_( \
+ r, tpl, var_traits) \
+ ( \
+ BOOST_PP_EXPR_IIF(tpl, typename) \
+ BOOST_IDENTITY_TYPE(( /* handles unwrapped commas */ \
+ BOOST_PP_ARRAY_ENUM( \
+ CONTRACT_DETAIL_PP_CONST_EXPR_VAR_TRAITS_TYPE( \
+ var_traits)) \
+ )) \
+ )
+
+// Precondition: SIZE(TYPE(var_traits)) > 1.
+#define CONTRACT_AUX_CODE_CONST_EXPR_BIND_VAR_EXPLICT_TYPE_NO_COMMA_( \
+ r, tpl, var_traits) \
+ ( \
+ BOOST_PP_ARRAY_ENUM(CONTRACT_DETAIL_PP_CONST_EXPR_VAR_TRAITS_TYPE( \
+ var_traits)) \
+ )
+
+// Precondition: SIZE(TYPE(var_traits)) > 0.
+#define CONTRACT_AUX_CODE_CONST_EXPR_BIND_VAR_EXPLICT_TYPE_( \
+ r, tpl, var_traits) \
+ BOOST_PP_IIF(BOOST_PP_EQUAL(1, BOOST_PP_ARRAY_SIZE( \
+ CONTRACT_DETAIL_PP_CONST_EXPR_VAR_TRAITS_TYPE( \
+ var_traits))), \
+ CONTRACT_AUX_CODE_CONST_EXPR_BIND_VAR_EXPLICT_TYPE_NO_COMMA_ \
+ , \
+ /* NOTE: unfortunately, to handle commas we need to used */ \
+ /* BOOST_IDENTITY_TYPE which seems to confuse compilers when */ \
+ /* explicit types are specified so we separate the no-comma */ \
+ /* case to not use IDENTITY_TYPE to not confuse compilers if */ \
+ /* no commas and explicit types (but compilers will still be */ \
+ /* confused when commas and explicit types) */ \
+ CONTRACT_AUX_CODE_CONST_EXPR_BIND_VAR_EXPLICT_TYPE_COMMAS_ \
+ )(r, tpl, var_traits)
+
+#define CONTRACT_AUX_CODE_CONST_EXPR_BIND_SEQ_(r, tpl, var_traits) \
+ ( /* local function bind syntax `(const bind[(var_type)]& var_name)...` */ \
+ const /* for const-expression const-correctness */ \
+ bind /* capture variable in scope */ \
+ BOOST_PP_IF(BOOST_PP_ARRAY_SIZE( /* if explicit variable type */ \
+ CONTRACT_DETAIL_PP_CONST_EXPR_VAR_TRAITS_TYPE(var_traits)), \
+ CONTRACT_AUX_CODE_CONST_EXPR_BIND_VAR_EXPLICT_TYPE_ \
+ , \
+ BOOST_PP_TUPLE_EAT(3) /* type implicitly deduced with Typeof */ \
+ )(r, tpl, var_traits) \
+ & /* ref so no copy constructor is required */ \
+ CONTRACT_DETAIL_PP_CONST_EXPR_VAR_TRAITS_NAME(var_traits) \
+ )
+
+// Count tokens separated by commas not wrapped by round parenthesis `()`.
+#define CONTRACT_AUX_CODE_CONST_EXPR_TOKENS_COUNT_(var_count) \
+ /* NOTE: The Local library uses an initialization assignment */ \
+ /* `= { var1 , ... }` later followed by a member initialization */ \
+ /* `: var1 , ...` for a total of 2 * n - 1 tokens separated by commas */ \
+ /* not wrapped within round parenthesis */ \
+ BOOST_PP_DEC(BOOST_PP_MUL(2, var_count))
+
+#define CONTRACT_AUX_CODE_CONST_EXPR_TOKENS_FUNC_DEF_( \
+ id, tpl, result_type, func_name, const_traits) \
+ BOOST_PP_TUPLE_TO_LIST( \
+ CONTRACT_AUX_CODE_CONST_EXPR_TOKENS_COUNT_(BOOST_PP_LIST_SIZE( \
+ CONTRACT_DETAIL_PP_CONST_EXPR_TRAITS_VARS(const_traits))) \
+ , ( /* tuple to wrap commas from LOCAL_FUNCTION expansion */ \
+ /* using internal LOCAL_FUNCTION macros to pass id */ \
+ BOOST_PP_IIF(tpl, \
+ BOOST_LOCAL_FUNCTION_ID_TPL \
+ , \
+ BOOST_LOCAL_FUNCTION_ID \
+ )( \
+ func_name /* name is unique (and contains id) */ \
+ , BOOST_PP_LIST_FOR_EACH( /* always pp-sequence syntax */ \
+ CONTRACT_AUX_CODE_CONST_EXPR_BIND_SEQ_ \
+ , tpl \
+ , CONTRACT_DETAIL_PP_CONST_EXPR_TRAITS_VARS(const_traits) \
+ ) \
+ (return result_type) /* avoid Boost.Typeof for result type */ \
+ ) \
+ { /* local function body */ \
+ /* extra paren around expression to wrap eventual commas */ \
+ return (CONTRACT_DETAIL_PP_CONST_EXPR_TRAITS_EXPR( \
+ const_traits)); \
+ } \
+ BOOST_PP_IIF(tpl, \
+ BOOST_LOCAL_FUNCTION_NAME_TPL \
+ , \
+ BOOST_LOCAL_FUNCTION_NAME \
+ )(func_name) \
+ ) )
+
+#define CONTRACT_AUX_CODE_CONST_EXPR_TOKENS_( \
+ id, tpl, result_type, func_name, const_expr) \
+ CONTRACT_AUX_CODE_CONST_EXPR_TOKENS_FUNC_DEF_(id, tpl, result_type, \
+ func_name, CONTRACT_DETAIL_PP_CONST_EXPR_TRAITS(const_expr))
+
+// PUBLIC //
+
+// Expand `const( ... ) ...` to pp-list of tokens to handle commas not wrapped
+// within round parenthesis contained in local function code (use PP_LIST_ENUM
+// to generate final code).
+#define CONTRACT_AUX_CODE_CONST_EXPR_TOKENS( \
+ id, tpl, result_type, func_name, const_expr) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_CONST_FRONT(const_expr), \
+ CONTRACT_AUX_CODE_CONST_EXPR_TOKENS_ \
+ , \
+ BOOST_PP_NIL BOOST_PP_TUPLE_EAT(5) \
+ )(id, tpl, result_type, func_name, const_expr)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/constructor_entry.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/constructor_entry.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,74 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_CONSTRUCTOR_ENTRY_HPP_
+#define CONTRACT_AUX_CODE_CONSTRUCTOR_ENTRY_HPP_
+
+#include <contract/aux_/macro/code_/typename.hpp>
+#include <contract/aux_/macro/code_/precondition.hpp>
+#include <contract/aux_/call/constructor_entry.hpp>
+#include <contract/aux_/constructor_try_block_guard.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CODE_CONSTRUCTOR_ENTRY_COMMA_PARAM_NAME_( \
+ r, tpl, p) \
+ , CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME(p)
+
+#define CONTRACT_AUX_CODE_CONSTRUCTOR_ENTRY_COMMA_PRECONDITION_(id, tpl, k, f) \
+ , \
+ & CONTRACT_AUX_CODE_CLASS_TYPE :: \
+ CONTRACT_AUX_CODE_PRECONDITION_FUNC(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_TEMPLATE_INSTANCE( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS(f)))
+
+// PUBLIC //
+
+#define CONTRACT_AUX_CODE_CONSTRUCTOR_ENTRY(id, tpl, k, f) \
+ BOOST_PP_IIF(BOOST_PP_BITOR(CONTRACT_AUX_CONFIG_PRECONDITIONS_01, \
+ CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01), \
+ ( /* a pp-list to be used with constructor member initializers */ \
+ /* POLICY: constructor preconditions and static class */ \
+ /* invariants are checked using an artificial base class and */ \
+ /* the 1st initializer so the checks happen before executing */ \
+ /* other base and member initializers */ \
+ ::contract::aux::call_constructor_entry< \
+ CONTRACT_AUX_CODE_CLASS_TYPE \
+ >( \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_CONFIG_DEBUG_01, __FILE__) \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_CONFIG_DEBUG_01) \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_CONFIG_DEBUG_01, __LINE__) \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_CONFIG_DEBUG_01) \
+ CONTRACT_AUX_CODE_FUNC_TYPENAME(tpl, f) \
+ CONTRACT_AUX_CODE_SIGNATURE_TYPE(id, tpl, k, f)() \
+ BOOST_PP_LIST_FOR_EACH( \
+ CONTRACT_AUX_CODE_CONSTRUCTOR_ENTRY_COMMA_PARAM_NAME_, \
+ tpl, \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f))) \
+ /* call func to check this object (not all) pre, static inv */ \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01) \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01, \
+ & CONTRACT_AUX_CODE_CLASS_TYPE :: \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_STATIC_FUNC \
+ ) \
+ BOOST_PP_IIF(CONTRACT_AUX_CONFIG_PRECONDITIONS_01, \
+ CONTRACT_AUX_CODE_CONSTRUCTOR_ENTRY_COMMA_PRECONDITION_ \
+ , \
+ BOOST_PP_TUPLE_EAT(4) \
+ )(id, tpl, k, f) \
+ ) \
+ , \
+ BOOST_PP_NIL \
+ ) \
+ , \
+ BOOST_PP_NIL /* no constructor preconditions or invariants */\
+ )
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/exception_spec.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/exception_spec.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,34 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_EXCEPTION_SPEC_HPP_
+#define CONTRACT_AUX_CODE_EXCEPTION_SPEC_HPP_
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CODE_EXCEPTION_SPEC_COMMA_(r, unused, i, exception) \
+ BOOST_PP_COMMA_IF(i) \
+ BOOST_PP_ARRAY_ENUM(exception)
+
+#define CONTRACT_AUX_CODE_EXCEPTION_SPEC_(id, tpl, k, f) \
+ throw( \
+ /* exception list will be empty for no-throw specification */ \
+ BOOST_PP_LIST_FOR_EACH_I(CONTRACT_AUX_CODE_EXCEPTION_SPEC_COMMA_, ~, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_EXCEPTIONS(f)) \
+ )
+
+// PUBLIC //
+
+#define CONTRACT_AUX_CODE_EXCEPTION_SPEC(id, tpl, k, f) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_FUNC_TRAITS_HAS_EXCEPTION_SPEC(f), \
+ CONTRACT_AUX_CODE_EXCEPTION_SPEC_ \
+ , \
+ BOOST_PP_TUPLE_EAT(4) /* nothing if no specification */ \
+ )(id, tpl, k, f)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/final.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/final.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,96 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_FINAL_HPP_
+#define CONTRACT_AUX_CODE_FINAL_HPP_
+
+#include <contract/aux_/mpl_assert.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/or.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CODE_FINAL_CHECK_METAFUNC_(id) \
+ CONTRACT_AUX_SYMBOL( (has_final_function_tag)(id) )
+
+#define CONTRACT_AUX_CODE_FINAL_TAG_FUNC_(f) \
+ CONTRACT_AUX_SYMBOL( (CONTRACT_DETAIL_PP_FUNC_TRAITS_NAME(f)) \
+ (final_function_tag) )
+
+#define CONTRACT_AUX_CODE_FINAL_TAG_FUNC_PARAM_TYPE_ENUM_(r, default01, i, p) \
+ BOOST_PP_COMMA_IF(i) \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER(p) \
+ BOOST_PP_ARRAY_ENUM(CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_TYPE(p))
+
+#define CONTRACT_AUX_CODE_FINAL_TAG_FUNC_SIGNATURE_(f, name) \
+ /* NOTE: final functions decl this member func tag then overriding */ \
+ /* functions statically assert (using introspection) that none of their */ \
+ /* base functions have the final tag member func (i.e., they were final) */\
+ CONTRACT_AUX_CODE_RESULT_TYPE(f, 0 /* no empty result type */) \
+ name \
+ ( \
+ BOOST_PP_LIST_FOR_EACH_I( \
+ CONTRACT_AUX_CODE_FINAL_TAG_FUNC_PARAM_TYPE_ENUM_, ~, \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f))) \
+ ) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CONST(f) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_VOLATILE(f)
+
+#define CONTRACT_AUX_CODE_FINAL_TAG_DECL_(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_TEMPLATE_DECL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_IS_TEMPLATE(f), \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS(f))) \
+ CONTRACT_AUX_CODE_FINAL_TAG_FUNC_SIGNATURE_(f, \
+ CONTRACT_AUX_CODE_FINAL_TAG_FUNC_(f)) \
+ ; /* no tag func definition needed for SFINAE so `;` */
+
+#define CONTRACT_AUX_CODE_FINAL_CHECK_BASE_(r, n, id_f) \
+ CONTRACT_AUX_MPL_ASSERT_MSG( \
+ /* base == class || !has_final_function_tag<base::func> */ \
+ (::boost::mpl::or_< \
+ ::boost::is_same< \
+ CONTRACT_AUX_CODE_BASE_TYPE(n) \
+ , CONTRACT_AUX_CODE_CLASS_TYPE \
+ > \
+ , ::boost::mpl::not_< \
+ CONTRACT_AUX_CODE_FINAL_CHECK_METAFUNC_( \
+ BOOST_PP_TUPLE_ELEM(2, 0, id_f))< \
+ CONTRACT_AUX_CODE_FINAL_TAG_FUNC_SIGNATURE_( \
+ BOOST_PP_TUPLE_ELEM(2, 1, id_f), \
+ (CONTRACT_AUX_CODE_BASE_TYPE(n)::*) ) \
+ > \
+ > \
+ >::value) \
+ , BOOST_PP_SEQ_CAT( \
+ (ERROR_cannot_override_final_function_from_base_class_number_) \
+ (BOOST_PP_INC(n))(_at_line_)(BOOST_PP_TUPLE_ELEM(2, 0, id_f)) )\
+ , (types< CONTRACT_AUX_CODE_BASE_TYPE(n) >) \
+ ); /* MPL assert requires trailing `;` */
+
+// PUBLIC //
+
+#define CONTRACT_AUX_CODE_FINAL_TAG(id, tpl, k, f) \
+ BOOST_PP_IIF(BOOST_PP_IS_EMPTY(CONTRACT_DETAIL_PP_FUNC_TRAITS_FINAL(f)), \
+ BOOST_PP_TUPLE_EAT(4) \
+ , \
+ public: /* tag must be public to be accessed from intro metafunc */ \
+ CONTRACT_AUX_CODE_FINAL_TAG_DECL_ \
+ )(id, tpl, k, f) \
+ private: /* check introspection metafunc can be private */ \
+ CONTRACT_AUX_HAS_XXX_MEMBER_FUNCTION( \
+ CONTRACT_AUX_CODE_FINAL_CHECK_METAFUNC_(id), \
+ CONTRACT_AUX_CODE_FINAL_TAG_FUNC_(f)) \
+
+#define CONTRACT_AUX_CODE_FINAL_CHECK(id, tpl, k, f) \
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX, \
+ CONTRACT_AUX_CODE_FINAL_CHECK_BASE_, (id, f))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/func.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/func.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,583 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_FUNC_HPP_
+#define CONTRACT_AUX_CODE_FUNC_HPP_
+
+#include <contract/aux_/debug.hpp>
+#include <contract/aux_/call/nonstatic_member_function.hpp>
+#include <contract/aux_/call/static_member_function.hpp>
+#include <contract/aux_/call/free_function.hpp>
+#include <contract/aux_/call/constructor_exit.hpp>
+#include <contract/aux_/call/destructor.hpp>
+#include <contract/aux_/macro/code_/class_invariant_const.hpp>
+#include <contract/aux_/macro/code_/class_invariant_const_volatile.hpp>
+#include <contract/aux_/macro/code_/class_invariant_static.hpp>
+#include <contract/aux_/macro/code_/precondition.hpp>
+#include <contract/aux_/macro/code_/constructor_entry.hpp>
+#include <contract/aux_/macro/code_/body.hpp>
+#include <contract/aux_/macro/code_/override.hpp>
+#include <contract/aux_/macro/code_/final.hpp>
+#include <contract/aux_/macro/code_/new.hpp>
+#include <contract/aux_/macro/code_/result_type.hpp>
+#include <contract/aux_/config.hpp>
+#include <contract/aux_/concept_assert.hpp>
+#include <contract/aux_/preprocessor/func_kind.hpp>
+#include <contract/detail/preprocessor/traits/func.hpp> // f
+#include <contract/detail/preprocessor/traits/func_param.hpp> // p
+#include <contract/detail/preprocessor/keyword/contract/comma.hpp>
+#include <contract/detail/preprocessor/keyword/public.hpp>
+#include <boost/preprocessor/list/for_each_i.hpp>
+#include <boost/preprocessor/facilities/is_empty.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/logical/bitor.hpp>
+#include <boost/preprocessor/logical/bitand.hpp>
+#include <boost/preprocessor/logical/and.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/array/enum.hpp>
+#include <boost/preprocessor/array/size.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CODE_FUNC_DOUBLE_PAREN_CONCEPT_(r, unused, concept) \
+ ((concept))
+
+#define CONTRACT_AUX_CODE_FUNC_PARAM_DECL_ENUM_(r, default01, i, p) \
+ BOOST_PP_COMMA_IF(i) \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER(p) \
+ BOOST_PP_ARRAY_ENUM(CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_TYPE(p)) \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME(p) \
+ BOOST_PP_IIF(BOOST_PP_AND(default01, BOOST_PP_ARRAY_SIZE( \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_DEFAULT(p))), \
+ = BOOST_PP_ARRAY_ENUM \
+ , \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_DEFAULT(p))
+
+#define CONTRACT_AUX_CODE_FUNC_COMMA_PARAM_TYPE_(r, unused, p) \
+ , \
+ BOOST_PP_ARRAY_ENUM(CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_TYPE(p))
+
+#define CONTRACT_AUX_CODE_FUNC_COMMA_PARAM_NAME_(r, unused, p) \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME(p)
+
+#define CONTRACT_AUX_CODE_FUNC_PARAM_NAME_ENUM_(r, unused, i, p) \
+ BOOST_PP_COMMA_IF(i) \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME(p)
+
+// Precondition: !EMPTY(ACCESS(f)).
+#define CONTRACT_AUX_CODE_FUNC_CLASS_INVARIANT_PTR_(f, class_inv_func_ptr) \
+ BOOST_PP_IIF(BOOST_PP_COMPL(BOOST_PP_IS_EMPTY( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_FRIEND(f))), \
+ /* NOTE: friends are contracts as static members however they never */ \
+ /* check (static) class invariants (regardless of their declaration */ \
+ /* access level) because they are not actually members */ \
+ 0 /* null ptr to not check class inv */ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_PUBLIC_FRONT( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_ACCESS(f)), \
+ /* POLICY: only public func check class inv */ \
+ class_inv_func_ptr \
+ , \
+ 0 /* null ptr to not check class inv */ \
+ ))
+
+#define CONTRACT_AUX_CODE_FUNC_CONCEPT_ASSERT_(r, id, i, concept) \
+ /* can expand multiple of this macros on same line because of id */ \
+ CONTRACT_AUX_CONCEPT_ASSERT( (BOOST_PP_ARRAY_ENUM(concept)), \
+ /* pp-cat infix because Boost.ConceptCheck will cat it again */ \
+ CONTRACT_AUX_SYMBOL( (concept_check)(id)(i) ) \
+ ); /* `;` ends concept assertion */
+
+#define CONTRACT_AUX_CODE_FUNC_CONCEPTS_(id, tpl, k, f) \
+ /* NOTE: use CONCEPT_ASSERT instead of CONCEPT_REQUIRES because */ \
+ /* REQUIRES does not compile and/or gives multiple concept errors when */ \
+ /* used with fwd decl (fwd decl are necessary for the contracted func */ \
+ /* as impl by this lib) -- the main reason to use REQUIRES is to spec */ \
+ /* concepts in func decl instead of def but that is already achieved */ \
+ /* by this lib syntax and its `requires` "keyword" */ \
+ BOOST_PP_LIST_FOR_EACH_I(CONTRACT_AUX_CODE_FUNC_CONCEPT_ASSERT_, id, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CONCEPTS(f))
+
+#define CONTRACT_AUX_CODE_FUNC_VIRTUAL_SPECIFIERS_CHECK_(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_FINAL_CHECK(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_OVERRIDE_CHECK(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_NEW_CHECK(id, tpl, k, f)
+
+#define CONTRACT_AUX_CODE_FUNC_CONSTRUCTOR_TRY_BLOCK_ENABLE_(id, tpl, k, f) \
+ BOOST_PP_IIF(BOOST_PP_BITAND( \
+ BOOST_PP_BITOR(CONTRACT_AUX_CONFIG_PRECONDITIONS_01, \
+ CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01), \
+ BOOST_PP_LIST_IS_CONS(CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES(f))), \
+ ( /* a pp-list to be used with constructor member initializers */ \
+ /* no typename needed here (inits are always types) */ \
+ BOOST_IDENTITY_TYPE((::contract::aux::constructor_inits_eval< \
+ CONTRACT_AUX_CODE_CLASS_TYPE \
+ , ::contract::aux::constructor_inits_eval_try_block_set \
+ >))( \
+ /* enabled try-block to catch initializers exceptions */ \
+ ::contract::aux::constructor_try_block_guard< \
+ CONTRACT_AUX_CODE_CLASS_TYPE \
+ >::CONTRACT_AUX_SYMBOL((enable))() \
+ ) \
+ , \
+ BOOST_PP_NIL \
+ ) \
+ , \
+ BOOST_PP_NIL /* no constructor try-block */ \
+ )
+
+#define CONTRACT_AUX_CODE_FUNC_CONSTRUCTOR_CALL_CONTRACT_DEF_( \
+ id, tpl, k, f, body_func) \
+ { \
+ /* POLICY: Only constructor member initializers and body are */ \
+ /* within constructor-try-block (but no contract implementation */ \
+ /* code and assertions) so disable try-blocks here after */ \
+ /* constructor initializers have been executed (contract code will */ \
+ /* re-enable try-block while calling the body) */ \
+ ::contract::aux::constructor_try_block_guard< \
+ CONTRACT_AUX_CODE_CLASS_TYPE >:: \
+ CONTRACT_AUX_SYMBOL((disable))(); \
+ CONTRACT_AUX_CODE_FUNC_CONCEPTS_(id, tpl, k, f) \
+ ::contract::aux::call_constructor_exit< \
+ CONTRACT_AUX_CODE_FUNC_TYPENAME(tpl, f) \
+ CONTRACT_AUX_CODE_SIGNATURE_TYPE(id, tpl, k, f) \
+ >( \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_CONFIG_DEBUG_01, __FILE__) \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_CONFIG_DEBUG_01) \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_CONFIG_DEBUG_01, __LINE__) \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_CONFIG_DEBUG_01) \
+ CONTRACT_AUX_CODE_FUNC_PTR(id, tpl, k, f, body_func, \
+ CONTRACT_AUX_CODE_CLASS_TYPE) \
+ BOOST_PP_LIST_FOR_EACH( \
+ CONTRACT_AUX_CODE_FUNC_COMMA_PARAM_NAME_, ~, \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f))) \
+ , this \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01) \
+ BOOST_PP_IIF(CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01, \
+ BOOST_PP_SEQ_ENUM \
+ , \
+ BOOST_PP_TUPLE_EAT(1) \
+ )( \
+ ( CONTRACT_AUX_CODE_FUNC_CLASS_INVARIANT_PTR_(f, \
+ & CONTRACT_AUX_CODE_CLASS_TYPE :: \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_STATIC_FUNC) ) \
+ ( CONTRACT_AUX_CODE_FUNC_CLASS_INVARIANT_PTR_(f, \
+ & CONTRACT_AUX_CODE_CLASS_TYPE :: \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_FUNC) ) \
+ ) \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_CONFIG_POSTCONDITIONS_01) \
+ BOOST_PP_IIF(CONTRACT_AUX_CONFIG_POSTCONDITIONS_01, \
+ CONTRACT_AUX_CODE_FUNC_PTR \
+ , \
+ BOOST_PP_TUPLE_EAT(6) \
+ )(id, tpl, k, f, CONTRACT_AUX_CODE_OLDOF_FUNC(id, tpl, k, f), \
+ CONTRACT_AUX_CODE_CLASS_TYPE) \
+ ); \
+ }
+
+#define CONTRACT_AUX_CODE_FUNC_CONSTRUCTOR_CALL_BODY_DEF_( \
+ id, tpl, k, f, body_func) \
+ { \
+ /* LIMITATION: to handle member initializers (that are defined */ \
+ /* within the macros) within the constructor-try-block, the */ \
+ /* try-block also needs to be defined within the macros so */ \
+ /* constructor macros must expand to an extra function within the */ \
+ /* try-block that just calls the body even when contracts are all */ \
+ /* turned off (this adds a small run-time overhead for */ \
+ /* constructors with member initializers and function-try-blocks */ \
+ /* even when contracts are off), also needed for ctor named params */ \
+ /* NOTE: no need for try block disable here because no contracts */ \
+ (body_func /* outer paren to wrap eventual tparams */ \
+ CONTRACT_AUX_CODE_TEMPLATE_INSTANCE( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS(f))) \
+ ( /* arguments */ \
+ BOOST_PP_LIST_FOR_EACH_I( \
+ CONTRACT_AUX_CODE_FUNC_PARAM_NAME_ENUM_, ~, \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f))) \
+ )); \
+ }
+
+#define CONTRACT_AUX_CODE_FUNC_CONSTRUCTOR_CATCH_(r, unused, catch_traits) \
+ catch(CONTRACT_DETAIL_PP_CATCH_TRAITS_EXCEPTION_DECL(catch_traits)) { \
+ BOOST_PP_EXPR_IIF(BOOST_PP_BITOR(CONTRACT_AUX_CONFIG_PRECONDITIONS_01, \
+ BOOST_PP_BITOR(CONTRACT_AUX_CONFIG_POSTCONDITIONS_01, \
+ CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01)), \
+ if(!::contract::aux::constructor_try_block_guard< \
+ CONTRACT_AUX_CODE_CLASS_TYPE >:: \
+ CONTRACT_AUX_SYMBOL((enabled))()) \
+ /* POLICY: Contracts exec outside function-try-block */ \
+ /* (see N1962) so re-throw and don't allow try-bloc exec */ \
+ { throw; } \
+ ) \
+ CONTRACT_DETAIL_PP_CATCH_TRAITS_STATEMENTS(catch_traits) \
+ }
+
+#define CONTRACT_AUX_CODE_FUNC_CONSTRUCTOR_COMMA_INIT_(r, unused, i, init) \
+ BOOST_PP_COMMA_IF(i) \
+ BOOST_PP_ARRAY_ENUM(init)
+
+#define CONTRACT_AUX_CODE_FUNC_CONSTRUCTOR_INITS_(inits) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(inits), :) \
+ BOOST_PP_LIST_FOR_EACH_I(CONTRACT_AUX_CODE_FUNC_CONSTRUCTOR_COMMA_INIT_, \
+ ~, inits)
+
+#define CONTRACT_AUX_CODE_FUNC_CONSTRUCTOR_INIT_ARRAY_WRAP_(d, unused, init) \
+ /* wrap into 1-size array so can be used with user-specified inits */ \
+ /* (which are always wrapped in arrays to handle unwrapped commas) */ \
+ (1, (init))
+
+#define CONTRACT_AUX_CODE_FUNC_CONSTRUCTOR_DEF_(id, tpl, k, f, body_func) \
+ CONTRACT_AUX_CODE_FUNC_CONSTRUCTOR_DEF(id, tpl, k, f, body_func, \
+ BOOST_PP_NIL) \
+
+#define CONTRACT_AUX_CODE_FUNC_DESTRUCTOR_DEF_(id, tpl, k, f, body_func) \
+ { \
+ CONTRACT_AUX_CODE_FUNC_CONCEPTS_(id, tpl, k, f) \
+ ::contract::aux::call_destructor< \
+ CONTRACT_AUX_CODE_FUNC_TYPENAME(tpl, f) \
+ CONTRACT_AUX_CODE_SIGNATURE_TYPE(id, tpl, k, f) \
+ >( \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_CONFIG_DEBUG_01, __FILE__) \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_CONFIG_DEBUG_01) \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_CONFIG_DEBUG_01, __LINE__) \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_CONFIG_DEBUG_01) \
+ CONTRACT_AUX_CODE_FUNC_PTR(id, tpl, k, f, body_func, \
+ CONTRACT_AUX_CODE_CLASS_TYPE) \
+ , this \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01) \
+ BOOST_PP_IIF(CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01, \
+ BOOST_PP_SEQ_ENUM \
+ , \
+ BOOST_PP_TUPLE_EAT(1) \
+ )( \
+ ( CONTRACT_AUX_CODE_FUNC_CLASS_INVARIANT_PTR_(f, \
+ & CONTRACT_AUX_CODE_CLASS_TYPE :: \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_STATIC_FUNC) ) \
+ ( CONTRACT_AUX_CODE_FUNC_CLASS_INVARIANT_PTR_(f, \
+ & CONTRACT_AUX_CODE_CLASS_TYPE :: \
+ CONTRACT_AUX_CODE_CLASS_INVARIANT_CONST_FUNC) ) \
+ ( CONTRACT_AUX_CODE_FUNC_CLASS_INVARIANT_PTR_(f, \
+ & CONTRACT_AUX_CODE_CLASS_TYPE :: \
+ CONTRACT_AUX_CODE_SUBCONTRACTED_CLASS_INVARIANT_CONST_FUNC) )\
+ ) \
+ ); \
+ }
+
+#define CONTRACT_AUX_CODE_FUNC_STATIC_MEMBER_DEF_(id, tpl, k, f, body_func) \
+ { \
+ CONTRACT_AUX_CODE_FUNC_CONCEPTS_(id, tpl, k, f) \
+ return ::contract::aux::call_static_member_function< \
+ CONTRACT_AUX_CODE_FUNC_TYPENAME(tpl, f) \
+ CONTRACT_AUX_CODE_SIGNATURE_TYPE(id, tpl, k, f) \
+ >( \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_CONFIG_DEBUG_01, __FILE__) \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_CONFIG_DEBUG_01) \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_CONFIG_DEBUG_01, __LINE__) \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_CONFIG_DEBUG_01) \
+ CONTRACT_AUX_CODE_FUNC_PTR(id, tpl, k, f, body_func, \
+ CONTRACT_AUX_CODE_CLASS_TYPE) \
+ BOOST_PP_LIST_FOR_EACH( \
+ CONTRACT_AUX_CODE_FUNC_COMMA_PARAM_NAME_, ~, \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f))) \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01) \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01, \
+ CONTRACT_AUX_CODE_FUNC_CLASS_INVARIANT_PTR_(f, \
+ & CONTRACT_AUX_CODE_CLASS_TYPE :: \
+ CONTRACT_AUX_CODE_SUBCONTRACTED_CLASS_INVARIANT_STATIC_FUNC) \
+ ) \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_CONFIG_PRECONDITIONS_01) \
+ BOOST_PP_IIF(CONTRACT_AUX_CONFIG_PRECONDITIONS_01, \
+ CONTRACT_AUX_CODE_FUNC_PTR \
+ , \
+ BOOST_PP_TUPLE_EAT(6) \
+ )(id, tpl, k, f, CONTRACT_AUX_CODE_PRECONDITION_FUNC( \
+ id, tpl, k, f), CONTRACT_AUX_CODE_CLASS_TYPE) \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_CONFIG_POSTCONDITIONS_01) \
+ BOOST_PP_IIF(CONTRACT_AUX_CONFIG_POSTCONDITIONS_01, \
+ CONTRACT_AUX_CODE_FUNC_PTR \
+ , \
+ BOOST_PP_TUPLE_EAT(6) \
+ )(id, tpl, k, f, CONTRACT_AUX_CODE_OLDOF_FUNC(id, tpl, k, f), \
+ CONTRACT_AUX_CODE_CLASS_TYPE) \
+ ); \
+ }
+
+#define CONTRACT_AUX_CODE_FUNC_FREE_DEF_(id, tpl, k, f, body_func) \
+ { \
+ CONTRACT_AUX_CODE_FUNC_CONCEPTS_(id, tpl, k, f) \
+ return ::contract::aux::call_free_function< \
+ CONTRACT_AUX_CODE_FUNC_TYPENAME(tpl, f) \
+ CONTRACT_AUX_CODE_SIGNATURE_TYPE(id, tpl, k, f) \
+ >( \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_CONFIG_DEBUG_01, __FILE__) \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_CONFIG_DEBUG_01) \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_CONFIG_DEBUG_01, __LINE__) \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_CONFIG_DEBUG_01) \
+ CONTRACT_AUX_CODE_FUNC_PTR(id, tpl, k, f, body_func, \
+ CONTRACT_AUX_CODE_CLASS_TYPE) /*class type not used here*/ \
+ BOOST_PP_LIST_FOR_EACH( \
+ CONTRACT_AUX_CODE_FUNC_COMMA_PARAM_NAME_, ~, \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f))) \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_CONFIG_PRECONDITIONS_01) \
+ BOOST_PP_IIF(CONTRACT_AUX_CONFIG_PRECONDITIONS_01, \
+ CONTRACT_AUX_CODE_FUNC_PTR \
+ , \
+ BOOST_PP_TUPLE_EAT(6) \
+ )(id, tpl, k, f, CONTRACT_AUX_CODE_PRECONDITION_FUNC( \
+ id, tpl, k, f), CONTRACT_AUX_CODE_CLASS_TYPE) \
+ /* class type not used here (because free func */ \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_CONFIG_POSTCONDITIONS_01) \
+ BOOST_PP_IIF(CONTRACT_AUX_CONFIG_POSTCONDITIONS_01, \
+ CONTRACT_AUX_CODE_FUNC_PTR \
+ , \
+ BOOST_PP_TUPLE_EAT(6) \
+ )(id, tpl, k, f, CONTRACT_AUX_CODE_OLDOF_FUNC( \
+ id, tpl, k, f), CONTRACT_AUX_CODE_CLASS_TYPE) \
+ ); \
+ }
+
+#define CONTRACT_AUX_CODE_FUNC_NONSTATIC_MEMBER_DEF_(id, tpl, k, f, body_func) \
+ { \
+ CONTRACT_AUX_CODE_FUNC_CONCEPTS_(id, tpl, k, f) \
+ return ::contract::aux::call_nonstatic_member_function< \
+ CONTRACT_AUX_CODE_FUNC_TYPENAME(tpl, f) \
+ CONTRACT_AUX_CODE_SIGNATURE_TYPE(id, tpl, k, f) \
+ >( \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_CONFIG_DEBUG_01, __FILE__) \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_CONFIG_DEBUG_01) \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_CONFIG_DEBUG_01, __LINE__) \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_CONFIG_DEBUG_01) \
+ CONTRACT_AUX_CODE_FUNC_PTR(id, tpl, k, f, body_func, \
+ CONTRACT_AUX_CODE_CLASS_TYPE) \
+ BOOST_PP_LIST_FOR_EACH( \
+ CONTRACT_AUX_CODE_FUNC_COMMA_PARAM_NAME_, ~, \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f))) \
+ , this \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01) \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01, \
+ CONTRACT_AUX_CODE_FUNC_CLASS_INVARIANT_PTR_(f, \
+ & CONTRACT_AUX_CODE_CLASS_TYPE :: \
+ BOOST_PP_IIF(BOOST_PP_IS_EMPTY( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_VOLATILE(f)), \
+ CONTRACT_AUX_CODE_SUBCONTRACTED_CLASS_INVARIANT_CONST_FUNC \
+ , \
+ BOOST_PP_EXPR_IIF(tpl, template) \
+ CONTRACT_AUX_CODE_SUBCONTRACTED_CLASS_INVARIANT_CONST_VOLATILE_FUNC< \
+ void> /* unused tparam to delay compilation */ \
+ ) \
+ ) \
+ ) \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_CONFIG_PRECONDITIONS_01) \
+ BOOST_PP_IIF(CONTRACT_AUX_CONFIG_PRECONDITIONS_01, \
+ CONTRACT_AUX_CODE_FUNC_PTR \
+ , \
+ BOOST_PP_TUPLE_EAT(6) \
+ )(id, tpl, k, f, \
+ CONTRACT_AUX_CODE_SUBCONTRACTED_PRECONDITION_FUNC( \
+ id, tpl, k, f), \
+ CONTRACT_AUX_CODE_CLASS_TYPE) \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_CONFIG_POSTCONDITIONS_01) \
+ BOOST_PP_IIF(CONTRACT_AUX_CONFIG_POSTCONDITIONS_01, \
+ CONTRACT_AUX_CODE_FUNC_PTR \
+ , \
+ BOOST_PP_TUPLE_EAT(6) \
+ )(id, tpl, k, f, \
+ CONTRACT_AUX_CODE_SUBCONTRACTED_OLDOF_FUNC( \
+ id, tpl, k, f), \
+ CONTRACT_AUX_CODE_CLASS_TYPE) \
+ ); \
+ /* for tpl func virtual spec checks must be within this func def */ \
+ /* so they can access actual tparam instantiated types, however */ \
+ /* for non-tpl func this causes MSVC duplicate definition linker */ \
+ /* errors so... (continues below) */ \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_FUNC_TRAITS_IS_TEMPLATE(f), \
+ CONTRACT_AUX_CODE_FUNC_VIRTUAL_SPECIFIERS_CHECK_ \
+ , \
+ BOOST_PP_TUPLE_EAT(4) \
+ )(id, tpl, k, f) \
+ } \
+ /* (continued from above) ... for non-tpl func these virtual spec */ \
+ /* checks must appear outside the func def to avoid MSVC liker errors */ \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_FUNC_TRAITS_IS_TEMPLATE(f), \
+ BOOST_PP_TUPLE_EAT(4) \
+ , \
+ CONTRACT_AUX_CODE_FUNC_VIRTUAL_SPECIFIERS_CHECK_ \
+ )(id, tpl, k, f)
+
+// PUBLIC //
+
+// Used to access a function pointer eventually member and template (class_type
+// ignored if not a member function).
+// Expand to: `& [class_type::[template]] func_name [<tparam_name, ...>]`
+#define CONTRACT_AUX_CODE_FUNC_PTR(id, tpl, k, f, func_name, class_type) \
+ & /* get pointer to function */ \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_FUNC_KIND_IS_MEMBER(k, f), \
+ class_type :: \
+ ) \
+ BOOST_PP_EXPR_IIF( \
+ BOOST_PP_BITAND( \
+ tpl \
+ , BOOST_PP_BITAND( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_MEMBER(k, f) \
+ , BOOST_PP_LIST_IS_CONS( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS(f)))\
+ ) \
+ ), \
+ template \
+ ) \
+ func_name \
+ CONTRACT_AUX_CODE_TEMPLATE_INSTANCE( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS(f)))
+
+// Named params need to force body even if all contracts off.
+#define CONTRACT_AUX_CODE_FUNC_CONSTRUCTOR_DEF_FORCE( \
+ id, tpl, k, f, body_func, first_inits, force_body) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES(f)), \
+ try /* constructor-try-block within macros to handle initializers */ \
+ ) \
+ CONTRACT_AUX_CODE_FUNC_CONSTRUCTOR_INITS_( \
+ BOOST_PP_LIST_APPEND( \
+ BOOST_PP_LIST_TRANSFORM( \
+ CONTRACT_AUX_CODE_FUNC_CONSTRUCTOR_INIT_ARRAY_WRAP_, ~, \
+ first_inits) \
+ , BOOST_PP_LIST_APPEND( \
+ /* NOTE: order of this pp-list append follows inheritance order */ \
+ /* (and try-block must be enabled after constructor-entry) */ \
+ BOOST_PP_LIST_TRANSFORM( \
+ CONTRACT_AUX_CODE_FUNC_CONSTRUCTOR_INIT_ARRAY_WRAP_, ~,\
+ CONTRACT_AUX_CODE_CONSTRUCTOR_ENTRY(id, tpl, k, f)) \
+ , BOOST_PP_LIST_APPEND( \
+ BOOST_PP_LIST_TRANSFORM( \
+ CONTRACT_AUX_CODE_FUNC_CONSTRUCTOR_INIT_ARRAY_WRAP_, \
+ ~, \
+ CONTRACT_AUX_CODE_FUNC_CONSTRUCTOR_TRY_BLOCK_ENABLE_( \
+ id, tpl, k, f)) \
+ , CONTRACT_DETAIL_PP_FUNC_TRAITS_INITIALIZERS(f) \
+ ) \
+ ) \
+ ) \
+ ) \
+ BOOST_PP_IIF(BOOST_PP_BITOR(CONTRACT_AUX_CONFIG_PRECONDITIONS_01, \
+ BOOST_PP_BITOR(CONTRACT_AUX_CONFIG_POSTCONDITIONS_01, \
+ CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01)), \
+ /* constructor contracts */ \
+ CONTRACT_AUX_CODE_FUNC_CONSTRUCTOR_CALL_CONTRACT_DEF_ \
+ , BOOST_PP_IIF(force_body, \
+ /* no contracts but constructor try-blocks */ \
+ CONTRACT_AUX_CODE_FUNC_CONSTRUCTOR_CALL_BODY_DEF_ \
+ , \
+ /* no contract and no try-blocks (eventually just constructor inits */ \
+ BOOST_PP_TUPLE_EAT(5) \
+ ))(id, tpl, k, f, body_func) \
+ BOOST_PP_LIST_FOR_EACH(CONTRACT_AUX_CODE_FUNC_CONSTRUCTOR_CATCH_, ~, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES(f))
+
+#define CONTRACT_AUX_CODE_FUNC_CONSTRUCTOR_DEF( \
+ id, tpl, k, f, body_func, first_inits) \
+ CONTRACT_AUX_CODE_FUNC_CONSTRUCTOR_DEF_FORCE(id, tpl, k, f, body_func, \
+ first_inits, BOOST_PP_LIST_IS_CONS( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES(f)))
+
+#define CONTRACT_AUX_CODE_FUNC_NAMED_DECL(id, tpl, k, f, name, \
+ access_level01, force_friend01, explicit01, force_inline01, \
+ force_result_type01, param_defaults01) \
+ BOOST_PP_IIF(access_level01, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_ACCESS \
+ , \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(f) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_BITAND(access_level01, BOOST_PP_COMPL( \
+ BOOST_PP_IS_EMPTY(CONTRACT_DETAIL_PP_FUNC_TRAITS_ACCESS(f)))), \
+ : \
+ ) \
+ BOOST_PP_EXPR_IIF(force_friend01, friend) /* see also static below */ \
+ CONTRACT_AUX_CODE_TEMPLATE_DECL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_IS_TEMPLATE(f), \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS(f))) \
+ BOOST_PP_IIF(explicit01, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_EXPLICIT \
+ , \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(f) \
+ BOOST_PP_IIF(force_inline01, \
+ inline \
+ BOOST_PP_TUPLE_EAT(1) \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_INLINE \
+ )(f) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_EXTERN(f) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_STATIC(f) \
+ /* friends contracted as static members (unless forcing friendship) */ \
+ BOOST_PP_EXPR_IIF(BOOST_PP_BITAND(BOOST_PP_COMPL(force_friend01), \
+ BOOST_PP_COMPL(BOOST_PP_IS_EMPTY( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_FRIEND(f)))), \
+ static \
+ ) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_VIRTUAL(f) \
+ CONTRACT_AUX_CODE_RESULT_TYPE(f, BOOST_PP_COMPL(force_result_type01)) \
+ name \
+ ( \
+ BOOST_PP_LIST_FOR_EACH_I(CONTRACT_AUX_CODE_FUNC_PARAM_DECL_ENUM_, \
+ param_defaults01, \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f))) \
+ ) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CONST(f) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_VOLATILE(f)
+
+#define CONTRACT_AUX_CODE_FUNC_DECL(id, tpl, k, f, friend01, defaults01) \
+ CONTRACT_AUX_CODE_FUNC_NAMED_DECL( \
+ id, tpl, k, f \
+ , CONTRACT_AUX_CODE_NAME(CONTRACT_DETAIL_PP_FUNC_TRAITS_OPERATOR(f), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_NAME(f)) \
+ , 1 /* with access level */ \
+ , friend01 \
+ , 1 /* with explicit */ \
+ /* NOTE: force inline for free contracted func to avoid */ \
+ /* duplicate def compiler error (this is same behaviour as for */ \
+ /* member func automatically inlined when def in class decl, */ \
+ /* which is always the case for contracted func) */ \
+ , BOOST_PP_BITAND( \
+ BOOST_PP_COMPL(CONTRACT_AUX_PP_FUNC_KIND_IS_MEMBER(k, f)) \
+ , BOOST_PP_BITOR( \
+ CONTRACT_AUX_CONFIG_PRECONDITIONS_01 \
+ , CONTRACT_AUX_CONFIG_POSTCONDITIONS_01 \
+ ) \
+ ) \
+ , 0 /* no forced result type */ \
+ , defaults01 /* with param defaults */ \
+ )
+
+#define CONTRACT_AUX_CODE_FUNC_DEF(id, tpl, k, f, body_func) \
+ /* the order of the following if-statement matter */ \
+ BOOST_PP_IIF(CONTRACT_AUX_PP_FUNC_KIND_IS_CONSTRUCTOR(k), \
+ CONTRACT_AUX_CODE_FUNC_CONSTRUCTOR_DEF_ \
+ , BOOST_PP_IIF(CONTRACT_AUX_PP_FUNC_KIND_IS_DESTRUCTOR(k), \
+ CONTRACT_AUX_CODE_FUNC_DESTRUCTOR_DEF_ \
+ , BOOST_PP_IIF(CONTRACT_AUX_PP_FUNC_KIND_IS_STATIC_MEMBER_FUNCTION(k, f), \
+ /* friend members are also contracted as static members */ \
+ CONTRACT_AUX_CODE_FUNC_STATIC_MEMBER_DEF_ \
+ , BOOST_PP_IIF(CONTRACT_AUX_PP_FUNC_KIND_IS_NONSTATIC_MEMBER_FUNCTION( \
+ k, f), \
+ CONTRACT_AUX_CODE_FUNC_NONSTATIC_MEMBER_DEF_ \
+ , \
+ CONTRACT_AUX_CODE_FUNC_FREE_DEF_ \
+ ))))(id, tpl, k, f, body_func)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/loop_variant.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/loop_variant.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,88 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_LOOP_VARIANT_HPP_
+#define CONTRACT_AUX_CODE_LOOP_VARIANT_HPP_
+
+#include <contract/broken.hpp>
+#include <contract/aux_/symbol.hpp>
+#include <contract/aux_/call/globals.hpp>
+#include <contract/aux_/macro/code_/const_expr.hpp>
+#include <contract/detail/preprocessor/keyword/const.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CODE_LOOP_VARIANT_VAR_ \
+ /* NOTE: this name should not be made unique (using id, etc) so to */ \
+ /* give error is multiple loop variants used within same loop */ \
+ /* (only 1 loop invariant for loop because that's theoretically correct */ \
+ /* and because there is only 1 old loop variant variable) */ \
+ CONTRACT_AUX_SYMBOL( (loop_variant) )
+
+#define CONTRACT_AUX_CODE_LOOP_VARIANT_FUNC_(id) \
+ CONTRACT_AUX_SYMBOL( (loop_variant_func)(id) )
+
+#define CONTRACT_AUX_CODE_LOOP_VARIANT_CHECK_AND_UPDATE_(expr) \
+ try { \
+ ::contract::aux::call_globals<>::is_checking_contract = true; \
+ /* assert loop variant never negative (but can be zero) */ \
+ if(!(CONTRACT_AUX_CODE_LOOP_VARIANT_VAR_ >= 0)) \
+ throw ::contract::broken(__FILE__, __LINE__, \
+ BOOST_PP_STRINGIZE(expr) " >= 0 " \
+ " /* non-negative loop variant */"); \
+ /* assert either 1st iteration (old loop variant not initialized */ \
+ /* yet) or loop variant monotonically decreasing */ \
+ if(!( \
+ CONTRACT_AUX_CODE_LOOP_VARIANT_OLD_VAR.value == \
+ ::contract::aux::loop_variant::uninitialized \
+ || CONTRACT_AUX_CODE_LOOP_VARIANT_VAR_ < \
+ CONTRACT_AUX_CODE_LOOP_VARIANT_OLD_VAR.value \
+ )) throw ::contract::broken(__FILE__, __LINE__, \
+ BOOST_PP_STRINGIZE(expr) " < oldof " BOOST_PP_STRINGIZE(expr) \
+ " /* monotonically decreasing loop variant */"); \
+ ::contract::aux::call_globals<>::is_checking_contract = false; \
+ } catch(...) { \
+ ::contract::aux::call_globals<>::is_checking_contract = false; \
+ ::contract::loop_variant_broken(::contract::FROM_BODY); \
+ } \
+ /* update old loop variant with variant calc in this iteration */ \
+ CONTRACT_AUX_CODE_LOOP_VARIANT_OLD_VAR.value = \
+ CONTRACT_AUX_CODE_LOOP_VARIANT_VAR_;
+
+#define CONTRACT_AUX_CODE_LOOP_VARIANT_CONST_(id, tpl, const_expr) \
+ BOOST_PP_LIST_ENUM(CONTRACT_AUX_CODE_CONST_EXPR_TOKENS(id, tpl, \
+ ::contract::aux::loop_variant::value_type, \
+ CONTRACT_AUX_CODE_LOOP_VARIANT_FUNC_(id), const_expr)) \
+ ::contract::aux::loop_variant::value_type \
+ CONTRACT_AUX_CODE_LOOP_VARIANT_VAR_ = \
+ CONTRACT_AUX_CODE_LOOP_VARIANT_FUNC_(id)(); \
+ CONTRACT_AUX_CODE_LOOP_VARIANT_CHECK_AND_UPDATE_( \
+ CONTRACT_DETAIL_PP_CONST_EXPR_TRAITS_EXPR( \
+ CONTRACT_DETAIL_PP_CONST_EXPR_TRAITS(const_expr)))
+
+#define CONTRACT_AUX_CODE_LOOP_VARIANT_(id, tpl, expr) \
+ ::contract::aux::loop_variant::value_type \
+ CONTRACT_AUX_CODE_LOOP_VARIANT_VAR_ = expr; \
+ CONTRACT_AUX_CODE_LOOP_VARIANT_CHECK_AND_UPDATE_(expr)
+
+// PUBLIC //
+
+#define CONTRACT_AUX_CODE_LOOP_VARIANT_OLD_VAR \
+ CONTRACT_AUX_SYMBOL( (loop_variant_old) )
+
+#define CONTRACT_AUX_CODE_LOOP_VARIANT(id, tpl, expr) \
+ /* loop variant cannot be a compile-time static expression */ \
+ /* (metafunction) because it must dynamically decrease at run-time */ \
+ /* but const-expr allowed for variant expr */ \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_CONST_FRONT(expr), \
+ CONTRACT_AUX_CODE_LOOP_VARIANT_CONST_ \
+ , \
+ CONTRACT_AUX_CODE_LOOP_VARIANT_ \
+ )(id, tpl, expr)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/name.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/name.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,69 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_NAME_HPP_
+#define CONTRACT_AUX_CODE_NAME_HPP_
+
+#include <contract/aux_/symbol.hpp>
+#include <contract/detail/preprocessor/traits/func.hpp> // f
+
+// PRIVATE //
+
+// Precondition: name is alphanumeric (so not destructor name `~...`).
+#define CONTRACT_AUX_CODE_NAME_OPERATOR_(name) \
+ CONTRACT_AUX_SYMBOL( (operator)(name) )
+
+#define CONTRACT_AUX_CODE_NAME_OPERATOR_COMMA_(unused) \
+ , /* symbol for for `operator,` */
+
+// Precondition: SIZE(operator_tokens) > 0.
+#define CONTRACT_AUX_CODE_NAME_OPERATOR_SYMBOL_(operator_tokens, name) \
+ /* operator's name is always alphanumeric so IS_COMMA_FRONT can be used */ \
+ /* (name is not alphanumeric only for ~destructor, not an operator) */ \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_COMMA_FRONT(name), \
+ CONTRACT_AUX_CODE_NAME_OPERATOR_COMMA_ /* comma operator */ \
+ , \
+ BOOST_PP_ARRAY_ENUM /* operator symbol tokens */ \
+ )(operator_tokens)
+
+#define CONTRACT_AUX_CODE_NAME_(operator_tokens, name) \
+ name
+
+// PUBLIC //
+
+// Expand to either the function name `f` or to the operator symbolic name
+// `operator ==`, `operator ,`, `operator new`, `operator int*` etc.
+#define CONTRACT_AUX_CODE_NAME(operator_tokens, name) \
+ BOOST_PP_IF(BOOST_PP_ARRAY_SIZE(operator_tokens), \
+ operator CONTRACT_AUX_CODE_NAME_OPERATOR_SYMBOL_ \
+ , \
+ CONTRACT_AUX_CODE_NAME_ \
+ )(operator_tokens, name)
+
+#define CONTRACT_AUX_CODE_NAME_POSTFIXED(is_constructor01, is_destructor01, \
+ operator_tokens, name, postfix_seq) \
+ CONTRACT_AUX_SYMBOL( \
+ ( \
+ BOOST_PP_IIF(is_constructor01, \
+ /* contract_aux_... so user can use func named constructor */ \
+ CONTRACT_AUX_SYMBOL( (constructor) ) \
+ BOOST_PP_TUPLE_EAT(1) \
+ , BOOST_PP_IIF(is_destructor01, \
+ /* contract_aux_... so user can use func named destructor */ \
+ CONTRACT_AUX_SYMBOL( (destructor) ) \
+ BOOST_PP_TUPLE_EAT(1) \
+ , BOOST_PP_IF(BOOST_PP_ARRAY_SIZE(operator_tokens), \
+ CONTRACT_AUX_CODE_NAME_OPERATOR_ \
+ , \
+ BOOST_PP_TUPLE_REM(1) \
+ )))(name) \
+ ) \
+ postfix_seq \
+ )
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/named_params_/boost_.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/named_params_/boost_.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,148 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_HPP_
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_HPP_
+
+#include <contract/detail/preprocessor/keyword/contract/out.hpp>
+#include <contract/detail/preprocessor/keyword/contract/in.hpp>
+#include <contract/detail/preprocessor/keyword/contract/deduce.hpp>
+#include <contract/detail/preprocessor/keyword/contract/requires.hpp>
+#include <contract/detail/preprocessor/keyword/auto.hpp>
+
+// Utilities that only transform parameter traits into Boost.Parameter formats.
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_REQ_( \
+ d, p, required_params, optional_params) \
+ ( \
+ BOOST_PP_LIST_APPEND(required_params, ( \
+ ( /* Boost.Parameter required param is 2-tuple */ \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_CLASSIFIED_NAME(p) \
+ , \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_TYPE_REQUIREMENT(p) \
+ ) \
+ , BOOST_PP_NIL)) \
+ , \
+ optional_params \
+ )
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_OPT_( \
+ d, p, required_params, optional_params) \
+ ( \
+ required_params \
+ , \
+ BOOST_PP_LIST_APPEND(optional_params, ( \
+ ( /* Boost.Parameter optional param is 3-tuple */ \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_CLASSIFIED_NAME(p) \
+ , \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_TYPE_REQUIREMENT(p) \
+ , \
+ BOOST_PP_ARRAY_ENUM( \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_DEFAULT(p)) \
+ ) \
+ , BOOST_PP_NIL)) \
+ )
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_REQOPT_TUPLE_( \
+ d, required_optional, p) \
+ BOOST_PP_IF(BOOST_PP_ARRAY_SIZE( \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_DEFAULT(p)), \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_OPT_ \
+ , \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_REQ_ \
+ )(d, p \
+ , BOOST_PP_TUPLE_ELEM(2, 0, required_optional) \
+ , BOOST_PP_TUPLE_ELEM(2, 1, required_optional) \
+ )
+
+// PUBLIC //
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_REQOPT(params) \
+ BOOST_PP_LIST_FOLD_LEFT( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_REQOPT_TUPLE_, \
+ (BOOST_PP_NIL, BOOST_PP_NIL), params)
+
+// Expand to 1 iff `out` (not if `in out`).
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_IS_OUT_ONLY(p) \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_OUT_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_DEDUCE_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER(p) \
+ BOOST_PP_NIL /* handle possible EMPTY after removals */ \
+ ))
+
+// Expand to 1 iff `out` or `in out`.
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_IS_OUT_OR_INOUT(p) \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_OUT_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_IN_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_DEDUCE_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER(p) \
+ BOOST_PP_NIL /* handle possible EMPTY after removals */ \
+ )))
+
+// Precondition: classifier is `[deduce] out | in | in out` (i.e., named param).
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_CLASSIFIED_NAME(p) \
+ /* order of following checking is important */ \
+ BOOST_PP_IIF(CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_IS_OUT_ONLY(p), \
+ out \
+ , BOOST_PP_IIF( /* already checked not out-only, so in-out */ \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_IS_OUT_OR_INOUT(p), \
+ in_out \
+ , /* else, in-only */ \
+ BOOST_PP_TUPLE_REM(1) \
+ ))(CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME(p))
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_TYPE_REQUIREMENT(p) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_AUTO_FRONT( \
+ /* the following removal order is important */ \
+ CONTRACT_DETAIL_PP_KEYWORD_OUT_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_IN_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_DEDUCE_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER(p) \
+ BOOST_PP_NIL /* handle possible EMPTY after removals */ \
+ )))), \
+ * BOOST_PP_TUPLE_EAT(1) /* any type */ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_REQUIRES_FRONT( \
+ /* the following removal order is important */ \
+ CONTRACT_DETAIL_PP_KEYWORD_OUT_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_IN_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_DEDUCE_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER(p) \
+ BOOST_PP_NIL /* handle possible EMPTY after removals */ \
+ )))), \
+ * BOOST_PP_ARRAY_DATA /* matching type requirement */ \
+ , \
+ BOOST_PP_ARRAY_DATA /* exact type specified */ \
+ ))(CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_TYPE(p))
+
+// Tag.
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_TAG(params, p) \
+ BOOST_PP_IIF(BOOST_PP_IS_EMPTY( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_NAMESPACE(params)), \
+ CONTRACT_AUX_CONFIG_NAMED_PARAMETER_TAG_NAMESPACE_DEFAULT \
+ BOOST_PP_TUPLE_EAT(1) \
+ , \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_NAMESPACE \
+ )(params) \
+ :: \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME(p)
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_TEMPLATE_TAG(tparams, t) \
+ BOOST_PP_IIF(BOOST_PP_IS_EMPTY( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_NAMESPACE(tparams)), \
+ CONTRACT_AUX_CONFIG_NAMED_PARAMETER_TAG_NAMESPACE_DEFAULT \
+ BOOST_PP_TUPLE_EAT(1) \
+ , \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_NAMESPACE \
+ )(tparams) \
+ :: \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_NAME(t)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/named_params_/constructor.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/named_params_/constructor.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,494 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_HPP_
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_HPP_
+
+#include <contract/aux_/macro/parameter.hpp>
+#include <boost/parameter.hpp>
+
+// WARNING: Unfortunately, this file must use internal implementation details
+// (aux) of Boost.Parameter. This is done to work around Boost.Parameter
+// limitations in supporting constructors that (1) only allow to specify a
+// single base class taking all named parameters at once in the member
+// initializers, (2) it does not allow to specify the body (so making it not
+// possible to invoke the contracted function to implement contracts), and (3)
+// force the use of default values in the base constructor implementation away
+// from the actual constructor definition. All these issue are solved here
+// even if at the cost of having to use a macro to access the named parameters
+// within the member initializers (this is because of lack of delegating
+// constructors so parameters must be defined as pointers so they can have
+// null default values in the constructor declaration) but named parameters
+// are accessed as usual in preconditions, postconditions, and body.
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARGS_ \
+ /* NOTE: no ID here because it needs to be used by CONSTRUCTOR_ARG */ \
+ /* macro at different lines (this is OK because this is a func param */ \
+ /* so it is unique to the func scope) */ \
+ CONTRACT_AUX_SYMBOL( (named_params_args) )
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARG_(name) \
+ /* NOTE: no ID here because it needs to be used by CONSTRUCTOR_ARG */ \
+ /* macro at different lines (this is OK because this is a func param */ \
+ /* so it is unique to the func scope) */ \
+ CONTRACT_AUX_SYMBOL( (named_params_arg)(name) )
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_DEFAULT_(name) \
+ /* NOTE: no ID here because it needs to be used by CONSTRUCTOR_ARG */ \
+ /* macro at different lines (this is OK because this is a func param */ \
+ /* so it is unique to the func scope) */ \
+ CONTRACT_AUX_SYMBOL( (named_params_default)(name) )
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_PARAM_PRED_(p) \
+ typename ::boost::parameter::aux::unwrap_predicate< \
+ void CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_TYPE_REQUIREMENT(p) \
+ >::type
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_PARAM_( \
+ params, p, predicate01) \
+ ::boost::parameter:: \
+ BOOST_PP_IF(BOOST_PP_ARRAY_SIZE( \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_DEFAULT(p)), \
+ optional \
+ , \
+ required \
+ ) < \
+ /* param tag (possibly deduced) */ \
+ BOOST_PP_EXPR_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_DEDUCE_FRONT( \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER(p)), \
+ ::boost::parameter::deduced< \
+ ) \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_TAG(params, p) \
+ BOOST_PP_EXPR_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_DEDUCE_FRONT( \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER(p)), \
+ > \
+ ) \
+ /* param type predicate */ \
+ BOOST_PP_COMMA_IF(predicate01) \
+ BOOST_PP_IIF(predicate01, \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_PARAM_PRED_ \
+ , \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(p) \
+ >
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_PARAM_ENUM_( \
+ r, params, i, p) \
+ BOOST_PP_COMMA_IF(i) \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_PARAM_(params, p, \
+ 1 /* with type predicate */)
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARG_TPARAM_( \
+ unused0, n, unused1) /* unused so it can be used with ENUM, etc */ \
+ CONTRACT_AUX_SYMBOL( (NamedParamsArg)(n) )
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARG_QUALIFIED_TPARAM_( \
+ unused, n, arg_types) /* unused so it can be used with ENUM, etc */ \
+ BOOST_PP_EXPR_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_CONST_FRONT( \
+ BOOST_PP_SEQ_ELEM(n, arg_types)), \
+ const \
+ ) \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARG_TPARAM_(~, n, ~) \
+ /* don't qualify with reference here */
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARG_PARAM_( \
+ unused0, n, unused1) /* unused so it can be used with ENUM, etc */ \
+ CONTRACT_AUX_SYMBOL( (named_params_arg)(n) )
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARG_TPARAM_DECL_( \
+ z, n, default01) \
+ typename CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARG_TPARAM_(~, n, ~) \
+ BOOST_PP_EXPR_IIF(default01, = void)
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARG_PARAM_DECL_( \
+ z, n, arg_types) \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARG_QUALIFIED_TPARAM_(~, n, \
+ arg_types) \
+ & /* always by ref (plus const for in-only params) */ \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARG_PARAM_(~, n, ~)
+
+// Precondition: ARRAY_SIZE(DEFAULT(p)) > 0
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_DEFAULT_TYPE_(p) \
+ /* NOTE: the default parameter type must be deduced because it is not */ \
+ /* specified anywhere (the parameter type is generic and it is not */ \
+ /* matched to the default value type by Boost.Parameter unless the */ \
+ /* default value is actually needed so the parameter type cannot be */ \
+ /* used because it would force matching between default value and */ \
+ /* parameter type in cases where Boost.Parameter does not require it) */ \
+ BOOST_TYPEOF(BOOST_PP_ARRAY_ENUM( \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_DEFAULT(p)))
+
+// Precondition: ARRAY_SIZE(DEFAULT(p)) > 0
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_DEFAULT_PARAM_(p) \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_DEFAULT_TYPE_(p) \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_DEFAULT_( \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME(p)) \
+ = BOOST_PP_ARRAY_ENUM(CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_DEFAULT(p))
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_NODEFAULT_PARAM_(p) \
+ ::contract::aux::named_params::no_default \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_DEFAULT_( \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME(p)) \
+ = 0
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_COMMA_NAMED_PARAM_DECL_( \
+ r, params, p) \
+ /* NOTE: keywords and defaults are defined here so the CONSTRUCTOR_ARG */ \
+ /* macro can access them with a fixed name (can't use the user-defined */ \
+ /* ones because the tag namespace might not be default in which case */ \
+ /* the CONSTRUCTOR_ARG macro won't know what the tag namespace is */ \
+ /* plus the CONTRACT_ARG macro has no access to defaults with are */ \
+ /* in the function declaration traits) */ \
+ , ::boost::parameter::keyword< \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_TAG(params, p) \
+ > const& \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARG_( \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME(p)) \
+ = ::boost::parameter::keyword< \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_TAG(params, p) \
+ >::instance \
+ , BOOST_PP_IF(BOOST_PP_ARRAY_SIZE( \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_DEFAULT(p)), \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_DEFAULT_PARAM_ \
+ , \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_NODEFAULT_PARAM_ \
+ )(p)
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_OPEN_ELEM_ENUM_( \
+ r, params, i, p) \
+ BOOST_PP_COMMA_IF(i) \
+ ::boost::parameter::aux::item< \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_PARAM_(params, p, \
+ 0 /* no type predicate */) \
+ , CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARG_TPARAM_(~, i, ~) \
+ /* don't close `>` here (that's why this is called OPEN_ELEM)... */
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_CLOSE_ELEM_(z, n, unused) \
+ > /* ... `item<` are closed here (so they are nested into each other) */
+
+// Named parameter structs.
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_PARAMS_TPL_(id) \
+ CONTRACT_AUX_SYMBOL( (named_params_constructor_tpl)(id) ) \
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_PARAMS_TYPE_(id) \
+ CONTRACT_AUX_SYMBOL( (named_params_constructor)(id) )
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_PARAMS_BASE_( \
+ f, named_and_deduced_params) \
+ ::boost::parameter::parameters< \
+ BOOST_PP_LIST_FOR_EACH_I( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_PARAM_ENUM_, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f), \
+ named_and_deduced_params) \
+ >
+
+// Define Boost.Parameter structs to deduce and match params.
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_PARAMS_( \
+ id, tpl, k, f, named_and_deduced_params) \
+ template< \
+ /* make this dummy template so its def can always use typename */ \
+ typename CONTRACT_AUX_SYMBOL( (NamedParamsConstructorUnused)(id) ) \
+ > \
+ struct CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_PARAMS_TPL_(id) \
+ : CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_PARAMS_BASE_( \
+ f, named_and_deduced_params) \
+ { \
+ template< \
+ BOOST_PP_ENUM(BOOST_PP_LIST_SIZE(named_and_deduced_params), \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARG_TPARAM_DECL_,\
+ 1 /* with default */) \
+ > \
+ struct arg_list { \
+ typedef typename ::boost::mpl::first< \
+ typename ::boost::parameter::aux::make_arg_list< \
+ BOOST_PP_LIST_FOR_EACH_I( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_OPEN_ELEM_ENUM_, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f), \
+ named_and_deduced_params) \
+ BOOST_PP_REPEAT( \
+ BOOST_PP_LIST_SIZE(named_and_deduced_params), \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_CLOSE_ELEM_, \
+ ~) \
+ /* if named params, at leas one param so alway , below */ \
+ , typename \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_PARAMS_BASE_( \
+ f, named_and_deduced_params)::deduced_list \
+ , ::boost::parameter::aux::tag_keyword_arg \
+ >::type \
+ >::type type; \
+ }; \
+ }; \
+ typedef CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_PARAMS_TPL_(id)<int> \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_PARAMS_TYPE_(id);
+
+// Constructor overloads (in the future to make this header shorter, some of
+// this code could be moved into the boost_.hpp because it depends on macros
+// from boost_.hpp).
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_TPARAM_DECL_PAREN_( \
+ r, id_params_args, p) \
+ /* NOTE: tparam type trait in pp-seq `(typename tparam)` used to pass */ \
+ /* param type via a metafunction instead of tparam name (can't use */ \
+ /* `class` instead of `typename` because it would remove typename */ \
+ /* prefixing IDENTITY_TYPE, double typenames are not removed instead */ \
+ ( typename \
+ /* IDENTITY_TYPE wraps all tparam commas for metafunc below */ \
+ typename BOOST_IDENTITY_TYPE(( \
+ /* metafunc that finds param type in arg-list from its tag */ \
+ typename ::contract::aux::named_params::arg_type< \
+ /* argument list type */ \
+ typename \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_PARAMS_TYPE_( \
+ BOOST_PP_TUPLE_ELEM(3, 0, id_params_args)):: \
+ template arg_list< \
+ BOOST_PP_ENUM(BOOST_PP_SEQ_SIZE( \
+ BOOST_PP_TUPLE_ELEM(3, 2, id_params_args)), \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARG_QUALIFIED_TPARAM_, \
+ BOOST_PP_TUPLE_ELEM(3, 2, id_params_args)) \
+ >::type \
+ /* param tag type */ \
+ , CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_TAG( \
+ BOOST_PP_TUPLE_ELEM(3, 1, id_params_args), p) \
+ /* param default value type (only if optional) */ \
+ BOOST_PP_COMMA_IF(BOOST_PP_ARRAY_SIZE( \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_DEFAULT(p))) \
+ BOOST_PP_IF(BOOST_PP_ARRAY_SIZE( \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_DEFAULT(p)), \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_DEFAULT_TYPE_ \
+ , \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(p) \
+ >::type \
+ )) \
+ )
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_PARAM_DECL_PAREN_( \
+ r, unused, p) \
+ ( /* pp-seq parenthesis for func param name trait */ \
+ int /* param type not used in ctor def expansion so just use int */ \
+ /* use param value expr instead of just param name here (usually */ \
+ /* param name carries its value but for named params this expr */ \
+ /* carries the param value-- cannot use CONTRACT_CONSTRUCTOR_ARG */ \
+ /* macro because it has extra wrapping parenthesis around the */ \
+ /* expr that will confuse the pp-parser here) */ \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARG( \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME(p)) \
+ )
+
+// Generate constructor definition func traits (which uses ARG).
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_DEF_F_( \
+ id, f, named_and_deduced_params, arg_types) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS_REPLACE( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_REPLACE( \
+ f, \
+ template( \
+ BOOST_PP_LIST_FOR_EACH( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_TPARAM_DECL_PAREN_, \
+ (id, CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f), arg_types), \
+ named_and_deduced_params) \
+ ) \
+ ), /* new func params: (<param-name>_type) <param-name> */ \
+ ( \
+ BOOST_PP_LIST_FOR_EACH( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_PARAM_DECL_PAREN_, \
+ ~, named_and_deduced_params) \
+ ) \
+ )
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_(r, z, id, tpl, k, f, \
+ body_func, named_and_deduced_params, arg_types) \
+ /* NOTE: always use typename here because this is a func template */ \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_ACCESS(f) \
+ : /* construct is member so access never empty and `:` always present */ \
+ template< \
+ BOOST_PP_ENUM(BOOST_PP_SEQ_SIZE(arg_types), \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARG_TPARAM_DECL_, \
+ 0 /* without default */) \
+ > \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_NAME(f) ( \
+ BOOST_PP_ENUM(BOOST_PP_SEQ_SIZE(arg_types), \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARG_PARAM_DECL_, \
+ arg_types) \
+ /* no named params if no arguments so , always follows here */ \
+ , typename ::boost::parameter::aux::match< \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_PARAMS_TYPE_(id) \
+ , BOOST_PP_ENUM(BOOST_PP_SEQ_SIZE(arg_types), \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARG_TPARAM_, ~) \
+ >::type /* no actual param name (just used to resolve ctor call */ \
+ = CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_PARAMS_TYPE_(id)( \
+ /* default constructor */) \
+ , ::contract::aux::named_params::args< \
+ typename CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_PARAMS_TYPE_( \
+ id)::template arg_list< \
+ BOOST_PP_ENUM(BOOST_PP_SEQ_SIZE(arg_types), \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARG_QUALIFIED_TPARAM_, \
+ arg_types) \
+ >::type \
+ > CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARGS_ = 0 \
+ BOOST_PP_LIST_FOR_EACH( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_COMMA_NAMED_PARAM_DECL_,\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f), \
+ named_and_deduced_params) \
+ ) \
+ CONTRACT_AUX_CODE_FUNC_CONSTRUCTOR_DEF_FORCE( \
+ id \
+ , 1 /* always in a template */ \
+ , k \
+ , CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_DEF_F_(id, f, \
+ named_and_deduced_params, arg_types) \
+ , body_func \
+ , ( \
+ BOOST_IDENTITY_TYPE(( \
+ ::contract::aux::constructor_inits_eval< \
+ CONTRACT_AUX_CODE_CLASS_TYPE \
+ , ::contract::aux:: \
+ constructor_inits_eval_named_params_args_set \
+ > \
+ ))( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARGS_.set( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_PARAMS_TYPE_(id)\
+ (/* default constructor*/)( \
+ BOOST_PP_ENUM(BOOST_PP_SEQ_SIZE(arg_types), \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARG_PARAM_, \
+ ~) \
+ ) \
+ ) \
+ ) \
+ , \
+ BOOST_PP_NIL \
+ ) \
+ , 1 /* always force body (even if no contracts) for named args */ \
+ )
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_TUPLE_(r, \
+ z_arity_id_tpl_k_f_body_params_args, arg_types) \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_(r \
+ , BOOST_PP_TUPLE_ELEM(9, 0, z_arity_id_tpl_k_f_body_params_args) \
+ /* do not pass arity */ \
+ , BOOST_PP_TUPLE_ELEM(9, 2, z_arity_id_tpl_k_f_body_params_args) \
+ , BOOST_PP_TUPLE_ELEM(9, 3, z_arity_id_tpl_k_f_body_params_args) \
+ , BOOST_PP_TUPLE_ELEM(9, 4, z_arity_id_tpl_k_f_body_params_args) \
+ , BOOST_PP_TUPLE_ELEM(9, 5, z_arity_id_tpl_k_f_body_params_args) \
+ , BOOST_PP_TUPLE_ELEM(9, 6, z_arity_id_tpl_k_f_body_params_args) \
+ , BOOST_PP_TUPLE_ELEM(9, 7, z_arity_id_tpl_k_f_body_params_args) \
+ /* do not pass args (i.e., arg_types_combinations) */ \
+ , arg_types \
+ )
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARG_TYPES_(r, arg_types) \
+ /* wraps arg types within pp-seq parenthesis so to make */ \
+ /* FOR_EACH_PRODUCT expand into another pp-seq */ \
+ ( arg_types )
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARITY_(z, arity, \
+ id_tpl_k_f_body_params_args) \
+ /* need outer FOR_EACH to pass data (because FOR_EACH_PRODUCT does not */ \
+ /* relay any data) */ \
+ BOOST_PP_SEQ_FOR_EACH( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_TUPLE_, \
+ (z, arity, BOOST_PP_TUPLE_REM(7) id_tpl_k_f_body_params_args),\
+ BOOST_PP_SEQ_FOR_EACH_PRODUCT( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARG_TYPES_, \
+ BOOST_PP_SEQ_FIRST_N(arity, BOOST_PP_TUPLE_ELEM(7, 6, \
+ id_tpl_k_f_body_params_args))))
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_PARAM_HAS_DEFAULT_( \
+ d, unused, p) \
+ BOOST_PP_BOOL(BOOST_PP_ARRAY_SIZE( \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_DEFAULT(p)))
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_OVERLOADS_(id, tpl, k, f, \
+ body_func, named_and_deduced_params, arg_types_combinations) \
+ BOOST_PP_REPEAT_FROM_TO( \
+ BOOST_PP_SUB(BOOST_PP_LIST_SIZE(named_and_deduced_params), \
+ /* count defaults (it could be 0) */ \
+ BOOST_PP_LIST_SIZE(BOOST_PP_LIST_FILTER( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_PARAM_HAS_DEFAULT_, \
+ ~, named_and_deduced_params))), \
+ /* INC to always include all params case in iterator */ \
+ BOOST_PP_INC(BOOST_PP_LIST_SIZE(named_and_deduced_params)), \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARITY_, \
+ (id, tpl, k, f, body_func, named_and_deduced_params, \
+ arg_types_combinations))
+
+// All combinations of constructor template parameters to handle the generic
+// named parameters (there combine the const/no-const to handle in/out/in-out).
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_COMBINATIONS_ARG_( \
+ r, unused, p) \
+ ( ( /* tuple seq w/ special format used by Boost.Parameter combinations */ \
+ /* Boost.Parameter uses [deduced_]required, [deduced_]optional here */ \
+ BOOST_PP_IF(BOOST_PP_ARRAY_SIZE( \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_DEFAULT(p)), \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_DEDUCE_FRONT( \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER(p)), \
+ deduced_optional \
+ , \
+ optional \
+ ) \
+ , \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_DEDUCE_FRONT( \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER(p)), \
+ deduced_required \
+ , \
+ required \
+ ) \
+ ) \
+ , \
+ /* named qualified with optional out() or in_out() */ \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_CLASSIFIED_NAME(p) \
+ , \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_TYPE_REQUIREMENT(p) \
+ , \
+ ~ /* Boost.Parameter uses no default value for constructor */ \
+ ) )
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARG_TYPES_COMBINATIONS_( \
+ named_and_deduced_params) \
+ /* re-use Boost.Parameter algorithm to cal seq of tparam combinations */ \
+ BOOST_PARAMETER_FUNCTION_FWD_COMBINATIONS( \
+ BOOST_PP_LIST_FOR_EACH( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_COMBINATIONS_ARG_, \
+ ~, named_and_deduced_params))
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ALL_PARAMS_( \
+ id, tpl, k, f, body_func, named_and_deduced_params) \
+ /* structs to deduce and match params */ \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_PARAMS_(id, tpl, k, f, \
+ named_and_deduced_params) \
+ /* actual constructor function definitions */ \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_OVERLOADS_(id, tpl, k, f, \
+ body_func, named_and_deduced_params, \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARG_TYPES_COMBINATIONS_(\
+ named_and_deduced_params))
+
+// PUBLIC //
+
+// Public because used to implement the CONSTRUCTOR_ARG macro.
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARG(name) \
+ /* don't wrap this expr within parenthesis at this level because it is */ \
+ /* used by other internal macros (you can program another ARG macro to */ \
+ /* wrap this in extra parenthesis) */ \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARGS_.get()[ \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARG_(name) \
+ | CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_DEFAULT_(name) \
+ ]
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR(id, tpl, k, f, body_func) \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ALL_PARAMS_( \
+ id, tpl, k, f, body_func, \
+ BOOST_PP_LIST_APPEND( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_NAMED( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f)), \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_DEDUCED( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f))))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/named_params_/contracted.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/named_params_/contracted.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,169 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_HPP_
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_HPP_
+
+// PRIVATE //
+
+// Contracted function traits.
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_DECL_TYPE_(p) \
+ /* IMPORTANT: always by ref (also to support for in-out and out) */ \
+ /* however never add const because const is automatically added */ \
+ /* by Boost.Parameter overloads in order to distinguish in and out */ \
+ BOOST_PP_EXPR_IIF( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_IS_OUT_OR_INOUT(p), \
+ typename ::boost::add_reference< \
+ ) \
+ CONTRACT_AUX_PARAMETER_BOOST_TYPE( \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME(p)) \
+ BOOST_PP_EXPR_IIF( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_IS_OUT_OR_INOUT(p), \
+ >::type \
+ )
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_TPARAM_DECL_PAREN_( \
+ r, unused, p) \
+ ( typename CONTRACT_AUX_PARAMETER_BOOST_TYPE( \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME(p)) )
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_PAREN_(r, unused, elem) \
+ ( elem )
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_PARAM_DECL_PAREN_( \
+ r, unused, p) \
+ ( ( CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_DECL_TYPE_(p) ) \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME(p) )
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_CONCEPTS_REPLACE_(f, \
+ concepts_sign) \
+ BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAM_CONCEPTS(f)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CONCEPTS_REPLACE \
+ , \
+ f BOOST_PP_TUPLE_EAT(2) \
+ )(f, concepts_sign)
+
+// Generate contracted func signature (which only uses positional params).
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_F_( \
+ k, f, named_and_deduced_params) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS_REPLACE( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_NAME_REPLACE( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_CONCEPTS_REPLACE_( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_REPLACE( \
+ f, /* new template params: Boost.Parameter's <param-name>_type */ \
+ template( \
+ BOOST_PP_LIST_FOR_EACH( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_TPARAM_DECL_PAREN_, \
+ ~, named_and_deduced_params) \
+ ) \
+ ), /* new concepts: parameter concepts (if any specified by user) */ \
+ requires( \
+ BOOST_PP_LIST_FOR_EACH( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_PAREN_, \
+ ~, CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAM_CONCEPTS(f)) \
+ ) \
+ ), /* new name (contracted function) */ \
+ ( CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_FUNC(k, f) ) \
+ ), /* new func params: (<param-name>_type) <param-name> */ \
+ ( \
+ BOOST_PP_LIST_FOR_EACH( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_PARAM_DECL_PAREN_, \
+ ~, named_and_deduced_params) \
+ ) \
+ )
+
+// Contracted body function declaration.
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_BODY_TPARAM_DECL_ENUM_( \
+ r, unused, i, p) \
+ BOOST_PP_COMMA_IF(i) \
+ typename CONTRACT_AUX_PARAMETER_BOOST_TYPE( \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME(p))
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_BODY_PARAM_DECL_ENUM_( \
+ r, unused, i, p) \
+ BOOST_PP_COMMA_IF(i) \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_DECL_TYPE_(p) \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME(p)
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_BODY_DECL_( \
+ id, tpl, k, f, body_func, named_and_deduced_params) \
+ template< \
+ BOOST_PP_LIST_FOR_EACH_I( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_BODY_TPARAM_DECL_ENUM_, \
+ ~, named_and_deduced_params) \
+ > \
+ CONTRACT_AUX_CODE_RESULT_TYPE(f, 1) /* allows empty result type */ \
+ /* keep original body func name (not contractedXnameXbody) so user can */ \
+ /* separate definition with usual BODY macro */ \
+ body_func ( \
+ BOOST_PP_LIST_FOR_EACH_I( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_BODY_PARAM_DECL_ENUM_, \
+ ~, named_and_deduced_params) \
+ ) \
+ /* POLICY: Exception spec only apply to exceptions thrown by the body */ \
+ /* and not to exceptions thrown by contract handlers (if they are */ \
+ /* redefined to throw) or by this library implementation code */ \
+ CONTRACT_AUX_CODE_EXCEPTION_SPEC(id, tpl, k, f)
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_FUNC_(k, f) \
+ CONTRACT_AUX_SYMBOL( (contracted)(CONTRACT_DETAIL_PP_FUNC_TRAITS_NAME(f)) )
+
+// PUBLIC //
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_FUNC(k, f) \
+ /* constructor, non-static member, static member with enabled */ \
+ /* contracts (destructors have no param so no named params) */ \
+ BOOST_PP_IIF( \
+ BOOST_PP_BITAND( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_MEMBER(k, f) \
+ , BOOST_PP_BITOR( \
+ CONTRACT_AUX_CONFIG_PRECONDITIONS_01 \
+ , BOOST_PP_BITOR( \
+ CONTRACT_AUX_CONFIG_POSTCONDITIONS_01 \
+ , CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01 \
+ ) \
+ ) \
+ ), \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_FUNC_ \
+ , BOOST_PP_IIF( /* free function with enabled contracts */ \
+ BOOST_PP_BITAND( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_FREE_FUNCTION(k, f) \
+ , BOOST_PP_BITOR( \
+ CONTRACT_AUX_CONFIG_PRECONDITIONS_01 \
+ , CONTRACT_AUX_CONFIG_POSTCONDITIONS_01 \
+ ) \
+ ), \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_FUNC_ \
+ , \
+ /* use body name here so contracted function impl by body func */ \
+ /* when no contracts but still BODY can be used to defer func def */ \
+ CONTRACT_AUX_FUNCTION_BODY_FUNC \
+ ))(k, f)
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_F(k, f) \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_F_(k, f, \
+ BOOST_PP_LIST_APPEND( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_NAMED( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f)), \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_DEDUCED( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f))))
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_BODY_DECL( \
+ id, tpl, k, f, body_func) \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_BODY_DECL_( \
+ id, tpl, k, f, body_func, \
+ BOOST_PP_LIST_APPEND( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_NAMED( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f)), \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_DEDUCED( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f))))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/named_params_/function.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/named_params_/function.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,149 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_NAMED_PARAMS_FUNCTION_HPP_
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_FUNCTION_HPP_
+
+#include <contract/aux_/macro/code_/named_params_/boost_.hpp>
+#include <boost/parameter.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_FUNCTION_TPARAM_NAME_ENUM_( \
+ r, unused, i, p) \
+ BOOST_PP_COMMA_IF(i) \
+ /* here (but only here) we must use Boost.Parameter convention that */ \
+ /* postfix ..._type (even if that would generate a reserved symbol */ \
+ /* for a param name ending with _) */ \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME(p), _type)
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_FUNCTION_PARAM_NAME_ENUM_( \
+ r, unused, i, p) \
+ BOOST_PP_COMMA_IF(i) \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME(p)
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_FUNCTION_DEF_( \
+ id, tpl, k, f, named_and_deduced_params) \
+ { \
+ return CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_FUNC(k, f)< \
+ BOOST_PP_LIST_FOR_EACH_I( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_FUNCTION_TPARAM_NAME_ENUM_, \
+ ~, named_and_deduced_params) \
+ >( \
+ BOOST_PP_LIST_FOR_EACH_I( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_FUNCTION_PARAM_NAME_ENUM_, \
+ ~, named_and_deduced_params) \
+ ); \
+ }
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_FUNCTION_ELEM_(r, unused, elem) \
+ elem
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_FUNCTION_(id, tpl, k, f, \
+ named_required_boost_params, named_optional_boost_params, \
+ deduced_required_boost_params, deduced_optional_boost_params) \
+ BOOST_PP_IIF(BOOST_PP_COMPL(CONTRACT_AUX_PP_FUNC_KIND_IS_MEMBER(k, f)), \
+ BOOST_PARAMETER_FUNCTION \
+ , BOOST_PP_IIF(BOOST_PP_COMPL(BOOST_PP_IS_EMPTY( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CONST(f))), \
+ BOOST_PARAMETER_CONST_MEMBER_FUNCTION \
+ , \
+ BOOST_PARAMETER_MEMBER_FUNCTION \
+ ))( \
+ ( /* paren wrap result type commas in Boost.Parameter */ \
+ /* this should always have result type but still checking size */ \
+ CONTRACT_AUX_CODE_RESULT_TYPE(f, 1 /* allows empty result type */) \
+ ), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_STATIC(f) \
+ /* `func`, `operator==`, etc */ \
+ CONTRACT_AUX_CODE_NAME(CONTRACT_DETAIL_PP_FUNC_TRAITS_OPERATOR(f), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_NAME(f)) \
+ , \
+ BOOST_PP_IIF(BOOST_PP_IS_EMPTY( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_NAMESPACE( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f))), \
+ CONTRACT_AUX_CONFIG_NAMED_PARAMETER_TAG_NAMESPACE_DEFAULT \
+ BOOST_PP_TUPLE_EAT(1) \
+ , \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_NAMESPACE \
+ )(CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f)) \
+ , \
+ /* (induced) named params `(required ...) (optinal ...)` */ \
+ BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(named_required_boost_params), \
+ (required \
+ BOOST_PP_LIST_FOR_EACH( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_FUNCTION_ELEM_, \
+ ~, named_required_boost_params) \
+ ) \
+ ) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(named_optional_boost_params), \
+ (optional \
+ BOOST_PP_LIST_FOR_EACH( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_FUNCTION_ELEM_, \
+ ~, named_optional_boost_params) \
+ ) \
+ ) \
+ /* deduced named params `(deduced (required ...) (optional ...) )` */ \
+ BOOST_PP_LPAREN_IF(BOOST_PP_LIST_IS_CONS(BOOST_PP_LIST_APPEND( \
+ deduced_required_boost_params, \
+ deduced_optional_boost_params))) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(BOOST_PP_LIST_APPEND( \
+ deduced_required_boost_params, \
+ deduced_optional_boost_params)), \
+ deduced \
+ ) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS( \
+ deduced_required_boost_params), \
+ (required \
+ BOOST_PP_LIST_FOR_EACH( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_FUNCTION_ELEM_, \
+ ~, deduced_required_boost_params) \
+ ) \
+ ) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS( \
+ deduced_optional_boost_params), \
+ (optional \
+ BOOST_PP_LIST_FOR_EACH( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_FUNCTION_ELEM_, \
+ ~, deduced_optional_boost_params) \
+ ) \
+ ) \
+ BOOST_PP_RPAREN_IF(BOOST_PP_LIST_IS_CONS(BOOST_PP_LIST_APPEND( \
+ deduced_required_boost_params, \
+ deduced_optional_boost_params))) \
+ ) \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_FUNCTION_DEF_(id, tpl, k, f, \
+ /* these are all named-and-deduced params in their original */ \
+ /* param traits format (while the other ..._boost_params in */ \
+ /* this function are in Boost.Parameter format) */ \
+ BOOST_PP_LIST_APPEND( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_NAMED( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f)), \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_DEDUCED( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f))))
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_FUNCTION_TUPLE_(id, tpl, k, f, \
+ namedreq_namedopt, deducedreq_deducedopt) \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_FUNCTION_(id, tpl, k, f, \
+ BOOST_PP_TUPLE_ELEM(2, 0, namedreq_namedopt), \
+ BOOST_PP_TUPLE_ELEM(2, 1, namedreq_namedopt), \
+ BOOST_PP_TUPLE_ELEM(2, 0, deducedreq_deducedopt), \
+ BOOST_PP_TUPLE_ELEM(2, 1, deducedreq_deducedopt))
+
+// PUBLIC //
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_FUNCTION(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_FUNCTION_TUPLE_(id, tpl, k, f, \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_REQOPT( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_NAMED( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f))), \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_REQOPT( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_DEDUCED( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f))))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/named_params_class_template.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/named_params_class_template.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,169 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_HPP_
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_HPP_
+
+#include <boost/preprocessor/comparison/greater_equal.hpp>
+#include <boost/parameter.hpp>
+
+// PRIVATE //
+
+// Arg template param.
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_ARG_( \
+ unused0, n, unused1) /* unused so it can be used with ENUM, etc */ \
+ CONTRACT_AUX_SYMBOL( (NamedTParamsArg)(n) )
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_ARG_DECL_ENUM_( \
+ r, arity_minus_defaults, i, t) \
+ BOOST_PP_COMMA_IF(i) \
+ typename CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_ARG_(~, i, ~) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_GREATER_EQUAL(i, arity_minus_defaults), \
+ = ::boost::parameter::void_ \
+ )
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_ARG_DECL_PAREN_( \
+ z, unused, i, t) \
+ ( typename CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_ARG_(~, i, ~) )
+
+// Args template param.
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_ARGS_ \
+ CONTRACT_AUX_SYMBOL( (NamedTParamsArgs) )
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_PARAM_ENUM_( \
+ r, tparams, i, t) \
+ BOOST_PP_COMMA_IF(i) \
+ BOOST_PP_IF(BOOST_PP_ARRAY_SIZE( \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_DEFAULT(t)), \
+ ::boost::parameter::optional< \
+ , \
+ ::boost::parameter::required< \
+ ) \
+ /* tag (possibly deduced) */ \
+ BOOST_PP_EXPR_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_DEDUCE_FRONT( \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND(t)), \
+ ::boost::parameter::deduced< \
+ ) \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_TEMPLATE_TAG(tparams, t) \
+ BOOST_PP_EXPR_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_DEDUCE_FRONT( \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND(t)), \
+ > \
+ ) \
+ /* NOTE: type requirement (if there is any type requirement then it */ \
+ /* must be a matching type requirement for a type template */ \
+ /* parameter because no exact type requirement applies to a type */ \
+ /* template parameter and only template parameters are supported so */ \
+ /* no need to check if KIND ends in `requires` in this case) */ \
+ BOOST_PP_COMMA_IF(BOOST_PP_ARRAY_SIZE( \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_REQUIREMENT(t))) \
+ BOOST_PP_IF(BOOST_PP_ARRAY_SIZE( \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_REQUIREMENT(t)), \
+ BOOST_PP_ARRAY_ENUM \
+ , \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_REQUIREMENT(t)) \
+ >
+
+// Original template params.
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_COMMA_TPARAM_DECL_( \
+ r, tparams, t) \
+ , typename CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_NAME(t) = typename \
+ ::boost::parameter::value_type< \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_ARGS_ \
+ , CONTRACT_AUX_CODE_NAMED_PARAMS_BOOST_TEMPLATE_TAG(tparams, t) \
+ BOOST_PP_COMMA_IF(BOOST_PP_ARRAY_SIZE( \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_DEFAULT(t))) \
+ BOOST_PP_IF(BOOST_PP_ARRAY_SIZE( \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_DEFAULT(t)), \
+ BOOST_PP_ARRAY_ENUM \
+ , \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_DEFAULT(t)) \
+ >::type
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_COMMA_TPARAM_DECL_PAREN_(\
+ r, unused, t) \
+ ( typename CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_NAME(t) )
+
+// Template declaration.
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_HAS_DEFAULT_( \
+ d, unused, t) \
+ BOOST_PP_BOOL(BOOST_PP_ARRAY_SIZE( \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_DEFAULT(t)))
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_DEFAULT_COUNT_( \
+ named_and_deduced_tparams) \
+ BOOST_PP_LIST_SIZE(BOOST_PP_LIST_FILTER( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_HAS_DEFAULT_,\
+ ~, named_and_deduced_tparams))
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_DECL_( \
+ template01, tparams, named_and_deduced_tparams) \
+ /* open template<...> (even if no tparams for specializations) */ \
+ BOOST_PP_EXPR_IIF(template01, template< ) \
+ /* Arg */ \
+ BOOST_PP_LIST_FOR_EACH_I( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_ARG_DECL_ENUM_, \
+ BOOST_PP_SUB(BOOST_PP_LIST_SIZE(named_and_deduced_tparams), \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_DEFAULT_COUNT_( \
+ named_and_deduced_tparams)), \
+ named_and_deduced_tparams) \
+ /* Args */ \
+ , typename CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_ARGS_ = \
+ typename ::boost::parameter::parameters< \
+ BOOST_PP_LIST_FOR_EACH_I( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_PARAM_ENUM_, \
+ tparams, named_and_deduced_tparams) \
+ >::bind< \
+ BOOST_PP_ENUM(BOOST_PP_LIST_SIZE(named_and_deduced_tparams), \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_ARG_, ~) \
+ >::type \
+ /* original template params */ \
+ BOOST_PP_LIST_FOR_EACH( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_COMMA_TPARAM_DECL_, \
+ tparams, named_and_deduced_tparams) \
+ /* close template<...> */ \
+ BOOST_PP_EXPR_IIF(template01, > )
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_POSITIONAL_C_(c, \
+ named_and_deduced_tparams) \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_REPLACE( \
+ c, /* new template params: without named/deduced syntax */ \
+ template( \
+ BOOST_PP_LIST_FOR_EACH_I( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_ARG_DECL_PAREN_, \
+ ~, named_and_deduced_tparams) \
+ ( typename CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_ARGS_ ) \
+ BOOST_PP_LIST_FOR_EACH( \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_COMMA_TPARAM_DECL_PAREN_, \
+ ~, named_and_deduced_tparams) \
+ ) \
+ )
+
+// PUBLIC //
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_DECL( \
+ template01, tparams) \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_DECL_(template01, tparams, \
+ BOOST_PP_LIST_APPEND( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_NAMED(tparams), \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_DEDUCED(tparams)))
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_POSITIONAL_C(c) \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CLASS_TEMPLATE_POSITIONAL_C_(c, \
+ BOOST_PP_LIST_APPEND( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_NAMED( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_PARAMS(c)), \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_DEDUCED( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_PARAMS(c))))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/named_params_func.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/named_params_func.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,66 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_NAMED_PARAMS_FUNC_HPP_
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_FUNC_HPP_
+
+#include <contract/aux_/macro/code_/named_params_/function.hpp>
+#include <contract/aux_/macro/code_/named_params_/constructor.hpp>
+#include <contract/aux_/macro/code_/named_params_/contracted.hpp>
+#include <boost/preprocessor/punctuation/paren_if.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_FUNC_FREE_( \
+ id, tpl, k, f, contracted_f, body_func) \
+ CONTRACT_AUX_FUNCTION_POSITIONAL_PARAMS( \
+ id, tpl, k, contracted_f, body_func) ; /* forward declaration */ \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_FUNCTION(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_BODY_DECL( \
+ id, tpl, k, f, body_func) \
+ /* user's function definition { ... } (and try-blocks) follows here */
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_FUNC_MEMBER_( \
+ id, tpl, k, f, contracted_f, body_func) \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_FUNCTION(id, tpl, k, f) \
+ CONTRACT_AUX_FUNCTION_POSITIONAL_PARAMS( \
+ id, tpl, k, contracted_f, body_func) \
+ /* user's function definition { ... } (and try-blocks) follows here */
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_FUNC_CONSTRUCTOR_( \
+ id, tpl, k, f, contracted_f, body_func) \
+ CONTRACT_AUX_FUNCTION_POSITIONAL_PARAMS_CONTRACT( \
+ id, tpl, k, contracted_f, body_func) \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR( \
+ id, tpl, k, f, body_func) \
+ CONTRACT_AUX_FUNCTION_POSITIONAL_PARAMS_BODY_DECL_FORCE( \
+ id, tpl, k, contracted_f, body_func, 1 /* named force body */) \
+ /* user's function definition { ... } (and try-blocks) follows here */
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_FUNC_( \
+ id, tpl, k, f, contracted_f, body_func) \
+ /* destructors have no parameters so we'll never get here */ \
+ BOOST_PP_IIF(CONTRACT_AUX_PP_FUNC_KIND_IS_CONSTRUCTOR(k), \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_FUNC_CONSTRUCTOR_ \
+ , BOOST_PP_IIF(CONTRACT_AUX_PP_FUNC_KIND_IS_MEMBER(k, f), \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_FUNC_MEMBER_ \
+ , \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_FUNC_FREE_ \
+ ))(id, tpl, k, f, contracted_f, body_func)
+
+
+// PUBLIC //
+
+#define CONTRACT_AUX_CODE_NAMED_PARAMS_FUNC(id, tpl, k, f, body_func) \
+ /* NOTE: even if named params are always impl using templates, tpl */ \
+ /* should not be forced to 1 here because tpl indicates if the */ \
+ /* enclosing scope and not the impl is type-dependent */ \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_FUNC_(id, tpl /* keep tpl */, k, f, \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_CONTRACTED_F(k, f), body_func)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/new.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/new.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,51 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_NEW_HPP_
+#define CONTRACT_AUX_CODE_NEW_HPP_
+
+#include <contract/aux_/mpl_assert.hpp>
+#include <contract/aux_/macro/code_/virtual.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/or.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CODE_NEW_CHECK_BASE_(r, n, id_f) \
+ CONTRACT_AUX_MPL_ASSERT_MSG( \
+ /* base == class && !has_virtual_function_tag<base::func> */ \
+ (::boost::mpl::or_< \
+ ::boost::is_same< \
+ CONTRACT_AUX_CODE_BASE_TYPE(n) \
+ , CONTRACT_AUX_CODE_CLASS_TYPE \
+ > \
+ , ::boost::mpl::not_< CONTRACT_AUX_CODE_HAS_VIRTUAL( \
+ BOOST_PP_TUPLE_ELEM(2, 0, id_f), BOOST_PP_TUPLE_ELEM(2, 1, \
+ id_f), CONTRACT_AUX_CODE_BASE_TYPE(n)) > \
+ >::value) \
+ , BOOST_PP_SEQ_CAT( \
+ (ERROR_matching_virtual_function_already_declared_by_base_class_number_) \
+ (BOOST_PP_INC(n))(_at_line_)(BOOST_PP_TUPLE_ELEM(2, 0, id_f))) \
+ , (types< CONTRACT_AUX_CODE_BASE_TYPE(n) >) \
+ ); /* MPL assert requires trailing `;` */
+
+#define CONTRACT_AUX_CODE_NEW_CHECK_(id, tpl, k, f) \
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX, \
+ CONTRACT_AUX_CODE_NEW_CHECK_BASE_, (id, f)) \
+
+// PUBLIC //
+
+#define CONTRACT_AUX_CODE_NEW_CHECK(id, tpl, k, f) \
+ BOOST_PP_IIF(BOOST_PP_IS_EMPTY(CONTRACT_DETAIL_PP_FUNC_TRAITS_NEW(f)),\
+ BOOST_PP_TUPLE_EAT(4) \
+ , \
+ CONTRACT_AUX_CODE_NEW_CHECK_ \
+ )(id, tpl, k, f)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/oldof.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/oldof.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,294 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_OLDOF_HPP_
+#define CONTRACT_AUX_CODE_OLDOF_HPP_
+
+#include <contract/aux_/bind_old.hpp>
+#include <contract/aux_/subcontract/oldof.hpp>
+#include <contract/aux_/macro/code_/oldof_type.hpp>
+#include <contract/aux_/macro/code_/postcondition.hpp>
+#include <contract/detail/preprocessor/traits/func.hpp> // f
+#include <contract/detail/preprocessor/traits/func_param.hpp> // p
+#include <contract/detail/preprocessor/traits/oldof.hpp> // o
+#include <boost/function.hpp>
+#include <list>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CODE_OLDOF_COMMA_PARAM_DECL_(r, tpl_f, p) \
+ , \
+ CONTRACT_AUX_CODE_FUNC_TYPENAME(BOOST_PP_TUPLE_ELEM(2, 0, tpl_f), \
+ BOOST_PP_TUPLE_ELEM(2, 1, tpl_f)) \
+ ::contract::aux::arg_const< \
+ BOOST_PP_ARRAY_ENUM(CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_TYPE(p)) \
+ >::type \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME(p)
+
+#define CONTRACT_AUX_CODE_OLDOF_COMMA_PARAM_NAME_(r, unused, p) \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME(p)
+
+#define CONTRACT_AUX_CODE_OLDOF_COMMA_TYPE_(r, tpl_f, i, o) \
+ , \
+ CONTRACT_AUX_CODE_OLDOF_TYPE(CONTRACT_AUX_CODE_FUNC_TYPENAME01 tpl_f, o, i)
+
+#define CONTRACT_AUX_CODE_NOOLD_COMMA_TYPE_(z, n, unused) \
+ , \
+ ::contract::aux::void_old
+
+#define CONTRACT_AUX_CODE_OLDOF_COMMA_EXPR_(r, unused, o) \
+ , \
+ CONTRACT_DETAIL_PP_OLDOF_TRAITS_EXPR(o)
+
+#define CONTRACT_AUX_CODE_OLDOF_AUTO_TYPEOF_TYPEDEFS_YES_(r, tpl_f, i, o) \
+ typedef \
+ CONTRACT_AUX_CODE_OLDOF_DEDUCE_AUTO_TYPE( \
+ CONTRACT_AUX_CODE_FUNC_TYPENAME01 tpl_f, o, i) \
+ CONTRACT_AUX_CODE_OLDOF_TYPE(CONTRACT_AUX_CODE_FUNC_TYPENAME01 tpl_f, \
+ o, i) \
+ ;
+
+#define CONTRACT_AUX_CODE_OLDOF_AUTO_TYPEOF_TYPEDEFS_(r, tpl_f, i, o) \
+ BOOST_PP_IF(BOOST_PP_ARRAY_SIZE(CONTRACT_DETAIL_PP_OLDOF_TRAITS_TYPE(o)), \
+ BOOST_PP_TUPLE_EAT(4) /* explicit old-of type (no `auto`) */ \
+ , \
+ CONTRACT_AUX_CODE_OLDOF_AUTO_TYPEOF_TYPEDEFS_YES_ \
+ )(r, tpl_f, i, o)
+
+// Expand to nothing if old-of type is not `auto`, otherwise deduce types.
+#define CONTRACT_AUX_CODE_OLDOF_AUTO_TYPEOF_(id, tpl, k, f) \
+ BOOST_PP_LIST_FOR_EACH_I(CONTRACT_AUX_CODE_OLDOF_AUTO_TYPEOF_TYPEDEFS_, \
+ (tpl, f), CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITION_OLDOFS(f))
+
+#define CONTRACT_AUX_CODE_OLDOF_PARAM_OBJ_ \
+ CONTRACT_AUX_SYMBOL( (obj) )
+
+#define CONTRACT_AUX_CODE_OLDOF_PARAMS_DECL_(id, tpl, k, f, oldof_auto_types) \
+ ( \
+ /* function_type for a dummy param used to resolve overloading */ \
+ /* (because pre add const to args and obj so it might have same */ \
+ /* signature as of overloaded func with const arg and obj) */ \
+ /* not named so it cannot be used by mistake */ \
+ CONTRACT_AUX_CODE_FUNC_TYPENAME(tpl, f) \
+ CONTRACT_AUX_CODE_SIGNATURE_TYPE(id, tpl, k, f)::body_type \
+ /* constructor have static old-of but non-static post so this is */ \
+ /* not accessible from static old-of but obj needs to be passed */ \
+ /* as a func param so it can be bound to post func */ \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_PP_FUNC_KIND_IS_CONSTRUCTOR(k)) \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_FUNC_KIND_IS_CONSTRUCTOR(k), \
+ CONTRACT_AUX_CODE_CLASS_TYPE const* const \
+ CONTRACT_AUX_CODE_OLDOF_PARAM_OBJ_ \
+ ) \
+ /* params and objects are provided because some of the old-of */ \
+ /* expr can depend on them (but they must be used as const) */ \
+ /* all params are const (and ref) for const-correctness */ \
+ BOOST_PP_LIST_FOR_EACH( \
+ CONTRACT_AUX_CODE_OLDOF_COMMA_PARAM_DECL_, (tpl, f), \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f))) \
+ ) \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_FUNC_KIND_IS_NONSTATIC_MEMBER_FUNCTION( \
+ k, f), \
+ const /* const obj for const-correctness (unless static) */ \
+ ) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_VOLATILE(f)
+
+#define CONTRACT_AUX_CODE_OLDOF_(id, tpl, k, f, oldof_auto_types) \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_FUNC_KIND_IS_MEMBER(k, f), private:) \
+ CONTRACT_AUX_CODE_TEMPLATE_DECL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_IS_TEMPLATE(f), \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS(f))) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_COMPL( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_NONSTATIC_MEMBER_FUNCTION(k, f)), \
+ /* POLICY: static also for constructor because no obj yet exists */ \
+ /* when evaluating old-of expr becore ctor body execution */ \
+ static \
+ ) \
+ CONTRACT_AUX_CODE_FUNC_TYPENAME(tpl, f) \
+ CONTRACT_AUX_CODE_SIGNATURE_TYPE(id, tpl, k, f) :: \
+ bound_postcondition_type \
+ CONTRACT_AUX_CODE_OLDOF_FUNC(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_OLDOF_PARAMS_DECL_(id, tpl, k, f, oldof_auto_types) \
+ { \
+ CONTRACT_AUX_CODE_OLDOF_AUTO_TYPEOF_(id, tpl, k, f) \
+ return ::contract::aux::bind_old< \
+ CONTRACT_AUX_CODE_FUNC_TYPENAME(tpl, f) \
+ CONTRACT_AUX_CODE_SIGNATURE_TYPE(id, tpl, k, f) :: \
+ body_type \
+ BOOST_PP_LIST_FOR_EACH_I(CONTRACT_AUX_CODE_OLDOF_COMMA_TYPE_, \
+ (tpl, f), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITION_OLDOFS(f)) \
+ BOOST_PP_REPEAT(BOOST_PP_SUB(CONTRACT_CONFIG_OLDOF_MAX, \
+ BOOST_PP_LIST_SIZE( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITION_OLDOFS( \
+ f))), \
+ CONTRACT_AUX_CODE_NOOLD_COMMA_TYPE_, ~) \
+ >( \
+ /* post function to bind */ \
+ & /* func ptr */ \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_FUNC_KIND_IS_MEMBER(k, f), \
+ CONTRACT_AUX_CODE_CLASS_TYPE :: \
+ ) \
+ BOOST_PP_EXPR_IIF( \
+ /* post is a func tpl ptr iif oldof_auto_types != nil */ \
+ /* or func template then use template prefix only */ \
+ /* for members in type-dependent context */ \
+ BOOST_PP_BITAND( \
+ tpl \
+ , BOOST_PP_BITAND( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_MEMBER(k, f) \
+ , BOOST_PP_BITOR( \
+ BOOST_PP_LIST_IS_CONS(oldof_auto_types) \
+ , CONTRACT_DETAIL_PP_FUNC_TRAITS_IS_TEMPLATE(f)\
+ ) \
+ ) \
+ ), \
+ template \
+ ) \
+ CONTRACT_AUX_CODE_POSTCONDITION_FUNC(id, tpl, k, f) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_BITOR( \
+ BOOST_PP_LIST_IS_CONS(oldof_auto_types), \
+ BOOST_PP_LIST_IS_CONS( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS( \
+ f)))), \
+ < \
+ ) \
+ BOOST_PP_LIST_ENUM(oldof_auto_types) \
+ BOOST_PP_COMMA_IF(BOOST_PP_BITAND( \
+ BOOST_PP_LIST_IS_CONS(oldof_auto_types), \
+ BOOST_PP_LIST_IS_CONS( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS(\
+ f))))) \
+ CONTRACT_AUX_CODE_TEMPLATE_PARAM_NAME_ENUM( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS(f))) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_BITOR( \
+ BOOST_PP_LIST_IS_CONS(oldof_auto_types), \
+ BOOST_PP_LIST_IS_CONS( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS( \
+ f)))), \
+ > \
+ ) \
+ /* object (only for non-static member and ctor) */ \
+ BOOST_PP_COMMA_IF( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_NONSTATIC_MEMBER_FUNCTION( \
+ k, f)) \
+ BOOST_PP_EXPR_IIF( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_NONSTATIC_MEMBER_FUNCTION( \
+ k, f), \
+ this \
+ ) \
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_PP_FUNC_KIND_IS_CONSTRUCTOR(k)) \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_FUNC_KIND_IS_CONSTRUCTOR(k), \
+ /* constructor old-of are static (because no obj exist yet) */ \
+ /* but constructor post are not static (because obj exist) */ \
+ /* so special param (not this) is used to bind obj to post */ \
+ CONTRACT_AUX_CODE_OLDOF_PARAM_OBJ_ \
+ ) \
+ /* old values */ \
+ BOOST_PP_LIST_FOR_EACH(CONTRACT_AUX_CODE_OLDOF_COMMA_EXPR_, ~, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITION_OLDOFS(f)) \
+ ); \
+ }
+
+#define CONTRACT_AUX_CODE_SUBCONTRACTED_OLDOF_COMMA_BASE_( \
+ z, n, id_tpl_k_f) \
+ , dynamic_cast< \
+ CONTRACT_AUX_CODE_SUBCONTRACTED_BASE_TYPE( \
+ BOOST_PP_TUPLE_ELEM(4, 0, id_tpl_k_f), n) \
+ const \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_VOLATILE( \
+ BOOST_PP_TUPLE_ELEM(4, 3, id_tpl_k_f)) \
+ * const \
+ >(this) \
+ /* call function to bind all (base, base's base, etc) oldofs */ \
+ , CONTRACT_AUX_CODE_FUNC_PTR( \
+ BOOST_PP_TUPLE_ELEM(4, 0, id_tpl_k_f) \
+ , BOOST_PP_TUPLE_ELEM(4, 1, id_tpl_k_f) \
+ , BOOST_PP_TUPLE_ELEM(4, 2, id_tpl_k_f) \
+ , BOOST_PP_TUPLE_ELEM(4, 3, id_tpl_k_f) \
+ , BOOST_PP_EXPAND(CONTRACT_AUX_CODE_SUBCONTRACTED_OLDOF_FUNC \
+ id_tpl_k_f) \
+ , CONTRACT_AUX_CODE_SUBCONTRACTED_BASE_TYPE( \
+ BOOST_PP_TUPLE_ELEM(4, 0, id_tpl_k_f), n) \
+ )
+
+#define CONTRACT_AUX_CODE_SUBCONTRACTED_OLDOF_RESULT_TYPE_(id, tpl, k, f) \
+ ::std::list< \
+ CONTRACT_AUX_CODE_FUNC_TYPENAME(tpl, f) \
+ CONTRACT_AUX_CODE_SIGNATURE_TYPE(id, tpl, k, f) :: \
+ bound_postcondition_type \
+ >
+
+#define CONTRACT_AUX_CODE_SUBCONTRACTED_OLDOF_(id, tpl, k, f) \
+ public: /* must be public for subcontracting */ \
+ CONTRACT_AUX_CODE_TEMPLATE_DECL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_IS_TEMPLATE(f), \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS(f))) \
+ CONTRACT_AUX_CODE_SUBCONTRACTED_OLDOF_RESULT_TYPE_(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_SUBCONTRACTED_OLDOF_FUNC(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_OLDOF_PARAMS_DECL_(id, tpl, k, f, oldof_auto_types) \
+ { \
+ return ::contract::aux::subcontract_oldof< \
+ CONTRACT_AUX_CODE_FUNC_TYPENAME(tpl, f) \
+ CONTRACT_AUX_CODE_SIGNATURE_TYPE(id, tpl, k, f) \
+ >( \
+ this \
+ , CONTRACT_AUX_CODE_FUNC_PTR(id, tpl, k, f, \
+ CONTRACT_AUX_CODE_OLDOF_FUNC(id, tpl, k, f), \
+ CONTRACT_AUX_CODE_CLASS_TYPE) \
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX, \
+ CONTRACT_AUX_CODE_SUBCONTRACTED_OLDOF_COMMA_BASE_, \
+ (id, tpl, k, f)) \
+ BOOST_PP_LIST_FOR_EACH( \
+ CONTRACT_AUX_CODE_OLDOF_COMMA_PARAM_NAME_, ~, \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f))) \
+ ); \
+ }
+
+// PUBLIC //
+
+#define CONTRACT_AUX_CODE_OLDOF_FUNC(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_NAME_POSTFIXED( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_CONSTRUCTOR(k), \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_DESTRUCTOR(k), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_OPERATOR(f), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_NAME(f), \
+ (oldof))
+
+#define CONTRACT_AUX_CODE_SUBCONTRACTED_OLDOF_FUNC(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_NAME_POSTFIXED( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_CONSTRUCTOR(k), \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_DESTRUCTOR(k), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_OPERATOR(f), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_NAME(f), \
+ (subcontracted_oldof))
+
+#define CONTRACT_AUX_CODE_OLDOF(id, tpl, k, f) \
+ BOOST_PP_IIF(CONTRACT_AUX_PP_FUNC_KIND_IS_DESTRUCTOR(k), \
+ BOOST_PP_TUPLE_EAT(5) \
+ , \
+ CONTRACT_AUX_CODE_OLDOF_ \
+ )(id, tpl, k, f, CONTRACT_AUX_CODE_OLDOF_AUTO_TYPES( \
+ CONTRACT_AUX_CODE_FUNC_TYPENAME01(tpl, f), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITION_OLDOFS(f))) \
+ BOOST_PP_IIF(CONTRACT_AUX_PP_FUNC_KIND_IS_NONSTATIC_MEMBER_FUNCTION(k, f), \
+ CONTRACT_AUX_CODE_SUBCONTRACTED_OLDOF_ \
+ , \
+ /* ctor and dtor subcontract via base-class creation rules */ \
+ BOOST_PP_TUPLE_EAT(4) \
+ )(id, tpl, k, f)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/oldof_type.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/oldof_type.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,75 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_OLDOF_TYPE_HPP_
+#define CONTRACT_AUX_CODE_OLDOF_TYPE_HPP_
+
+#include <contract/aux_/oldof.hpp>
+#include <contract/detail/preprocessor/traits/oldof.hpp> // o
+#include <boost/typeof/typeof.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CODE_OLDOF_AUTO_TYPE_(index) \
+ CONTRACT_AUX_SYMBOL( (Old) (index) )
+
+#define CONTRACT_AUX_CODE_OLDOF_AUTO_TYPES_APPEND_(index, autotypes) \
+ BOOST_PP_LIST_APPEND(autotypes, \
+ (CONTRACT_AUX_CODE_OLDOF_AUTO_TYPE_(index), BOOST_PP_NIL))
+
+#define CONTRACT_AUX_CODE_OLDOF_AUTO_TYPES_IDENTITY_(index, autotypes) \
+ autotypes
+
+#define CONTRACT_AUX_CODE_OLDOF_AUTO_TYPES_(d, index_autotypes, o) \
+ ( \
+ BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(2, 0, index_autotypes)) \
+ , \
+ BOOST_PP_IF(BOOST_PP_ARRAY_SIZE( \
+ CONTRACT_DETAIL_PP_OLDOF_TRAITS_TYPE(o)), \
+ CONTRACT_AUX_CODE_OLDOF_AUTO_TYPES_IDENTITY_ \
+ , \
+ CONTRACT_AUX_CODE_OLDOF_AUTO_TYPES_APPEND_ \
+ )(BOOST_PP_TUPLE_ELEM(2, 0, index_autotypes), \
+ BOOST_PP_TUPLE_ELEM(2, 1, index_autotypes)) \
+ )
+
+#define CONTRACT_AUX_CODE_OLDOF_TYPE_AUTO_(typename01, o, index) \
+ /* just type name here, aux::oldof already applied to typeof deduction */ \
+ CONTRACT_AUX_CODE_OLDOF_AUTO_TYPE_(index)
+
+#define CONTRACT_AUX_CODE_OLDOF_TYPE_SPECIFIED_(typename01, o, index) \
+ BOOST_PP_EXPR_IIF(typename01, typename) \
+ ::contract::aux::oldof< \
+ BOOST_PP_ARRAY_ENUM(CONTRACT_DETAIL_PP_OLDOF_TRAITS_TYPE(o)) \
+ >::type
+
+// PUBLIC //
+
+#define CONTRACT_AUX_CODE_OLDOF_TYPE(typename01, o, index) \
+ BOOST_PP_IF(BOOST_PP_ARRAY_SIZE(CONTRACT_DETAIL_PP_OLDOF_TRAITS_TYPE(o)), \
+ CONTRACT_AUX_CODE_OLDOF_TYPE_SPECIFIED_ \
+ , \
+ CONTRACT_AUX_CODE_OLDOF_TYPE_AUTO_ \
+ )(typename01, o, index)
+
+#define CONTRACT_AUX_CODE_OLDOF_DEDUCE_AUTO_TYPE(typename01, o, index) \
+ BOOST_PP_EXPR_IIF(typename01, typename) \
+ ::contract::aux::oldof< \
+ BOOST_PP_IIF(typename01, \
+ /* dependent type context Boost.Typeof (no typename needed) */ \
+ BOOST_TYPEOF_TPL \
+ , \
+ BOOST_TYPEOF \
+ )(CONTRACT_DETAIL_PP_OLDOF_TRAITS_EXPR(o)) \
+ >::type
+
+#define CONTRACT_AUX_CODE_OLDOF_AUTO_TYPES(typename01, oldofs) \
+ BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_LIST_FOLD_LEFT( \
+ CONTRACT_AUX_CODE_OLDOF_AUTO_TYPES_, (0, BOOST_PP_NIL), oldofs))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/override.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/override.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,56 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_OVERRIDE_HPP_
+#define CONTRACT_AUX_CODE_OVERRIDE_HPP_
+
+#include <contract/aux_/mpl_assert.hpp>
+#include <contract/aux_/macro/code_/virtual.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/preprocessor/control/expr_if.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CODE_OVERRIDE_CONDITION_OR_BASE_(r, n, id_f) \
+ /* (base != class && has_virtual_function_tag<base::func>) || ... */ \
+ BOOST_PP_EXPR_IF(n, ||) \
+ (::boost::mpl::and_< \
+ ::boost::mpl::not_< ::boost::is_same< \
+ CONTRACT_AUX_CODE_BASE_TYPE(n) \
+ , CONTRACT_AUX_CODE_CLASS_TYPE \
+ > > \
+ , CONTRACT_AUX_CODE_HAS_VIRTUAL(BOOST_PP_TUPLE_ELEM(2, 0, id_f), \
+ BOOST_PP_TUPLE_ELEM(2, 1, id_f), \
+ CONTRACT_AUX_CODE_BASE_TYPE(n)) \
+ >::value)
+
+#define CONTRACT_AUX_CODE_OVERRIDE_CHECK_(id, tpl, k, f) \
+ CONTRACT_AUX_MPL_ASSERT_MSG( \
+ CONTRACT_AUX_CODE_OVERRIDE_CONDITION(id, tpl, k, f) \
+ , BOOST_PP_SEQ_CAT( \
+ (ERROR_no_base_class_declares_matching_virtual_function_to_override_at_line_)\
+ (id)) \
+ , ( /* can't print bases here because they can be more than 4 */ ) \
+ ); /* MPL assert requires trailing `;` */
+
+// PUBLIC //
+
+#define CONTRACT_AUX_CODE_OVERRIDE_CONDITION(id, tpl, k, f) \
+ ( BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX, \
+ CONTRACT_AUX_CODE_OVERRIDE_CONDITION_OR_BASE_, (id, f)) ) \
+
+#define CONTRACT_AUX_CODE_OVERRIDE_CHECK(id, tpl, k, f) \
+ BOOST_PP_IIF(BOOST_PP_IS_EMPTY(CONTRACT_DETAIL_PP_FUNC_TRAITS_OVERRIDE(f)),\
+ BOOST_PP_TUPLE_EAT(4) \
+ , \
+ CONTRACT_AUX_CODE_OVERRIDE_CHECK_ \
+ )(id, tpl, k, f)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/postcondition.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/postcondition.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,355 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_POSTCONDITION_HPP_
+#define CONTRACT_AUX_CODE_POSTCONDITION_HPP_
+
+#include <contract/aux_/identity_equal.hpp>
+#include <contract/aux_/uninitialized.hpp>
+#include <contract/aux_/macro/code_/assertion_func.hpp>
+#include <contract/aux_/macro/code_/oldof.hpp>
+#include <contract/aux_/macro/code_/assert.hpp>
+#include <contract/detail/preprocessor/traits/oldof.hpp> // o
+#include <boost/preprocessor/list/adt.hpp>
+#include <boost/preprocessor/list/filter.hpp>
+
+// PRIVATE //
+
+// NOTE: Transform an assignment `var =` into an equality comparison `var ==`
+// to internally deal with trailing `=` symbol of old-of and result which
+// cannot be remove by pp (the equality comparison is done with a special
+// identity_equal type `var == identity_equal()` which redefines == to return a
+// const& to var itself).
+#define CONTRACT_AUX_CODE_POSTCONDITION_ASSIGNMENT_TO_CONSTREF_(assignment) \
+ /* it is legal to pp-cat `= ## =` to `==` (see C++03 standard) */ \
+ BOOST_PP_CAT(assignment, =) ::contract::aux::identity_equal()
+
+#define CONTRACT_AUX_CODE_POSTCONDITION_COMMA_OLDOF_AUTO_PARAM_DECL_( \
+ r, typename01, i, o) \
+ , \
+ BOOST_PP_EXPR_IIF(typename01, typename) \
+ ::contract::aux::arg_const< \
+ CONTRACT_AUX_CODE_OLDOF_TYPE(typename01, o, i) >::type \
+ CONTRACT_DETAIL_PP_OLDOF_TRAITS_ASSIGNMENT(o) \
+ /* old-of assignment syntax has trailing `=` (which cannot be removed */ \
+ /* by pp) so it must be handled as a default param and it is set to */ \
+ /* uninitialized data to avoid requiring a default constructor for the */ \
+ /* old-of type-- this is OK because this default param value is never */ \
+ /* used (func call always specify this param) */ \
+ ::contract::aux::uninitialized< \
+ CONTRACT_AUX_CODE_OLDOF_TYPE(typename01, o, i) \
+ >::value()
+
+#define CONTRACT_AUX_CODE_POSTCONDITION_COMMA_OLDOF_AUTO_PARAM_CONSTREF_( \
+ r, tpl, i, o) \
+ , \
+ CONTRACT_AUX_CODE_POSTCONDITION_ASSIGNMENT_TO_CONSTREF_( \
+ CONTRACT_DETAIL_PP_OLDOF_TRAITS_ASSIGNMENT(o))
+
+#define CONTRACT_AUX_CODE_POSTCONDITION_COMMA_PARAM_DECL_(r, tpl_f, p) \
+ , \
+ CONTRACT_AUX_CODE_FUNC_TYPENAME(BOOST_PP_TUPLE_ELEM(2, 0, tpl_f), \
+ BOOST_PP_TUPLE_ELEM(2, 1, tpl_f)) \
+ ::contract::aux::arg_const< \
+ BOOST_PP_ARRAY_ENUM(CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_TYPE(p)) \
+ >::type \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME(p)
+
+#define CONTRACT_AUX_CODE_POSTCONDITION_COMMA_PARAM_NAME_(r, tpl, p) \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME(p)
+
+#define CONTRACT_AUX_CODE_POSTCONDITION_TPARAM_DECL_ENUM_(r, unused, i, type) \
+ BOOST_PP_COMMA_IF(i) \
+ typename type
+
+#define CONTRACT_AUX_CODE_POSTCONDITION_TPARAM_NAME_ENUM_(r, unused, i, type) \
+ BOOST_PP_COMMA_IF(i) \
+ type
+
+#define CONTRACT_AUX_CODE_POSTCONDITION_RESULT_PARAM_DECL_(id, tpl, k, f) \
+ /* type (it is void_result for void result type) */ \
+ CONTRACT_AUX_CODE_FUNC_TYPENAME(tpl, f) \
+ ::contract::aux::result_const< \
+ CONTRACT_AUX_CODE_RESULT_TYPE(f, 0 /* don't allow empty result */) \
+ >::type \
+ /* result parameter name and assignment */ \
+ BOOST_PP_IIF(BOOST_PP_IS_EMPTY( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITION_RESULT_ASSIGNMENT( \
+ f)), \
+ CONTRACT_AUX_SYMBOL( (unused_result)(id) ) \
+ = /* must have trailing assignment symbol */ \
+ BOOST_PP_TUPLE_EAT(1) \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITION_RESULT_ASSIGNMENT \
+ )(f) \
+ /* result assignment syntax has trailing `=` (which cannot be removed */ \
+ /* by pp) so it must be handled as a default param and it is set to */ \
+ /* uninitialized date to avoid requiring a default constructor for the */ \
+ /* result type-- this is OK because this default param value is never */ \
+ /* used (func call always specify this param) */ \
+ ::contract::aux::uninitialized< \
+ CONTRACT_AUX_CODE_FUNC_TYPENAME(tpl, f) \
+ ::contract::aux::result_const< \
+ CONTRACT_AUX_CODE_RESULT_TYPE(f, 0 /* don't allow empty result */) \
+ >::type \
+ >::value()
+
+#define CONTRACT_AUX_CODE_POSTCONDITION_RESULT_PARAM_CONSTREF_(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_POSTCONDITION_ASSIGNMENT_TO_CONSTREF_( \
+ BOOST_PP_IIF(BOOST_PP_IS_EMPTY( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITION_RESULT_ASSIGNMENT(\
+ f)), \
+ CONTRACT_AUX_SYMBOL( (unused_result)(id) ) \
+ = /* must have trailing assignment symbol */ \
+ BOOST_PP_TUPLE_EAT(1) \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITION_RESULT_ASSIGNMENT \
+ )(f) \
+ )
+
+#define CONTRACT_AUX_CODE_POSTCONDITION_VALIDATE_RESULT_DECL_(id, tpl, k, f) \
+ /* statically assert that auto `result = return` can be specified */ \
+ /* only if result type is not void */ \
+ BOOST_PP_IIF(BOOST_PP_IS_EMPTY( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITION_RESULT_ASSIGNMENT(f)),\
+ BOOST_PP_TUPLE_EAT(3) \
+ , \
+ CONTRACT_AUX_MPL_ASSERT_MSG \
+ )( \
+ /* extra paren around static assert condition wrap eventual commas */ \
+ ( !::boost::is_void< \
+ /* this type will always be void if no result type is */ \
+ /* specified in func decl (e.g., for ctor) but it might or */ \
+ /* not be void otherwise */ \
+ CONTRACT_AUX_CODE_FUNC_TYPENAME(tpl, f) \
+ CONTRACT_AUX_CODE_SIGNATURE_TYPE(id, tpl, k, f) :: \
+ result_type \
+ >::value ) \
+ , \
+ BOOST_PP_CAT(ERROR_postconditions_cannot_access_return_value_for_function_returning_void_at_line_, id) \
+ , \
+ (types< CONTRACT_AUX_CODE_FUNC_TYPENAME(tpl, f) \
+ CONTRACT_AUX_CODE_SIGNATURE_TYPE(id, tpl, k, f) :: \
+ result_type >) \
+ ); /* MPL assert requires trailing `;` */
+
+#define CONTRACT_AUX_CODE_POSTCONDITION_FUNC_DECL_TOKENS_(id, tpl, k, f, \
+ oldof_auto_types, function_name, is_assertion, dispatch_param) \
+ BOOST_PP_TUPLE_TO_LIST( /* pp-list for tparams unwrapped commas */ \
+ BOOST_PP_MAX(1, BOOST_PP_ADD( /* always at least 1 elem in tuple */ \
+ BOOST_PP_ADD(BOOST_PP_LIST_SIZE(oldof_auto_types) \
+ , CONTRACT_AUX_CODE_TEMPLATE_COUNT( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS(f)))) \
+ , is_assertion /* add 1 if true, 0 otherwise */ \
+ )) \
+ , ( \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_FUNC_KIND_IS_MEMBER(k, f), private:) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_BITOR(is_assertion, BOOST_PP_BITOR( \
+ BOOST_PP_LIST_IS_CONS(oldof_auto_types), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_IS_TEMPLATE(f))), \
+ template< \
+ ) \
+ /* old-of tparams */ \
+ BOOST_PP_LIST_FOR_EACH_I( \
+ CONTRACT_AUX_CODE_POSTCONDITION_TPARAM_DECL_ENUM_, ~, \
+ oldof_auto_types) \
+ /* actual tparams */ \
+ BOOST_PP_COMMA_IF(BOOST_PP_BITAND( \
+ BOOST_PP_LIST_IS_CONS(oldof_auto_types), \
+ BOOST_PP_LIST_IS_CONS( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS( \
+ f))))) \
+ CONTRACT_AUX_CODE_TEMPLATE_DECL(0, /* no `template<` and `>` */ \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS(f))) \
+ /* unused tparam to delay assertion-func compilation */ \
+ BOOST_PP_COMMA_IF(BOOST_PP_BITAND(is_assertion, BOOST_PP_BITOR( \
+ BOOST_PP_LIST_IS_CONS(oldof_auto_types), \
+ BOOST_PP_LIST_IS_CONS( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS( \
+ f)))))) \
+ BOOST_PP_EXPR_IIF(is_assertion, \
+ typename CONTRACT_AUX_SYMBOL( (Unused)(id) ) \
+ ) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_BITOR(is_assertion, BOOST_PP_BITOR( \
+ BOOST_PP_LIST_IS_CONS(oldof_auto_types), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_IS_TEMPLATE(f))), \
+ > \
+ ) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_COMPL(BOOST_PP_BITOR( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_NONSTATIC_MEMBER_FUNCTION(k, f) \
+ , CONTRACT_AUX_PP_FUNC_KIND_IS_CONSTRUCTOR(k))), \
+ /* static unless non-static member function or constructor */ \
+ static \
+ ) \
+ void function_name \
+ ( \
+ /* extra param for type-dispatching based on ass. requirements */ \
+ /* (can't go at the end because of default parameters) */\
+ BOOST_PP_EXPR_IIF(is_assertion, dispatch_param) \
+ BOOST_PP_COMMA_IF(is_assertion) /* next param always there */ \
+ /* function_type for a dummy param used to resolve overloading */ \
+ /* (because pre add const to args and obj so it might have same */ \
+ /* signature as of overloaded func with const arg and obj) */ \
+ /* not named so it cannot be used by mistake */ \
+ CONTRACT_AUX_CODE_FUNC_TYPENAME(tpl, f) \
+ CONTRACT_AUX_CODE_SIGNATURE_TYPE(id, tpl, k, f)::body_type \
+ /* all params are const (and ref) for const-correctness */ \
+ BOOST_PP_LIST_FOR_EACH( \
+ CONTRACT_AUX_CODE_POSTCONDITION_COMMA_PARAM_DECL_, \
+ (tpl, f), \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f))) \
+ /* all old-ofs are const (and ref) for const-correctness */ \
+ BOOST_PP_LIST_FOR_EACH_I( \
+ CONTRACT_AUX_CODE_POSTCONDITION_COMMA_OLDOF_AUTO_PARAM_DECL_, \
+ /* use typename keyword if tpl or there are */ \
+ /* auto-typed old-ofs (because this is tpl in that case) */\
+ BOOST_PP_BITOR(tpl, BOOST_PP_BITOR( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_IS_TEMPLATE(f), \
+ BOOST_PP_LIST_IS_CONS(oldof_auto_types))), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITION_OLDOFS(f)) \
+ /* result is const (and ref) for const-reoccrectness */ \
+ , CONTRACT_AUX_CODE_POSTCONDITION_RESULT_PARAM_DECL_(id, tpl, k, f)\
+ ) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_BITOR( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_NONSTATIC_MEMBER_FUNCTION(k, f) \
+ , CONTRACT_AUX_PP_FUNC_KIND_IS_CONSTRUCTOR(k)), \
+ /* object `this` is const for const-correctness (unless static) */ \
+ const \
+ ) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_VOLATILE(f) \
+ ) )
+
+#define CONTRACT_AUX_CODE_POSTCONDITION_ASSERTION_FUNC_(id, a) \
+ CONTRACT_AUX_SYMBOL( (postcondition_assertion) \
+ (CONTRACT_DETAIL_PP_ASSERTION_TRAITS_NUMBER(a)) (id) )
+
+#define CONTRACT_AUX_CODE_POSTCONDITION_ASSERTION_FUNC_DECL_TOKENS_( \
+ d, id, tpl, k_f_oldofautotypes, dispatch_param, a) \
+ CONTRACT_AUX_CODE_POSTCONDITION_FUNC_DECL_TOKENS_(id, tpl, \
+ BOOST_PP_TUPLE_ELEM(3, 0, k_f_oldofautotypes), \
+ BOOST_PP_TUPLE_ELEM(3, 1, k_f_oldofautotypes), \
+ BOOST_PP_TUPLE_ELEM(3, 2, k_f_oldofautotypes), \
+ CONTRACT_AUX_CODE_POSTCONDITION_ASSERTION_FUNC_(id, a), \
+ 1 /* yes for assertion */, dispatch_param)
+
+#define CONTRACT_AUX_CODE_POSTCONDITION_ASSERTION_FUNC_CALL_DATA_( \
+ id, tpl, k, f, oldof_auto_types, a) \
+ /* NOTE: Extra parens (assertion_func<...>(...)); wrap tparam commas */ \
+ (CONTRACT_AUX_CODE_POSTCONDITION_ASSERTION_FUNC_(id, a) \
+ < /* always a tpl because of extra Unused tparam */ \
+ BOOST_PP_LIST_FOR_EACH_I( \
+ CONTRACT_AUX_CODE_POSTCONDITION_TPARAM_NAME_ENUM_, ~, \
+ oldof_auto_types) \
+ BOOST_PP_COMMA_IF(BOOST_PP_BITAND( \
+ BOOST_PP_LIST_IS_CONS(oldof_auto_types), \
+ BOOST_PP_LIST_IS_CONS( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS( \
+ f))))) \
+ CONTRACT_AUX_CODE_TEMPLATE_PARAM_NAME_ENUM( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS(f))) \
+ BOOST_PP_COMMA_IF(BOOST_PP_BITOR( \
+ BOOST_PP_LIST_IS_CONS(oldof_auto_types), \
+ BOOST_PP_LIST_IS_CONS( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS(f))))) \
+ void /* unused tparam to disable assertion func compilation */ \
+ > \
+ ( \
+ CONTRACT_AUX_CODE_FUNC_TYPENAME(tpl, f) \
+ /* NOTE: extra param for assertion func dispatch based on */ \
+ /* requirements-- mpl::true_ iff assertion requirements */ \
+ /* are met at compile-time */ \
+ ::boost::mpl::bool_< \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_REQUIREMENT(a) \
+ >::type() \
+ , CONTRACT_AUX_CODE_FUNC_TYPENAME(tpl, f) \
+ CONTRACT_AUX_CODE_SIGNATURE_TYPE(id, tpl, k, f):: \
+ body_type() \
+ BOOST_PP_LIST_FOR_EACH( \
+ CONTRACT_AUX_CODE_POSTCONDITION_COMMA_PARAM_NAME_, \
+ tpl, \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f))) \
+ BOOST_PP_LIST_FOR_EACH_I( \
+ CONTRACT_AUX_CODE_POSTCONDITION_COMMA_OLDOF_AUTO_PARAM_CONSTREF_, \
+ ~, CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITION_OLDOFS(f)) \
+ , CONTRACT_AUX_CODE_POSTCONDITION_RESULT_PARAM_CONSTREF_(id, tpl, k, f)\
+ ));
+
+#define CONTRACT_AUX_CODE_POSTCONDITION_ASSERTION_FUNC_CALL_( \
+ d, id, tpl, k_f_oldofautotypes, a) \
+ CONTRACT_AUX_CODE_POSTCONDITION_ASSERTION_FUNC_CALL_DATA_(id, tpl, \
+ BOOST_PP_TUPLE_ELEM(3, 0, k_f_oldofautotypes), \
+ BOOST_PP_TUPLE_ELEM(3, 1, k_f_oldofautotypes), \
+ BOOST_PP_TUPLE_ELEM(3, 2, k_f_oldofautotypes), \
+ a)
+
+#define CONTRACT_AUX_CODE_POSTCONDITION_(id, tpl, k, f, oldof_auto_types) \
+ CONTRACT_AUX_CODE_ASSERTION_FUNC_DEF(id, tpl, postcondition, \
+ CONTRACT_AUX_CODE_POSTCONDITION_ASSERTION_FUNC_DECL_TOKENS_, \
+ (k, f, oldof_auto_types), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS(f)) \
+ BOOST_PP_LIST_ENUM(CONTRACT_AUX_CODE_POSTCONDITION_FUNC_DECL_TOKENS_( \
+ id, tpl, k, f, oldof_auto_types, \
+ CONTRACT_AUX_CODE_POSTCONDITION_FUNC(id, tpl, k, f), \
+ 0 /* not for assertion */, ~ /* no dispatch param */)) \
+ { \
+ CONTRACT_AUX_CODE_ASSERT(id, \
+ BOOST_PP_BITOR(tpl, BOOST_PP_LIST_IS_CONS(oldof_auto_types)), \
+ postcondition, \
+ CONTRACT_AUX_CODE_POSTCONDITION_ASSERTION_FUNC_CALL_, \
+ (k, f, oldof_auto_types), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS(f)) \
+ /* ensure that postcondition of void func do not attempt to access */ \
+ /* result value (note, this does not automatically error because */ \
+ /* the special type void_result and not void is used to handle void */ \
+ /* func) this check needs to be done within the func for tpl so */ \
+ /* to access the instantiated result type in case it depends on a */ \
+ /* tparam but... (continue below) */ \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_FUNC_TRAITS_IS_TEMPLATE(f), \
+ CONTRACT_AUX_CODE_POSTCONDITION_VALIDATE_RESULT_DECL_ \
+ , \
+ BOOST_PP_TUPLE_EAT(4) \
+ )(id, tpl, k, f) \
+ } \
+ /* (continued from above) ...the check needs to be done outside the */ \
+ /* func def for non-tpl to avoid linker errors on some compilers (MSVC) */ \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_FUNC_TRAITS_IS_TEMPLATE(f), \
+ BOOST_PP_TUPLE_EAT(4) \
+ , \
+ CONTRACT_AUX_CODE_POSTCONDITION_VALIDATE_RESULT_DECL_ \
+ )(id, tpl, k, f)
+
+// PUBLIC //
+
+#define CONTRACT_AUX_CODE_POSTCONDITION_FUNC(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_NAME_POSTFIXED( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_CONSTRUCTOR(k), \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_DESTRUCTOR(k), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_OPERATOR(f), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_NAME(f), \
+ (postcondition))
+
+#define CONTRACT_AUX_CODE_POSTCONDITION(id, tpl, k, f) \
+ BOOST_PP_IIF(CONTRACT_AUX_PP_FUNC_KIND_IS_DESTRUCTOR(k), \
+ BOOST_PP_TUPLE_EAT(5) \
+ , \
+ CONTRACT_AUX_CODE_POSTCONDITION_ \
+ )(id, tpl, k, f, CONTRACT_AUX_CODE_OLDOF_AUTO_TYPES( \
+ CONTRACT_AUX_CODE_FUNC_TYPENAME01(tpl, f), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITION_OLDOFS(f)))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/precondition.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/precondition.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,269 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_PRECONDITION_HPP_
+#define CONTRACT_AUX_CODE_PRECONDITION_HPP_
+
+#include <contract/aux_/symbol.hpp>
+#include <contract/aux_/debug.hpp>
+#include <contract/aux_/subcontract/precondition.hpp>
+#include <contract/aux_/macro/code_/name.hpp>
+#include <contract/aux_/macro/code_/assert.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CODE_PRECONDITION_COMMA_PARAM_DECL_(r, tpl_f, p) \
+ , \
+ CONTRACT_AUX_CODE_FUNC_TYPENAME(BOOST_PP_TUPLE_ELEM(2, 0, tpl_f), \
+ BOOST_PP_TUPLE_ELEM(2, 1, tpl_f)) \
+ ::contract::aux::arg_const< \
+ BOOST_PP_ARRAY_ENUM(CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_TYPE(p)) \
+ >::type \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME(p)
+
+#define CONTRACT_AUX_CODE_PRECONDITION_COMMA_PARAM_NAME_(r, unused, p) \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME(p)
+
+// Precondition: !CONFIG_PRECONDITION_OVERRIDE_01 && member(f)
+#define CONTRACT_AUX_CODE_PRECONDITION_NO_OVERRIDE_(id, tpl, k, f) \
+ /* if not ( !has_virtual(B::f) || pre(f) == NIL ) then error */\
+ CONTRACT_AUX_MPL_ASSERT_MSG( \
+ (!CONTRACT_AUX_CODE_OVERRIDE_CONDITION(id, tpl, k, f)) || \
+ (BOOST_PP_LIST_IS_NIL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PRECONDITIONS(f))) \
+ , BOOST_PP_SEQ_CAT( \
+ (ERROR_library_configuration_forbids_precondition_override_at_line_) \
+ (id) ) \
+ , ( /* can't print any type here because all bases checked */ ) \
+ ); /* MPL assert requires trailing `;` */ \
+ /* if has_virtual(B::f) then assert false (so overridden pre must hold) */ \
+ CONTRACT_AUX_CODE_ASSERT_CONDITION( \
+ (!(CONTRACT_AUX_CODE_OVERRIDE_CONDITION(id, tpl, k, f)) || \
+ false), \
+ precondition, 0 /* no number (it will not be printed) */, \
+ /* print same asserted condition */ \
+ (!(CONTRACT_AUX_CODE_OVERRIDE_CONDITION(id, tpl, k, f)) || \
+ false))
+
+#define CONTRACT_AUX_CODE_PRECONDITION_FUNC_DECL_TOKENS_(id, tpl, k, f, \
+ function_name, is_assertion, dispatch_param) \
+ BOOST_PP_TUPLE_TO_LIST( /* pp-list for tparams unwrapped commas */ \
+ BOOST_PP_MAX(1, BOOST_PP_ADD( /* always at least 1 elem in tuple */ \
+ CONTRACT_AUX_CODE_TEMPLATE_COUNT( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS(f))) \
+ , is_assertion /* add 1 if true, 0 otherwise */ \
+ )) \
+ , ( \
+ BOOST_PP_EXPR_IIF(BOOST_PP_BITAND(is_assertion, \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_MEMBER(k, f)), \
+ /* if not assertion, can't decl private here for subcontracting */ \
+ private: \
+ ) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_BITOR(is_assertion, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_IS_TEMPLATE(f)), \
+ template< \
+ ) \
+ /* actual tparams last because of trailing default params */ \
+ CONTRACT_AUX_CODE_TEMPLATE_DECL(0, /* no `template<` and `>` */ \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS(f))) \
+ /* unused tparam to delay assertion-func compilation */ \
+ BOOST_PP_COMMA_IF(BOOST_PP_BITAND(is_assertion, \
+ BOOST_PP_LIST_IS_CONS( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS( \
+ f))))) \
+ BOOST_PP_EXPR_IIF(is_assertion, \
+ typename CONTRACT_AUX_SYMBOL( (Unused)(id) ) \
+ ) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_BITOR(is_assertion, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_IS_TEMPLATE(f)), \
+ > \
+ ) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_COMPL( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_NONSTATIC_MEMBER_FUNCTION(k, f)), \
+ /* POLICY: also cons pre are static so they cannot access obj */ \
+ /* because there is no obj before successful const body exec */ \
+ static \
+ ) \
+ void function_name \
+ ( \
+ /* extra param for type-dispatching based on ass. requirements */ \
+ /* (can't go at the end because of default parameters) */\
+ BOOST_PP_EXPR_IIF(is_assertion, dispatch_param) \
+ BOOST_PP_COMMA_IF(is_assertion) /* next param always there */ \
+ /* function_type for a dummy param used to resolve overloading */ \
+ /* (because pre add const to args and obj so it might have same */ \
+ /* signature as of overloaded func with const arg and obj) */ \
+ /* not named so it cannot be used by mistake */ \
+ CONTRACT_AUX_CODE_FUNC_TYPENAME(tpl, f) \
+ CONTRACT_AUX_CODE_SIGNATURE_TYPE(id, tpl, k, f)::body_type \
+ /* all params are const (and ref) for const-correctness */ \
+ BOOST_PP_LIST_FOR_EACH( \
+ CONTRACT_AUX_CODE_PRECONDITION_COMMA_PARAM_DECL_, \
+ (tpl, f), \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f))) \
+ ) \
+ BOOST_PP_EXPR_IIF( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_NONSTATIC_MEMBER_FUNCTION(k, f), \
+ const /* const obj for const-correctness (unless static) */ \
+ ) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_VOLATILE(f) \
+ ) )
+
+#define CONTRACT_AUX_CODE_PRECONDITION_ASSERTION_FUNC_(id, a) \
+ CONTRACT_AUX_SYMBOL( (precondition_assertion) \
+ (CONTRACT_DETAIL_PP_ASSERTION_TRAITS_NUMBER(a)) (id) )
+
+#define CONTRACT_AUX_CODE_PRECONDITION_ASSERTION_FUNC_DECL_TOKENS_( \
+ d, id, tpl, k_f, dispatch_param, a) \
+ CONTRACT_AUX_CODE_PRECONDITION_FUNC_DECL_TOKENS_(id, tpl, \
+ BOOST_PP_TUPLE_ELEM(2, 0, k_f), BOOST_PP_TUPLE_ELEM(2, 1, k_f), \
+ CONTRACT_AUX_CODE_PRECONDITION_ASSERTION_FUNC_(id, a), \
+ 1 /* yes for assertion */, dispatch_param)
+
+#define CONTRACT_AUX_CODE_PRECONDITION_ASSERTION_FUNC_CALL_DATA_( \
+ k, f, id, tpl, a) \
+ /* NOTE: Extra parens (assertion_func<...>(...)); wrap tparam commas */ \
+ (CONTRACT_AUX_CODE_PRECONDITION_ASSERTION_FUNC_(id, a) \
+ < /* always a tpl because of extra Unused tparam */ \
+ CONTRACT_AUX_CODE_TEMPLATE_PARAM_NAME_ENUM( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS(f))) \
+ BOOST_PP_COMMA_IF(BOOST_PP_LIST_IS_CONS( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS(f)))) \
+ void /* unused tparam to disable assertion func compilation */ \
+ > \
+ ( \
+ CONTRACT_AUX_CODE_FUNC_TYPENAME(tpl, f) \
+ /* NOTE: extra param for assertion func dispatch based on */ \
+ /* requirements-- mpl::true_ iff assertion requirements */ \
+ /* are met at compile-time */ \
+ ::boost::mpl::bool_< \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_REQUIREMENT(a) \
+ >::type() \
+ , CONTRACT_AUX_CODE_FUNC_TYPENAME(tpl, f) \
+ CONTRACT_AUX_CODE_SIGNATURE_TYPE(id, tpl, k, f):: \
+ body_type() \
+ BOOST_PP_LIST_FOR_EACH( \
+ CONTRACT_AUX_CODE_PRECONDITION_COMMA_PARAM_NAME_, tpl, \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f))) \
+ ));
+
+#define CONTRACT_AUX_CODE_PRECONDITION_ASSERTION_FUNC_CALL_( \
+ d, id, tpl, k_f, a) \
+ CONTRACT_AUX_CODE_PRECONDITION_ASSERTION_FUNC_CALL_DATA_(id, tpl, \
+ BOOST_PP_TUPLE_ELEM(2, 0, k_f), BOOST_PP_TUPLE_ELEM(2, 1, k_f), a)
+
+#define CONTRACT_AUX_CODE_PRECONDITION_(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_ASSERTION_FUNC_DEF(id, tpl, precondition, \
+ CONTRACT_AUX_CODE_PRECONDITION_ASSERTION_FUNC_DECL_TOKENS_, \
+ (k, f), CONTRACT_DETAIL_PP_FUNC_TRAITS_PRECONDITIONS(f)) \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_FUNC_KIND_IS_MEMBER(k, f), private:) \
+ BOOST_PP_LIST_ENUM(CONTRACT_AUX_CODE_PRECONDITION_FUNC_DECL_TOKENS_( \
+ id, tpl, k, f, CONTRACT_AUX_CODE_PRECONDITION_FUNC(id, tpl, k, f), \
+ 0 /* not for assertion */, ~ /* no dispatch param */)) \
+ { \
+ /* POLICY: N1962 requires that preconditions cannot be overridden */ \
+ BOOST_PP_IIF(BOOST_PP_BITAND(BOOST_PP_COMPL( \
+ CONTRACT_AUX_CONFIG_PRECONDITION_OVERRIDE_01), \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_NONSTATIC_MEMBER_FUNCTION(k, f)), \
+ CONTRACT_AUX_CODE_PRECONDITION_NO_OVERRIDE_ \
+ , \
+ BOOST_PP_TUPLE_EAT(4) \
+ )(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_ASSERT(id, tpl, precondition, \
+ CONTRACT_AUX_CODE_PRECONDITION_ASSERTION_FUNC_CALL_, (k, f), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PRECONDITIONS(f)) \
+ }
+
+#define CONTRACT_AUX_CODE_SUBCONTRACTED_PRECONDITION_COMMA_BASE_( \
+ z, n, id_tpl_k_f) \
+ , dynamic_cast< \
+ CONTRACT_AUX_CODE_SUBCONTRACTED_BASE_TYPE( \
+ BOOST_PP_TUPLE_ELEM(4, 0, id_tpl_k_f), n) \
+ const \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_VOLATILE( \
+ BOOST_PP_TUPLE_ELEM(4, 3, id_tpl_k_f)) \
+ * const \
+ >(this) \
+ /* call function to check all (base, base's base, etc) preconditions */ \
+ , CONTRACT_AUX_CODE_FUNC_PTR( \
+ BOOST_PP_TUPLE_ELEM(4, 0, id_tpl_k_f), \
+ BOOST_PP_TUPLE_ELEM(4, 1, id_tpl_k_f), \
+ BOOST_PP_TUPLE_ELEM(4, 2, id_tpl_k_f), \
+ BOOST_PP_TUPLE_ELEM(4, 3, id_tpl_k_f), \
+ BOOST_PP_EXPAND(CONTRACT_AUX_CODE_SUBCONTRACTED_PRECONDITION_FUNC \
+ id_tpl_k_f), \
+ CONTRACT_AUX_CODE_SUBCONTRACTED_BASE_TYPE( \
+ BOOST_PP_TUPLE_ELEM(4, 0, id_tpl_k_f), n))
+
+#define CONTRACT_AUX_CODE_SUBCONTRACTED_PRECONDITION_(id, tpl, k, f) \
+ /* this cannot be private */ \
+ BOOST_PP_LIST_ENUM(CONTRACT_AUX_CODE_PRECONDITION_FUNC_DECL_TOKENS_( \
+ id, tpl, k, f, \
+ CONTRACT_AUX_CODE_SUBCONTRACTED_PRECONDITION_FUNC(id, tpl, k, f), \
+ 0 /* not for assertion */, void /* no ass. req. dispatch type */)) \
+ { \
+ ::contract::aux::subcontract_precondition< \
+ CONTRACT_AUX_CODE_FUNC_TYPENAME(tpl, f) \
+ CONTRACT_AUX_CODE_SIGNATURE_TYPE(id, tpl, k, f) \
+ >( \
+ this \
+ /* call func to check this object (not all) precondition */ \
+ , CONTRACT_AUX_CODE_FUNC_PTR(id, tpl, k, f, \
+ CONTRACT_AUX_CODE_PRECONDITION_FUNC(id, tpl, k, f), \
+ CONTRACT_AUX_CODE_CLASS_TYPE) \
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX, \
+ CONTRACT_AUX_CODE_SUBCONTRACTED_PRECONDITION_COMMA_BASE_, \
+ (id, tpl, k, f)) \
+ BOOST_PP_LIST_FOR_EACH( \
+ CONTRACT_AUX_CODE_PRECONDITION_COMMA_PARAM_NAME_, ~, \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f))) \
+ ); \
+ }
+
+// PUBLIC //
+
+#define CONTRACT_AUX_CODE_PRECONDITION_FUNC(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_NAME_POSTFIXED( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_CONSTRUCTOR(k), \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_DESTRUCTOR(k), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_OPERATOR(f), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_NAME(f), \
+ (precondition))
+
+#define CONTRACT_AUX_CODE_SUBCONTRACTED_PRECONDITION_FUNC(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_NAME_POSTFIXED( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_CONSTRUCTOR(k), \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_DESTRUCTOR(k), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_OPERATOR(f), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_NAME(f), \
+ (subcontracted_precondition))
+
+#define CONTRACT_AUX_CODE_PRECONDITION(id, tpl, k, f) \
+ BOOST_PP_IIF(CONTRACT_AUX_PP_FUNC_KIND_IS_DESTRUCTOR(k), \
+ BOOST_PP_TUPLE_EAT(4) \
+ , \
+ CONTRACT_AUX_CODE_PRECONDITION_ \
+ )(id, tpl, k, f) \
+ BOOST_PP_IIF(CONTRACT_AUX_PP_FUNC_KIND_IS_NONSTATIC_MEMBER_FUNCTION(k, f), \
+ /* must be public for subcontracting */ \
+ public: CONTRACT_AUX_CODE_SUBCONTRACTED_PRECONDITION_ \
+ , \
+ /* ctor and dtor subcontract via base-class creation rules */ \
+ BOOST_PP_TUPLE_EAT(4) \
+ )(id, tpl, k, f)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/result_type.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/result_type.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,53 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_RESULT_TYPE_HPP_
+#define CONTRACT_AUX_CODE_RESULT_TYPE_HPP_
+
+#include <contract/detail/preprocessor/traits/func/result_type.hpp>
+#include <contract/detail/preprocessor/traits/func/name.hpp>
+#include <contract/detail/preprocessor/keyword/operator.hpp>
+#include <boost/preprocessor/control/if.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+#include <boost/preprocessor/facilities/is_empty.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/array/size.hpp>
+#include <boost/preprocessor/array/enum.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CODE_RESULT_TYPE_HANDLE_EMPTY_(f) \
+ BOOST_PP_IF(BOOST_PP_ARRAY_SIZE( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_OPERATOR(f)),\
+ /* implicit type conversion operators `operator int* ( void )` have */ \
+ /* empty result type and their result type is made to match the */ \
+ /* operator symbolic type `int*` */ \
+ BOOST_PP_ARRAY_ENUM \
+ , \
+ /* constructors and destructors have empty result type and their */ \
+ /* result type is made to be void */ \
+ void BOOST_PP_TUPLE_EAT(1) \
+ )(CONTRACT_DETAIL_PP_FUNC_TRAITS_OPERATOR(f))
+
+#define CONTRACT_AUX_CODE_RESULT_TYPE_NOT_EMPTY_(f) \
+ BOOST_PP_ARRAY_ENUM(CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE(f))
+
+// PUBLIC //
+
+#define CONTRACT_AUX_CODE_RESULT_TYPE(f, allow_empty) \
+ BOOST_PP_IF(BOOST_PP_ARRAY_SIZE( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE(f)), \
+ CONTRACT_AUX_CODE_RESULT_TYPE_NOT_EMPTY_ \
+ , BOOST_PP_IIF(allow_empty, \
+ BOOST_PP_TUPLE_EAT(1) /* expand to empty */ \
+ , \
+ CONTRACT_AUX_CODE_RESULT_TYPE_HANDLE_EMPTY_ \
+ ))(f)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/signature.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/signature.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,107 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_SIGNATURE_HPP_
+#define CONTRACT_AUX_CODE_SIGNATURE_HPP_
+
+#include <contract/aux_/symbol.hpp>
+#include <contract/aux_/signature_traits.hpp>
+#include <contract/detail/preprocessor/traits/func.hpp> // f
+#include <contract/detail/preprocessor/traits/func_param.hpp> // p
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/list/for_each_i.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CODE_SIGNATURE_PARAM_TYPE_ENUM_(r, unused, i, p) \
+ BOOST_PP_COMMA_IF(i) \
+ BOOST_PP_ARRAY_ENUM(CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_TYPE(p))
+
+#define CONTRACT_AUX_CODE_SIGNATURE_COMMA_SUBCONTRACTED_BASE_TYPE_(z, n, id) \
+ , \
+ CONTRACT_AUX_CODE_SUBCONTRACTED_BASE_TYPE(id, n)
+
+#define CONTRACT_AUX_CODE_SIGNATURE_CLASS_(id, tpl, k, f) \
+ /* this symbol is unique because of id (it cannot be made unique */ \
+ /* without id, for example just using the func and param names, */ \
+ /* because overloaded func will have same func name, param name, etc) */ \
+ /* NOTE: f's name is still needed because free func in same namespace */ \
+ /* and decl on same line will have same id in same namespace */ \
+ CONTRACT_AUX_CODE_NAME_POSTFIXED( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_CONSTRUCTOR(k), \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_DESTRUCTOR(k), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_OPERATOR(f), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_NAME(f), \
+ (signature_traits)(id))
+
+// PUBLIC //
+
+// In type-dependent context, this must be prefixed by typename.
+#define CONTRACT_AUX_CODE_SIGNATURE_TYPE(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_SIGNATURE_CLASS_(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_TEMPLATE_INSTANCE( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS(f))) \
+ ::type
+
+#define CONTRACT_AUX_CODE_SIGNATURE(id, tpl, k, f) \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_FUNC_KIND_IS_MEMBER(k, f), private:) \
+ CONTRACT_AUX_CODE_TEMPLATE_DECL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_IS_TEMPLATE(f), \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS(f))) \
+ struct CONTRACT_AUX_CODE_SIGNATURE_CLASS_(id, tpl, k, f) { \
+ typedef \
+ BOOST_PP_IIF( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_NONSTATIC_MEMBER_FUNCTION( \
+ k, f), \
+ ::contract::aux::derived_signature_traits \
+ , \
+ ::contract::aux::signature_traits \
+ ) \
+ < \
+ CONTRACT_AUX_CODE_RESULT_TYPE(f, 0 /* no empty result */) \
+ /* function (eventually member function) pointer type */ \
+ ( \
+ BOOST_PP_EXPR_IIF(BOOST_PP_BITOR( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_NONSTATIC_MEMBER_FUNCTION(\
+ k, f) \
+ , BOOST_PP_BITOR( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_CONSTRUCTOR(k) \
+ , CONTRACT_AUX_PP_FUNC_KIND_IS_DESTRUCTOR(k) \
+ )), \
+ CONTRACT_AUX_CODE_CLASS_TYPE:: \
+ ) \
+ * \
+ ) \
+ /* function argument types */ \
+ ( \
+ BOOST_PP_LIST_FOR_EACH_I( \
+ CONTRACT_AUX_CODE_SIGNATURE_PARAM_TYPE_ENUM_, ~, \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f))) \
+ ) \
+ /* cv-qualifiers */ \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CONST(f) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_VOLATILE(f) \
+ /* base class types (only for subcontracting) */ \
+ BOOST_PP_IIF( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_NONSTATIC_MEMBER_FUNCTION(\
+ k, f), \
+ BOOST_PP_REPEAT \
+ , \
+ BOOST_PP_TUPLE_EAT(3) \
+ )(CONTRACT_CONFIG_INHERITANCE_MAX, \
+ CONTRACT_AUX_CODE_SIGNATURE_COMMA_SUBCONTRACTED_BASE_TYPE_,\
+ id) \
+ > \
+ type \
+ ; /* typedef end */ \
+ }; /* struct end */
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/subcontract.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/subcontract.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,76 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_SUBCONTRACT_HPP_
+#define CONTRACT_AUX_CODE_SUBCONTRACT_HPP_
+
+#include <contract/aux_/subcontract/from.hpp>
+#include <contract/aux_/subcontract/has_class_invariant.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CODE_SUBCONTRACT_FUNC_BASE_TYPEDEF_(z, n, id_tpl_f) \
+ typedef \
+ /* here typename only if enclosing scope is template (tpl = 1) but */ \
+ /* not also if f is template (because if f is template no */ \
+ /* subcontracting using mpl::false_ which is not type-dependent) */ \
+ BOOST_PP_EXPR_IIF(BOOST_PP_TUPLE_ELEM(3, 1, id_tpl_f), \
+ typename \
+ ) \
+ ::contract::aux::subcontract_from< \
+ CONTRACT_AUX_CODE_CLASS_TYPE \
+ , CONTRACT_AUX_CODE_BASE_TYPE(n) \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_FUNC_TRAITS_IS_TEMPLATE( \
+ BOOST_PP_TUPLE_ELEM(3, 2, id_tpl_f)), \
+ /* NOTE: member func tpl cannot be virtual so no subcontract */\
+ ::boost::mpl::false_ \
+ BOOST_PP_TUPLE_EAT(3) \
+ , \
+ CONTRACT_AUX_CODE_HAS_VIRTUAL \
+ )(BOOST_PP_TUPLE_ELEM(3, 0, id_tpl_f), \
+ BOOST_PP_TUPLE_ELEM(3, 2, id_tpl_f), \
+ CONTRACT_AUX_CODE_BASE_TYPE(n)) \
+ >::type \
+ CONTRACT_AUX_CODE_SUBCONTRACTED_BASE_TYPE(BOOST_PP_TUPLE_ELEM( \
+ 3, 0, id_tpl_f), n) \
+ ;
+
+#define CONTRACT_AUX_CODE_SUBCONTRACT_INVARIANT_BASE_TYPEDEF_(z, n, id_tpl_c) \
+ typedef \
+ CONTRACT_AUX_CODE_CLASS_TYPENAME(BOOST_PP_TUPLE_ELEM(3, 1, id_tpl_c), \
+ BOOST_PP_TUPLE_ELEM(3, 2, id_tpl_c)) \
+ ::contract::aux::subcontract_from< \
+ CONTRACT_AUX_CODE_CLASS_TYPE \
+ , CONTRACT_AUX_CODE_BASE_TYPE(n) \
+ , ::contract::aux::has_subcontracted_class_invariant< \
+ void (CONTRACT_AUX_CODE_BASE_TYPE(n)::*) ( ) const \
+ > \
+ >::type \
+ CONTRACT_AUX_CODE_SUBCONTRACTED_BASE_TYPE(BOOST_PP_TUPLE_ELEM(3, 0, \
+ id_tpl_c), n) \
+ ;
+
+// PUBLIC //
+
+#define CONTRACT_AUX_CODE_SUBCONTRACTED_BASE_TYPE(id, n) \
+ CONTRACT_AUX_SYMBOL( (subcontracted_base)(n)(id) )
+
+// Subcontract overriding function pre and post from all bases.
+#define CONTRACT_AUX_CODE_SUBCONTRACT_PREPOSTCONDITION_FROM_BASES( \
+ id, tpl, k, f) \
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX, \
+ CONTRACT_AUX_CODE_SUBCONTRACT_FUNC_BASE_TYPEDEF_, \
+ (id, tpl, f))
+
+// Subcontract (dynamic, volatile, and static) class inv from all bases.
+#define CONTRACT_AUX_CODE_SUBCONTRACT_CLASS_INVARIANT_FROM_BASES(id, tpl, c) \
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX, \
+ CONTRACT_AUX_CODE_SUBCONTRACT_INVARIANT_BASE_TYPEDEF_, \
+ (id, tpl, c))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/template.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/template.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,168 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_TEMPLATE_HPP_
+#define CONTRACT_AUX_CODE_TEMPLATE_HPP_
+
+#include <contract/detail/preprocessor/traits/class.hpp> // c
+#include <contract/detail/preprocessor/traits/func.hpp> // f
+#include <contract/detail/preprocessor/traits/template_param.hpp> // t
+#include <contract/detail/preprocessor/list/to_array.hpp>
+#include <contract/detail/preprocessor/keyword/template.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/control/expr_iif.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/logical/compl.hpp>
+#include <boost/preprocessor/facilities/is_empty.hpp>
+#include <boost/preprocessor/list/adt.hpp>
+#include <boost/preprocessor/list/for_each_i.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+
+// PRIVATE //
+
+// Template parameters.
+
+#define CONTRACT_AUX_CODE_TEMPLATE_TEMPLATE_PARAM_SPLIT_(tparams_list) \
+ tparams_list ,
+
+#define CONTRACT_AUX_CODE_TEMPLATE_PARAM_TEMPLATE_KIND_ENUM_( \
+ tparams_list) \
+ CONTRACT_DETAIL_PP_ARRAY_REM( \
+ CONTRACT_DETAIL_PP_LIST_TO_ARRAY(tparams_list))
+
+#define CONTRACT_AUX_CODE_TEMPLATE_PARAM_TEMPLATE_KIND_TOKENS_(tparams_class) \
+ template< \
+ /* cannot use LIST_ENUM here because of reentrancy */ \
+ BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(BOOST_PP_TUPLE_ELEM( \
+ 2, 0, tparams_class)), \
+ CONTRACT_AUX_CODE_TEMPLATE_PARAM_TEMPLATE_KIND_ENUM_ \
+ , \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(BOOST_PP_TUPLE_ELEM(2, 0, tparams_class)) \
+ > BOOST_PP_TUPLE_ELEM(2, 1, tparams_class)
+
+// Precondition: tparams_class is `( tparams_list ) class`
+#define CONTRACT_AUX_CODE_TEMPLATE_PARAM_TEMPLATE_KIND_(tparams_class) \
+ CONTRACT_AUX_CODE_TEMPLATE_PARAM_TEMPLATE_KIND_TOKENS_( ( \
+ CONTRACT_AUX_CODE_TEMPLATE_TEMPLATE_PARAM_SPLIT_ tparams_class ) )
+
+// Precondition: !EMPTY(KIND(t))
+#define CONTRACT_AUX_CODE_TEMPLATE_PARAM_KIND_(t) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_TEMPLATE_FRONT( \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND(t)), \
+ /* template<...> class for template tparam */ \
+ CONTRACT_AUX_CODE_TEMPLATE_PARAM_TEMPLATE_KIND_ \
+ , \
+ BOOST_PP_TUPLE_REM(1) /* typename or class for type tparam */ \
+ )(CONTRACT_DETAIL_PP_KEYWORD_TEMPLATE_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND(t)))
+
+// Precondition: t is a positional tparam.
+#define CONTRACT_AUX_CODE_TEMPLATE_PARAM_ENUM_(r, unused, i, t) \
+ BOOST_PP_COMMA_IF(i) \
+ /* typename, class, or template<...> class (non-value tparams) */ \
+ BOOST_PP_IIF(BOOST_PP_IS_EMPTY( \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND(t)), \
+ BOOST_PP_TUPLE_EAT(1) \
+ , \
+ CONTRACT_AUX_CODE_TEMPLATE_PARAM_KIND_ \
+ )(t) \
+ /* otherwise, type requirement (value tparams) */ \
+ BOOST_PP_IF(BOOST_PP_ARRAY_SIZE( \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_REQUIREMENT(t)), \
+ BOOST_PP_ARRAY_ENUM \
+ , \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_REQUIREMENT(t)) \
+ /* name */ \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_NAME(t) \
+ /* default */ \
+ BOOST_PP_IF(BOOST_PP_ARRAY_SIZE( \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_DEFAULT(t)), \
+ = BOOST_PP_ARRAY_ENUM \
+ , \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_DEFAULT(t))
+
+#define CONTRACT_AUX_CODE_TEMPLATE_PARAM_NAME_ENUM_(r, unused, i, t) \
+ BOOST_PP_COMMA_IF(i) \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_NAME(t)
+
+// Count (because template template params can introduced unwrapped commas).
+
+#define CONTRACT_AUX_CODE_TEMPLATE_COUNT_INC_(count, unused) \
+ BOOST_PP_INC(count)
+
+#define CONTRACT_AUX_CODE_TEMPLATE_COUNT_TEMPLATE_PARAMS_SIZE_( \
+ count, tparams_list) \
+ BOOST_PP_ADD(count, BOOST_PP_LIST_SIZE(tparams_list))
+
+#define CONTRACT_AUX_CODE_TEMPLATE_COUNT_TEMPLATE_PARAMS_( \
+ count, tparams_class) \
+ BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(BOOST_PP_TUPLE_ELEM(2, 0, \
+ tparams_class)), \
+ /* as many tokens as tparams 1 for `template<typename X> class`, */ \
+ /* 2 for `tempalte<typename X, typename Y> class`, etc */ \
+ CONTRACT_AUX_CODE_TEMPLATE_COUNT_TEMPLATE_PARAMS_SIZE_ \
+ , \
+ /* no tparams `tempalte<> class` but still 1 token */ \
+ CONTRACT_AUX_CODE_TEMPLATE_COUNT_INC_ \
+ )(count, BOOST_PP_TUPLE_ELEM(2, 0, tparams_class))
+
+// Precondition: tparams_class is `( tparams_list ) class`
+#define CONTRACT_AUX_CODE_TEMPLATE_COUNT_TEMPLATE_(count, tparams_class) \
+ CONTRACT_AUX_CODE_TEMPLATE_COUNT_TEMPLATE_PARAMS_(count, ( \
+ CONTRACT_AUX_CODE_TEMPLATE_TEMPLATE_PARAM_SPLIT_ tparams_class ) )
+
+// Precondition: !EMPTY(KIND(t))
+#define CONTRACT_AUX_CODE_TEMPLATE_COUNT_KIND_(count, t) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_TEMPLATE_FRONT( \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND(t)), \
+ /* template<...> class for template tparam */ \
+ CONTRACT_AUX_CODE_TEMPLATE_COUNT_TEMPLATE_ \
+ , \
+ CONTRACT_AUX_CODE_TEMPLATE_COUNT_INC_ /* it is type tparam */ \
+ )(count, CONTRACT_DETAIL_PP_KEYWORD_TEMPLATE_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND(t)))
+
+#define CONTRACT_AUX_CODE_TEMPLATE_COUNT_(d, count, t) \
+ BOOST_PP_IIF(BOOST_PP_IS_EMPTY( \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND(t)), \
+ CONTRACT_AUX_CODE_TEMPLATE_COUNT_INC_ /* it is value tparam */ \
+ , \
+ CONTRACT_AUX_CODE_TEMPLATE_COUNT_KIND_ \
+ )(count, t)
+
+// PUBLIC //
+
+// Precondition: All of these only work on positional tparams.
+
+// For template specializations, template01 is 1 and tparams is nil pp-list,
+#define CONTRACT_AUX_CODE_TEMPLATE_DECL(template01, tparams) \
+ BOOST_PP_EXPR_IIF(template01, template< ) /* for specializations */ \
+ BOOST_PP_LIST_FOR_EACH_I(CONTRACT_AUX_CODE_TEMPLATE_PARAM_ENUM_, ~, \
+ tparams) \
+ BOOST_PP_EXPR_IIF(template01, > )
+
+#define CONTRACT_AUX_CODE_TEMPLATE_PARAM_NAME_ENUM(tparams) \
+ BOOST_PP_LIST_FOR_EACH_I(CONTRACT_AUX_CODE_TEMPLATE_PARAM_NAME_ENUM_, \
+ ~, tparams)
+
+#define CONTRACT_AUX_CODE_TEMPLATE_INSTANCE(tparams) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(tparams), < ) \
+ CONTRACT_AUX_CODE_TEMPLATE_PARAM_NAME_ENUM(tparams) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(tparams), > )
+
+// Count number of template tokens: 1 for template<> and template<typename X>,
+// 2 for template<typename X, typename Y>, etc.
+#define CONTRACT_AUX_CODE_TEMPLATE_COUNT(tparams) \
+ /* cannot just use LIST_SIZE because of template template param */ \
+ BOOST_PP_LIST_FOLD_LEFT(CONTRACT_AUX_CODE_TEMPLATE_COUNT_, 0, tparams)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/typename.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/typename.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,56 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_TYPENAME_HPP_
+#define CONTRACT_AUX_CODE_TYPENAME_HPP_
+
+#include <contract/detail/preprocessor/traits/class.hpp> // c
+#include <contract/detail/preprocessor/traits/func.hpp> // f
+#include <boost/preprocessor/control/expr_iif.hpp>
+#include <boost/preprocessor/logical/bitor.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CODE_TYPENAME01_(tpl, params) \
+ /* the typename keyword should be used to resolve nested type */ \
+ /* expressions if the enclosing scope is a template (tpl is 1) or */ \
+ /* the declared class or function has non-empty template parameters */ \
+ /* (template specializations with empty template parameters will still */ \
+ /* be templates (...TRAITS_IS_TEMPLATE is 1) but they do not make for */ \
+ /* a type-dependent scope so the actual template parameters are used) */ \
+ BOOST_PP_BITOR( \
+ tpl \
+ , BOOST_PP_BITOR( \
+ BOOST_PP_LIST_IS_CONS( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL(params)) \
+ , BOOST_PP_BITOR( \
+ BOOST_PP_LIST_IS_CONS( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_NAMED(params)) \
+ , BOOST_PP_LIST_IS_CONS( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_NAMED(params)) \
+ ) \
+ ) \
+ ) \
+
+// PUBLIC //
+
+#define CONTRACT_AUX_CODE_CLASS_TYPENAME01(tpl, c) \
+ CONTRACT_AUX_CODE_TYPENAME01_(tpl, \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_PARAMS(c))
+
+#define CONTRACT_AUX_CODE_CLASS_TYPENAME(tpl, c) \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_CODE_CLASS_TYPENAME01(tpl, c), typename)
+
+#define CONTRACT_AUX_CODE_FUNC_TYPENAME01(tpl, f) \
+ CONTRACT_AUX_CODE_TYPENAME01_(tpl, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS(f))
+
+#define CONTRACT_AUX_CODE_FUNC_TYPENAME(tpl, f) \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_CODE_FUNC_TYPENAME01(tpl, f), typename)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/code_/virtual.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/code_/virtual.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,78 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_CODE_VIRTUAL_HPP_
+#define CONTRACT_AUX_CODE_VIRTAUL_HPP_
+
+#include <contract/aux_/mpl_assert.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/or.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_CODE_VIRTUAL_TAG_FUNC_(f) \
+ CONTRACT_AUX_SYMBOL( (CONTRACT_DETAIL_PP_FUNC_TRAITS_NAME(f)) \
+ (virtual_function_tag) )
+
+#define CONTRACT_AUX_CODE_VIRTUAL_TAG_FUNC_PARAM_TYPE_ENUM_( \
+ r, default01, i, p) \
+ BOOST_PP_COMMA_IF(i) \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER(p) \
+ BOOST_PP_ARRAY_ENUM(CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_TYPE(p))
+
+#define CONTRACT_AUX_CODE_VIRTUAL_FUNC_SIGNATURE_(f, name) \
+ /* NOTE: virtual functions decl this member func tag which existence */ \
+ /* can be checked using the introspection metafunction also def here */ \
+ CONTRACT_AUX_CODE_RESULT_TYPE(f, 0 /* don't allow empty result type */) \
+ name \
+ ( \
+ BOOST_PP_LIST_FOR_EACH_I( \
+ CONTRACT_AUX_CODE_VIRTUAL_TAG_FUNC_PARAM_TYPE_ENUM_, ~, \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f))) \
+ ) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CONST(f) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_VOLATILE(f)
+
+#define CONTRACT_AUX_CODE_VIRTUAL_TAG_DECL_(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_TEMPLATE_DECL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_IS_TEMPLATE(f), \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS(f))) \
+ CONTRACT_AUX_CODE_VIRTUAL_FUNC_SIGNATURE_(f, \
+ CONTRACT_AUX_CODE_VIRTUAL_TAG_FUNC_(f)) \
+ ; /* no tag func definition needed for SFINAE so `;` */
+
+#define CONTRACT_AUX_CODE_VIRTUAL_CHECK_METAFUNC_(id) \
+ CONTRACT_AUX_SYMBOL( (has_virtual_function_tag)(id) )
+
+#define CONTRACT_AUX_CODE_VIRTUAL_CHECK_DEF_(id, tpl, k, f) \
+ CONTRACT_AUX_HAS_XXX_MEMBER_FUNCTION( \
+ CONTRACT_AUX_CODE_VIRTUAL_CHECK_METAFUNC_(id), \
+ CONTRACT_AUX_CODE_VIRTUAL_TAG_FUNC_(f)) \
+
+// PUBLIC //
+
+// Return MPL type true_ or false_.
+#define CONTRACT_AUX_CODE_HAS_VIRTUAL(id, f, class_type) \
+ CONTRACT_AUX_CODE_VIRTUAL_CHECK_METAFUNC_(id)< \
+ CONTRACT_AUX_CODE_VIRTUAL_FUNC_SIGNATURE_(f, (class_type::*)) \
+ >
+
+#define CONTRACT_AUX_CODE_VIRTUAL_TAG(id, tpl, k, f) \
+ BOOST_PP_IIF(BOOST_PP_IS_EMPTY(CONTRACT_DETAIL_PP_FUNC_TRAITS_VIRTUAL(f)), \
+ BOOST_PP_TUPLE_EAT(4) \
+ , \
+ public: /* must be public to be accessed from intro metafunc */ \
+ CONTRACT_AUX_CODE_VIRTUAL_TAG_DECL_ \
+ )(id, tpl, k, f) \
+ private: /* check introspection metafunc can be private */ \
+ CONTRACT_AUX_CODE_VIRTUAL_CHECK_DEF_(id, tpl, k, f)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/function.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/function.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,247 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_FUNCTION_HPP_
+#define CONTRACT_AUX_FUNCTION_HPP_
+
+#include <contract/aux_/macro/code_/named_params_func.hpp>
+#include <contract/aux_/macro/code_/signature.hpp>
+#include <contract/aux_/macro/code_/precondition.hpp>
+#include <contract/aux_/macro/code_/postcondition.hpp>
+#include <contract/aux_/macro/code_/oldof.hpp>
+#include <contract/aux_/macro/code_/func.hpp>
+#include <contract/aux_/macro/code_/body.hpp>
+#include <contract/aux_/macro/code_/final.hpp>
+#include <contract/aux_/macro/code_/virtual.hpp>
+#include <contract/aux_/macro/code_/subcontract.hpp>
+#include <contract/aux_/macro/code_/exception_spec.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/logical/bitor.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_FUNCTION_POSTCONDITION_AND_OLDOF_(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_POSTCONDITION(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_OLDOF(id, tpl, k, f)
+
+#define CONTRACT_AUX_FUNCTION_BODY_FORWARD_DECL_( \
+ id, tpl, k, f, body_func) \
+ CONTRACT_AUX_CODE_BODY_DECL(id, tpl, k, f, body_func) \
+ ; /* forward declaration (no definition here, will be def by user later) */
+
+#define CONTRACT_AUX_FUNCTION_OVERRIDE_AND_NEW_AND_FINAL_(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_FINAL(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_OVERRIDE(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_NEW(id, tpl, k, f)
+
+#define CONTRACT_AUX_FUNCTION_VIRTUAL_SPECIFIERS_(id, tpl, k, f) \
+ BOOST_PP_IIF(BOOST_PP_BITOR(CONTRACT_AUX_CONFIG_VIRTUAL_SPECIFIERS_01, \
+ BOOST_PP_BITOR(CONTRACT_AUX_CONFIG_PRECONDITIONS_01, \
+ BOOST_PP_BITOR(CONTRACT_AUX_CONFIG_POSTCONDITIONS_01, \
+ CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01))), \
+ CONTRACT_AUX_CODE_VIRTUAL \
+ , \
+ BOOST_PP_TUPLE_EAT(4) \
+ )(id, tpl, k, f) \
+ BOOST_PP_IIF(CONTRACT_AUX_CONFIG_VIRTUAL_SPECIFIERS_01, \
+ CONTRACT_AUX_FUNCTION_OVERRIDE_AND_NEW_AND_FINAL_ \
+ , \
+ BOOST_PP_TUPLE_EAT(4) \
+ )(id, tpl, k, f)
+
+#define CONTRACT_AUX_CODE_FUNCTION_VIRTUAL_FINAL_AND_SUBCONTRACT_( \
+ id, tpl, k, f) \
+ CONTRACT_AUX_CODE_VIRTUAL_TAG(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_FINAL_TAG(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_SUBCONTRACT_PREPOSTCONDITION_FROM_BASES(id, tpl, k, f)
+
+#define CONTRACT_AUX_FUNCTION_FORWARD_DECL_(id, tpl, k, f) \
+ CONTRACT_AUX_CODE_FUNC_DECL(id, tpl, k, f \
+ , 0 /* fwd decl never friend (only contracted func def) */\
+ , 1 /* with defaults */ \
+ ) ; /* fwd decl `;` */
+
+// Expand to 1 if the specific function kind has contracts enabled, 0 otherwise.
+#define CONTRACT_AUX_FUNCTION_HAS_CONTRACT_(k, f) \
+ /* order of this matters, start with free func */ \
+ BOOST_PP_IIF(CONTRACT_AUX_PP_FUNC_KIND_IS_FREE_FUNCTION(k, f), \
+ BOOST_PP_BITOR( \
+ CONTRACT_AUX_CONFIG_PRECONDITIONS_01 \
+ , CONTRACT_AUX_CONFIG_POSTCONDITIONS_01 \
+ ) \
+ /* not free func then dtor, ctor, or (static or not) member func */ \
+ , BOOST_PP_IIF(CONTRACT_AUX_PP_FUNC_KIND_IS_DESTRUCTOR(k), \
+ CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01 \
+ /* not free func or dtor then ctor or (static or not) member func */ \
+ , \
+ BOOST_PP_BITOR( \
+ CONTRACT_AUX_CONFIG_PRECONDITIONS_01 \
+ , BOOST_PP_BITOR( \
+ CONTRACT_AUX_CONFIG_POSTCONDITIONS_01 \
+ , CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01 \
+ ) \
+ ) \
+ ))
+
+#define CONTRACT_AUX_FUNCTION_NEEDS_BODY_(k, f) \
+ BOOST_PP_BITOR( \
+ /* contracts are enabled for this function */ \
+ CONTRACT_AUX_FUNCTION_HAS_CONTRACT_(k, f) \
+ /* or, contracts off but (constructor) member initializers have */ \
+ /* constructor-try blocks for its inits */ \
+ /* POLICY: Function-try block only apply to exception */ \
+ /* thrown by the body (see N1962) so they are */ \
+ /* programmed outside the macros for functions and */ \
+ /* destructor (so to have no extra body call overhead */ \
+ /* when contracts are off); they need to be */ \
+ /* programmed within the macros for constructor */ \
+ /* because member initializers are programmed within */ \
+ /* the macros constructor try blocks need to apply */ \
+ /* to exception thrown by both the constructor body */ \
+ /* and its initializers (so this library internally */ \
+ /* disables constructor-try-block handlers when not */ \
+ /* executing constructor initializers or body) */ \
+ , BOOST_PP_LIST_IS_CONS(CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES(f)) \
+ )
+
+// PUBLIC //
+
+#define CONTRACT_AUX_FUNCTION_POSITIONAL_PARAMS_CONTRACT( \
+ id, tpl, k, f, body_func) \
+ /* NOTE: Some of these tpl is OR with IS_TEMPLATE so _TPL does */ \
+ /* not have to (but it still can) be used with function templates */ \
+ BOOST_PP_IIF( \
+ BOOST_PP_BITAND( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_NONSTATIC_MEMBER_FUNCTION(k, f) \
+ , BOOST_PP_BITOR( \
+ CONTRACT_AUX_CONFIG_PRECONDITIONS_01 \
+ , BOOST_PP_BITOR( \
+ CONTRACT_AUX_CONFIG_POSTCONDITIONS_01 \
+ , CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01 \
+ ) \
+ ) \
+ ), \
+ /* NOTE: virtual specifiers (override, new, and final) are enabled */ \
+ /* if and only if contract compilation is enabled because they */ \
+ /* need to use the separation between body and contracted function */ \
+ /* in order to program their static assertion check (necessary to */ \
+ /* access actual template param type for function templates) */ \
+ CONTRACT_AUX_CODE_FUNCTION_VIRTUAL_FINAL_AND_SUBCONTRACT_ \
+ , \
+ BOOST_PP_TUPLE_EAT(4) \
+ )(id, tpl, k, f) \
+ BOOST_PP_IIF(CONTRACT_AUX_PP_FUNC_KIND_IS_MEMBER(k, f), \
+ BOOST_PP_TUPLE_EAT(4) \
+ , \
+ /* NOTE: non-members are fwd decl up here so pre and post can call */ \
+ /* func itself (e.g., to recursively check factorial result) */ \
+ CONTRACT_AUX_FUNCTION_FORWARD_DECL_ \
+ )(id, tpl, k, f) \
+ BOOST_PP_IIF(CONTRACT_AUX_FUNCTION_HAS_CONTRACT_(k, f), \
+ CONTRACT_AUX_CODE_SIGNATURE \
+ , \
+ BOOST_PP_TUPLE_EAT(4) \
+ )(id, tpl, k, f) \
+ BOOST_PP_IIF(CONTRACT_AUX_CONFIG_PRECONDITIONS_01, \
+ CONTRACT_AUX_CODE_PRECONDITION \
+ , \
+ BOOST_PP_TUPLE_EAT(4) \
+ )(id, tpl /* don't force tpl for templates */, k, f) \
+ BOOST_PP_IIF(CONTRACT_AUX_CONFIG_POSTCONDITIONS_01, \
+ CONTRACT_AUX_FUNCTION_POSTCONDITION_AND_OLDOF_ \
+ , \
+ BOOST_PP_TUPLE_EAT(4) \
+ )(id, tpl /* don't force tpl for templates */, k, f)
+
+#define CONTRACT_AUX_FUNCTION_POSITIONAL_PARAMS_CONTRACTED_FUNC( \
+ id, tpl, k, f, body_func) \
+ BOOST_PP_IIF( \
+ BOOST_PP_BITAND( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_FREE_FUNCTION(k, f) \
+ , BOOST_PP_BITOR( \
+ CONTRACT_AUX_CONFIG_PRECONDITIONS_01 \
+ , CONTRACT_AUX_CONFIG_POSTCONDITIONS_01 \
+ ) \
+ ), \
+ /* NOTE: Free func body needs to be forward declared so body func */ \
+ /* ptr can be passed to the contract caller even if the actual */ \
+ /* body func will be defined later by the user (this is not the */ \
+ /* case for member func because within a class symbols are visible */ \
+ /* regardless of their declaration order) */ \
+ CONTRACT_AUX_FUNCTION_BODY_FORWARD_DECL_ \
+ , \
+ BOOST_PP_TUPLE_EAT(5) \
+ )(id, tpl, k, f, body_func) \
+ /* actual func always decl (not matter if contracts or not) */ \
+ CONTRACT_AUX_CODE_FUNC_DECL(id, tpl, k, f \
+ /* contracted function of a friend decl is the only part that */ \
+ /* retains friendship (rest of contract is as for static member) */ \
+ , BOOST_PP_COMPL(BOOST_PP_IS_EMPTY( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_FRIEND(f))) \
+ /* default params for members while for non-members defaults */ \
+ /* already specified by fwd decl above */ \
+ , CONTRACT_AUX_PP_FUNC_KIND_IS_MEMBER(k, f) \
+ ) \
+ BOOST_PP_IIF(CONTRACT_AUX_FUNCTION_NEEDS_BODY_(k, f), \
+ /* def calls body */ \
+ CONTRACT_AUX_CODE_FUNC_DEF \
+ , BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_INITIALIZERS(f)), \
+ /* def init members (ctor only) and possibly calls body */ \
+ CONTRACT_AUX_CODE_FUNC_DEF \
+ , \
+ BOOST_PP_TUPLE_EAT(5) \
+ ))(id, tpl /* don't force tpl for template */, k, f, body_func)
+
+#define CONTRACT_AUX_FUNCTION_BODY_FUNC(k, f) \
+ CONTRACT_AUX_CODE_NAME_POSTFIXED( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_CONSTRUCTOR(k), \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_DESTRUCTOR(k), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_OPERATOR(f), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_NAME(f), \
+ (body))
+
+// Named parameters need to force body even if all contracts off.
+#define CONTRACT_AUX_FUNCTION_POSITIONAL_PARAMS_BODY_DECL_FORCE( \
+ id, tpl, k, f, body_func, force_body) \
+ BOOST_PP_IIF(force_body, \
+ CONTRACT_AUX_CODE_BODY_DECL \
+ , \
+ BOOST_PP_TUPLE_EAT(5) \
+ )(id, tpl, k, f, body_func) \
+ /* POLICY: Exception spec only apply to exceptions thrown by the body */ \
+ /* and not to exceptions thrown by contract handlers (if they are */ \
+ /* redefined to throw) or by this library implementation code */ \
+ CONTRACT_AUX_CODE_EXCEPTION_SPEC(id, tpl, k, f) \
+ /* user's function definition { ... } (and try-blocks) follows here */
+
+#define CONTRACT_AUX_FUNCTION_POSITIONAL_PARAMS_BODY_DECL( \
+ id, tpl, k, f, body_func) \
+ CONTRACT_AUX_FUNCTION_POSITIONAL_PARAMS_BODY_DECL_FORCE( \
+ id, tpl, k, f, body_func, CONTRACT_AUX_FUNCTION_NEEDS_BODY_(k, f))
+
+#define CONTRACT_AUX_FUNCTION_POSITIONAL_PARAMS( \
+ id, tpl, k, f, body_func) \
+ CONTRACT_AUX_FUNCTION_POSITIONAL_PARAMS_CONTRACT(id, tpl, k, f, body_func) \
+ CONTRACT_AUX_FUNCTION_POSITIONAL_PARAMS_CONTRACTED_FUNC(id, tpl, k, f, \
+ body_func) \
+ CONTRACT_AUX_FUNCTION_POSITIONAL_PARAMS_BODY_DECL(id, tpl, k, f, body_func)
+
+#define CONTRACT_AUX_FUNCTION(id, tpl, k, f) \
+ BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(BOOST_PP_LIST_APPEND( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_NAMED( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f)), \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_DEDUCED( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(f)))), \
+ CONTRACT_AUX_CODE_NAMED_PARAMS_FUNC \
+ , \
+ CONTRACT_AUX_FUNCTION_POSITIONAL_PARAMS \
+ )(id, tpl, k, f, CONTRACT_AUX_FUNCTION_BODY_FUNC(k, f))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/loop_variant.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/loop_variant.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,32 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_MACRO_LOOP_VARIANT_HPP_
+#define CONTRACT_AUX_MACRO_LOOP_VARIANT_HPP_
+
+#include <contract/aux_/macro/code_/loop_variant.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_LOOP_VARIANT_(id, tpl, expr) \
+ CONTRACT_AUX_CODE_LOOP_VARIANT(id, tpl, BOOST_PP_SEQ_HEAD(expr))
+
+// PUBLIC //
+
+#define CONTRACT_AUX_LOOP_VARIANT(id, tpl, expr) \
+ BOOST_PP_IIF(BOOST_PP_COMPL(CONTRACT_AUX_CONFIG_LOOP_VARIANTS_01), \
+ BOOST_PP_TUPLE_EAT(3) \
+ , BOOST_PP_IIF(BOOST_PP_EQUAL(BOOST_PP_SEQ_SIZE(expr), 1), \
+ CONTRACT_AUX_LOOP_VARIANT_ \
+ , \
+ CONTRACT_AUX_MPL_ASSERT_MSG(false, \
+ ERROR_too_many_loop_variant_parameters, ()); \
+ BOOST_PP_TUPLE_EAT(3) \
+ ))(id, tpl, expr)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/macro/parameter.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/macro/parameter.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,40 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_PARAMETER_HPP_
+#define CONTRACT_AUX_PARAMETER_HPP_
+
+// PUBLIC //
+
+#define CONTRACT_AUX_PARAMETER_BOOST_TYPE(param_name) \
+ /* use this name instead of Boost.Parameter's ..._type so (1) the same */ \
+ /* can be used in both the parameter requirement metafunction, (2) */ \
+ /* users don't have to use tag::paran_name::_ that explictly specifies */ \
+ /* the tag namespace, and (3) limits the use of ..._type which can lead */ \
+ /* to reserved symbols for param names ending with _ */ \
+ CONTRACT_AUX_SYMBOL( (param_name)(type) )
+
+#define CONTRACT_AUX_PARAMETER_BOOST_PARAM( \
+ tag_namespace, passing_name, name) \
+ BOOST_PARAMETER_NAME( (passing_name, tag_namespace) name ) \
+ /* this hides the use of the tag namespace and allows to use the same */ \
+ /* type name in type predicates as outside the parameter list */ \
+ typedef tag_namespace::name::_ \
+ CONTRACT_AUX_PARAMETER_BOOST_TYPE(name);
+
+#define CONTRACT_AUX_PARAMETER_BOOST_TEMPLATE_PARAM( \
+ tag_namespace, passing_name, name) \
+ /* there's no Boost.Parameter API that allows to specify namespace and */ \
+ /* passing name so we need to use Boost.Parameter details directly */ \
+ namespace tag_namespace { struct name; } \
+ template< typename T > \
+ struct passing_name \
+ : ::boost::parameter::template_keyword<tag_namespace::name, T> \
+ {};
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/mpl_assert.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/mpl_assert.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,33 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_MPL_ASSERT_HPP_
+#define CONTRACT_AUX_MPL_ASSERT_HPP_
+
+#include <boost/mpl/assert.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_MPL_ASSERT_MSG_(counter, condition, message, types) \
+ /* unfortunately, need to use Boost.MPL implementation detail */ \
+ /* to pass unique ID (not just __LINE__) so this macro can be expanded */ \
+ /* multiple times on the same line if with different IDs */ \
+ BOOST_MPL_ASSERT_MSG_IMPL( \
+ BOOST_PP_CAT(BOOST_PP_CAT(message, _id_), counter), \
+ condition, message, types)
+
+// PUBLIC //
+
+// Allow to expand multiple assert macros on same line (without name clashes).
+#define CONTRACT_AUX_MPL_ASSERT_MSG(condition, message, types) \
+ CONTRACT_AUX_MPL_ASSERT_MSG_( \
+ BOOST_MPL_AUX_PP_COUNTER(), /* uses Boost.MPL impl detail */ \
+ condition, message, types)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/named_params.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/named_params.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,88 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_NAMED_PARAMS_HPP_
+#define CONTRACT_AUX_NAMED_PARAMS_HPP_
+
+#include <boost/parameter.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace contract { namespace aux { namespace named_params {
+
+// To declare default value for required parameters (which have no default).
+struct no_default
+{
+ // Dummy param so it can be decl as a default parameter with `... = 0`.
+ no_default ( int const& ) {}
+};
+
+// Hold Boost.Parameter arg_list so it can be set during ctor member inits.
+template< typename ArgList >
+struct args
+{
+ // Dummy param so it can be decl as a default parameter with `... = 0`.
+ args ( int const& ) : ptr_() {}
+ int set ( ArgList const& arg_list ) {
+ ptr_ = boost::shared_ptr<ArgList>(new ArgList(arg_list));
+ return 0;
+ }
+ ArgList& get ( void ) { return *(ptr_.get()); }
+private:
+ boost::shared_ptr<ArgList> ptr_;
+};
+
+template< typename ArgList, typename Tag >
+class find_tag {
+ typedef typename ArgList::key_type current_tag;
+ typedef typename ArgList::tail_type next_elem;
+ typedef typename boost::mpl::if_<boost::is_same<current_tag, Tag>,
+ boost::mpl::identity<ArgList>
+ ,
+ find_tag<next_elem, Tag>
+ >::type elem;
+public:
+ typedef typename elem::type type;
+};
+
+template< typename Tag >
+struct find_tag<boost::parameter::aux::empty_arg_list, Tag> {
+ typedef boost::parameter::aux::empty_arg_list type;
+};
+
+template< typename ArgList, typename Tag, typename Default = no_default >
+class arg_type {
+ template< typename ArgElem >
+ struct arg_reference {
+ // NOTE: Using reference here prevent to assign in parameters within
+ // the body (this makes in parameters equivalent to const&). If
+ // value_type is used instead of reference here, in-parameters can be
+ // assigned with the body but their changes are not visible to the
+ // calling scope (this makes in parameters equivalent to passing by
+ // value but not by const&). In either case, in-out and out parameters
+ // are passed by (non-const) & so their changes are visible to the
+ // calling scope. Following Ada and Boost.Parameter semantics, in
+ // parameters should be const& (and not just passed by value) so
+ // reference and not value_type is correctly used here.
+ typedef typename ArgElem::reference type;
+ };
+ typedef typename find_tag<ArgList, Tag>::type arg_elem;
+public:
+ typedef typename boost::mpl::if_<boost::is_same<arg_elem,
+ boost::parameter::aux::empty_arg_list>,
+ boost::mpl::identity<Default>
+ ,
+ arg_reference<arg_elem>
+ >::type::type type;
+};
+
+}}} // namespace contract::aux::named_params
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/oldof.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/oldof.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,42 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_OLDOF_HPP_
+#define CONTRACT_AUX_OLDOF_HPP_
+
+#include <contract/oldof.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/if.hpp>
+
+namespace contract { namespace aux {
+
+// Must be empty struct so any attempt to use it will generate a compiler-error,
+// plus struct name is used to report error message.
+struct ERROR_missing_const_copy_constructor_for_oldof_type {
+ // Has dummy const-correct copy constructor from any type so it will
+ // never fail an old-of copy<>.
+ template< typename T >
+ ERROR_missing_const_copy_constructor_for_oldof_type( T const& ) {}
+};
+
+// Select type above iff a type T has no old-of (not has_oldof<T>) so the
+// CONTRACT_OLDOF declaration will compile but any attempt to use the old-of
+// value for the empty struct type above in an assertion will generate a
+// compiler-error unless the assertion adds has_oldof to its requirements.
+template< typename T >
+struct oldof {
+ typedef typename boost::mpl::if_< has_oldof<T>,
+ T
+ ,
+ ERROR_missing_const_copy_constructor_for_oldof_type
+ >::type type;
+};
+
+}} // namespace contract::aux
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/preprocessor/func_kind.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/preprocessor/func_kind.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,72 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_PP_FUNC_KIND_HPP_
+#define CONTRACT_AUX_PP_FUNC_KIND_HPP_
+
+#include <contract/aux_/config.hpp>
+#include <contract/detail/preprocessor/traits/func.hpp> // f
+#include <boost/preprocessor/comparison/equal.hpp>
+
+// PUBLIC //
+
+// Kind `k` enumeration.
+#define CONTRACT_AUX_PP_FUNC_KIND_CONSTRUCTOR 1
+#define CONTRACT_AUX_PP_FUNC_KIND_DESTRUCTOR 2
+#define CONTRACT_AUX_PP_FUNC_KIND_FUNCTION 3
+
+#define CONTRACT_AUX_PP_FUNC_KIND_IS_CONSTRUCTOR(k) \
+ BOOST_PP_EQUAL(k, CONTRACT_AUX_PP_FUNC_KIND_CONSTRUCTOR)
+
+#define CONTRACT_AUX_PP_FUNC_KIND_IS_DESTRUCTOR(k) \
+ BOOST_PP_EQUAL(k, CONTRACT_AUX_PP_FUNC_KIND_DESTRUCTOR)
+
+#define CONTRACT_AUX_PP_FUNC_KIND_IS_FUNCTION(k) \
+ BOOST_PP_EQUAL(k, CONTRACT_AUX_PP_FUNC_KIND_FUNCTION)
+
+#define CONTRACT_AUX_PP_FUNC_KIND_IS_MEMBER(k, f) \
+ /* FUTURE: leave this macro here because in the future members could be */ \
+ /* detected using special API macros (CONTRACT_MEMBER_...) thus using k */ \
+ /* instead of access level in f */ \
+ BOOST_PP_COMPL(BOOST_PP_IS_EMPTY(CONTRACT_DETAIL_PP_FUNC_TRAITS_ACCESS(f)))
+
+#define CONTRACT_AUX_PP_FUNC_KIND_IS_NONSTATIC_MEMBER_FUNCTION(k, f) \
+ BOOST_PP_BITAND( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_FUNCTION(k) \
+ , BOOST_PP_BITAND( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_MEMBER(k, f) \
+ , BOOST_PP_BITAND( \
+ BOOST_PP_IS_EMPTY(CONTRACT_DETAIL_PP_FUNC_TRAITS_STATIC(f)) \
+ /* friend members are also contracted as static members */ \
+ , BOOST_PP_IS_EMPTY(CONTRACT_DETAIL_PP_FUNC_TRAITS_FRIEND(f)) \
+ ) \
+ ) \
+ )
+
+#define CONTRACT_AUX_PP_FUNC_KIND_IS_STATIC_MEMBER_FUNCTION(k, f) \
+ BOOST_PP_BITAND( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_FUNCTION(k) \
+ , BOOST_PP_BITAND( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_MEMBER(k, f) \
+ , BOOST_PP_BITOR( \
+ BOOST_PP_COMPL(BOOST_PP_IS_EMPTY( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_STATIC(f))) \
+ /* friend members are also contracted as static members */ \
+ , BOOST_PP_COMPL(BOOST_PP_IS_EMPTY( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_FRIEND(f))) \
+ ) \
+ ) \
+ )
+
+#define CONTRACT_AUX_PP_FUNC_KIND_IS_FREE_FUNCTION(k, f) \
+ BOOST_PP_BITAND( \
+ CONTRACT_AUX_PP_FUNC_KIND_IS_FUNCTION(k) \
+ , BOOST_PP_COMPL(CONTRACT_AUX_PP_FUNC_KIND_IS_MEMBER(k, f)) \
+ )
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/preprocessor/iteration/arity_1.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/preprocessor/iteration/arity_1.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,11 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#undef CONTRACT_AUX_PP_ITERATION_ARITY
+
+#define CONTRACT_AUX_PP_ITERATION_ARITY BOOST_PP_FRAME_ITERATION(1)
+
Added: sandbox/contract/include/contract/aux_/preprocessor/iteration/cv_member_2.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/preprocessor/iteration/cv_member_2.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,35 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#undef CONTRACT_AUX_PP_ITERATION_IS_MEMBER
+#undef CONTRACT_AUX_PP_ITERATION_MEMBER_CONST
+#undef CONTRACT_AUX_PP_ITERATION_MEMBER_VOLATILE
+
+#if BOOST_PP_FRAME_ITERATION(2) == 0 // Free func.
+# define CONTRACT_AUX_PP_ITERATION_IS_MEMBER 0
+# define CONTRACT_AUX_PP_ITERATION_MEMBER_CONST /* empty */
+# define CONTRACT_AUX_PP_ITERATION_MEMBER_VOLATILE /* empty */
+#elif BOOST_PP_FRAME_ITERATION(2) == 1 // Member func.
+# define CONTRACT_AUX_PP_ITERATION_IS_MEMBER 1
+# define CONTRACT_AUX_PP_ITERATION_MEMBER_CONST /* empty */
+# define CONTRACT_AUX_PP_ITERATION_MEMBER_VOLATILE /* empty */
+#elif BOOST_PP_FRAME_ITERATION(2) == 2 // Const member func.
+# define CONTRACT_AUX_PP_ITERATION_IS_MEMBER 1
+# define CONTRACT_AUX_PP_ITERATION_MEMBER_CONST const
+# define CONTRACT_AUX_PP_ITERATION_MEMBER_VOLATILE /* empty */
+#elif BOOST_PP_FRAME_ITERATION(2) == 3 // Volatile member func.
+# define CONTRACT_AUX_PP_ITERATION_IS_MEMBER 1
+# define CONTRACT_AUX_PP_ITERATION_MEMBER_CONST /* empty */
+# define CONTRACT_AUX_PP_ITERATION_MEMBER_VOLATILE volatile
+#elif BOOST_PP_FRAME_ITERATION(2) == 4 // Const volatile member func.
+# define CONTRACT_AUX_PP_ITERATION_IS_MEMBER 1
+# define CONTRACT_AUX_PP_ITERATION_MEMBER_CONST const
+# define CONTRACT_AUX_PP_ITERATION_MEMBER_VOLATILE volatile
+#else
+# error "INTERNAL ERROR: invalid iteration index (in frame 2)"
+#endif
+
Added: sandbox/contract/include/contract/aux_/preprocessor/iteration/params.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/preprocessor/iteration/params.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,20 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_PP_ITERATION_PARAMS_HPP_
+#define CONTRACT_AUX_PP_ITERATION_PARAMS_HPP_
+
+#include <contract/config.hpp>
+
+#define CONTRACT_AUX_PP_ITERATION_PARAMS_ARITY(file) \
+ (3, (0, CONTRACT_CONFIG_FUNCTION_ARITY_MAX, file))
+
+#define CONTRACT_AUX_PP_ITERATION_PARAMS_CV_MEMBER(file) \
+ (3, (0, 4, file))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/result_const.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/result_const.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,32 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_RESULT_CONST_HPP_
+#define CONTRACT_AUX_RESULT_CONST_HPP_
+
+#include <contract/aux_/arg_const.hpp>
+#include <boost/type_traits/is_void.hpp>
+#include <boost/mpl/if.hpp>
+
+namespace contract { namespace aux {
+
+class void_result {}; // Must be copyable so to be returned.
+
+template< typename Result >
+struct result_const {
+ typedef typename arg_const <
+ typename boost::mpl::if_<boost::is_void<Result>,
+ void_result
+ , Result
+ >::type
+ >::type type;
+};
+
+}} // namespace contract::aux
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/signature_traits.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/signature_traits.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,284 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#if !BOOST_PP_IS_ITERATING
+# ifndef CONTRACT_AUX_SIGNATURE_TRAITS_HPP_
+# define CONTRACT_AUX_SIGNATURE_TRAITS_HPP_
+
+#include <contract/config.hpp>
+#include <contract/aux_/arg_const.hpp>
+#include <contract/aux_/result_const.hpp>
+#include <contract/aux_/mpl_assert.hpp>
+#include <contract/aux_/preprocessor/iteration/params.hpp>
+#include <boost/function.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+#include <boost/preprocessor/control/expr_iif.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+#include <boost/preprocessor/repetition/enum.hpp>
+#include <boost/preprocessor/iteration/iterate.hpp>
+#include <list>
+
+#define CONTRACT_comma_class_Base(z, n, unused) \
+ , class BOOST_PP_CAT(Base, n)
+#define CONTRACT_comma_Base(z, n, unused) \
+ , BOOST_PP_CAT(Base, n)
+
+#define CONTRACT_Arg(z, n, unused) \
+ BOOST_PP_CAT(Arg, n)
+#define CONTRACT_comma_typename_Arg(z, n, unused) \
+ , typename BOOST_PP_CAT(Arg, n)
+#define CONTRACT_typedef_arg_types(z, n, unused) \
+ typedef BOOST_PP_CAT(Arg, n) BOOST_PP_CAT(arg_type, n) ; \
+ typedef typename arg_const< BOOST_PP_CAT(Arg, n) >::type \
+ BOOST_PP_CAT(const_arg_type, n) ;
+#define CONTRACT_const_arg_type(z, n, unused) \
+ BOOST_PP_CAT(const_arg_type, n)
+#define CONTRACT_comma_const_arg_type(z, n, unused) \
+ , BOOST_PP_CAT(const_arg_type, n)
+
+#define CONTRACT_typedef_constructor_and_subcontracted_oldof_type() \
+ typedef \
+ bound_postcondition_type \
+ ( * constructor_oldof_type ) \
+ ( \
+ body_type \
+ , const_obj_type const \
+ BOOST_PP_REPEAT(CONTRACT_AUX_PP_ITERATION_ARITY, \
+ CONTRACT_comma_const_arg_type, ~) \
+ ) \
+ ; \
+ typedef \
+ std::list< bound_postcondition_type > \
+ ( Class:: \
+ * subcontracted_oldof_type ) \
+ ( \
+ body_type \
+ BOOST_PP_REPEAT(CONTRACT_AUX_PP_ITERATION_ARITY, \
+ CONTRACT_comma_const_arg_type, ~) \
+ ) \
+ const \
+ CONTRACT_AUX_PP_ITERATION_MEMBER_VOLATILE \
+ ;
+#define CONTRACT_typedef_derived_traits_base(z, n, unused) \
+ typedef \
+ signature_traits< \
+ Result \
+ ( BOOST_PP_CAT(Base, n) :: * ) \
+ ( BOOST_PP_ENUM(CONTRACT_AUX_PP_ITERATION_ARITY, \
+ CONTRACT_Arg, ~) ) \
+ CONTRACT_AUX_PP_ITERATION_MEMBER_CONST \
+ CONTRACT_AUX_PP_ITERATION_MEMBER_VOLATILE \
+ > \
+ BOOST_PP_CAT(base, n) \
+ ;
+
+namespace contract { namespace aux {
+
+template< typename F >
+struct signature_traits {
+ CONTRACT_AUX_MPL_ASSERT_MSG(sizeof(F) == 0,
+ ERROR_too_many_function_parameters_see_CONTRACT_CONFIG_FUNCTION_ARITY_MAX,
+ (types< F >));
+};
+
+// NOTE: In principle, this and the template above could be merged into one
+// making the base tparam optional (providing a default parameter like
+// void_base for them). Then template specializations could be used to program
+// derived_signature_traits as a special signature_traits that specified
+// non-void base types. This was tried, it worked on GCC but too many
+// specializations confused MSVC (plus too many specializations might slow down
+// the compiler more).
+template<
+ typename F
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX,
+ CONTRACT_comma_class_Base, ~)
+>
+struct derived_signature_traits {
+ CONTRACT_AUX_MPL_ASSERT_MSG(sizeof(F) == 0,
+ ERROR_too_many_function_parameters_see_CONTRACT_CONFIG_FUNCTION_ARITY_MAX,
+ (types< F /* can't print bases b/c could be more than 4 */ >));
+};
+
+}} // namespace contract::aux
+
+# define BOOST_PP_ITERATION_PARAMS_1 \
+ CONTRACT_AUX_PP_ITERATION_PARAMS_ARITY( \
+ "contract/aux_/signature_traits.hpp")
+# include BOOST_PP_ITERATE()
+# undef CONTRACT_comma_class_Base
+# undef CONTRACT_comma_Base
+# undef CONTRACT_Arg
+# undef CONTRACT_comma_typename_Arg
+# undef CONTRACT_typedef_arg
+# undef CONTRACT_const_arg_type
+# undef CONTRACT_comma_const_arg_type
+# undef CONTRACT_typedef_constructor_and_subcontracted_oldof_type
+# undef CONTRACT_typedef_derived_traits_base
+# endif // #include guard
+#elif BOOST_PP_ITERATION_DEPTH() == 1 // arity iteration
+# define BOOST_PP_ITERATION_PARAMS_2 \
+ CONTRACT_AUX_PP_ITERATION_PARAMS_CV_MEMBER( \
+ "contract/aux_/signature_traits.hpp")
+# include BOOST_PP_ITERATE()
+#elif BOOST_PP_ITERATION_DEPTH() == 2 // free, member, cv iteration
+// Define CONTRACT_AUX_PP_ITERATION_ARITY (from iteration frame 1).
+# include <contract/aux_/preprocessor/iteration/arity_1.hpp>
+// Define ..._IS_MEMBER, ..._MEMBER_CONST, and ..._MEMBER_VOLATILE (iter 2).
+# include <contract/aux_/preprocessor/iteration/cv_member_2.hpp>
+
+namespace contract { namespace aux {
+
+template<
+ typename Result
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_PP_ITERATION_IS_MEMBER)
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_ITERATION_IS_MEMBER, class Class)
+ BOOST_PP_REPEAT(CONTRACT_AUX_PP_ITERATION_ARITY,
+ CONTRACT_comma_typename_Arg, ~)
+>
+struct signature_traits<
+ Result
+ ( BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_ITERATION_IS_MEMBER, Class::)
+ * )
+ ( BOOST_PP_ENUM(CONTRACT_AUX_PP_ITERATION_ARITY, CONTRACT_Arg, ~) )
+ CONTRACT_AUX_PP_ITERATION_MEMBER_CONST
+ CONTRACT_AUX_PP_ITERATION_MEMBER_VOLATILE
+> {
+ // Function types.
+ typedef Result result_type;
+ typedef typename result_const< Result >::type const_result_type;
+ BOOST_PP_REPEAT(CONTRACT_AUX_PP_ITERATION_ARITY,
+ CONTRACT_typedef_arg_types, ~)
+
+ // Object types.
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_ITERATION_IS_MEMBER,
+ typedef Class class_type;
+ typedef Class CONTRACT_AUX_PP_ITERATION_MEMBER_CONST
+ CONTRACT_AUX_PP_ITERATION_MEMBER_VOLATILE*
+ cv_qualified_obj_type;
+ typedef Class const CONTRACT_AUX_PP_ITERATION_MEMBER_VOLATILE*
+ const_obj_type;
+ )
+
+ // Body function types.
+ typedef
+ Result
+ ( BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_ITERATION_IS_MEMBER, Class::)
+ * body_type )
+ ( BOOST_PP_ENUM(CONTRACT_AUX_PP_ITERATION_ARITY, CONTRACT_Arg, ~) )
+ CONTRACT_AUX_PP_ITERATION_MEMBER_CONST
+ CONTRACT_AUX_PP_ITERATION_MEMBER_VOLATILE
+ ;
+
+ // Precondition function types.
+ typedef
+ void
+ ( BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_ITERATION_IS_MEMBER, Class::)
+ * precondition_type )
+ (
+ body_type
+ BOOST_PP_REPEAT(CONTRACT_AUX_PP_ITERATION_ARITY,
+ CONTRACT_comma_const_arg_type, ~)
+ )
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_ITERATION_IS_MEMBER, const)
+ CONTRACT_AUX_PP_ITERATION_MEMBER_VOLATILE
+ ;
+ typedef
+ void
+ (* static_precondition_type)
+ (
+ body_type
+ BOOST_PP_REPEAT(CONTRACT_AUX_PP_ITERATION_ARITY,
+ CONTRACT_comma_const_arg_type, ~)
+ )
+ ;
+
+ // Postcondition (and old-of) function types.
+ typedef
+ boost::function<
+ void
+ (
+ BOOST_PP_ENUM(CONTRACT_AUX_PP_ITERATION_ARITY,
+ CONTRACT_const_arg_type, ~)
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_PP_ITERATION_ARITY)
+ const_result_type
+ )
+ >
+ bound_postcondition_type
+ ;
+ typedef
+ bound_postcondition_type
+ ( BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_ITERATION_IS_MEMBER, Class::)
+ * oldof_type )
+ (
+ body_type
+ BOOST_PP_REPEAT(CONTRACT_AUX_PP_ITERATION_ARITY,
+ CONTRACT_comma_const_arg_type, ~)
+ )
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_ITERATION_IS_MEMBER, const)
+ CONTRACT_AUX_PP_ITERATION_MEMBER_VOLATILE
+ ;
+ BOOST_PP_IIF(CONTRACT_AUX_PP_ITERATION_IS_MEMBER,
+ CONTRACT_typedef_constructor_and_subcontracted_oldof_type \
+ , \
+ BOOST_PP_EMPTY \
+ )()
+
+ // NOTE: Static class invariant is defined even if not a member because
+ // this signature class for free-functions is also used for static member
+ // functions (for simplicity so to avoid defining another set signatures
+ // and because static member signature does not need class/object types).
+ typedef void ( * static_class_invariant_type ) ( ) ;
+
+ // Dynamic const or const volatile class invariant.
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_ITERATION_IS_MEMBER,
+ typedef void ( Class:: * class_invariant_type ) ( ) const
+ CONTRACT_AUX_PP_ITERATION_MEMBER_VOLATILE ;
+ )
+};
+
+template<
+ typename Result
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_PP_ITERATION_IS_MEMBER)
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_ITERATION_IS_MEMBER, class Class)
+ BOOST_PP_REPEAT(CONTRACT_AUX_PP_ITERATION_ARITY,
+ CONTRACT_comma_typename_Arg, ~)
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX,
+ CONTRACT_comma_class_Base, ~)
+>
+struct derived_signature_traits<
+ Result
+ ( BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_ITERATION_IS_MEMBER, Class::)
+ * )
+ ( BOOST_PP_ENUM(CONTRACT_AUX_PP_ITERATION_ARITY, CONTRACT_Arg, ~) )
+ CONTRACT_AUX_PP_ITERATION_MEMBER_CONST
+ CONTRACT_AUX_PP_ITERATION_MEMBER_VOLATILE
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX, CONTRACT_comma_Base, ~)
+>
+ : signature_traits<
+ Result
+ ( BOOST_PP_EXPR_IIF(CONTRACT_AUX_PP_ITERATION_IS_MEMBER,
+ Class::)
+ * )
+ ( BOOST_PP_ENUM(CONTRACT_AUX_PP_ITERATION_ARITY,
+ CONTRACT_Arg, ~) )
+ CONTRACT_AUX_PP_ITERATION_MEMBER_CONST
+ CONTRACT_AUX_PP_ITERATION_MEMBER_VOLATILE
+ >
+{
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX,
+ CONTRACT_typedef_derived_traits_base, ~)
+};
+
+}} // namespace contract::aux
+
+#else // iteration
+# error "INTERNAL ERROR: iteration index out-of-range"
+#endif // iteration
+
Added: sandbox/contract/include/contract/aux_/subcontract/class_invariant.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/subcontract/class_invariant.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,74 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#if !BOOST_PP_IS_ITERATING
+# ifndef CONTRACT_AUX_SUBCONTRACT_CLASS_INVARIANT_HPP_
+# define CONTRACT_AUX_SUBCONTRACT_CLASS_INVARIANT_HPP_
+
+#include <contract/config.hpp>
+#include <contract/aux_/subcontract/from.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+#include <boost/preprocessor/iteration/iterate.hpp>
+
+#define CONTRACT_class_Base(z, n, unused) \
+ , class BOOST_PP_CAT(Base, n)
+#define CONTRACT_comma_base_params(z, n, unused) \
+ , BOOST_PP_CAT(Base, n) const CONTRACT_iteration_volatile* const \
+ BOOST_PP_CAT(base, n) \
+ , void (BOOST_PP_CAT(Base, n)::* const \
+ BOOST_PP_CAT(sub_class_inv, n)) ( ) \
+ const CONTRACT_iteration_volatile
+
+#define CONTRACT_base_class_inv_check(z, n, unused) \
+ if(is_subcontracted_from< Class, BOOST_PP_CAT(Base, n) >::value) { \
+ (BOOST_PP_CAT(base, n)->*BOOST_PP_CAT(sub_class_inv, n))(); \
+ }
+
+# define BOOST_PP_ITERATION_PARAMS_1 (3, (0, 1, \
+ "contract/aux_/subcontract/class_invariant.hpp"))
+# include BOOST_PP_ITERATE() // Iterate over volatile or not.
+# undef CONTRACT_class_Base
+# undef CONTRACT_comma_base_params
+# undef CONTRACT_base_class_inv_check
+# endif // #include guard
+#elif BOOST_PP_ITERATION_DEPTH() == 1
+# if BOOST_PP_FRAME_ITERATION(1) == 0
+# define CONTRACT_iteration_volatile /* empty */
+# elif BOOST_PP_FRAME_ITERATION(1) == 1
+# define CONTRACT_iteration_volatile volatile
+# else
+# error "INTERNAL ERROR: iteration index out-of-range"
+# endif
+
+namespace contract { namespace aux {
+
+template<
+ class Class
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX, CONTRACT_class_Base, ~)
+>
+void subcontract_class_invariant(
+ // NOTE: Even if the class inv func name is known a priori, func must be
+ // passed by ptr to avoid error in accessing a private func.
+ Class const CONTRACT_iteration_volatile* const obj
+ , void (Class::* const this_class_inv) ( ) const CONTRACT_iteration_volatile
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX,
+ CONTRACT_comma_base_params, ~)
+) {
+ // Check all class invs in short-circuit AND (1st throw stops check).
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX,
+ CONTRACT_base_class_inv_check, ~)
+ (obj->*this_class_inv)();
+}
+
+}} // namespace contract::aux
+
+# undef CONTRACT_iteration_volatile
+#else // iteration
+# error "INTERNAL ERROR: iteration index out-of-range"
+#endif // iteration
+
Added: sandbox/contract/include/contract/aux_/subcontract/from.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/subcontract/from.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,60 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_SUBCONTRACT_FROM_HPP_
+#define CONTRACT_AUX_SUBCONTRACT_FROM_HPP_
+
+#include <boost/type_traits/is_same.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/and.hpp>
+
+namespace contract { namespace aux {
+
+namespace private_ { // This type should not be used outside this file.
+ template< class Derived, class Base >
+ struct not_subcontracted_tag {
+ // NOTE: This is the special type used to tag a pair Derived-Base when
+ // a function in the Derived class shall not subcontract from the Base
+ // class (because no base class function is actually being overridden).
+ // It is necessary to use the Derived type itself in order to compile
+ // because the rest of the code will assume this tag type has
+ // precondition, old-of, etc functions.
+ typedef Derived type;
+ };
+} // namespace private_
+
+template< class Derived, class Base >
+struct is_subcontracted_from :
+ boost::mpl::not_< boost::is_same<
+ Base
+ , typename private_::not_subcontracted_tag< Derived, Base >::type
+ > >
+{};
+
+// BaseHasFunction should be mpl::true_ iff Base a virtual function matching
+// the overriding function being subcontracted which can either be the base
+// virtual function or the (dynamic, static, or volatile) class invariant
+// function (use introspection).
+template< class Derived, class Base, class BaseHasFunction >
+struct subcontract_from {
+ // Subcontract iff Base != Derived && HasVirtualFunction
+ typedef typename boost::mpl::if_<
+ boost::mpl::and_<
+ boost::mpl::not_< boost::is_same< Base, Derived > >
+ , BaseHasFunction
+ >
+ , Base // Subcontract (by returning the given base type).
+ // Don't subcontract (by tagging with a special type).
+ , typename private_::not_subcontracted_tag< Derived, Base >::type
+ >::type type;
+};
+
+}} // namespace contract::aux
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/subcontract/has_class_invariant.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/subcontract/has_class_invariant.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,33 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_SUBCONTRACT_HAS_CLASS_INVARIANT_HPP_
+#define CONTRACT_AUX_SUBCONTRACT_HAS_CLASS_INVARIANT_HPP_
+
+#include <contract/aux_/has_xxx_member_function.hpp>
+
+// NOTE: This symbol must be used to name the subcontract class invariant meber
+// function in order for this introspection check to work.
+#define CONTRACT_AUX_CODE_SUBCONTRACT_HAS_CLASS_INVARIANT_FUNC \
+ CONTRACT_AUX_SYMBOL( (subcontracted_class_invariant) )
+
+namespace contract { namespace aux {
+
+// Decl has_subcontracted_class_invariant< void (Base::*) ( ) const> metafunc.
+// NOTE: This can be done here because all class invariant functions have the
+// same name and signature. Unfortunately, that is not true instead of user
+// defined member functions for which the introspecting metafunction must be
+// defined within the user class decl itself by the expansion of the FUNCTION
+// macro (and similarly for the virtual specifier introspection tag functions
+// and check metafunctions that also depend by the func names and signature).
+CONTRACT_AUX_HAS_XXX_MEMBER_FUNCTION(has_subcontracted_class_invariant,
+ CONTRACT_AUX_CODE_SUBCONTRACT_HAS_CLASS_INVARIANT_FUNC)
+
+}} // namespace contract::aux
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/subcontract/oldof.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/subcontract/oldof.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,96 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#if !BOOST_PP_IS_ITERATING
+# ifndef CONTRACT_AUX_SUBCONTRACT_OLDOF_HPP_
+# define CONTRACT_AUX_SUBCONTRACT_OLDOF_HPP_
+
+#include <contract/config.hpp>
+#include <contract/aux_/subcontract/from.hpp>
+#include <contract/aux_/preprocessor/iteration/params.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+#include <boost/preprocessor/iteration/iterate.hpp>
+#include <list>
+
+#define CONTRACT_comma_base_params(z, n, unused) \
+ , typename SignTraits::BOOST_PP_CAT(base, n)::const_obj_type const \
+ BOOST_PP_CAT(base, n) \
+ , typename SignTraits::BOOST_PP_CAT(base, n)::subcontracted_oldof_type \
+ const BOOST_PP_CAT(sub_oldof, n)
+#define CONTRACT_comma_const_arg_param(z, n, unused) \
+ , typename SignTraits::BOOST_PP_CAT(const_arg_type, n) \
+ BOOST_PP_CAT(const_arg, n)
+#define CONTRACT_comma_const_arg(z, n, unused) \
+ , BOOST_PP_CAT(const_arg, n)
+
+#define CONTRACT_base_oldof_eval(z, n, unused) \
+ if(is_subcontracted_from< \
+ typename SignTraits::class_type \
+ , typename SignTraits::BOOST_PP_CAT(base, n)::class_type \
+ >::value \
+ ) { \
+ all_posts_type base_posts = \
+ (BOOST_PP_CAT(base, n)->*BOOST_PP_CAT(sub_oldof, n)) \
+ ( \
+ typename SignTraits::BOOST_PP_CAT(base, n)::body_type() \
+ BOOST_PP_REPEAT_ ## z(CONTRACT_AUX_PP_ITERATION_ARITY, \
+ CONTRACT_comma_const_arg, ~) \
+ ); \
+ all_posts.insert(all_posts.end(), \
+ base_posts.begin(), base_posts.end()); \
+ }
+
+# define BOOST_PP_ITERATION_PARAMS_1 \
+ CONTRACT_AUX_PP_ITERATION_PARAMS_ARITY( \
+ "contract/aux_/subcontract/oldof.hpp")
+# include BOOST_PP_ITERATE()
+# undef CONTRACT_comma_base_params
+# undef CONTRACT_comma_const_arg_param
+# undef CONTRACT_comma_const_arg
+# undef CONTRACT_base_oldof_eval
+# endif // #include guard
+#elif BOOST_PP_ITERATION_DEPTH() == 1
+// Define CONTRACT_AUX_PP_ITERATION_ARITY (from iteration frame 1).
+# include <contract/aux_/preprocessor/iteration/arity_1.hpp>
+
+namespace contract { namespace aux {
+
+template< class SignTraits >
+std::list< typename SignTraits::bound_postcondition_type >
+subcontract_oldof(
+ typename SignTraits::const_obj_type const obj
+ , typename SignTraits::oldof_type const this_oldof
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX,
+ CONTRACT_comma_base_params, ~)
+ BOOST_PP_REPEAT(CONTRACT_AUX_PP_ITERATION_ARITY,
+ CONTRACT_comma_const_arg_param, ~)
+) {
+ // Execute all old-of bindings to return list of all bound post functions.
+ typedef std::list< typename SignTraits::bound_postcondition_type >
+ all_posts_type;
+ all_posts_type all_posts;
+
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX,
+ CONTRACT_base_oldof_eval, ~)
+
+ typename SignTraits::bound_postcondition_type post = (obj->*this_oldof)(
+ typename SignTraits::body_type()
+ BOOST_PP_REPEAT(CONTRACT_AUX_PP_ITERATION_ARITY,
+ CONTRACT_comma_const_arg, ~)
+ );
+ all_posts.push_back(post);
+
+ return all_posts;
+}
+
+}} // namespace contract::aux
+
+#else // iteration
+# error "INTERNAL ERROR: iteration index out-of-range"
+#endif // iteration
+
Added: sandbox/contract/include/contract/aux_/subcontract/postcondition.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/subcontract/postcondition.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,68 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#if !BOOST_PP_IS_ITERATING
+# ifndef CONTRACT_AUX_SUBCONTRACT_POSTCONDITION_HPP_
+# define CONTRACT_AUX_SUBCONTRACT_POSTCONDITION_HPP_
+
+#include <contract/config.hpp>
+#include <contract/aux_/preprocessor/iteration/params.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+#include <boost/preprocessor/repetition/enum.hpp>
+#include <boost/preprocessor/iteration/iterate.hpp>
+#include <list>
+
+#define CONTRACT_comma_const_arg_param(z, n, unused) \
+ , typename SignTraits::BOOST_PP_CAT(const_arg_type, n) \
+ BOOST_PP_CAT(const_arg, n)
+#define CONTRACT_const_arg(z, n, unused) \
+ BOOST_PP_CAT(const_arg, n)
+
+# define BOOST_PP_ITERATION_PARAMS_1 \
+ CONTRACT_AUX_PP_ITERATION_PARAMS_ARITY( \
+ "contract/aux_/subcontract/postcondition.hpp")
+# include BOOST_PP_ITERATE()
+# undef CONTRACT_comma_const_arg_param
+# undef CONTRACT_const_arg
+# endif // #include guard
+#elif BOOST_PP_ITERATION_DEPTH() == 1
+// Define CONTRACT_AUX_PP_ITERATION_ARITY (from iteration frame 1).
+# include <contract/aux_/preprocessor/iteration/arity_1.hpp>
+
+namespace contract { namespace aux {
+
+template< class SignTraits >
+void subcontract_postcondition(
+ std::list< typename SignTraits::bound_postcondition_type >
+ const& subcontracted_bound_posts
+ BOOST_PP_REPEAT(CONTRACT_AUX_PP_ITERATION_ARITY,
+ CONTRACT_comma_const_arg_param, ~)
+ , typename SignTraits::const_result_type const_result
+) {
+ // Check all (bound with old-of and obj) post in short-circuit AND.
+
+ for(typename std::list< typename SignTraits::bound_postcondition_type >::
+ const_iterator post = subcontracted_bound_posts.begin();
+ post != subcontracted_bound_posts.end();
+ ++post
+ ) {
+ (*post)( // If one throws, entire AND fails.
+ BOOST_PP_ENUM(CONTRACT_AUX_PP_ITERATION_ARITY,
+ CONTRACT_const_arg, ~)
+ BOOST_PP_COMMA_IF(CONTRACT_AUX_PP_ITERATION_ARITY)
+ const_result
+ );
+ } // None threw so entire AND passes.
+}
+
+}} // namespace contract::aux
+
+#else // iteration
+# error "INTERNAL ERROR: iteration index out-of-range"
+#endif // iteration
+
Added: sandbox/contract/include/contract/aux_/subcontract/precondition.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/subcontract/precondition.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,133 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#if !BOOST_PP_IS_ITERATING
+# ifndef CONTRACT_AUX_SUBCONTRACT_PRECONDITION_HPP_
+# define CONTRACT_AUX_SUBCONTRACT_PRECONDITION_HPP_
+
+#include <contract/config.hpp>
+#include <contract/aux_/subcontract/from.hpp>
+#include <contract/aux_/preprocessor/iteration/params.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+#include <boost/preprocessor/iteration/iterate.hpp>
+
+#define CONTRACT_comma_base_params(z, n, unused) \
+ , typename SignTraits::BOOST_PP_CAT(base, n)::const_obj_type const \
+ BOOST_PP_CAT(base, n) \
+ , typename SignTraits::BOOST_PP_CAT(base, n)::precondition_type const \
+ BOOST_PP_CAT(sub_pre, n)
+#define CONTRACT_comma_const_arg_param(z, n, unused) \
+ , typename SignTraits::BOOST_PP_CAT(const_arg_type, n) \
+ BOOST_PP_CAT(const_arg, n)
+#define CONTRACT_comma_const_arg(z, n, unused) \
+ , BOOST_PP_CAT(const_arg, n)
+
+#define CONTRACT_and_not_first_error(z, n, unused) \
+ && ! BOOST_PP_CAT(first_error, n)
+#define CONTRACT_begin_base_pre_check(z, n, unused) \
+ BOOST_PP_EXPR_IIF( \
+ CONTRACT_AUX_CONFIG_REPORT_OVERRIDDEN_PRECONDITION_FAILURE_01, \
+ bool BOOST_PP_CAT(first_error, n) = \
+ true /* assume error until 1st checked */ \
+ BOOST_PP_REPEAT_ ## z(n, CONTRACT_and_not_first_error, ~) \
+ ; \
+ ) \
+ try { \
+ if(is_subcontracted_from< \
+ typename SignTraits::class_type \
+ , typename SignTraits::BOOST_PP_CAT(base, n)::class_type \
+ >::value \
+ ) { \
+ (BOOST_PP_CAT(base, n)->*BOOST_PP_CAT(sub_pre, n))( \
+ typename SignTraits::BOOST_PP_CAT(base, n)::body_type() \
+ BOOST_PP_REPEAT_ ## z(CONTRACT_AUX_PP_ITERATION_ARITY, \
+ CONTRACT_comma_const_arg, ~) \
+ ); \
+ return; /* this base's pre passed so entire OR is true (done) */ \
+ } /* else, not subcontracting from this base */ \
+ BOOST_PP_EXPR_IIF( \
+ CONTRACT_AUX_CONFIG_REPORT_OVERRIDDEN_PRECONDITION_FAILURE_01, \
+ BOOST_PP_CAT(first_error, n) = false; /* not subcontr so no err */ \
+ ) \
+ throw not_subcontracting(); /* not subcontracting but check next */ \
+ } catch(...) { /* this check failed or not subcontracting this base */
+#define CONTRACT_end_base_pre_check(z, n, unused) \
+ BOOST_PP_EXPR_IIF( \
+ CONTRACT_AUX_CONFIG_REPORT_OVERRIDDEN_PRECONDITION_FAILURE_01, \
+ if(BOOST_PP_CAT(first_error, BOOST_PP_SUB(BOOST_PP_DEC( \
+ CONTRACT_CONFIG_INHERITANCE_MAX), n))) /* if 1st err... */\
+ ) \
+ throw; /* ...re-throw error */ \
+ }
+
+# define BOOST_PP_ITERATION_PARAMS_1 \
+ CONTRACT_AUX_PP_ITERATION_PARAMS_ARITY( \
+ "contract/aux_/subcontract/precondition.hpp")
+# include BOOST_PP_ITERATE()
+# undef CONTRACT_comma_base_params
+# undef CONTRACT_comma_const_arg_param
+# undef CONTRACT_comma_const_arg
+# undef CONTRACT_and_not_first_error
+# undef CONTRACT_begin_base_pre_check
+# undef CONTRACT_end_base_pre_check
+# endif // #include guard
+#elif BOOST_PP_ITERATION_DEPTH() == 1
+// Define CONTRACT_AUX_PP_ITERATION_ARITY (from iteration frame 1).
+# include <contract/aux_/preprocessor/iteration/arity_1.hpp>
+
+namespace contract { namespace aux {
+
+template< class SignTraits >
+void subcontract_precondition(
+ typename SignTraits::const_obj_type const obj
+ , typename SignTraits::precondition_type const this_pre
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX,
+ CONTRACT_comma_base_params, ~)
+ BOOST_PP_REPEAT(CONTRACT_AUX_PP_ITERATION_ARITY,
+ CONTRACT_comma_const_arg_param, ~)
+) {
+ // Check all pre in short-circuit OR (OK unless all throw).
+
+ // Nesting used to re-throw the very first exception in case all fail.
+ struct not_subcontracting {}; // Internal only, don't inherit from except.
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX,
+ CONTRACT_begin_base_pre_check, ~)
+
+ BOOST_PP_EXPR_IIF(
+ CONTRACT_AUX_CONFIG_REPORT_OVERRIDDEN_PRECONDITION_FAILURE_01,
+ bool first_error =
+ true BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX,
+ CONTRACT_and_not_first_error, ~)
+ ;
+ )
+ try {
+ (obj->*this_pre)(
+ typename SignTraits::body_type()
+ BOOST_PP_REPEAT(CONTRACT_AUX_PP_ITERATION_ARITY,
+ CONTRACT_comma_const_arg, ~)
+ );
+ return; // This check passed so entire OR is true.
+ } catch(...) {
+ BOOST_PP_EXPR_IIF(
+ CONTRACT_AUX_CONFIG_REPORT_OVERRIDDEN_PRECONDITION_FAILURE_01,
+ if(first_error) // If this is 1st error...
+ )
+ throw; // ...re-throw error.
+ }
+
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX,
+ CONTRACT_end_base_pre_check, ~)
+ throw not_subcontracting(); // Should never get here.
+}
+
+}} // namespace contract::aux
+
+#else // iteration
+# error "INTERNAL ERROR: iteration index out-of-range"
+#endif // iteration
+
Added: sandbox/contract/include/contract/aux_/subcontract/static_class_invariant.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/subcontract/static_class_invariant.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,52 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_SUBCONTRACT_STATIC_CLASS_INVARIANT_HPP_
+#define CONTRACT_AUX_SUBCONTRACT_STATIC_CLASS_INVARIANT_HPP_
+
+#include <contract/config.hpp>
+#include <contract/aux_/subcontract/from.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+
+#define CONTRACT_comma_class_Base(z, n, unused) \
+ , class BOOST_PP_CAT(Base, n)
+#define CONTRACT_comma_base_param(z, n, unused) \
+ , void (* BOOST_PP_CAT(sub_static_class_inv, n)) ( )
+#define CONTRACT_base_static_class_inv_check(z, n, unused) \
+ if(is_subcontracted_from< Class, BOOST_PP_CAT(Base, n) >::value) { \
+ (*BOOST_PP_CAT(sub_static_class_inv, n))(); \
+ }
+
+namespace contract { namespace aux {
+
+template<
+ class Class
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX,
+ CONTRACT_comma_class_Base, ~)
+>
+void subcontract_static_class_invariant(
+ // NOTE: Even if the class inv func name is known a priori, func must be
+ // passed by ptr to avoid error in accessing a private func.
+ void (* this_static_class_inv) ( )
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX,
+ CONTRACT_comma_base_param, ~)
+) {
+ // Check all static class inv in short-circuit AND (1st throw stops check).
+ BOOST_PP_REPEAT(CONTRACT_CONFIG_INHERITANCE_MAX,
+ CONTRACT_base_static_class_inv_check, ~)
+ (*this_static_class_inv)();
+}
+
+}} // namespace contract::aux
+
+#undef CONTRACT_comma_class_Base
+#undef CONTRACT_comma_base_param
+#undef CONTRACT_base_static_class_inv_check
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/symbol.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/symbol.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,31 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_SYMBOL_HPP_
+#define CONTRACT_AUX_SYMBOL_HPP_
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/seq/cat.hpp>
+#include <boost/preprocessor/seq/transform.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_AUX_SYMBOL_POSTFIX_(s, unused, tokens) \
+ BOOST_PP_CAT(tokens, CONTRACT_AUX_SYMBOL_INFIX)
+
+// PUBLIC //
+
+// All these macros cannot use `_` because if (user) symbols have leading or
+// trailing `_`, cat symbol might have double `__` which is reserved by C++.
+#define CONTRACT_AUX_SYMBOL_INFIX X
+
+#define CONTRACT_AUX_SYMBOL(seq) \
+ BOOST_PP_SEQ_CAT(BOOST_PP_SEQ_TRANSFORM(CONTRACT_AUX_SYMBOL_POSTFIX_, ~, \
+ (contract_aux) seq))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/thread_variable.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/thread_variable.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,67 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_THREAD_VARIABLE_HPP_
+#define CONTRACT_AUX_THREAD_VARIABLE_HPP_
+
+#if CONTRACT_AUX_CONFIG_THREAD_SAFE_01
+# include <boost/thread/recursive_mutex.hpp> // Required only if thread safe.
+#endif
+
+namespace contract { namespace aux {
+
+template<typename T>
+class thread_variable {
+public:
+ // Both implicit and default constructors.
+ /* implicit */ thread_variable(T const& value): value_(value) {}
+ thread_variable(): value_(T()) {} // Default T() requires only if this used.
+
+ // Set //
+
+ void operator=(T const& value) { // Sync so cannot return object&.
+#if CONTRACT_AUX_CONFIG_THREAD_SAFE_01
+ boost::recursive_mutex::scoped_lock lock(mutex_);
+#endif
+ value_ = value;
+ } // Release eventual lock.
+
+ void operator=(T const& value) volatile { // Sync so cannot return object&.
+#if CONTRACT_AUX_CONFIG_THREAD_SAFE_01
+ boost::recursive_mutex::scoped_lock lock(mutex_);
+#endif
+ value_ = value;
+ } // Release eventual lock.
+
+ // Get //
+
+ operator T() const { // Sync so must return object copy (by value).
+#if CONTRACT_AUX_CONFIG_THREAD_SAFE_01
+ boost::recursive_mutex::scoped_lock lock(mutex_);
+#endif
+ return value_;
+ } // Release eventual lock.
+
+ operator T() const volatile { // Sync so must return object copy (by value).
+#if CONTRACT_AUX_CONFIG_THREAD_SAFE_01
+ boost::recursive_mutex::scoped_lock lock(mutex_);
+#endif
+ return value_;
+ } // Release eventual lock.
+
+private:
+ T value_;
+
+#if CONTRACT_AUX_CONFIG_THREAD_SAFE_01
+ mutable boost::recursive_mutex mutex_;
+#endif
+};
+
+}} // namespace contract::aux
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/aux_/uninitialized.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/aux_/uninitialized.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,43 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_AUX_UNINITIALIZED_HPP_
+#define CONTRACT_AUX_UNINITIALIZED_HPP_
+
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/type_traits/add_pointer.hpp>
+#include <cassert>
+#include <stdexcept>
+
+namespace contract { namespace aux {
+
+// This function is used as a default parameter value for parameter names
+// that are specified together with an `=` which cannot be separated using
+// pp-metaprogramming (e.g., old-of and return values in postconditions).
+// However, this is used just to compile the code an this default value should
+// never actually be used and this function should never be called (because the
+// default value access an invalid pointer) so this function aborts.
+// NOTE: This cannot be achieved simply using a C-style cast `(T)0` as the
+// default parameter value because in some cases (e.g., if T is a & to a
+// complex type like void_result) the cast will generate a compiler-error.
+template< typename T >
+struct uninitialized {
+ // NOTE: This needs to be a template class with a static member function
+ // instead of just a template function because otherwise some compilers
+ // (MSVC) will not be able to deduce the template type (even if it is
+ // always explicitly specified when invoking the function).
+ static typename boost::add_reference<T>::type value() {
+ assert(false); // Internal Error: Should never execute this.
+ typename boost::add_pointer<T>::type ptr = 0;
+ return *ptr;
+ }
+};
+
+}} // namespace contract::aux
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/block_invariant.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/block_invariant.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,93 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_BLOCK_INVARIANT_HPP_
+#define CONTRACT_BLOCK_INVARIANT_HPP_
+
+/** @file
+@brief Macros used to specify block invariants (this header is automatically
+included by <c>contract.hpp</c>).
+*/
+
+#include <contract/aux_/macro/block_invariant.hpp>
+#include <contract/detail/preprocessor/variadic/to_seq.hpp>
+#include <boost/local_function/detail/preprocessor/line_counter.hpp>
+#include <boost/config.hpp>
+
+#ifndef DOXYGEN
+
+#ifndef BOOST_NO_VARIADIC_MACROS
+
+#define CONTRACT_BLOCK_INVARIANT(...) \
+ CONTRACT_AUX_BLOCK_INVARIANT( \
+ BOOST_LOCAL_FUNCTION_DETAIL_PP_LINE_COUNTER, \
+ 0, /* outside template */ \
+ CONTRACT_DETAIL_PP_VARIADIC_TO_SEQ( \
+ (ERROR_block_invariants_cannot_be_empty), __VA_ARGS__))
+
+#define CONTRACT_BLOCK_INVARIANT_TPL(...) \
+ CONTRACT_AUX_BLOCK_INVARIANT( \
+ BOOST_LOCAL_FUNCTION_DETAIL_PP_LINE_COUNTER, \
+ 1, /* inside template */ \
+ CONTRACT_DETAIL_PP_VARIADIC_TO_SEQ( \
+ (ERROR_block_invariants_cannot_be_empty), __VA_ARGS__))
+
+#else
+
+#define CONTRACT_BLOCK_INVARIANT(seq) \
+ CONTRACT_AUX_BLOCK_INVARIANT( \
+ BOOST_LOCAL_FUNCTION_DETAIL_PP_LINE_COUNTER, \
+ 0, /* outside template */ \
+ seq)
+
+#define CONTRACT_BLOCK_INVARIANT_TPL(seq) \
+ CONTRACT_AUX_BLOCK_INVARIANT( \
+ BOOST_LOCAL_FUNCTION_DETAIL_PP_LINE_COUNTER, \
+ 1, /* inside template */ \
+ seq)
+
+#endif
+
+#else
+
+/**
+@brief Macro used to specify block invariants.
+
+This macro can appear at any point in a code block within a function definition
+and it is used to assert correctness condition of the implementation (similarly
+to C++ <c>assert</c>).
+
+@Params
+@Param{assertions,
+The syntax for the assertions is explained in the @RefSect{grammar\, Grammar}
+section.
+Static assertions\, constant assertions\, and select assertions can be used.
+}
+@EndParams
+
+Within a type-dependent scope (e.g., within templates),
+@RefMacro{CONTRACT_BLOCK_INVARIANT_TPL} must be used instead of this macro.
+
+@SeeAlso @RefSect{advanced_topics, Advanced Topics} section.
+*/
+#define CONTRACT_BLOCK_INVARIANT(assertions)
+
+/**
+@brief Macro used to specify block invariants within a type-dependent scope
+(e.g., within templates).
+
+This macro is the exact same as @RefMacro{CONTRACT_BLOCK_INVARIANT} but is must
+be used when specifying block invariants within a type-dependent scope.
+
+@SeeAlso @RefSect{advanced_topics, Advanced Topics} section.
+*/
+#define CONTRACT_BLOCK_INVARIANT_TPL(assertions)
+
+#endif
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/body.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/body.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,175 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_BODY_HPP_
+#define CONTRACT_BODY_HPP_
+
+/** @file
+@brief Macros used to program body definitions separately from the contract
+declarations (this header is automatically include by <c>contract.hpp</c>).
+*/
+
+#include <contract/aux_/config.hpp>
+#include <contract/aux_/symbol.hpp>
+#include <contract/aux_/macro/body.hpp>
+
+// PRIVATE //
+
+#ifndef DOXYGEN
+
+#define CONTRACT_BODY_CTOR_DTOR_( \
+ contracted_body_macro, class_type, constructor_name, contracted01) \
+ BOOST_PP_EXPR_IF(contracted01, void) \
+ CONTRACT_AUX_BODY_CLASS_TYPE(class_type) :: \
+ BOOST_PP_IIF(contracted01, \
+ contracted_body_macro \
+ , \
+ BOOST_PP_TUPLE_REM(1) \
+ )(constructor_name)
+
+#endif // DOXYGEN
+
+// PUBLIC //
+
+/**
+@brief Macro used to name the body of free functions and free function
+operators.
+
+This macro is used to name the body of free functions and free function
+operators when the body is defined separately from the contract declaration.
+Free functions and free function operators with contracts are declared
+using the @RefMacro{CONTRACT_FUNCTION} macro.
+
+@Params
+@Param{function_name,
+The syntax for free function and free function operator names is explained in
+the @RefSect{grammar\, Grammar} section.
+}
+@EndParams
+
+@SeeAlso @RefSect{tutorial, Tutorial} section.
+*/
+#define CONTRACT_FREE_BODY(function_name) \
+ BOOST_PP_IIF( \
+ BOOST_PP_BITOR( \
+ CONTRACT_AUX_CONFIG_PRECONDITIONS_01 \
+ , CONTRACT_AUX_CONFIG_POSTCONDITIONS_01 \
+ ), \
+ CONTRACT_AUX_BODY_FUNCTION_CONTRACTED \
+ , \
+ CONTRACT_AUX_BODY_FUNCTION \
+ )(function_name)
+
+/**
+@brief Macro used to name the body of member functions and member function
+operators.
+
+This macro is used to name the body of member functions and member function
+operators when the body is defined separately from the contract declaration.
+Member functions and member function operators with contracts are declared
+using the @RefMacro{CONTRACT_FUNCTION} macro.
+
+@Params
+@Param{function_name,
+The syntax for function and operator names is explained in the
+@RefSect{grammar\, Grammar} section.
+}
+@EndParams
+
+@Warning This macro must also be used when a virtual function invokes the
+overridden function from one of its base classes (see the
+@RefSect{tutorial, Tutorial} section).
+
+@SeeAlso @RefSect{tutorial, Tutorial} section.
+*/
+#define CONTRACT_MEMBER_BODY(function_name) \
+ /* NOTE: this must be a different macro from FREE_BODY because it */ \
+ /* expands also if invariants (not just pre and post) */ \
+ /* class type is specified so this macro API is same as ctor and dtor */ \
+ BOOST_PP_IIF( \
+ BOOST_PP_BITOR( \
+ CONTRACT_AUX_CONFIG_PRECONDITIONS_01 \
+ , BOOST_PP_BITOR( \
+ CONTRACT_AUX_CONFIG_POSTCONDITIONS_01 \
+ , CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01 \
+ ) \
+ ), \
+ CONTRACT_AUX_BODY_FUNCTION_CONTRACTED \
+ , \
+ CONTRACT_AUX_BODY_FUNCTION \
+ )(function_name)
+
+/**
+@brief Macro used to name the body of constructors.
+
+This macro is used to name the body of constructors when the body is defined
+separately from the contract declaration.
+Constructors with contracts are declared using the
+@RefMacro{CONTRACT_CONSTRUCTOR} macro.
+
+@Params
+@Param{class_type,
+The syntax for the class type is explained in the @RefSect{grammar\, Grammar}
+section (for class templates\, this type is qualified with the template parameters).
+}
+@Param{constructor_name,
+This is the class name and its syntax is explained in the
+@RefSect{grammar\, Grammar} section (for class templates\, this name is
+<em>not</em> qualified with the template parameters).
+}
+@EndParams
+
+@Warning The body of constructors with member initializers should always be
+defined together with the constructor declaration and its contract.
+
+@SeeAlso @RefSect{tutorial, Tutorial} section.
+*/
+// class_type: `vect<T>`, `(vect<T, A>)`, or `comma(1)(vect<T, A>)`.
+#define CONTRACT_CONSTRUCTOR_BODY(class_type, constructor_name) \
+ CONTRACT_BODY_CTOR_DTOR_(CONTRACT_AUX_BODY_CONSTRUCTOR_CONTRACTED \
+ , class_type, constructor_name \
+ , BOOST_PP_BITOR( \
+ CONTRACT_AUX_CONFIG_PRECONDITIONS_01 \
+ , BOOST_PP_BITOR( \
+ CONTRACT_AUX_CONFIG_POSTCONDITIONS_01 \
+ , CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01 \
+ ) \
+ ) \
+ )
+
+/**
+@brief Macro used to name the body of destructors.
+
+This macro is used to name the body of destructors when the body is defined
+separately from the contract declaration.
+Destructors with contracts are declared using the
+@RefMacro{CONTRACT_DESTRUCTOR} macro.
+
+@Params
+@Param{class_type,
+The syntax for the class type is explained in the @RefSect{grammar\, Grammar}
+section (for class templates\, this type is qualified with the template
+parameters).
+}
+@Param{destructor_name,
+This is the class name prefixed by the tilde symbol <c>~</c> and its syntax is
+explained in the @RefSect{grammar\, Grammar} section (for class templates\,
+this name is <em>not</em> qualified with the template parameters).
+}
+@EndParams
+
+@SeeAlso @RefSect{tutorial, Tutorial} section.
+*/
+// class_type: `vect<T>`, `(vect<T, A>)`, or `comma(1)(vect<T, A>)`.
+#define CONTRACT_DESTRUCTOR_BODY(class_type, destructor_name) \
+ CONTRACT_BODY_CTOR_DTOR_(CONTRACT_AUX_BODY_DESTRUCTOR_CONTRACTED \
+ , class_type, destructor_name \
+ , CONTRACT_AUX_CONFIG_CLASS_INVARIANTS_01 \
+ )
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/broken.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/broken.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,595 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_BROKEN_HPP_
+#define CONTRACT_BROKEN_HPP_
+
+/** @file
+@brief Contract broken handlers (this header is automatically included by
+<c>contract.hpp</c>).
+*/
+
+#include <contract/aux_/thread_variable.hpp>
+#include <stdexcept>
+#include <sstream>
+#include <string>
+#include <iostream> // For default broken handler.
+
+// IMPORTANT: Most of these functions do no throw so they comply with
+// C++ STL exception safety requirements.
+
+// NOTE: The contract broken handlers are similar to std::temrinate (inlining
+// functions also to avoid multiple definitions error).
+
+namespace contract {
+
+/**
+@brief Exception automatically thrown by the library to signal a contract
+assertion failure.
+
+This exception contains detailed information about the failed contract
+assertion (file name, line number, etc).
+
+A contract assertion is considered failed if it cannot be evaluated to be true
+(so if it is evaluated to be false but also if an exception is thrown by the
+code that evaluates the assertion condition).
+In case a contract assertion fails, the library automatically calls the
+appropriate contract broken handler with this exception as the active exception
+(the fact that assertion failures are signaled by this library by throwing this
+exception does not necessarily mean that the exception will be ultimately
+thrown by the broken contract, that is entirely up to the implementation of the
+contract broken handlers).
+By default, contract broken handlers print an error message to <c>std::cerr</c>
+and terminate the program calling <c>std::terminate</c>, but programmers can
+redefine this behaviour by customizing the contract broken handlers (for
+example to have the handlers throw exceptions instead of terminating the
+program).
+Within customized contract broken handlers, programmers can re-throw and catch
+this exception to obtained information about the failed asserted condition
+(file name, line number, etc).
+
+@Note This exception is guaranteed to publicly inherit from
+<c>std::logic_error</c> (because <c>std::logic_error</c> models programming
+errors and those are the type of errors that contract assertions detect).
+
+@SeeAlso @RefSect{advanced_topics, Advanced Topics} section.
+*/
+class broken: public std::logic_error // This is a logic error or "bug".
+{
+public:
+ /**
+ @brief Construct this exception specifying the failed assertion file name,
+ line number, assertion code, and assertion number (no-throw).
+
+ The assertion number is optional and it defaults to zero (an assertion
+ number equal to zero is ignored and not shown in the error description).
+ */
+ explicit broken (
+ char const* file_name,
+ unsigned long const& line_number,
+ char const* assertion_code,
+ unsigned int const& assertion_number = 0
+ ) throw( )
+ : std::logic_error("")
+ , file_name_(file_name)
+ , line_number_(line_number)
+ , assertion_code_(assertion_code)
+ , assertion_number_(assertion_number)
+ {}
+
+ /** @brief Copy constructor (no-throw). */
+ broken ( broken const& source ) throw( ) // Make sure unthrow.
+ : std::logic_error("")
+ , file_name_(source.file_name_)
+ , line_number_(source.line_number_)
+ , assertion_code_(source.assertion_code_)
+ , assertion_number_(source.assertion_number_)
+ {}
+
+ /** @brief Copy operator (no-throw). */
+ broken& operator= ( broken const& source ) throw( ) { // Make sure unthrow.
+ file_name_ = source.file_name_;
+ line_number_ = source.line_number_;
+ assertion_code_ = source.assertion_code_;
+ assertion_number_ = source.assertion_number_;
+ return *this;
+ }
+
+ /** @brief Virtual destructor (no-throw). */
+ virtual ~broken ( void ) throw( ) {} // Make sure unthrow.
+
+ /** @brief Return a description of the assertion failure (no-throw). */
+ virtual char const* what ( void ) const throw( ) {
+ // IMPORTANT: The format of this error message is based on GCC text
+ // provided in case of C-style `assert()` failure (so don't change it).
+ // Don't print assertion number here (because we don't know which type
+ // of assertion this is) -- contract handlers know also the assertion
+ // type and context and they will print at this information.
+ std::ostringstream msg;
+ msg << "assertion \"" << assertion_code() << "\" failed: file \"" <<
+ file_name() << "\", line " << line_number();
+ what_ = msg.str();
+ return what_.c_str();
+ }
+
+ /**
+ @brief Return the name of the file containing the failed assertion
+ (no-throw).
+ */
+ virtual char const* file_name ( void ) const throw( )
+ { return file_name_.c_str(); }
+
+ /** @brief Return the number of the line containing the failed
+ assertion (no-throw). */
+ virtual unsigned long const line_number ( void ) const throw( )
+ { return line_number_; }
+
+ /** @brief Return the text of the asserted code that failed (no-throw). */
+ virtual char const* assertion_code ( void ) const throw( )
+ { return assertion_code_.c_str(); }
+
+ /**
+ @brief Return the number of the failed assertion (no-throw).
+
+ The assertion number is useful only within the context of a specific
+ contract broken handler that can differentiates between broken
+ preconditions, postconditions, etc because different preconditions,
+ postconditions, etc will in general have the same assertion number (the
+ first precondition is assertion number 1, the first postcondition is also
+ assertion number 1, etc).
+
+ If this number is zero then no sensible assertion number was specified and
+ it should be ignored (e.g., loop variant assertions have no assertion
+ number because there can only be one single variant for a loop).
+ */
+ virtual unsigned int const assertion_number ( void ) const throw( )
+ { return assertion_number_; }
+
+private:
+ std::string file_name_;
+ unsigned long line_number_;
+ std::string assertion_code_;
+ unsigned int assertion_number_;
+ mutable std::string what_; // This state needed to keep c_str() ptr valid.
+};
+
+/**
+@brief Specify the context from which the contract assertion failed.
+
+This information is important because in order to comply with STL exception
+safety requirements, destructors shall never throw an exception.
+Therefore, even if programmers customize the contract broken handlers to throw
+an exception instead of terminating the program, it is still important to know
+at least if the assertion failed from a destructor's contract so programmers
+can avoid throwing an exception from the broken handlers in such a case.
+
+@Note All the different contexts identified by this enumeration have different
+contract checking semantics (see also
+@RefSect{contract_programming_overview, Contract Programming Overview}) so it
+might be relevant to differentiate between them in the contract broken
+handlers.
+
+@SeeAlso @RefSect{advanced_topics, Advanced Topics} section.
+*/
+typedef enum
+{
+ /** @brief Assertion failed from within constructor contracts. */
+ FROM_CONSTRUCTOR,
+ /** @brief Assertion failed from within destructor contracts. */
+ FROM_DESTRUCTOR,
+ /** @brief Assertion failed from within non-static member function
+ contracts. */
+ FROM_NONSTATIC_MEMBER_FUNCTION,
+ /** @brief Assertion failed from within static member function contracts. */
+ FROM_STATIC_MEMBER_FUNCTION,
+ /** @brief Assertion failed from within free function contracts. */
+ FROM_FREE_FUNCTION,
+ /** @brief Assertion failed from within body contracts (for both block
+ invariants and loop variants). */
+ FROM_BODY
+} from;
+
+#ifndef DOXYGEN
+typedef void (*broken_contract_handler) ( from const& context ) ;
+#else // Doxygen can correctly parse the typedef above...
+/**
+@brief Contract broken handler function pointer.
+
+A contract broken handler is a function returning <c>void</c> and taking only
+one parameter of type @RefEnum{from} indicating the context from which the
+contract assertion failed:
+
+@code
+typedef void (*handler_function_pointer) ( from const& context ) ;
+@endcode
+
+@Note This function prototype is not non-throw to allow programmers to
+customize the contract broken handlers to throw exceptions if they wish to do
+so.
+
+@SeeAlso @RefSect{advanced_topics, Advanced Topics} section.
+*/
+typedef handler_function_pointer broken_contract_handler ;
+#endif
+
+#ifndef DOXYGEN
+
+// NOTE: This private code is here instead that in the aux director because
+// it is the only way to resolve inclusion problems without splitting into
+// multiple headers (having multiple headers for the broken handlers, one
+// for the broken exception, etc is confusing for the user).
+namespace aux {
+
+// Default broken handler do not throw (exception specification throw()) so
+// they comply with STL exception safety requirements. Inlined function also
+// to avoid multiple definition error.
+inline void default_broken_handler(char const* contract_description,
+ from const& context) throw() {
+ // Default handlers are verbose and prints to standard-error the error
+ // before terminating (redefine the default handlers to be quite, etc).
+ try {
+ try {
+ throw; // To catch below and print to standard error.
+ } catch(broken& failure) {
+ // IMPORTANT: The format of this error message is based on GCC
+ // error in case of C-style `assert` failure -- don't change it.
+ std::cerr << contract_description << " ";
+ if(failure.assertion_number())
+ std::cerr << "number " << failure.assertion_number() << " ";
+ std::cerr << "\"" << failure.assertion_code() <<
+ "\" failed: file \"" << failure.file_name() <<
+ "\", line " << failure.line_number() << std::endl;
+ throw; // Re-throw.
+ } catch(std::exception& failure) {
+ std::cerr << contract_description << " failed: " << failure.what()
+ << std::cerr;
+ throw; // Re-throw.
+ } catch(...) {
+ std::cerr << contract_description <<
+ " failed: unknown error" << std::endl;
+ throw; // Re-throw.
+ }
+ } catch(...) {
+ std::terminate(); // Terminate with active exception.
+ }
+ std::terminate(); // Always terminate.
+}
+
+inline void default_precondition_broken_handler(from const& context) throw()
+ { default_broken_handler("precondition", context); }
+inline void default_postcondition_broken_handler(from const& context) throw()
+ { default_broken_handler("postcondition", context); }
+inline void default_class_invariant_broken_on_entry_handler(
+ from const& context) throw()
+ { default_broken_handler("class invariant (on entry)", context); }
+inline void default_class_invariant_broken_on_exit_handler(
+ from const& context) throw()
+ { default_broken_handler("class invariant (on exit)", context); }
+inline void default_class_invariant_broken_on_throw_handler(
+ from const& context) throw()
+ { default_broken_handler("class invariant (on throw)", context); }
+inline void default_block_invariant_broken_handler(from const& context) throw()
+ { default_broken_handler("block invariant", context); }
+inline void default_loop_variant_broken_handler(from const& context) throw()
+ { default_broken_handler("loop variant", context); }
+
+// NOTE: A template is used to wrap these variables so they can be defined in
+// this header (instead of requiring to link a pre-compiled .cpp for these
+// definitions) without causing a multiple definition error (static or extern
+// specifiers cannot be used here because static creates a different variable
+// copy for each translation unit when these variables need to globally have
+// the same value for the entire program, and extern still requires the
+// definitions somewhere in a .cpp which we wanted to avoid).
+template<int Unused = 0>
+struct broken_handlers {
+ static thread_variable<broken_contract_handler> precondition;
+ static thread_variable<broken_contract_handler> postcondition;
+ static thread_variable<broken_contract_handler> class_invariant_on_entry;
+ static thread_variable<broken_contract_handler> class_invariant_on_exit;
+ static thread_variable<broken_contract_handler> class_invariant_on_throw;
+ static thread_variable<broken_contract_handler> block_invariant;
+ static thread_variable<broken_contract_handler> loop_variant;
+};
+
+template<int Unused>
+thread_variable<broken_contract_handler> broken_handlers<Unused>::
+ precondition = &default_precondition_broken_handler;
+template<int Unused>
+thread_variable<broken_contract_handler> broken_handlers<Unused>::
+ postcondition = &default_postcondition_broken_handler;
+template<int Unused>
+thread_variable<broken_contract_handler> broken_handlers<Unused>::
+ class_invariant_on_entry =
+ &default_class_invariant_broken_on_entry_handler;
+template<int Unused>
+thread_variable<broken_contract_handler> broken_handlers<Unused>::
+ class_invariant_on_exit =
+ &default_class_invariant_broken_on_exit_handler;
+template<int Unused>
+thread_variable<broken_contract_handler> broken_handlers<Unused>::
+ class_invariant_on_throw =
+ &default_class_invariant_broken_on_throw_handler;
+template<int Unused>
+thread_variable<broken_contract_handler> broken_handlers<Unused>::
+ block_invariant = &default_block_invariant_broken_handler;
+template<int Unused>
+thread_variable<broken_contract_handler> broken_handlers<Unused>::
+ loop_variant = &default_loop_variant_broken_handler;
+
+} // namespace aux
+
+#endif
+
+/** @brief Set precondition broken handler to specified handler returning
+replaced handler. */
+inline broken_contract_handler set_precondition_broken (
+ broken_contract_handler handler ) throw( ) {
+ broken_contract_handler prev = aux::broken_handlers<>::precondition;
+ aux::broken_handlers<>::precondition = handler;
+ return prev;
+}
+
+/**
+@brief Broken handler called when a precondition assertion fails.
+
+By default, it prints information about the failed assertion to
+<c>std::cerr</c> and it calls <c>std::terminate</c>.
+However, it can be customized using
+@RefFunc{contract::set_precondition_broken} (even to throw exceptions).
+
+@Params
+@Param{context,
+Context from which the precondition assertion failed.
+}
+@EndParams
+
+This handler is automatically called by the library in case of a precondition
+assertion failure (an assertion fails if it is not evaluated to be true, so
+if it is evaluated to be false but also if it cannot be evaluated because an
+exception is thrown by the asserted condition).
+
+@SeeAlso @RefSect{advanced_topics, Advanced Topics} section.
+*/
+inline void precondition_broken ( from const& context )
+ // In general this could throw for user defined handlers.
+ { aux::broken_handlers<>::precondition(context); }
+
+/** @brief Set postcondition broken handler to specified handler returning
+replaced handler. */
+inline broken_contract_handler set_postcondition_broken (
+ broken_contract_handler handler ) throw( )
+{
+ broken_contract_handler prev = aux::broken_handlers<>::postcondition;
+ aux::broken_handlers<>::postcondition = handler;
+ return prev;
+}
+
+/**
+@brief Broken handler called when a postcondition assertion fails.
+
+By default, it prints information about the failed assertion to
+<c>std::cerr</c> and it calls <c>std::terminate</c>.
+However, it can be customized using
+@RefFunc{contract::set_postcondition_broken} (even to throw exceptions).
+
+@Params
+@Param{context,
+Context from which the postcondition assertion failed.
+}
+@EndParams
+
+This handler is automatically called by the library in case of a postcondition
+assertion failure (an assertion fails if it is not evaluated to be true, so
+if it is evaluated to be false but also if it cannot be evaluated because an
+exception is thrown by the asserted condition).
+
+@SeeAlso @RefSect{advanced_topics, Advanced Topics} section.
+*/
+inline void postcondition_broken ( from const& context )
+ // In general this could throw for user defined handlers.
+ { aux::broken_handlers<>::postcondition(context); }
+
+/** @brief Set handler for class invariant broken on entry to specified handler
+returning replaced handler. */
+inline broken_contract_handler set_class_invariant_broken_on_entry (
+ broken_contract_handler handler ) throw( )
+{
+ broken_contract_handler prev = aux::broken_handlers<>::
+ class_invariant_on_entry;
+ aux::broken_handlers<>::class_invariant_on_entry = handler;
+ return prev;
+}
+
+/**
+@brief Broken handler called when a class invariant assertion fails on function
+entry.
+
+By default, it prints information about the failed assertion to
+<c>std::cerr</c> and it calls <c>std::terminate</c>.
+However, it can be customized using
+@RefFunc{contract::set_class_invariant_broken_on_entry} (even to throw
+exceptions, but programmers should be careful to never throw from destructors).
+
+@Params
+@Param{context,
+Context from which the class invariants assertion failed (destructors\, etc).
+}
+@EndParams
+
+This handler is automatically called by the library in case of a class invariant
+assertion failure (an assertion fails if it is not evaluated to be true, so
+if it is evaluated to be false but also if it cannot be evaluated because an
+exception is thrown by the asserted condition).
+
+@SeeAlso @RefSect{advanced_topics, Advanced Topics} section.
+*/
+inline void class_invariant_broken_on_entry ( from const& context )
+ // In general this could throw for user defined handlers.
+ { aux::broken_handlers<>::class_invariant_on_entry(context); }
+
+/** @brief Set handler for class invariant broken on exit to specified handler
+returning replaced handler. */
+inline broken_contract_handler set_class_invariant_broken_on_exit (
+ broken_contract_handler handler ) throw( )
+{
+ broken_contract_handler prev = aux::broken_handlers<>::
+ class_invariant_on_exit;
+ aux::broken_handlers<>::class_invariant_on_exit = handler;
+ return prev;
+}
+
+/**
+@brief Broken handler called when a class invariant assertion fails on function
+exit.
+
+By default, it prints information about the failed assertion to
+<c>std::cerr</c> and it calls <c>std::terminate</c>.
+However, it can be customized using
+@RefFunc{contract::set_class_invariant_broken_on_exit} (even to throw
+exceptions, but programmers should be careful to never throw from destructors).
+
+@Params
+@Param{context,
+Context from which the class invariants assertion failed (destructors\, etc).
+}
+@EndParams
+
+This handler is automatically called by the library in case of a class invariant
+assertion failure (an assertion fails if it is not evaluated to be true, so
+if it is evaluated to be false but also if it cannot be evaluated because an
+exception is thrown by the asserted condition).
+
+@SeeAlso @RefSect{advanced_topics, Advanced Topics} section.
+*/
+inline void class_invariant_broken_on_exit ( from const& context )
+ // In general this could throw for user defined handlers.
+ { aux::broken_handlers<>::class_invariant_on_exit(context); }
+
+/** @brief Set handler for class invariant broken on throw to specified
+handler returning replaced handler. */
+inline broken_contract_handler set_class_invariant_broken_on_throw (
+ broken_contract_handler handler ) throw( )
+{
+ broken_contract_handler prev = aux::broken_handlers<>::
+ class_invariant_on_throw;
+ aux::broken_handlers<>::class_invariant_on_throw = handler;
+ return prev;
+}
+
+/**
+@brief Broken handler called when a class invariant assertion fails on function
+exit after the function body threw an exception.
+
+By default, it prints information about the failed assertion to
+<c>std::cerr</c> and it calls <c>std::terminate</c>.
+However, it can be customized using
+@RefFunc{contract::set_class_invariant_broken_on_throw} (even to throw
+exceptions, but programmers should be careful to never throw from destructors).
+
+@Params
+@Param{context,
+Context from which the class invariants assertion failed (destructors\, etc).
+}
+@EndParams
+
+This handler is automatically called by the library in case of a class invariant
+assertion failure (an assertion fails if it is not evaluated to be true, so
+if it is evaluated to be false but also if it cannot be evaluated because an
+exception is thrown by the asserted condition).
+
+@SeeAlso @RefSect{advanced_topics, Advanced Topics} section.
+*/
+inline void class_invariant_broken_on_throw ( from const& context )
+ // In general this could throw for user defined handlers.
+ { aux::broken_handlers<>::class_invariant_on_throw(context); }
+
+/** @brief For convenience, set all class invariant broken handlers (on entry,
+on exit, and on throw) to specified handler. */
+inline void set_class_invariant_broken ( broken_contract_handler handler )
+ throw( )
+{
+ set_class_invariant_broken_on_entry(handler);
+ set_class_invariant_broken_on_exit(handler);
+ set_class_invariant_broken_on_throw(handler);
+}
+
+/** @brief Set block invariant broken handler to specified handler returning
+replaced handler. */
+inline broken_contract_handler set_block_invariant_broken (
+ broken_contract_handler handler ) throw( )
+{
+ broken_contract_handler prev = aux::broken_handlers<>::block_invariant;
+ aux::broken_handlers<>::block_invariant = handler;
+ return prev;
+}
+
+/**
+@brief Broken handler called when a block invariant assertion fails.
+
+By default, it prints information about the failed assertion to
+<c>std::cerr</c> and it calls <c>std::terminate</c>.
+However, it can be customized using
+@RefFunc{contract::set_block_invariant_broken} (even to throw exceptions, but
+programmers should be careful to never throw from destructors).
+
+@Params
+@Param{context,
+Context from which the block invariants assertion failed (i.e.\, the body).
+}
+@EndParams
+
+This handler is automatically called by the library in case of a block invariant
+assertion failure (an assertion fails if it is not evaluated to be true, so
+if it is evaluated to be false but also if it cannot be evaluated because an
+exception is thrown by the asserted condition).
+
+@SeeAlso @RefSect{advanced_topics, Advanced Topics} section.
+*/
+inline void block_invariant_broken ( from const& context )
+ // In general this could throw for user defined handlers.
+ { aux::broken_handlers<>::block_invariant(context); }
+
+/** @brief Set the loop variant broken handler to specified handler returning
+replaced handler. */
+inline broken_contract_handler set_loop_variant_broken (
+ broken_contract_handler handler ) throw( )
+{
+ broken_contract_handler prev = aux::broken_handlers<>::loop_variant;
+ aux::broken_handlers<>::loop_variant = handler;
+ return prev;
+}
+
+/**
+@brief Broken handler called when a loop variant assertion fails.
+
+By default, it prints information about the failed assertion to
+<c>std::cerr</c> and it calls <c>std::terminate</c>.
+However, it can be customized using
+@RefFunc{contract::set_loop_variant_broken} (even to throw exceptions, but
+programmers should be careful to never throw from destructors).
+
+@Params
+@Param{context,
+Context from which the loop variants assertion failed (i.e.\, the body).
+}
+@EndParams
+
+This handler is automatically called by the library in case of a loop invariant
+assertion failure (an assertion fails if it is not evaluated to be true, so
+if it is evaluated to be false but also if it cannot be evaluated because an
+exception is thrown by the asserted condition).
+
+@SeeAlso @RefSect{advanced_topics, Advanced Topics} section.
+*/
+inline void loop_variant_broken ( from const& context )
+ // In general this could throw for user defined handlers.
+ { aux::broken_handlers<>::loop_variant(context); }
+
+} // namespace
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/class.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/class.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,72 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_CLASS_HPP_
+#define CONTRACT_CLASS_HPP_
+
+/** @file
+@brief Macros used to declare classes with contracts (this header is
+automatically included by <c>contract.hpp</c>).
+*/
+
+#include <contract/aux_/macro/class.hpp>
+#include <contract/detail/preprocessor/traits/class.hpp>
+
+/**
+@brief Macro used to declare classes with contracts.
+
+This macro is used to declare a class with class invariants and member
+functions with preconditions and postconditions.
+A class declared with this macro must always specify (possibly empty) class
+invariants using the @RefMacro{CONTRACT_CLASS_INVARIANT} macro.
+
+Constructors, destructors, and member functions with contracts are declared
+using the @RefMacro{CONTRACT_CONSTRUCTOR}, @RefMacro{CONTRACT_DESTRUCTOR}, and
+@RefMacro{CONTRACT_FUNCTION} macros respectively.
+The semantics of calls to constructors, destructors, and member functions with
+contracts are explained in the
+@RefSect{contract_programming_overview, Contract Programming Overview} section.
+
+@Params
+@Param{class_declaration,
+The class declaration syntax is explained in the @RefSect{grammar\, Grammar}
+section.
+If present\, base classes must be specified using <c>extends( ... )</c>.
+}
+@EndParams
+
+Nested classes with contracts are also declared using this macro but they must
+always repeat their access level <c>public</c>, <c>protected</c>, or
+<c>private</c>.
+Within a type-dependent scope, nested classes with contracts must be declared
+using the @RefMacro{CONTRACT_CLASS_TPL} macro.
+
+@SeeAlso @RefSect{tutorial, Tutorial} section.
+*/
+#define CONTRACT_CLASS(class_declaration) \
+ CONTRACT_AUX_CLASS( \
+ BOOST_LOCAL_FUNCTION_DETAIL_PP_LINE_COUNTER, \
+ 0, /* outside template */ \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS(class_declaration))
+
+/**
+@brief Macro used to declare nested classes with contracts within a
+type-dependent scope (e.g., within templates).
+
+This macro is the exact same as @RefMacro{CONTRACT_CLASS} but it must be used
+when declaring nested classes with contracts within a type-dependent scope.
+
+@SeeAlso @RefSect{tutorial, Tutorial} section.
+*/
+#define CONTRACT_CLASS_TPL(class_declaration) \
+ CONTRACT_AUX_CLASS( \
+ BOOST_LOCAL_FUNCTION_DETAIL_PP_LINE_COUNTER, \
+ 1, /* inside template */ \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS(class_declaration))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/class_invariant.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/class_invariant.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,103 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_CLASS_INVARIANT_HPP_
+#define CONTRACT_CLASS_INVARIANT_HPP_
+
+/** @file
+@brief Macros used to specify class invariants (this header is automatically
+included by <c>contract.hpp</c>).
+*/
+
+#include <contract/aux_/macro/class_invariant.hpp>
+#include <contract/detail/preprocessor/variadic/to_seq.hpp>
+#include <boost/local_function/detail/preprocessor/line_counter.hpp>
+#include <boost/config.hpp>
+
+#ifndef DOXYGEN
+
+#ifndef BOOST_NO_VARIADIC_MACROS
+
+#define CONTRACT_CLASS_INVARIANT(...) \
+ CONTRACT_AUX_CLASS_INVARIANT( \
+ BOOST_LOCAL_FUNCTION_DETAIL_PP_LINE_COUNTER, \
+ 0 /* outside template */, \
+ CONTRACT_DETAIL_PP_VARIADIC_TO_SEQ((void) /* empty */, \
+ __VA_ARGS__))
+
+#define CONTRACT_CLASS_INVARIANT_TPL(...) \
+ CONTRACT_AUX_CLASS_INVARIANT( \
+ BOOST_LOCAL_FUNCTION_DETAIL_PP_LINE_COUNTER, \
+ 1 /* inside template */, \
+ CONTRACT_DETAIL_PP_VARIADIC_TO_SEQ((void) /* empty */, \
+ __VA_ARGS__))
+
+#else
+
+#define CONTRACT_CLASS_INVARIANT(seq) \
+ CONTRACT_AUX_CLASS_INVARIANT( \
+ BOOST_LOCAL_FUNCTION_DETAIL_PP_LINE_COUNTER, \
+ 0, /* outside template */ \
+ seq)
+
+#define CONTRACT_CLASS_INVARIANT_TPL(seq) \
+ CONTRACT_AUX_CLASS_INVARIANT( \
+ BOOST_LOCAL_FUNCTION_DETAIL_PP_LINE_COUNTER, \
+ 1, /* inside template */ \
+ seq)
+
+#endif
+
+#else
+
+/**
+@brief Macro used to specify class invariants.
+
+This macro must be used to specify class invariant at the very beginning of the
+definition of a class with contracts declared using the
+@RefMacro{CONTRACT_CLASS} macro (no other statement can appear before this
+macro in the class definition, not even a <c>typedef</c> or a <c>friend</c>
+declaration).
+
+Constructors, destructors, and member functions with contracts are declared
+using the @RefMacro{CONTRACT_CONSTRUCTOR}, @RefMacro{CONTRACT_DESTRUCTOR}, and
+@RefMacro{CONTRACT_FUNCTION} macros respectively.
+The semantics of calls to constructors, destructors, and member functions of a
+class with contracts are explained in the
+@RefSect{contract_programming_overview, Contract Programming Overview} section.
+
+@Params
+@Param{class_invariants,
+The syntax for class invariants is explained in the @RefSect{grammar\, Grammar}
+section.
+Use <c>void</c> to specify empty class invariant.
+}
+@EndParams
+
+Within a type-dependent scope (e.g., within templates), the
+@RefMacro{CONTRACT_CLASS_INVARIANT_TPL} macro must be used instead of this
+macro.
+
+@SeeAlso @RefSect{tutorial, Tutorial} section.
+*/
+#define CONTRACT_CLASS_INVARIANT(class_invariants)
+
+/**
+@brief Macro used to specify class invariants within a type-dependent scope
+(e.g., within templates).
+
+This macro is the exact same as @RefMacro{CONTRACT_CLASS_INVARIANT} but it must
+be used when specifying class invariants within a type-dependent scope.
+
+@SeeAlso @RefSect{tutorial, Tutorial} section.
+*/
+#define CONTRACT_CLASS_INVARIANT_TPL(class_invariants)
+
+#endif
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/config.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/config.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,258 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_CONFIG_HPP_
+#define CONTRACT_CONFIG_HPP_
+
+/** @file
+@brief Macros used to configure the library behaviour at compile-time (this
+header is automatically included by <c>contract.hpp</c>).
+
+These configuration macros have appropriate default values if left undefined.
+Programmers can define these macros before including any of the library headers
+(using compiler options like <c>-D</c> for GCC, <c>/D</c> for MSVC, etc) in
+order to change the library behaviour.
+
+The macros @RefMacro{CONTRACT_CONFIG_NO_PRECONDITIONS},
+@RefMacro{CONTRACT_CONFIG_NO_POSTCONDITIONS}, etc can be defined to selectively
+disable compilation and run-time checking of all preconditions, postconditions,
+etc.
+This is a common practice in Contract Programming to generate debug and release
+builds with less correctness checks but faster run-times.
+Note that all contracts are compiled and checked at run-time by default unless
+specified otherwise using these configuration macros.
+
+@SeeAlso @RefSect{getting_started, Getting Started} section,
+@RefSect{contract_programming_overview, Contract Programming Overview} section.
+*/
+
+#include <contract/limits.hpp>
+
+// All these macros are undefined by default (unless generating Doxygen docs).
+// Virtual specifiers (final, override, and new) are enabled iff contracts
+// (pre, post, or inv) are enabled.
+#ifdef DOXYGEN
+
+/**
+@brief Disable compilation and run-time checking of all preconditions.
+
+Preconditions are not checked at run-time and not even compiled when
+programmers define this macro.
+This can be used to speed up execution and compilation of debug and release
+builds at different stages of development and testing as it is common practise
+in Contract Programming.
+
+@Note Assertion requirements can be used to selectively disable single
+assertions (see the @RefSect{advanced_topics, Advanced Topics} section).
+
+@SeeAlso @RefSect{getting_started, Getting Started} section.
+*/
+#define CONTRACT_CONFIG_NO_PRECONDITIONS
+
+/**
+@brief Disable compilation and run-time checking of all postconditions.
+
+Postconditions are not checked at run-time and not even compiled when
+programmers define this macro.
+This can be used to speed up execution and compilation of debug and release
+builds at different stages of development and testing as it is common practise
+in Contract Programming.
+
+@Note Assertion requirements can be used to selectively disable single
+assertions (see the @RefSect{advanced_topics, Advanced Topics} section).
+
+@SeeAlso @RefSect{getting_started, Getting Started} section.
+*/
+#define CONTRACT_CONFIG_NO_POSTCONDITIONS
+
+/**
+@brief Disable compilation and run-time checking of all class invariants.
+
+Class invariants are not checked at run-time and not even compiled when
+programmers define this macro.
+This can be used to speed up execution and compilation of debug and release
+builds at different stages of development and testing as it is common practise
+in Contract Programming.
+
+@Note Assertion requirements can be used to selectively disable single
+assertions (see the @RefSect{advanced_topics, Advanced Topics} section).
+
+@SeeAlso @RefSect{getting_started, Getting Started} section.
+*/
+#define CONTRACT_CONFIG_NO_CLASS_INVARIANTS
+
+/**
+@brief Disable compilation and run-time checking of all block invariants.
+
+Block invariants are not checked at run-time and not even compiled when
+programmers define this macro.
+This can be used to speed up execution and compilation of debug and release
+builds at different stages of development and testing as it is common practise
+in Contract Programming.
+
+@Note Assertion requirements can be used to selectively disable single
+assertions (see the @RefSect{advanced_topics, Advanced Topics} section).
+
+@SeeAlso @RefSect{getting_started, Getting Started} section.
+*/
+#define CONTRACT_CONFIG_NO_BLOCK_INVARIANTS
+
+/**
+@brief Disable compilation and run-time checking of all loop variants.
+
+Loop variants are not checked at run-time and not even compiled when
+programmers define this macro.
+This can be used to speed up execution and compilation of debug and release
+builds at different stages of development and testing as it is common practise
+in Contract Programming.
+
+@Note Assertion requirements can be used to selectively disable single
+assertions (see the @RefSect{advanced_topics, Advanced Topics} section).
+
+@SeeAlso @RefSect{getting_started, Getting Started} section.
+*/
+#define CONTRACT_CONFIG_NO_LOOP_VARIANTS
+
+#endif // DOXYGEN
+
+/**
+@brief Specify the maximum number of supported function parameters.
+
+This macro automatically defaults to <c>5</c> if left undefined by programmers.
+This macro must be a non-negative integral number.
+Increasing the value specified by this macro might increase compilation time.
+
+@SeeAlso @RefSect{tutorial, Tutorial} section.
+*/
+#ifndef CONTRACT_CONFIG_FUNCTION_ARITY_MAX
+# define CONTRACT_CONFIG_FUNCTION_ARITY_MAX 5
+#endif
+
+/**
+@brief Specify the maximum number of base classes supported for
+multiple-inheritance.
+
+This macro automatically defaults to <c>4</c> if left undefined by programmers.
+This macro must be a non-negative integral number.
+Increasing the value specified by this macro might increase compilation time.
+
+@SeeAlso @RefSect{tutorial, Tutorial} section.
+*/
+#ifndef CONTRACT_CONFIG_INHERITANCE_MAX
+# define CONTRACT_CONFIG_INHERITANCE_MAX 4
+#endif
+
+/**
+@brief Specify the maximum number of supported old value declarations in
+postconditions.
+
+This macro automatically defaults to <c>5</c> if left undefined by programmers.
+This macro must be a non-negative integral number smaller or equal to
+@RefMacro{CONTRACT_LIMIT_OLDOFS}.
+Increasing the value specified by this macro might increase compilation time.
+
+@SeeAlso @RefSect{tutorial, Tutorial} section.
+*/
+#ifndef CONTRACT_CONFIG_OLDOF_MAX
+# define CONTRACT_CONFIG_OLDOF_MAX 5
+#endif
+#if CONTRACT_CONFIG_OLDOF_MAX > CONTRACT_LIMIT_OLDOFS
+# error "CONTRACT_CONFIG_OLDOF_MAX cannot exceed CONTRACT_LIMIT_OLDOFS"
+#endif
+
+/**
+@brief Specify the maximum supported array dimension for multi-dimensional
+arrays.
+
+This macro automatically defaults to <c>3</c> if left undefined by programmers
+(therefore, by default up to 3-dimensional arrays <c>x[]</c>, <c>x[][]</c>, and
+<c>x[][][]</c> can be passed to functions declared using this library, but
+always using an extra <c>typedef</c> as specified by the
+@RefSect{tutorial, Tutorial} section).
+This macro must be a non-negative integral number.
+Increasing the value specified by this macro might increase compilation time.
+
+@SeeAlso @RefSect{tutorial, Tutorial} section.
+*/
+#ifndef CONTRACT_CONFIG_ARRAY_DIMENSION_MAX
+# define CONTRACT_CONFIG_ARRAY_DIMENSION_MAX 3
+#endif
+
+#ifdef DOXYGEN
+
+/**
+@brief Do not allow overriding functions to specify preconditions.
+
+If programmers define this macro, the library will generate a compile-time
+error if overriding functions specify preconditions.
+Therefore, preconditions can only be specified by functions at the very root of
+the inheritance tree and they cannot be subcontracted (this is as specified by
+@RefSect{bibliography, [N1962]}, however note that in case of
+multiple-inheritance the preconditions of all base functions will still be
+checked in logic-or with each other effectively still allowing a base class to
+weaken the preconditions from another base class).
+
+By default, this library allows to subcontract preconditions.
+
+@SeeAlso @RefSect{advanced_topics, Advanced Topics} section.
+*/
+#define CONTRACT_CONFIG_DO_NOT_SUBCONTRACT_PRECONDITIONS
+
+/**
+@brief Specify that no assertion should be disabled while checking
+preconditions.
+
+Assertion checking is disabled within assertions in order to avoid infinite
+recursion and that is a standard requirement of Contract Programming.
+However, if programmers define this macro then no assertion checking is
+disabled within preconditions (this is as specified by
+@RefSect{bibliography, [N1962]}).
+Assertion checking within assertion checking will still be disabled for
+postconditions, class invariants, etc.
+
+By default, this library disables assertion checking within assertions for all
+contracts, including preconditions.
+
+@SeeAlso @RefSect{contract_programming_overview, Contract Programming Overview}
+section.
+*/
+#define CONTRACT_CONFIG_PRECONDITIONS_DISABLE_NO_ASSERTION
+
+/**
+@brief Report precondition that failed in the overridden function (instead of
+the precondition failed in the overriding function).
+
+Subcontracted preconditions fail only when the preconditions of the overriding
+function fail together with the overridden preconditions from all the base
+classes.
+By default the assertion that failed in the overriding function is reported.
+If programmes define this macro then the library will instead the report the
+assertion that failed in the overridden function from within one of the base
+classes.
+
+@SeeAlso @RefSect{advanced_topics, Advanced Topics} section.
+*/
+#define CONTRACT_CONFIG_REPORT_BASE_PRECONDITION_FAILURE
+
+/**
+@brief Make the implementation of this library thread-safe.
+
+In order to globally disable assertion checking within assertions, this library
+internally has to use a global variable.
+If programmers defined this macro, such a variable will be automatically locked
+to avoid race conditions (this effectively introduces a global lock in the
+program).
+
+@SeeAlso @RefSect{contract_programming_overview, Contract Programming Overview}
+section.
+*/
+#define CONTRACT_CONFIG_THREAD_SAFE
+
+#endif // DOXYGEN
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/constructor.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/constructor.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,85 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_CONSTRUCTOR_HPP_
+#define CONTRACT_CONSTRUCTOR_HPP_
+
+/** @file
+@brief Macros used to declare constructors with contracts (this header is
+automatically included by <c>contract.hpp</c>).
+*/
+
+#include <contract/aux_/macro/function.hpp>
+#include <contract/aux_/preprocessor/func_kind.hpp>
+#include <contract/detail/preprocessor/traits/func.hpp>
+
+/**
+@brief Macro used to declare constructors with contracts.
+
+This macro is used to declare a constructor with possible preconditions and
+postconditions.
+At least all public constructors of a class with non-empty class invariants
+should be declared using this macro so to check the class invariants (even if
+the constructors have no precondition and no postcondition).
+
+The semantics of a call to a constructor with contracts are explained in the
+@RefSect{contract_programming_overview, Contract Programming Overview} section.
+Destructors and member functions are declared using the
+@RefMacro{CONTRACT_DESTRUCTOR} and @RefMacro{CONTRACT_FUNCTION} macros
+respectively.
+
+@Params
+@Param{function_declaration,
+The constructor declaration syntax is explained in the
+@RefSect{grammar\, Grammar} section.
+Constructors must always repeat their access level <c>public</c>\,
+<c>protected</c>\, or <c>private</c>.
+If present\, member initializers must be specified using
+<c>initialize( ... )</c> and within this macro (even if they are technically
+part of the constructor definition and not of its declaration).
+}
+@EndParams
+
+The @RefMacro{CONTRACT_CLASS} macro must be used to declare the class enclosing
+a constructor declared using this macro.
+
+Within a type-dependent scope (e.g., within templates), the
+@RefMacro{CONTRACT_CONSTRUCTOR_TPL} macro must be used instead of this macro.
+
+The @RefMacro{CONTRACT_CONSTRUCTOR_BODY} macro must be used when separating the
+constructor body definition form the constructor declaration programmed using
+this macro.
+Unfortunately, it is not possible to use this macro so separate body
+definitions for constructors that have member initializers.
+
+@SeeAlso @RefSect{tutorial, Tutorial} section.
+*/
+#define CONTRACT_CONSTRUCTOR(function_declaration) \
+ CONTRACT_AUX_FUNCTION( \
+ BOOST_LOCAL_FUNCTION_DETAIL_PP_LINE_COUNTER, \
+ 0, /* outside template */ \
+ CONTRACT_AUX_PP_FUNC_KIND_CONSTRUCTOR, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS(function_declaration))
+
+/**
+@brief Macro used to declare constructors with contracts within a
+type-dependent scope (e.g., within templates).
+
+This macro is the exact same as @RefMacro{CONTRACT_CONSTRUCTOR} but it must be
+used when declaring constructors with contracts within a type-dependent scope.
+
+@SeeAlso @RefSect{tutorial, Tutorial} section.
+*/
+#define CONTRACT_CONSTRUCTOR_TPL(function_declaration) \
+ CONTRACT_AUX_FUNCTION( \
+ BOOST_LOCAL_FUNCTION_DETAIL_PP_LINE_COUNTER, \
+ 1, /* inside template */ \
+ CONTRACT_AUX_PP_FUNC_KIND_CONSTRUCTOR, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS(function_declaration))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/copy.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/copy.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,77 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_COPY_HPP_
+#define CONTRACT_COPY_HPP_
+
+/** @file
+@brief Copy result value and old values for postconditions (this header is
+automatically included by <c>contract.hpp</c>).
+*/
+
+#include <boost/type_traits/add_const.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/noncopyable.hpp>
+
+namespace contract {
+
+/**
+@brief Copy result value and old values for postconditions.
+
+The default implementation of his class template can copy values of any type
+that is <c>ConstantCopyConstructible</c> which is of any type <c>T</c> that has
+a constant-correct copy constructor of the form:
+
+@code
+ T::T( T const& source ) ;
+@endcode
+
+@Params
+@Param{T,
+The type of the value to copy (it is either the result type of the type of an
+old-of expression).
+}
+@EndParams
+
+Programmers can specialize this class template to copy a specific type
+differently (and even for types that are not <c>ConstantCopyConstructible</c>,
+or not <c>CopyConstructible</c> at all).
+
+@Warning When specializing this class template, programmers must make sure that
+their code is constant-correct otherwise the contracts will no longer be
+constant-correct.
+
+@SeeAlso @RefSect{advanced_topics, Advanced Topics} section.
+*/
+template< typename T >
+class copy : private boost::noncopyable {
+public:
+ typedef typename boost::add_reference<typename boost::add_const<
+ T>::type>::type const_reference_type;
+
+ /**
+ @brief Construct this object copying the specified value assuming <c>T</c>
+ has a constant-correct copy constructor.
+ */
+ explicit copy ( const_reference_type value )
+ : value_(value) // Copy here using T's const-correct copy constructor.
+ {}
+
+ /**
+ @brief Return a constant reference to the copied value.
+ */
+ const_reference_type value ( void ) const { return value_; }
+
+private:
+ // Hold by value (not by reference) to make actual copy.
+ typename boost::add_const<T>::type value_;
+};
+
+} // namespace contract
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/destructor.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/destructor.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,81 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DESTRUCTOR_HPP_
+#define CONTRACT_DESTRUCTOR_HPP_
+
+/** @file
+@brief Macros used to declare destructors with contracts (this header is
+automatically included by <c>contract.hpp</c>).
+*/
+
+#include <contract/aux_/macro/function.hpp>
+#include <contract/aux_/preprocessor/func_kind.hpp>
+#include <contract/detail/preprocessor/traits/func.hpp>
+
+/**
+@brief Macro used to declare destructors with contracts.
+
+This macro is used to declare a destructor.
+At least the public destructor of a class with non-empty class invariants should
+be declared using this macro in order to check the class invariants (even if
+destructors never have preconditions or postconditions).
+
+The semantics of a call to a destructor with contracts are explained in the
+@RefSect{contract_programming_overview, Contract Programming Overview} section.
+Constructor and member functions are declared using the
+@RefMacro{CONTRACT_CONSTRUCTOR} and @RefMacro{CONTRACT_FUNCTION} macros
+respectively.
+
+@Params
+@Param{function_declaration,
+The destructor declaration syntax is explained in the
+@RefSect{grammar\, Grammar} section.
+Destructors must always repeat their access level <c>public</c>\,
+<c>protected</c>\, or <c>private</c>.
+The keyword <c>void</c> must be used to indicate that the destructor has an
+empty parameter list.
+}
+@EndParams
+
+The @RefMacro{CONTRACT_CLASS} macro must be used to declare the class enclosing
+a destructor declared using this macro.
+
+Within a type-dependent scope (e.g., within templates), the
+@RefMacro{CONTRACT_DESTRUCTOR_TPL} macro must be used instead of this macro.
+
+The @RefMacro{CONTRACT_DESTRUCTOR_BODY} macro must be used when separating the
+destructor body definition from the destruction declaration programmed using
+this macro.
+
+@SeeAlso @RefSect{tutorial, Tutorial} section.
+*/
+#define CONTRACT_DESTRUCTOR(function_declaration) \
+ CONTRACT_AUX_FUNCTION( \
+ BOOST_LOCAL_FUNCTION_DETAIL_PP_LINE_COUNTER, \
+ 0, /* outside template */ \
+ CONTRACT_AUX_PP_FUNC_KIND_DESTRUCTOR, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS(function_declaration))
+
+/**
+@brief Macro used to declare destructors with contracts within a type-dependent
+scope (e.g., within templates).
+
+This macro is the exact same as @RefMacro{CONTRACT_DESTRUCTOR} but it must be
+used when declaring destructors with contracts within a type-dependent scope.
+
+@SeeAlso @RefSect{tutorial, Tutorial} section.
+*/
+#define CONTRACT_DESTRUCTOR_TPL(function_declaration) \
+ CONTRACT_AUX_FUNCTION( \
+ BOOST_LOCAL_FUNCTION_DETAIL_PP_LINE_COUNTER, \
+ 1, /* inside template */ \
+ CONTRACT_AUX_PP_FUNC_KIND_DESTRUCTOR, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS(function_declaration))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/array/first_n-generate.py
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/array/first_n-generate.py 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,70 @@
+
+# Copyright (C) 2008-2012 Lorenzo Caminiti
+# Distributed under 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)
+# Home at http://sourceforge.net/projects/contractpp
+
+import sys
+import shutil
+
+def placeholders(start, stop):
+ (s, comma) = ('', '')
+ for i in range(start, stop):
+ (s, comma) = (s + comma + '_' + str(i + 1), ', ')
+ return s
+
+def data(max_size):
+ s = ''
+ for size in range(1, max_size + 1):
+ for index in range(1, size + 1):
+ s = s + '''
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_{0}_{1}({2}) \\
+ ({1}, ({3})) \
+'''.format(size, index, placeholders(0, size), placeholders(0, index))
+ return s
+
+BOOST_PP_LIMIT_TUPLE = raw_input("BOOST_PP_LIMIT_TUPLE" +
+ " from <boost/preprocessor/limits.hpp> [64] = ")
+if BOOST_PP_LIMIT_TUPLE == "": BOOST_PP_LIMIT_TUPLE = 64
+else: BOOST_PP_LIMIT_TUPLE = int(BOOST_PP_LIMIT_TUPLE)
+
+header = sys.argv[0].replace("-generate.py", ".hpp", 1)
+shutil.copyfile(header, header + ".bak")
+h = open(header, 'w')
+
+h.write('''
+#ifndef CONTRACT_DETAIL_PP_ARRAY_FIRST_N_HPP_
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_HPP_
+
+// WARNING: FILE AUTOMATICALLY GENERATED, DO NOT MODIFY IT!
+// Instead modify the generation script "<FILE>-generate.py" and run
+// `$ python <FILE_NAME>-generate.py > FILE_NAME.hpp`.
+// Used: #define BOOST_PP_LIMIT_TUPLE {0}
+
+#include <boost/preprocessor/limits.hpp>
+#if BOOST_PP_LIMIT_TUPLE != {0}
+#error "Code generation used incorrect BOOST_PP_LIMIT_TUPLE"
+#endif
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/array/size.hpp>
+#include <boost/preprocessor/array/data.hpp>
+
+// PUBLIC //
+
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N(n, array) \\
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_ARRAY_FIRST_N_, \\
+ BOOST_PP_CAT(BOOST_PP_ARRAY_SIZE(array), BOOST_PP_CAT(_, n))) \\
+ BOOST_PP_ARRAY_DATA(array)
+
+// DATA //
+{1}
+
+#endif // #include guard
+
+'''.format(BOOST_PP_LIMIT_TUPLE, data(BOOST_PP_LIMIT_TUPLE)))
+
+h.close()
+print "Written", header
+
Added: sandbox/contract/include/contract/detail/preprocessor/array/first_n.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/array/first_n.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,4196 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_ARRAY_FIRST_N_HPP_
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_HPP_
+
+// WARNING: FILE AUTOMATICALLY GENERATED, DO NOT MODIFY IT!
+// Instead modify the generation script "<FILE>-generate.py" and run
+// `$ python <FILE_NAME>-generate.py > FILE_NAME.hpp`.
+// Used: #define BOOST_PP_LIMIT_TUPLE 64
+
+#include <boost/preprocessor/limits.hpp>
+#if BOOST_PP_LIMIT_TUPLE != 64
+#error "Code generation used incorrect BOOST_PP_LIMIT_TUPLE"
+#endif
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/array/size.hpp>
+#include <boost/preprocessor/array/data.hpp>
+
+// PUBLIC //
+
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N(n, array) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_ARRAY_FIRST_N_, \
+ BOOST_PP_CAT(BOOST_PP_ARRAY_SIZE(array), BOOST_PP_CAT(_, n))) \
+ BOOST_PP_ARRAY_DATA(array)
+
+// DATA //
+
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_1_1(_1) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_2_1(_1, _2) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_2_2(_1, _2) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_3_1(_1, _2, _3) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_3_2(_1, _2, _3) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_3_3(_1, _2, _3) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_4_1(_1, _2, _3, _4) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_4_2(_1, _2, _3, _4) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_4_3(_1, _2, _3, _4) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_4_4(_1, _2, _3, _4) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_5_1(_1, _2, _3, _4, _5) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_5_2(_1, _2, _3, _4, _5) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_5_3(_1, _2, _3, _4, _5) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_5_4(_1, _2, _3, _4, _5) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_5_5(_1, _2, _3, _4, _5) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_6_1(_1, _2, _3, _4, _5, _6) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_6_2(_1, _2, _3, _4, _5, _6) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_6_3(_1, _2, _3, _4, _5, _6) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_6_4(_1, _2, _3, _4, _5, _6) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_6_5(_1, _2, _3, _4, _5, _6) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_6_6(_1, _2, _3, _4, _5, _6) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_7_1(_1, _2, _3, _4, _5, _6, _7) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_7_2(_1, _2, _3, _4, _5, _6, _7) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_7_3(_1, _2, _3, _4, _5, _6, _7) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_7_4(_1, _2, _3, _4, _5, _6, _7) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_7_5(_1, _2, _3, _4, _5, _6, _7) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_7_6(_1, _2, _3, _4, _5, _6, _7) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_7_7(_1, _2, _3, _4, _5, _6, _7) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_8_1(_1, _2, _3, _4, _5, _6, _7, _8) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_8_2(_1, _2, _3, _4, _5, _6, _7, _8) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_8_3(_1, _2, _3, _4, _5, _6, _7, _8) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_8_4(_1, _2, _3, _4, _5, _6, _7, _8) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_8_5(_1, _2, _3, _4, _5, _6, _7, _8) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_8_6(_1, _2, _3, _4, _5, _6, _7, _8) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_8_7(_1, _2, _3, _4, _5, _6, _7, _8) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_8_8(_1, _2, _3, _4, _5, _6, _7, _8) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_9_1(_1, _2, _3, _4, _5, _6, _7, _8, _9) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_9_2(_1, _2, _3, _4, _5, _6, _7, _8, _9) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_9_3(_1, _2, _3, _4, _5, _6, _7, _8, _9) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_9_4(_1, _2, _3, _4, _5, _6, _7, _8, _9) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_9_5(_1, _2, _3, _4, _5, _6, _7, _8, _9) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_9_6(_1, _2, _3, _4, _5, _6, _7, _8, _9) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_9_7(_1, _2, _3, _4, _5, _6, _7, _8, _9) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_9_8(_1, _2, _3, _4, _5, _6, _7, _8, _9) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_9_9(_1, _2, _3, _4, _5, _6, _7, _8, _9) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_10_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_10_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_10_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_10_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_10_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_10_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_10_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_10_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_10_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_10_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_11_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_11_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_11_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_11_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_11_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_11_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_11_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_11_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_11_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_11_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_11_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_12_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_12_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_12_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_12_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_12_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_12_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_12_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_12_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_12_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_12_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_12_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_12_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_13_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_13_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_13_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_13_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_13_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_13_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_13_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_13_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_13_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_13_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_13_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_13_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_13_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_14_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_14_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_14_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_14_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_14_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_14_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_14_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_14_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_14_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_14_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_14_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_14_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_14_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_14_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_15_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_15_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_15_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_15_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_15_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_15_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_15_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_15_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_15_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_15_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_15_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_15_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_15_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_15_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_15_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_16_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_16_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_16_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_16_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_16_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_16_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_16_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_16_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_16_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_16_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_16_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_16_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_16_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_16_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_16_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_16_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_17_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_17_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_17_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_17_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_17_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_17_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_17_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_17_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_17_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_17_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_17_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_17_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_17_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_17_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_17_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_17_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_17_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_18_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_18_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_18_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_18_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_18_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_18_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_18_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_18_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_18_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_18_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_18_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_18_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_18_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_18_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_18_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_18_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_18_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_18_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_19_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_19_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_19_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_19_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_19_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_19_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_19_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_19_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_19_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_19_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_19_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_19_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_19_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_19_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_19_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_19_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_19_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_19_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_19_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_20_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_20_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_20_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_20_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_20_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_20_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_20_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_20_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_20_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_20_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_20_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_20_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_20_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_20_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_20_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_20_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_20_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_20_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_20_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_20_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_21_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_21_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_21_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_21_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_21_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_21_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_21_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_21_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_21_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_21_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_21_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_21_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_21_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_21_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_21_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_21_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_21_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_21_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_21_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_21_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_21_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_22_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_22_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_22_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_22_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_22_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_22_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_22_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_22_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_22_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_22_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_22_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_22_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_22_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_22_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_22_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_22_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_22_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_22_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_22_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_22_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_22_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_22_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_23_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_23_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_23_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_23_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_23_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_23_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_23_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_23_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_23_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_23_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_23_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_23_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_23_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_23_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_23_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_23_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_23_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_23_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_23_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_23_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_23_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_23_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_23_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_24_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_24_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_24_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_24_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_24_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_24_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_24_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_24_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_24_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_24_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_24_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_24_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_24_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_24_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_24_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_24_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_24_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_24_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_24_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_24_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_24_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_24_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_24_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_24_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_25_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_25_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_25_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_25_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_25_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_25_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_25_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_25_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_25_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_25_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_25_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_25_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_25_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_25_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_25_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_25_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_25_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_25_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_25_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_25_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_25_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_25_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_25_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_25_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_25_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_26_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_26_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_26_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_26_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_26_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_26_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_26_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_26_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_26_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_26_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_26_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_26_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_26_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_26_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_26_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_26_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_26_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_26_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_26_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_26_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_26_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_26_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_26_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_26_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_26_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_26_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_27_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_27_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_27_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_27_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_27_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_27_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_27_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_27_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_27_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_27_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_27_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_27_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_27_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_27_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_27_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_27_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_27_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_27_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_27_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_27_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_27_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_27_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_27_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_27_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_27_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_27_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_27_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_28_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_29_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_30_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_31_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_32_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_33_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_34_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_35_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_36_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_37_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_38_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (38, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (38, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_39_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (39, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (38, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (39, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_40_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (40, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (38, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (39, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (40, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_41_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (41, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (38, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (39, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (40, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (41, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_42_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (42, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (38, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (39, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (40, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (41, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (42, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_43_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (43, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (38, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (39, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (40, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (41, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (42, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (43, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_44_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (44, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (38, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (39, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (40, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (41, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (42, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (43, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (44, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_45_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (45, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (38, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (39, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (40, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (41, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (42, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (43, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (44, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (45, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_46_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (46, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (38, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (39, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (40, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (41, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (42, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (43, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (44, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (45, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (46, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_47_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (47, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (38, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (39, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (40, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (41, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (42, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (43, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (44, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (45, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (46, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (47, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_48_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (48, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (38, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (39, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (40, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (41, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (42, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (43, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (44, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (45, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (46, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (47, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (48, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_49_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (49, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (38, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (39, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (40, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (41, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (42, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (43, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (44, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (45, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (46, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (47, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (48, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (49, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_50_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (50, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (38, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (39, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (40, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (41, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (42, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (43, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (44, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (45, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (46, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (47, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (48, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (49, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (50, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_51_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (51, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (38, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (39, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (40, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (41, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (42, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (43, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (44, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (45, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (46, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (47, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (48, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (49, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (50, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (51, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_52_52(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (52, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (38, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (39, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (40, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (41, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (42, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (43, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (44, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (45, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (46, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (47, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (48, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (49, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (50, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (51, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_52(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (52, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_53_53(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (53, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (38, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (39, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (40, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (41, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (42, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (43, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (44, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (45, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (46, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (47, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (48, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (49, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (50, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (51, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_52(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (52, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_53(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (53, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_54_54(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (54, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (38, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (39, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (40, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (41, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (42, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (43, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (44, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (45, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (46, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (47, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (48, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (49, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (50, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (51, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_52(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (52, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_53(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (53, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_54(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (54, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_55_55(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (55, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (38, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (39, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (40, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (41, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (42, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (43, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (44, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (45, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (46, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (47, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (48, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (49, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (50, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (51, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_52(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (52, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_53(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (53, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_54(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (54, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_55(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (55, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_56_56(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (56, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (38, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (39, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (40, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (41, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (42, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (43, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (44, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (45, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (46, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (47, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (48, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (49, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (50, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (51, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_52(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (52, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_53(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (53, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_54(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (54, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_55(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (55, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_56(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (56, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_57_57(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (57, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (38, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (39, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (40, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (41, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (42, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (43, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (44, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (45, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (46, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (47, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (48, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (49, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (50, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (51, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_52(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (52, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_53(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (53, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_54(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (54, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_55(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (55, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_56(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (56, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_57(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (57, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_58_58(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (58, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (38, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (39, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (40, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (41, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (42, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (43, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (44, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (45, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (46, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (47, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (48, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (49, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (50, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (51, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_52(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (52, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_53(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (53, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_54(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (54, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_55(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (55, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_56(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (56, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_57(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (57, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_58(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (58, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_59_59(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (59, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (38, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (39, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (40, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (41, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (42, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (43, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (44, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (45, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (46, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (47, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (48, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (49, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (50, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (51, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_52(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (52, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_53(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (53, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_54(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (54, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_55(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (55, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_56(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (56, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_57(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (57, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_58(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (58, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_59(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (59, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_60_60(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (60, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (38, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (39, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (40, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (41, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (42, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (43, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (44, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (45, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (46, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (47, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (48, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (49, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (50, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (51, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_52(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (52, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_53(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (53, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_54(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (54, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_55(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (55, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_56(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (56, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_57(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (57, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_58(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (58, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_59(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (59, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_60(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (60, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_61_61(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (61, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (38, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (39, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (40, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (41, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (42, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (43, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (44, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (45, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (46, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (47, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (48, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (49, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (50, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (51, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_52(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (52, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_53(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (53, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_54(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (54, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_55(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (55, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_56(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (56, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_57(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (57, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_58(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (58, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_59(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (59, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_60(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (60, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_61(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (61, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_62_62(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (62, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (38, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (39, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (40, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (41, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (42, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (43, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (44, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (45, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (46, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (47, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (48, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (49, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (50, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (51, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_52(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (52, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_53(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (53, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_54(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (54, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_55(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (55, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_56(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (56, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_57(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (57, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_58(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (58, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_59(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (59, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_60(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (60, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_61(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (61, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_62(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (62, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_63_63(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (63, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (1, (_1))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (2, (_1, _2))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (3, (_1, _2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (4, (_1, _2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (5, (_1, _2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (6, (_1, _2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (7, (_1, _2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (8, (_1, _2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (9, (_1, _2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (10, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (11, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (12, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (13, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (14, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (15, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (16, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (17, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (18, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (19, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (20, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (21, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (22, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (23, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (24, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (25, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (26, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (27, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (28, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (29, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (30, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (31, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (32, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (33, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (34, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (35, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (36, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (37, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (38, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (39, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (40, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (41, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (42, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (43, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (44, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (45, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (46, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (47, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (48, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (49, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (50, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (51, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_52(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (52, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_53(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (53, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_54(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (54, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_55(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (55, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_56(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (56, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_57(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (57, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_58(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (58, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_59(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (59, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_60(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (60, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_61(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (61, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_62(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (62, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_63(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (63, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_FIRST_N_64_64(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (64, (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/array/rem.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/array/rem.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,22 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_ARRAY_REM_HPP_
+#define CONTRACT_DETAIL_PP_ARRAY_REM_HPP_
+
+#include <boost/preprocessor/tuple/rem.hpp>
+#include <boost/preprocessor/array/size.hpp>
+#include <boost/preprocessor/array/data.hpp>
+
+// PUBLIC //
+
+#define CONTRACT_DETAIL_PP_ARRAY_REM(array) \
+ BOOST_PP_TUPLE_REM_CTOR(BOOST_PP_ARRAY_SIZE(array), \
+ BOOST_PP_ARRAY_DATA(array))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/array/rest_n-generate.py
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/array/rest_n-generate.py 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,71 @@
+
+# Copyright (C) 2008-2012 Lorenzo Caminiti
+# Distributed under 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)
+# Home at http://sourceforge.net/projects/contractpp
+
+import sys
+import shutil
+
+def placeholders(start, stop):
+ (s, comma) = ('', '')
+ for i in range(start, stop):
+ (s, comma) = (s + comma + '_' + str(i + 1), ', ')
+ return s
+
+def data(max_size):
+ s = ''
+ for size in range(1, max_size + 1):
+ for index in range(1, size):
+ s = s + '''
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_{0}_{1}({2}) \\
+ ({3}, ({4})) \
+'''.format(size, index, placeholders(0, size), str(size - index),
+ placeholders(index, size))
+ return s
+
+BOOST_PP_LIMIT_TUPLE = raw_input("BOOST_PP_LIMIT_TUPLE" +
+ " from <boost/preprocessor/limits.hpp> [64] = ")
+if BOOST_PP_LIMIT_TUPLE == "": BOOST_PP_LIMIT_TUPLE = 64
+else: BOOST_PP_LIMIT_TUPLE = int(BOOST_PP_LIMIT_TUPLE)
+
+header = sys.argv[0].replace("-generate.py", ".hpp", 1)
+shutil.copyfile(header, header + ".bak")
+h = open(header, 'w')
+
+h.write('''
+#ifndef CONTRACT_DETAIL_PP_ARRAY_REST_N_HPP_
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_HPP_
+
+// WARNING: FILE AUTOMATICALLY GENERATED, DO NOT MODIFY IT!
+// Instead modify the generation script "<FILE>-generate.py" and run
+// `$ python <FILE_NAME>-generate.py > FILE_NAME.hpp`.
+// Used: #define BOOST_PP_LIMIT_TUPLE {0}
+
+#include <boost/preprocessor/limits.hpp>
+#if BOOST_PP_LIMIT_TUPLE != {0}
+#error "Code generation used incorrect BOOST_PP_LIMIT_TUPLE"
+#endif
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/array/size.hpp>
+#include <boost/preprocessor/array/data.hpp>
+
+// PUBLIC //
+
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N(n, array) \\
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_ARRAY_REST_N_, \\
+ BOOST_PP_CAT(BOOST_PP_ARRAY_SIZE(array), BOOST_PP_CAT(_, n))) \\
+ BOOST_PP_ARRAY_DATA(array)
+
+// DATA //
+{1}
+
+#endif // #include guard
+
+'''.format(BOOST_PP_LIMIT_TUPLE, data(BOOST_PP_LIMIT_TUPLE)))
+
+h.close()
+print "Written", header
+
Added: sandbox/contract/include/contract/detail/preprocessor/array/rest_n.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/array/rest_n.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,4068 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_ARRAY_REST_N_HPP_
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_HPP_
+
+// WARNING: FILE AUTOMATICALLY GENERATED, DO NOT MODIFY IT!
+// Instead modify the generation script "<FILE>-generate.py" and run
+// `$ python <FILE_NAME>-generate.py > FILE_NAME.hpp`.
+// Used: #define BOOST_PP_LIMIT_TUPLE 64
+
+#include <boost/preprocessor/limits.hpp>
+#if BOOST_PP_LIMIT_TUPLE != 64
+#error "Code generation used incorrect BOOST_PP_LIMIT_TUPLE"
+#endif
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/array/size.hpp>
+#include <boost/preprocessor/array/data.hpp>
+
+// PUBLIC //
+
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N(n, array) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_ARRAY_REST_N_, \
+ BOOST_PP_CAT(BOOST_PP_ARRAY_SIZE(array), BOOST_PP_CAT(_, n))) \
+ BOOST_PP_ARRAY_DATA(array)
+
+// DATA //
+
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_2_1(_1, _2) \
+ (1, (_2))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_3_1(_1, _2, _3) \
+ (2, (_2, _3))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_3_2(_1, _2, _3) \
+ (1, (_3))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_4_1(_1, _2, _3, _4) \
+ (3, (_2, _3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_4_2(_1, _2, _3, _4) \
+ (2, (_3, _4))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_4_3(_1, _2, _3, _4) \
+ (1, (_4))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_5_1(_1, _2, _3, _4, _5) \
+ (4, (_2, _3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_5_2(_1, _2, _3, _4, _5) \
+ (3, (_3, _4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_5_3(_1, _2, _3, _4, _5) \
+ (2, (_4, _5))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_5_4(_1, _2, _3, _4, _5) \
+ (1, (_5))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_6_1(_1, _2, _3, _4, _5, _6) \
+ (5, (_2, _3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_6_2(_1, _2, _3, _4, _5, _6) \
+ (4, (_3, _4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_6_3(_1, _2, _3, _4, _5, _6) \
+ (3, (_4, _5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_6_4(_1, _2, _3, _4, _5, _6) \
+ (2, (_5, _6))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_6_5(_1, _2, _3, _4, _5, _6) \
+ (1, (_6))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_7_1(_1, _2, _3, _4, _5, _6, _7) \
+ (6, (_2, _3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_7_2(_1, _2, _3, _4, _5, _6, _7) \
+ (5, (_3, _4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_7_3(_1, _2, _3, _4, _5, _6, _7) \
+ (4, (_4, _5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_7_4(_1, _2, _3, _4, _5, _6, _7) \
+ (3, (_5, _6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_7_5(_1, _2, _3, _4, _5, _6, _7) \
+ (2, (_6, _7))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_7_6(_1, _2, _3, _4, _5, _6, _7) \
+ (1, (_7))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_8_1(_1, _2, _3, _4, _5, _6, _7, _8) \
+ (7, (_2, _3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_8_2(_1, _2, _3, _4, _5, _6, _7, _8) \
+ (6, (_3, _4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_8_3(_1, _2, _3, _4, _5, _6, _7, _8) \
+ (5, (_4, _5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_8_4(_1, _2, _3, _4, _5, _6, _7, _8) \
+ (4, (_5, _6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_8_5(_1, _2, _3, _4, _5, _6, _7, _8) \
+ (3, (_6, _7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_8_6(_1, _2, _3, _4, _5, _6, _7, _8) \
+ (2, (_7, _8))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_8_7(_1, _2, _3, _4, _5, _6, _7, _8) \
+ (1, (_8))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_9_1(_1, _2, _3, _4, _5, _6, _7, _8, _9) \
+ (8, (_2, _3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_9_2(_1, _2, _3, _4, _5, _6, _7, _8, _9) \
+ (7, (_3, _4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_9_3(_1, _2, _3, _4, _5, _6, _7, _8, _9) \
+ (6, (_4, _5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_9_4(_1, _2, _3, _4, _5, _6, _7, _8, _9) \
+ (5, (_5, _6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_9_5(_1, _2, _3, _4, _5, _6, _7, _8, _9) \
+ (4, (_6, _7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_9_6(_1, _2, _3, _4, _5, _6, _7, _8, _9) \
+ (3, (_7, _8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_9_7(_1, _2, _3, _4, _5, _6, _7, _8, _9) \
+ (2, (_8, _9))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_9_8(_1, _2, _3, _4, _5, _6, _7, _8, _9) \
+ (1, (_9))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_10_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \
+ (9, (_2, _3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_10_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \
+ (8, (_3, _4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_10_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \
+ (7, (_4, _5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_10_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \
+ (6, (_5, _6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_10_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \
+ (5, (_6, _7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_10_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \
+ (4, (_7, _8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_10_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \
+ (3, (_8, _9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_10_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \
+ (2, (_9, _10))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_10_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \
+ (1, (_10))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_11_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \
+ (10, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_11_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \
+ (9, (_3, _4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_11_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \
+ (8, (_4, _5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_11_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \
+ (7, (_5, _6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_11_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \
+ (6, (_6, _7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_11_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \
+ (5, (_7, _8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_11_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \
+ (4, (_8, _9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_11_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \
+ (3, (_9, _10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_11_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \
+ (2, (_10, _11))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_11_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \
+ (1, (_11))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_12_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \
+ (11, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_12_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \
+ (10, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_12_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \
+ (9, (_4, _5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_12_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \
+ (8, (_5, _6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_12_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \
+ (7, (_6, _7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_12_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \
+ (6, (_7, _8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_12_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \
+ (5, (_8, _9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_12_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \
+ (4, (_9, _10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_12_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \
+ (3, (_10, _11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_12_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \
+ (2, (_11, _12))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_12_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \
+ (1, (_12))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_13_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
+ (12, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_13_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
+ (11, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_13_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
+ (10, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_13_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
+ (9, (_5, _6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_13_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
+ (8, (_6, _7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_13_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
+ (7, (_7, _8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_13_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
+ (6, (_8, _9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_13_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
+ (5, (_9, _10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_13_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
+ (4, (_10, _11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_13_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
+ (3, (_11, _12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_13_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
+ (2, (_12, _13))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_13_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
+ (1, (_13))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_14_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (13, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_14_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (12, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_14_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (11, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_14_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (10, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_14_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (9, (_6, _7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_14_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (8, (_7, _8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_14_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (7, (_8, _9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_14_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (6, (_9, _10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_14_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (5, (_10, _11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_14_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (4, (_11, _12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_14_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (3, (_12, _13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_14_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (2, (_13, _14))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_14_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (1, (_14))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_15_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (14, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_15_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (13, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_15_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (12, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_15_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (11, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_15_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (10, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_15_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (9, (_7, _8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_15_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (8, (_8, _9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_15_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (7, (_9, _10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_15_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (6, (_10, _11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_15_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (5, (_11, _12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_15_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (4, (_12, _13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_15_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (3, (_13, _14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_15_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (2, (_14, _15))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_15_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (1, (_15))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_16_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (15, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_16_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (14, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_16_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (13, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_16_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (12, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_16_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (11, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_16_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (10, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_16_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (9, (_8, _9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_16_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (8, (_9, _10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_16_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (7, (_10, _11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_16_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (6, (_11, _12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_16_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (5, (_12, _13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_16_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (4, (_13, _14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_16_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (3, (_14, _15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_16_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (2, (_15, _16))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_16_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (1, (_16))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_17_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (16, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_17_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (15, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_17_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (14, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_17_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (13, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_17_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (12, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_17_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (11, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_17_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (10, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_17_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (9, (_9, _10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_17_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (8, (_10, _11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_17_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (7, (_11, _12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_17_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (6, (_12, _13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_17_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (5, (_13, _14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_17_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (4, (_14, _15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_17_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (3, (_15, _16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_17_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (2, (_16, _17))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_17_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (1, (_17))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_18_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (17, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_18_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (16, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_18_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (15, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_18_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (14, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_18_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (13, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_18_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (12, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_18_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (11, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_18_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (10, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_18_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (9, (_10, _11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_18_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (8, (_11, _12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_18_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (7, (_12, _13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_18_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (6, (_13, _14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_18_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (5, (_14, _15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_18_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (4, (_15, _16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_18_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (3, (_16, _17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_18_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (2, (_17, _18))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_18_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (1, (_18))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_19_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (18, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_19_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (17, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_19_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (16, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_19_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (15, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_19_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (14, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_19_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (13, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_19_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (12, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_19_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (11, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_19_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (10, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_19_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (9, (_11, _12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_19_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (8, (_12, _13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_19_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (7, (_13, _14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_19_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (6, (_14, _15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_19_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (5, (_15, _16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_19_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (4, (_16, _17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_19_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (3, (_17, _18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_19_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (2, (_18, _19))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_19_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (1, (_19))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_20_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (19, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_20_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (18, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_20_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (17, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_20_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (16, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_20_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (15, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_20_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (14, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_20_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (13, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_20_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (12, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_20_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (11, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_20_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (10, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_20_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (9, (_12, _13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_20_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (8, (_13, _14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_20_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (7, (_14, _15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_20_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (6, (_15, _16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_20_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (5, (_16, _17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_20_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (4, (_17, _18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_20_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (3, (_18, _19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_20_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (2, (_19, _20))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_20_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (1, (_20))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_21_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (20, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_21_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (19, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_21_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (18, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_21_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (17, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_21_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (16, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_21_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (15, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_21_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (14, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_21_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (13, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_21_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (12, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_21_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (11, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_21_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (10, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_21_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (9, (_13, _14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_21_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (8, (_14, _15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_21_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (7, (_15, _16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_21_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (6, (_16, _17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_21_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (5, (_17, _18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_21_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (4, (_18, _19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_21_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (3, (_19, _20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_21_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (2, (_20, _21))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_21_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (1, (_21))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_22_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (21, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_22_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (20, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_22_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (19, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_22_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (18, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_22_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (17, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_22_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (16, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_22_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (15, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_22_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (14, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_22_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (13, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_22_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (12, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_22_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (11, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_22_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (10, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_22_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (9, (_14, _15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_22_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (8, (_15, _16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_22_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (7, (_16, _17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_22_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (6, (_17, _18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_22_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (5, (_18, _19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_22_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (4, (_19, _20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_22_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (3, (_20, _21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_22_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (2, (_21, _22))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_22_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (1, (_22))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_23_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (22, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_23_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (21, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_23_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (20, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_23_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (19, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_23_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (18, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_23_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (17, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_23_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (16, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_23_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (15, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_23_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (14, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_23_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (13, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_23_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (12, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_23_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (11, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_23_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (10, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_23_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (9, (_15, _16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_23_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (8, (_16, _17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_23_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (7, (_17, _18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_23_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (6, (_18, _19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_23_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (5, (_19, _20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_23_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (4, (_20, _21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_23_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (3, (_21, _22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_23_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (2, (_22, _23))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_23_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (1, (_23))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_24_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (23, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_24_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (22, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_24_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (21, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_24_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (20, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_24_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (19, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_24_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (18, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_24_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (17, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_24_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (16, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_24_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (15, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_24_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (14, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_24_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (13, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_24_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (12, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_24_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (11, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_24_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (10, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_24_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (9, (_16, _17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_24_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (8, (_17, _18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_24_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (7, (_18, _19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_24_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (6, (_19, _20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_24_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (5, (_20, _21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_24_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (4, (_21, _22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_24_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (3, (_22, _23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_24_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (2, (_23, _24))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_24_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (1, (_24))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_25_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (24, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_25_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (23, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_25_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (22, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_25_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (21, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_25_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (20, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_25_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (19, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_25_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (18, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_25_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (17, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_25_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (16, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_25_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (15, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_25_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (14, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_25_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (13, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_25_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (12, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_25_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (11, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_25_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (10, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_25_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (9, (_17, _18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_25_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (8, (_18, _19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_25_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (7, (_19, _20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_25_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (6, (_20, _21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_25_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (5, (_21, _22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_25_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (4, (_22, _23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_25_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (3, (_23, _24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_25_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (2, (_24, _25))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_25_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (1, (_25))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_26_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (25, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_26_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (24, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_26_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (23, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_26_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (22, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_26_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (21, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_26_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (20, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_26_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (19, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_26_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (18, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_26_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (17, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_26_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (16, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_26_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (15, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_26_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (14, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_26_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (13, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_26_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (12, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_26_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (11, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_26_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (10, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_26_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (9, (_18, _19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_26_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (8, (_19, _20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_26_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (7, (_20, _21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_26_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (6, (_21, _22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_26_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (5, (_22, _23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_26_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (4, (_23, _24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_26_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (3, (_24, _25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_26_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (2, (_25, _26))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_26_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (1, (_26))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_27_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (26, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_27_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (25, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_27_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (24, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_27_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (23, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_27_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (22, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_27_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (21, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_27_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (20, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_27_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (19, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_27_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (18, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_27_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (17, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_27_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (16, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_27_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (15, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_27_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (14, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_27_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (13, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_27_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (12, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_27_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (11, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_27_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (10, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_27_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (9, (_19, _20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_27_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (8, (_20, _21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_27_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (7, (_21, _22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_27_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (6, (_22, _23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_27_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (5, (_23, _24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_27_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (4, (_24, _25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_27_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (3, (_25, _26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_27_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (2, (_26, _27))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_27_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (1, (_27))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_28_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (27, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_28_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (26, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_28_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (25, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_28_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (24, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_28_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (23, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_28_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (22, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_28_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (21, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_28_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (20, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_28_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (19, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_28_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (18, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_28_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (17, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_28_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (16, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_28_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (15, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_28_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (14, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_28_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (13, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_28_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (12, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_28_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (11, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_28_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (10, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_28_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (9, (_20, _21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_28_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (8, (_21, _22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_28_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (7, (_22, _23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_28_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (6, (_23, _24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_28_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (5, (_24, _25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_28_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (4, (_25, _26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_28_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (3, (_26, _27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_28_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (2, (_27, _28))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_28_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (1, (_28))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (28, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (27, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (26, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (25, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (24, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (23, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (22, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (21, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (20, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (19, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (18, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (17, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (16, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (15, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (14, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (13, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (12, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (11, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (10, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (9, (_21, _22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (8, (_22, _23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (7, (_23, _24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (6, (_24, _25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (5, (_25, _26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (4, (_26, _27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (3, (_27, _28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (2, (_28, _29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_29_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (1, (_29))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (29, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (28, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (27, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (26, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (25, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (24, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (23, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (22, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (21, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (20, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (19, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (18, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (17, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (16, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (15, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (14, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (13, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (12, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (11, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (10, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (9, (_22, _23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (8, (_23, _24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (7, (_24, _25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (6, (_25, _26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (5, (_26, _27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (4, (_27, _28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (3, (_28, _29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (2, (_29, _30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_30_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (1, (_30))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (30, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (29, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (28, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (27, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (26, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (25, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (24, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (23, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (22, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (21, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (20, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (19, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (18, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (17, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (16, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (15, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (14, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (13, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (12, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (11, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (10, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (9, (_23, _24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (8, (_24, _25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (7, (_25, _26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (6, (_26, _27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (5, (_27, _28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (4, (_28, _29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (3, (_29, _30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (2, (_30, _31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_31_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (1, (_31))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (31, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (30, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (29, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (28, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (27, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (26, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (25, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (24, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (23, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (22, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (21, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (20, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (19, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (18, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (17, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (16, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (15, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (14, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (13, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (12, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (11, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (10, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (9, (_24, _25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (8, (_25, _26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (7, (_26, _27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (6, (_27, _28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (5, (_28, _29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (4, (_29, _30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (3, (_30, _31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (2, (_31, _32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_32_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (1, (_32))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (32, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (31, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (30, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (29, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (28, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (27, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (26, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (25, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (24, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (23, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (22, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (21, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (20, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (19, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (18, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (17, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (16, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (15, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (14, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (13, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (12, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (11, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (10, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (9, (_25, _26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (8, (_26, _27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (7, (_27, _28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (6, (_28, _29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (5, (_29, _30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (4, (_30, _31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (3, (_31, _32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (2, (_32, _33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_33_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (1, (_33))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (33, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (32, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (31, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (30, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (29, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (28, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (27, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (26, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (25, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (24, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (23, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (22, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (21, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (20, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (19, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (18, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (17, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (16, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (15, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (14, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (13, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (12, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (11, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (10, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (9, (_26, _27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (8, (_27, _28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (7, (_28, _29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (6, (_29, _30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (5, (_30, _31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (4, (_31, _32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (3, (_32, _33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (2, (_33, _34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_34_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (1, (_34))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (34, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (33, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (32, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (31, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (30, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (29, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (28, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (27, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (26, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (25, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (24, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (23, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (22, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (21, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (20, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (19, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (18, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (17, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (16, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (15, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (14, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (13, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (12, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (11, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (10, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (9, (_27, _28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (8, (_28, _29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (7, (_29, _30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (6, (_30, _31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (5, (_31, _32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (4, (_32, _33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (3, (_33, _34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (2, (_34, _35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_35_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (1, (_35))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (35, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (34, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (33, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (32, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (31, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (30, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (29, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (28, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (27, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (26, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (25, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (24, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (23, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (22, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (21, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (20, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (19, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (18, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (17, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (16, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (15, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (14, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (13, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (12, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (11, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (10, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (9, (_28, _29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (8, (_29, _30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (7, (_30, _31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (6, (_31, _32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (5, (_32, _33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (4, (_33, _34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (3, (_34, _35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (2, (_35, _36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_36_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (1, (_36))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (36, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (35, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (34, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (33, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (32, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (31, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (30, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (29, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (28, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (27, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (26, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (25, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (24, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (23, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (22, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (21, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (20, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (19, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (18, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (17, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (16, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (15, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (14, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (13, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (12, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (11, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (10, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (9, (_29, _30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (8, (_30, _31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (7, (_31, _32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (6, (_32, _33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (5, (_33, _34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (4, (_34, _35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (3, (_35, _36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (2, (_36, _37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_37_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (1, (_37))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (37, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (36, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (35, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (34, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (33, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (32, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (31, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (30, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (29, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (28, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (27, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (26, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (25, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (24, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (23, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (22, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (21, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (20, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (19, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (18, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (17, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (16, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (15, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (14, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (13, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (12, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (11, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (10, (_29, _30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (9, (_30, _31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (8, (_31, _32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (7, (_32, _33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (6, (_33, _34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (5, (_34, _35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (4, (_35, _36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (3, (_36, _37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (2, (_37, _38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_38_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (1, (_38))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (38, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (37, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (36, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (35, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (34, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (33, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (32, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (31, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (30, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (29, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (28, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (27, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (26, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (25, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (24, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (23, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (22, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (21, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (20, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (19, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (18, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (17, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (16, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (15, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (14, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (13, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (12, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (11, (_29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (10, (_30, _31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (9, (_31, _32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (8, (_32, _33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (7, (_33, _34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (6, (_34, _35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (5, (_35, _36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (4, (_36, _37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (3, (_37, _38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (2, (_38, _39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_39_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (1, (_39))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (39, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (38, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (37, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (36, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (35, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (34, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (33, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (32, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (31, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (30, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (29, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (28, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (27, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (26, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (25, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (24, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (23, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (22, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (21, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (20, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (19, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (18, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (17, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (16, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (15, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (14, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (13, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (12, (_29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (11, (_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (10, (_31, _32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (9, (_32, _33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (8, (_33, _34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (7, (_34, _35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (6, (_35, _36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (5, (_36, _37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (4, (_37, _38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (3, (_38, _39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (2, (_39, _40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_40_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (1, (_40))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (40, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (39, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (38, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (37, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (36, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (35, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (34, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (33, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (32, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (31, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (30, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (29, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (28, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (27, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (26, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (25, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (24, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (23, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (22, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (21, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (20, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (19, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (18, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (17, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (16, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (15, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (14, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (13, (_29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (12, (_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (11, (_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (10, (_32, _33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (9, (_33, _34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (8, (_34, _35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (7, (_35, _36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (6, (_36, _37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (5, (_37, _38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (4, (_38, _39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (3, (_39, _40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (2, (_40, _41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_41_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (1, (_41))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (41, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (40, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (39, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (38, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (37, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (36, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (35, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (34, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (33, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (32, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (31, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (30, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (29, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (28, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (27, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (26, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (25, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (24, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (23, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (22, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (21, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (20, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (19, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (18, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (17, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (16, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (15, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (14, (_29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (13, (_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (12, (_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (11, (_32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (10, (_33, _34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (9, (_34, _35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (8, (_35, _36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (7, (_36, _37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (6, (_37, _38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (5, (_38, _39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (4, (_39, _40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (3, (_40, _41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (2, (_41, _42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_42_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (1, (_42))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (42, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (41, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (40, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (39, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (38, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (37, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (36, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (35, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (34, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (33, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (32, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (31, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (30, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (29, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (28, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (27, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (26, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (25, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (24, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (23, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (22, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (21, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (20, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (19, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (18, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (17, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (16, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (15, (_29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (14, (_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (13, (_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (12, (_32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (11, (_33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (10, (_34, _35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (9, (_35, _36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (8, (_36, _37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (7, (_37, _38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (6, (_38, _39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (5, (_39, _40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (4, (_40, _41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (3, (_41, _42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (2, (_42, _43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_43_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (1, (_43))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (43, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (42, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (41, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (40, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (39, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (38, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (37, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (36, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (35, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (34, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (33, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (32, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (31, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (30, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (29, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (28, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (27, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (26, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (25, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (24, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (23, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (22, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (21, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (20, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (19, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (18, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (17, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (16, (_29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (15, (_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (14, (_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (13, (_32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (12, (_33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (11, (_34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (10, (_35, _36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (9, (_36, _37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (8, (_37, _38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (7, (_38, _39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (6, (_39, _40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (5, (_40, _41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (4, (_41, _42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (3, (_42, _43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (2, (_43, _44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_44_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (1, (_44))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (44, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (43, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (42, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (41, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (40, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (39, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (38, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (37, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (36, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (35, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (34, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (33, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (32, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (31, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (30, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (29, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (28, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (27, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (26, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (25, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (24, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (23, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (22, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (21, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (20, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (19, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (18, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (17, (_29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (16, (_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (15, (_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (14, (_32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (13, (_33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (12, (_34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (11, (_35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (10, (_36, _37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (9, (_37, _38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (8, (_38, _39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (7, (_39, _40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (6, (_40, _41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (5, (_41, _42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (4, (_42, _43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (3, (_43, _44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (2, (_44, _45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_45_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (1, (_45))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (45, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (44, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (43, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (42, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (41, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (40, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (39, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (38, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (37, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (36, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (35, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (34, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (33, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (32, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (31, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (30, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (29, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (28, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (27, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (26, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (25, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (24, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (23, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (22, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (21, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (20, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (19, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (18, (_29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (17, (_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (16, (_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (15, (_32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (14, (_33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (13, (_34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (12, (_35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (11, (_36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (10, (_37, _38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (9, (_38, _39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (8, (_39, _40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (7, (_40, _41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (6, (_41, _42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (5, (_42, _43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (4, (_43, _44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (3, (_44, _45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (2, (_45, _46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_46_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (1, (_46))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (46, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (45, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (44, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (43, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (42, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (41, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (40, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (39, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (38, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (37, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (36, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (35, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (34, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (33, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (32, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (31, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (30, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (29, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (28, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (27, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (26, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (25, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (24, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (23, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (22, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (21, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (20, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (19, (_29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (18, (_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (17, (_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (16, (_32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (15, (_33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (14, (_34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (13, (_35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (12, (_36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (11, (_37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (10, (_38, _39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (9, (_39, _40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (8, (_40, _41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (7, (_41, _42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (6, (_42, _43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (5, (_43, _44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (4, (_44, _45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (3, (_45, _46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (2, (_46, _47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_47_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (1, (_47))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (47, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (46, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (45, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (44, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (43, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (42, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (41, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (40, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (39, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (38, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (37, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (36, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (35, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (34, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (33, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (32, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (31, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (30, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (29, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (28, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (27, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (26, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (25, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (24, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (23, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (22, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (21, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (20, (_29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (19, (_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (18, (_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (17, (_32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (16, (_33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (15, (_34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (14, (_35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (13, (_36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (12, (_37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (11, (_38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (10, (_39, _40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (9, (_40, _41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (8, (_41, _42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (7, (_42, _43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (6, (_43, _44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (5, (_44, _45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (4, (_45, _46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (3, (_46, _47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (2, (_47, _48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_48_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (1, (_48))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (48, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (47, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (46, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (45, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (44, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (43, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (42, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (41, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (40, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (39, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (38, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (37, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (36, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (35, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (34, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (33, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (32, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (31, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (30, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (29, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (28, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (27, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (26, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (25, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (24, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (23, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (22, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (21, (_29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (20, (_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (19, (_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (18, (_32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (17, (_33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (16, (_34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (15, (_35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (14, (_36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (13, (_37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (12, (_38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (11, (_39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (10, (_40, _41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (9, (_41, _42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (8, (_42, _43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (7, (_43, _44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (6, (_44, _45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (5, (_45, _46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (4, (_46, _47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (3, (_47, _48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (2, (_48, _49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_49_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (1, (_49))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (49, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (48, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (47, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (46, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (45, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (44, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (43, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (42, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (41, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (40, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (39, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (38, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (37, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (36, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (35, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (34, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (33, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (32, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (31, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (30, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (29, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (28, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (27, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (26, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (25, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (24, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (23, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (22, (_29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (21, (_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (20, (_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (19, (_32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (18, (_33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (17, (_34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (16, (_35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (15, (_36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (14, (_37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (13, (_38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (12, (_39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (11, (_40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (10, (_41, _42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (9, (_42, _43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (8, (_43, _44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (7, (_44, _45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (6, (_45, _46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (5, (_46, _47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (4, (_47, _48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (3, (_48, _49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (2, (_49, _50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_50_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (1, (_50))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (50, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (49, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (48, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (47, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (46, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (45, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (44, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (43, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (42, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (41, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (40, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (39, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (38, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (37, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (36, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (35, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (34, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (33, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (32, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (31, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (30, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (29, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (28, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (27, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (26, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (25, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (24, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (23, (_29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (22, (_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (21, (_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (20, (_32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (19, (_33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (18, (_34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (17, (_35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (16, (_36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (15, (_37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (14, (_38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (13, (_39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (12, (_40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (11, (_41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (10, (_42, _43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (9, (_43, _44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (8, (_44, _45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (7, (_45, _46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (6, (_46, _47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (5, (_47, _48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (4, (_48, _49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (3, (_49, _50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (2, (_50, _51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_51_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (1, (_51))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (51, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (50, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (49, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (48, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (47, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (46, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (45, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (44, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (43, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (42, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (41, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (40, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (39, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (38, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (37, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (36, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (35, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (34, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (33, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (32, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (31, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (30, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (29, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (28, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (27, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (26, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (25, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (24, (_29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (23, (_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (22, (_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (21, (_32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (20, (_33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (19, (_34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (18, (_35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (17, (_36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (16, (_37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (15, (_38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (14, (_39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (13, (_40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (12, (_41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (11, (_42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (10, (_43, _44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (9, (_44, _45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (8, (_45, _46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (7, (_46, _47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (6, (_47, _48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (5, (_48, _49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (4, (_49, _50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (3, (_50, _51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (2, (_51, _52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_52_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (1, (_52))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (52, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (51, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (50, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (49, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (48, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (47, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (46, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (45, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (44, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (43, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (42, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (41, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (40, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (39, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (38, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (37, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (36, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (35, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (34, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (33, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (32, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (31, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (30, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (29, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (28, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (27, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (26, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (25, (_29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (24, (_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (23, (_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (22, (_32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (21, (_33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (20, (_34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (19, (_35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (18, (_36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (17, (_37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (16, (_38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (15, (_39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (14, (_40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (13, (_41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (12, (_42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (11, (_43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (10, (_44, _45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (9, (_45, _46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (8, (_46, _47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (7, (_47, _48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (6, (_48, _49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (5, (_49, _50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (4, (_50, _51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (3, (_51, _52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (2, (_52, _53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_53_52(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (1, (_53))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (53, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (52, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (51, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (50, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (49, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (48, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (47, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (46, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (45, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (44, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (43, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (42, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (41, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (40, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (39, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (38, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (37, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (36, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (35, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (34, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (33, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (32, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (31, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (30, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (29, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (28, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (27, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (26, (_29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (25, (_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (24, (_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (23, (_32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (22, (_33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (21, (_34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (20, (_35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (19, (_36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (18, (_37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (17, (_38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (16, (_39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (15, (_40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (14, (_41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (13, (_42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (12, (_43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (11, (_44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (10, (_45, _46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (9, (_46, _47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (8, (_47, _48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (7, (_48, _49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (6, (_49, _50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (5, (_50, _51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (4, (_51, _52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (3, (_52, _53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_52(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (2, (_53, _54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_54_53(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (1, (_54))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (54, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (53, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (52, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (51, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (50, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (49, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (48, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (47, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (46, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (45, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (44, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (43, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (42, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (41, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (40, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (39, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (38, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (37, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (36, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (35, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (34, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (33, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (32, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (31, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (30, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (29, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (28, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (27, (_29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (26, (_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (25, (_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (24, (_32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (23, (_33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (22, (_34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (21, (_35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (20, (_36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (19, (_37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (18, (_38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (17, (_39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (16, (_40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (15, (_41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (14, (_42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (13, (_43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (12, (_44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (11, (_45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (10, (_46, _47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (9, (_47, _48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (8, (_48, _49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (7, (_49, _50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (6, (_50, _51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (5, (_51, _52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (4, (_52, _53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_52(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (3, (_53, _54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_53(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (2, (_54, _55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_55_54(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (1, (_55))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (55, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (54, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (53, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (52, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (51, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (50, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (49, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (48, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (47, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (46, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (45, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (44, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (43, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (42, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (41, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (40, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (39, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (38, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (37, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (36, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (35, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (34, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (33, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (32, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (31, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (30, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (29, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (28, (_29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (27, (_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (26, (_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (25, (_32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (24, (_33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (23, (_34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (22, (_35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (21, (_36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (20, (_37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (19, (_38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (18, (_39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (17, (_40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (16, (_41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (15, (_42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (14, (_43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (13, (_44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (12, (_45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (11, (_46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (10, (_47, _48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (9, (_48, _49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (8, (_49, _50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (7, (_50, _51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (6, (_51, _52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (5, (_52, _53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_52(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (4, (_53, _54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_53(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (3, (_54, _55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_54(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (2, (_55, _56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_56_55(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (1, (_56))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (56, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (55, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (54, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (53, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (52, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (51, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (50, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (49, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (48, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (47, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (46, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (45, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (44, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (43, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (42, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (41, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (40, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (39, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (38, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (37, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (36, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (35, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (34, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (33, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (32, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (31, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (30, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (29, (_29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (28, (_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (27, (_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (26, (_32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (25, (_33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (24, (_34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (23, (_35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (22, (_36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (21, (_37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (20, (_38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (19, (_39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (18, (_40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (17, (_41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (16, (_42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (15, (_43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (14, (_44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (13, (_45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (12, (_46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (11, (_47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (10, (_48, _49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (9, (_49, _50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (8, (_50, _51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (7, (_51, _52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (6, (_52, _53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_52(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (5, (_53, _54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_53(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (4, (_54, _55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_54(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (3, (_55, _56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_55(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (2, (_56, _57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_57_56(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (1, (_57))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (57, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (56, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (55, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (54, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (53, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (52, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (51, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (50, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (49, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (48, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (47, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (46, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (45, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (44, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (43, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (42, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (41, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (40, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (39, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (38, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (37, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (36, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (35, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (34, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (33, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (32, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (31, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (30, (_29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (29, (_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (28, (_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (27, (_32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (26, (_33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (25, (_34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (24, (_35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (23, (_36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (22, (_37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (21, (_38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (20, (_39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (19, (_40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (18, (_41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (17, (_42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (16, (_43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (15, (_44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (14, (_45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (13, (_46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (12, (_47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (11, (_48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (10, (_49, _50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (9, (_50, _51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (8, (_51, _52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (7, (_52, _53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_52(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (6, (_53, _54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_53(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (5, (_54, _55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_54(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (4, (_55, _56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_55(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (3, (_56, _57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_56(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (2, (_57, _58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_58_57(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (1, (_58))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (58, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (57, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (56, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (55, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (54, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (53, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (52, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (51, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (50, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (49, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (48, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (47, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (46, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (45, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (44, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (43, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (42, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (41, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (40, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (39, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (38, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (37, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (36, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (35, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (34, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (33, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (32, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (31, (_29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (30, (_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (29, (_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (28, (_32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (27, (_33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (26, (_34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (25, (_35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (24, (_36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (23, (_37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (22, (_38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (21, (_39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (20, (_40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (19, (_41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (18, (_42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (17, (_43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (16, (_44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (15, (_45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (14, (_46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (13, (_47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (12, (_48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (11, (_49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (10, (_50, _51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (9, (_51, _52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (8, (_52, _53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_52(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (7, (_53, _54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_53(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (6, (_54, _55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_54(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (5, (_55, _56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_55(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (4, (_56, _57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_56(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (3, (_57, _58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_57(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (2, (_58, _59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_59_58(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (1, (_59))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (59, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (58, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (57, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (56, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (55, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (54, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (53, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (52, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (51, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (50, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (49, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (48, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (47, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (46, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (45, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (44, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (43, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (42, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (41, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (40, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (39, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (38, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (37, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (36, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (35, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (34, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (33, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (32, (_29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (31, (_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (30, (_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (29, (_32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (28, (_33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (27, (_34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (26, (_35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (25, (_36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (24, (_37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (23, (_38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (22, (_39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (21, (_40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (20, (_41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (19, (_42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (18, (_43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (17, (_44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (16, (_45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (15, (_46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (14, (_47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (13, (_48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (12, (_49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (11, (_50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (10, (_51, _52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (9, (_52, _53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_52(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (8, (_53, _54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_53(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (7, (_54, _55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_54(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (6, (_55, _56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_55(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (5, (_56, _57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_56(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (4, (_57, _58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_57(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (3, (_58, _59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_58(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (2, (_59, _60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_60_59(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (1, (_60))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (60, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (59, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (58, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (57, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (56, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (55, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (54, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (53, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (52, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (51, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (50, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (49, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (48, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (47, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (46, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (45, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (44, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (43, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (42, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (41, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (40, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (39, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (38, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (37, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (36, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (35, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (34, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (33, (_29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (32, (_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (31, (_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (30, (_32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (29, (_33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (28, (_34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (27, (_35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (26, (_36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (25, (_37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (24, (_38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (23, (_39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (22, (_40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (21, (_41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (20, (_42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (19, (_43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (18, (_44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (17, (_45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (16, (_46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (15, (_47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (14, (_48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (13, (_49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (12, (_50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (11, (_51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (10, (_52, _53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_52(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (9, (_53, _54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_53(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (8, (_54, _55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_54(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (7, (_55, _56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_55(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (6, (_56, _57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_56(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (5, (_57, _58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_57(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (4, (_58, _59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_58(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (3, (_59, _60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_59(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (2, (_60, _61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_61_60(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (1, (_61))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (61, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (60, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (59, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (58, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (57, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (56, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (55, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (54, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (53, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (52, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (51, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (50, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (49, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (48, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (47, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (46, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (45, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (44, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (43, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (42, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (41, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (40, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (39, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (38, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (37, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (36, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (35, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (34, (_29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (33, (_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (32, (_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (31, (_32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (30, (_33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (29, (_34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (28, (_35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (27, (_36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (26, (_37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (25, (_38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (24, (_39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (23, (_40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (22, (_41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (21, (_42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (20, (_43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (19, (_44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (18, (_45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (17, (_46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (16, (_47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (15, (_48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (14, (_49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (13, (_50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (12, (_51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (11, (_52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_52(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (10, (_53, _54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_53(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (9, (_54, _55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_54(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (8, (_55, _56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_55(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (7, (_56, _57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_56(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (6, (_57, _58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_57(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (5, (_58, _59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_58(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (4, (_59, _60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_59(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (3, (_60, _61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_60(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (2, (_61, _62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_62_61(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (1, (_62))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (62, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (61, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (60, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (59, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (58, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (57, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (56, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (55, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (54, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (53, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (52, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (51, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (50, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (49, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (48, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (47, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (46, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (45, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (44, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (43, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (42, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (41, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (40, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (39, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (38, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (37, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (36, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (35, (_29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (34, (_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (33, (_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (32, (_32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (31, (_33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (30, (_34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (29, (_35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (28, (_36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (27, (_37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (26, (_38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (25, (_39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (24, (_40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (23, (_41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (22, (_42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (21, (_43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (20, (_44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (19, (_45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (18, (_46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (17, (_47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (16, (_48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (15, (_49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (14, (_50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (13, (_51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (12, (_52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_52(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (11, (_53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_53(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (10, (_54, _55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_54(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (9, (_55, _56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_55(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (8, (_56, _57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_56(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (7, (_57, _58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_57(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (6, (_58, _59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_58(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (5, (_59, _60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_59(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (4, (_60, _61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_60(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (3, (_61, _62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_61(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (2, (_62, _63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_63_62(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (1, (_63))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_1(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (63, (_2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_2(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (62, (_3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_3(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (61, (_4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_4(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (60, (_5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_5(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (59, (_6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_6(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (58, (_7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_7(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (57, (_8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_8(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (56, (_9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_9(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (55, (_10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (54, (_11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (53, (_12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (52, (_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (51, (_14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (50, (_15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (49, (_16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (48, (_17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (47, (_18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (46, (_19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (45, (_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (44, (_21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (43, (_22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (42, (_23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (41, (_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (40, (_25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (39, (_26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (38, (_27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (37, (_28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (36, (_29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (35, (_30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (34, (_31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (33, (_32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (32, (_33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (31, (_34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (30, (_35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (29, (_36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (28, (_37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (27, (_38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (26, (_39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (25, (_40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (24, (_41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (23, (_42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (22, (_43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (21, (_44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (20, (_45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (19, (_46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (18, (_47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (17, (_48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (16, (_49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (15, (_50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (14, (_51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (13, (_52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_52(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (12, (_53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_53(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (11, (_54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_54(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (10, (_55, _56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_55(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (9, (_56, _57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_56(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (8, (_57, _58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_57(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (7, (_58, _59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_58(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (6, (_59, _60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_59(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (5, (_60, _61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_60(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (4, (_61, _62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_61(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (3, (_62, _63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_62(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (2, (_63, _64))
+#define CONTRACT_DETAIL_PP_ARRAY_REST_N_64_63(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (1, (_64))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/facilities/is_digit-generate.py
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/facilities/is_digit-generate.py 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,54 @@
+
+# Copyright (C) 2008-2012 Lorenzo Caminiti
+# Distributed under 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)
+# Home at http://sourceforge.net/projects/contractpp
+
+import sys
+import shutil
+
+def data(max_size):
+ s = ''
+ for i in range(0, max_size + 1): # 0 and max_size included in range.
+ s = s + '''
+#define CONTRACT_DETAIL_PP_IS_DIGIT_{0} (1) /* unary */ \
+'''.format(i)
+ return s
+
+BOOST_PP_LIMIT_MAG = raw_input("BOOST_PP_LIMIT_MAG" +
+ " from <boost/preprocessor/limits.hpp> [256] = ")
+if BOOST_PP_LIMIT_MAG == "": BOOST_PP_LIMIT_MAG = 256
+else: BOOST_PP_LIMIT_MAG = int(BOOST_PP_LIMIT_MAG)
+
+header = sys.argv[0].replace("-generate.py", ".hpp", 1)
+shutil.copyfile(header, header + ".bak")
+h = open(header, 'w')
+
+h.write('''
+#ifndef CONTRACT_DETAIL_PP_IS_DIGIT_HPP_
+#define CONTRACT_DETAIL_PP_IS_DIGIT_HPP_
+
+// WARNING: FILE AUTOMATICALLY GENERATED, DO NOT MODIFY IT!
+// Instead modify the generation script "<FILE>-generate.py" and run
+// `$ python <FILE_NAME>-generate.py > FILE_NAME.hpp`.
+// Used: #define BOOST_PP_LIMIT_MAG {0}
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+
+// PUBLIC //
+
+#define CONTRACT_DETAIL_PP_IS_DIGIT(tokens) \\
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \\
+ CONTRACT_DETAIL_PP_IS_DIGIT_)
+
+// DATA //
+{1}
+
+#endif // #include guard
+
+'''.format(BOOST_PP_LIMIT_MAG, data(BOOST_PP_LIMIT_MAG)))
+
+h.close()
+print "Written", header
+
Added: sandbox/contract/include/contract/detail/preprocessor/facilities/is_digit.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/facilities/is_digit.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,285 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_IS_DIGIT_HPP_
+#define CONTRACT_DETAIL_PP_IS_DIGIT_HPP_
+
+// WARNING: FILE AUTOMATICALLY GENERATED, DO NOT MODIFY IT!
+// Instead modify the generation script "<FILE>-generate.py" and run
+// `$ python <FILE_NAME>-generate.py > FILE_NAME.hpp`.
+// Used: #define BOOST_PP_LIMIT_MAG 256
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+
+// PUBLIC //
+
+#define CONTRACT_DETAIL_PP_IS_DIGIT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_IS_DIGIT_)
+
+// DATA //
+
+#define CONTRACT_DETAIL_PP_IS_DIGIT_0 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_1 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_2 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_3 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_4 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_5 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_6 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_7 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_8 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_9 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_10 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_11 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_12 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_13 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_14 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_15 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_16 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_17 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_18 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_19 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_20 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_21 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_22 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_23 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_24 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_25 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_26 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_27 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_28 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_29 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_30 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_31 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_32 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_33 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_34 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_35 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_36 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_37 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_38 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_39 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_40 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_41 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_42 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_43 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_44 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_45 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_46 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_47 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_48 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_49 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_50 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_51 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_52 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_53 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_54 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_55 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_56 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_57 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_58 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_59 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_60 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_61 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_62 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_63 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_64 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_65 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_66 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_67 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_68 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_69 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_70 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_71 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_72 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_73 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_74 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_75 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_76 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_77 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_78 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_79 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_80 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_81 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_82 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_83 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_84 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_85 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_86 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_87 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_88 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_89 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_90 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_91 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_92 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_93 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_94 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_95 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_96 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_97 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_98 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_99 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_100 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_101 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_102 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_103 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_104 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_105 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_106 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_107 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_108 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_109 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_110 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_111 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_112 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_113 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_114 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_115 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_116 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_117 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_118 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_119 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_120 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_121 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_122 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_123 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_124 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_125 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_126 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_127 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_128 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_129 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_130 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_131 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_132 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_133 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_134 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_135 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_136 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_137 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_138 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_139 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_140 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_141 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_142 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_143 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_144 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_145 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_146 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_147 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_148 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_149 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_150 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_151 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_152 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_153 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_154 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_155 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_156 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_157 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_158 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_159 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_160 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_161 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_162 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_163 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_164 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_165 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_166 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_167 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_168 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_169 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_170 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_171 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_172 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_173 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_174 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_175 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_176 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_177 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_178 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_179 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_180 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_181 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_182 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_183 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_184 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_185 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_186 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_187 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_188 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_189 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_190 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_191 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_192 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_193 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_194 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_195 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_196 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_197 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_198 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_199 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_200 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_201 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_202 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_203 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_204 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_205 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_206 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_207 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_208 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_209 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_210 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_211 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_212 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_213 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_214 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_215 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_216 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_217 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_218 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_219 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_220 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_221 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_222 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_223 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_224 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_225 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_226 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_227 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_228 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_229 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_230 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_231 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_232 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_233 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_234 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_235 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_236 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_237 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_238 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_239 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_240 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_241 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_242 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_243 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_244 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_245 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_246 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_247 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_248 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_249 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_250 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_251 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_252 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_253 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_254 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_255 (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_DIGIT_256 (1) /* unary */
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/and.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/and.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_AND_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_AND_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_AND_IS_and (1) /* unary */
+#define and_CONTRACT_DETAIL_PP_KEYWORD_AND_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_AND_REMOVE_and /* nothing */
+#define and_CONTRACT_DETAIL_PP_KEYWORD_AND_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_AND_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_AND_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_AND_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_AND_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_AND_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_AND_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_AND_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_AND_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_AND_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_AND_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_AND_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_AND_FRONT, and)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_AND_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_AND_BACK, and)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/and_eq.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/and_eq.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_AND_EQ_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_AND_EQ_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_AND_EQ_IS_and_eq (1) /* unary */
+#define and_eq_CONTRACT_DETAIL_PP_KEYWORD_AND_EQ_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_AND_EQ_REMOVE_and_eq /* nothing */
+#define and_eq_CONTRACT_DETAIL_PP_KEYWORD_AND_EQ_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_AND_EQ_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_AND_EQ_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_AND_EQ_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_AND_EQ_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_AND_EQ_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_AND_EQ_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_AND_EQ_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_AND_EQ_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_AND_EQ_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_AND_EQ_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_AND_EQ_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_AND_EQ_FRONT, and_eq)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_AND_EQ_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_AND_EQ_BACK, and_eq)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/asm.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/asm.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_ASM_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_ASM_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_ASM_IS_asm (1) /* unary */
+#define asm_CONTRACT_DETAIL_PP_KEYWORD_ASM_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_ASM_REMOVE_asm /* nothing */
+#define asm_CONTRACT_DETAIL_PP_KEYWORD_ASM_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_ASM_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_ASM_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_ASM_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_ASM_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_ASM_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_ASM_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_ASM_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_ASM_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_ASM_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_ASM_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_ASM_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_ASM_FRONT, asm)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_ASM_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_ASM_BACK, asm)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/auto.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/auto.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_AUTO_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_AUTO_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_AUTO_IS_auto (1) /* unary */
+#define auto_CONTRACT_DETAIL_PP_KEYWORD_AUTO_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_AUTO_REMOVE_auto /* nothing */
+#define auto_CONTRACT_DETAIL_PP_KEYWORD_AUTO_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_AUTO_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_AUTO_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_AUTO_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_AUTO_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_AUTO_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_AUTO_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_AUTO_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_AUTO_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_AUTO_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_AUTO_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_AUTO_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_AUTO_FRONT, auto)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_AUTO_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_AUTO_BACK, auto)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/bitand.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/bitand.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_BITAND_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_BITAND_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_BITAND_IS_bitand (1) /* unary */
+#define bitand_CONTRACT_DETAIL_PP_KEYWORD_BITAND_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_BITAND_REMOVE_bitand /* nothing */
+#define bitand_CONTRACT_DETAIL_PP_KEYWORD_BITAND_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_BITAND_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_BITAND_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_BITAND_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_BITAND_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_BITAND_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_BITAND_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_BITAND_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_BITAND_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_BITAND_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_BITAND_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_BITAND_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_BITAND_FRONT, bitand)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_BITAND_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_BITAND_BACK, bitand)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/bitor.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/bitor.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_BITOR_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_BITOR_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_BITOR_IS_bitor (1) /* unary */
+#define bitor_CONTRACT_DETAIL_PP_KEYWORD_BITOR_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_BITOR_REMOVE_bitor /* nothing */
+#define bitor_CONTRACT_DETAIL_PP_KEYWORD_BITOR_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_BITOR_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_BITOR_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_BITOR_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_BITOR_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_BITOR_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_BITOR_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_BITOR_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_BITOR_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_BITOR_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_BITOR_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_BITOR_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_BITOR_FRONT, bitor)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_BITOR_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_BITOR_BACK, bitor)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/bool.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/bool.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_BOOL_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_BOOL_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_BOOL_IS_bool (1) /* unary */
+#define bool_CONTRACT_DETAIL_PP_KEYWORD_BOOL_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_BOOL_REMOVE_bool /* nothing */
+#define bool_CONTRACT_DETAIL_PP_KEYWORD_BOOL_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_BOOL_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_BOOL_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_BOOL_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_BOOL_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_BOOL_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_BOOL_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_BOOL_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_BOOL_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_BOOL_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_BOOL_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_BOOL_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_BOOL_FRONT, bool)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_BOOL_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_BOOL_BACK, bool)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/break.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/break.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_BREAK_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_BREAK_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_BREAK_IS_break (1) /* unary */
+#define break_CONTRACT_DETAIL_PP_KEYWORD_BREAK_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_BREAK_REMOVE_break /* nothing */
+#define break_CONTRACT_DETAIL_PP_KEYWORD_BREAK_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_BREAK_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_BREAK_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_BREAK_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_BREAK_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_BREAK_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_BREAK_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_BREAK_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_BREAK_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_BREAK_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_BREAK_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_BREAK_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_BREAK_FRONT, break)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_BREAK_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_BREAK_BACK, break)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/case.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/case.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_CASE_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_CASE_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_CASE_IS_case (1) /* unary */
+#define case_CONTRACT_DETAIL_PP_KEYWORD_CASE_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_CASE_REMOVE_case /* nothing */
+#define case_CONTRACT_DETAIL_PP_KEYWORD_CASE_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_CASE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_CASE_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_CASE_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_CASE_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CASE_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CASE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_CASE_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CASE_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CASE_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_CASE_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CASE_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CASE_FRONT, case)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CASE_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CASE_BACK, case)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/catch.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/catch.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_CATCH_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_CATCH_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_CATCH_IS_catch (1) /* unary */
+#define catch_CONTRACT_DETAIL_PP_KEYWORD_CATCH_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_CATCH_REMOVE_catch /* nothing */
+#define catch_CONTRACT_DETAIL_PP_KEYWORD_CATCH_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_CATCH_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_CATCH_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_CATCH_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_CATCH_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CATCH_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CATCH_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_CATCH_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CATCH_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CATCH_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_CATCH_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CATCH_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CATCH_FRONT, catch)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CATCH_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CATCH_BACK, catch)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/char.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/char.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_CHAR_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_CHAR_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_CHAR_IS_char (1) /* unary */
+#define char_CONTRACT_DETAIL_PP_KEYWORD_CHAR_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_CHAR_REMOVE_char /* nothing */
+#define char_CONTRACT_DETAIL_PP_KEYWORD_CHAR_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_CHAR_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_CHAR_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_CHAR_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_CHAR_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CHAR_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CHAR_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_CHAR_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CHAR_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CHAR_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_CHAR_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CHAR_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CHAR_FRONT, char)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CHAR_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CHAR_BACK, char)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/class.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/class.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_CLASS_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_CLASS_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_CLASS_IS_class (1) /* unary */
+#define class_CONTRACT_DETAIL_PP_KEYWORD_CLASS_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_CLASS_REMOVE_class /* nothing */
+#define class_CONTRACT_DETAIL_PP_KEYWORD_CLASS_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_CLASS_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_CLASS_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_CLASS_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_CLASS_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CLASS_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CLASS_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_CLASS_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CLASS_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CLASS_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_CLASS_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CLASS_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CLASS_FRONT, class)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CLASS_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CLASS_BACK, class)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/compl.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/compl.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_COMPL_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_COMPL_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_COMPL_IS_compl (1) /* unary */
+#define compl_CONTRACT_DETAIL_PP_KEYWORD_COMPL_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_COMPL_REMOVE_compl /* nothing */
+#define compl_CONTRACT_DETAIL_PP_KEYWORD_COMPL_REMOVE /* nothing */
+
+// PRIVATE //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_COMPL_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_COMPL_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_COMPL_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_COMPL_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_COMPL_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_COMPL_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_COMPL_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_COMPL_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_COMPL_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_COMPL_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_COMPL_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_COMPL_FRONT, compl)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_COMPL_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_COMPL_BACK, compl)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/const.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/const.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_CONST_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_CONST_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_CONST_IS_const (1) /* unary */
+#define const_CONTRACT_DETAIL_PP_KEYWORD_CONST_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_CONST_REMOVE_const /* nothing */
+#define const_CONTRACT_DETAIL_PP_KEYWORD_CONST_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_CONST_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_CONST_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_CONST_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_CONST_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CONST_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CONST_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_CONST_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CONST_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CONST_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_CONST_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CONST_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CONST_FRONT, const)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CONST_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CONST_BACK, const)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/const_cast.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/const_cast.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_CONST_CAST_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_CONST_CAST_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_CONST_CAST_IS_const_cast (1) /* unary */
+#define const_cast_CONTRACT_DETAIL_PP_KEYWORD_CONST_CAST_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_CONST_CAST_REMOVE_const_cast /* nothing */
+#define const_cast_CONTRACT_DETAIL_PP_KEYWORD_CONST_CAST_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_CONST_CAST_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_CONST_CAST_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_CONST_CAST_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_CONST_CAST_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CONST_CAST_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CONST_CAST_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_CONST_CAST_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CONST_CAST_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CONST_CAST_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_CONST_CAST_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CONST_CAST_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CONST_CAST_FRONT, const_cast)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CONST_CAST_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CONST_CAST_BACK, const_cast)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/continue.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/continue.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_CONTINUE_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_CONTINUE_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_CONTINUE_IS_continue (1) /* unary */
+#define continue_CONTRACT_DETAIL_PP_KEYWORD_CONTINUE_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_CONTINUE_REMOVE_continue /* nothing */
+#define continue_CONTRACT_DETAIL_PP_KEYWORD_CONTINUE_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_CONTINUE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_CONTINUE_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_CONTINUE_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_CONTINUE_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CONTINUE_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CONTINUE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_CONTINUE_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CONTINUE_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CONTINUE_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_CONTINUE_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CONTINUE_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CONTINUE_FRONT, continue)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CONTINUE_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CONTINUE_BACK, continue)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/contract/comma.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/contract/comma.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_COMMA_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_COMMA_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_COMMA_IS_comma (1) /* unary */
+#define comma_CONTRACT_DETAIL_PP_KEYWORD_COMMA_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_COMMA_REMOVE_comma /* nothing */
+#define comma_CONTRACT_DETAIL_PP_KEYWORD_COMMA_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_COMMA_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_COMMA_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_COMMA_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_COMMA_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_COMMA_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_COMMA_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_COMMA_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_COMMA_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_COMMA_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_COMMA_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_COMMA_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_COMMA_FRONT, comma)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_COMMA_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_COMMA_BACK, comma)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/contract/deduce.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/contract/deduce.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_DEDUCE_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_DEDUCE_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_DEDUCE_IS_deduce (1) /* unary */
+#define deduce_CONTRACT_DETAIL_PP_KEYWORD_DEDUCE_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_DEDUCE_REMOVE_deduce /* nothing */
+#define deduce_CONTRACT_DETAIL_PP_KEYWORD_DEDUCE_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_DEDUCE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_DEDUCE_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_DEDUCE_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_DEDUCE_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DEDUCE_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DEDUCE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_DEDUCE_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DEDUCE_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DEDUCE_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_DEDUCE_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DEDUCE_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DEDUCE_FRONT, deduce)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DEDUCE_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DEDUCE_BACK, deduce)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/contract/extends.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/contract/extends.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_EXTENDS_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_EXTENDS_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_EXTENDS_IS_extends (1) /* unary */
+#define extends_CONTRACT_DETAIL_PP_KEYWORD_EXTENDS_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_EXTENDS_REMOVE_extends /* nothing */
+#define extends_CONTRACT_DETAIL_PP_KEYWORD_EXTENDS_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_EXTENDS_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_EXTENDS_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_EXTENDS_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_EXTENDS_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_EXTENDS_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_EXTENDS_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_EXTENDS_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_EXTENDS_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_EXTENDS_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_EXTENDS_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_EXTENDS_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_EXTENDS_FRONT, extends)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_EXTENDS_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_EXTENDS_BACK, extends)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/contract/in.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/contract/in.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_IN_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_IN_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_IN_IS_in (1) /* unary */
+#define in_CONTRACT_DETAIL_PP_KEYWORD_IN_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_IN_REMOVE_in /* nothing */
+#define in_CONTRACT_DETAIL_PP_KEYWORD_IN_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_IN_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IN_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_IN_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_IN_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IN_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_IN_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_IN_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IN_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_IN_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_IN_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IN_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_IN_FRONT, in)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IN_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_IN_BACK, in)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/contract/initialize.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/contract/initialize.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_INITIALIZE_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_INITIALIZE_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_INITIALIZE_IS_initialize (1) /* unary */
+#define initialize_CONTRACT_DETAIL_PP_KEYWORD_INITIALIZE_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_INITIALIZE_REMOVE_initialize /* nothing */
+#define initialize_CONTRACT_DETAIL_PP_KEYWORD_INITIALIZE_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_INITIALIZE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_INITIALIZE_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_INITIALIZE_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_INITIALIZE_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_INITIALIZE_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_INITIALIZE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_INITIALIZE_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_INITIALIZE_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_INITIALIZE_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_INITIALIZE_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_INITIALIZE_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_INITIALIZE_FRONT, initialize)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_INITIALIZE_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_INITIALIZE_BACK, initialize)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/contract/out.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/contract/out.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_OUT_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_OUT_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_OUT_IS_out (1) /* unary */
+#define out_CONTRACT_DETAIL_PP_KEYWORD_OUT_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_OUT_REMOVE_out /* nothing */
+#define out_CONTRACT_DETAIL_PP_KEYWORD_OUT_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_OUT_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_OUT_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_OUT_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_OUT_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_OUT_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_OUT_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_OUT_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_OUT_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_OUT_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_OUT_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_OUT_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_OUT_FRONT, out)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_OUT_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_OUT_BACK, out)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/contract/postcondition.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/contract/postcondition.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_POSTCONDITION_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_POSTCONDITION_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_POSTCONDITION_IS_postcondition (1) /*unary*/
+#define postcondition_CONTRACT_DETAIL_PP_KEYWORD_POSTCONDITION_IS (1) /*unary*/
+#define CONTRACT_DETAIL_PP_KEYWORD_POSTCONDITION_REMOVE_postcondition/*nothing*/
+#define postcondition_CONTRACT_DETAIL_PP_KEYWORD_POSTCONDITION_REMOVE/*nothing*/
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_POSTCONDITION_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_POSTCONDITION_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_POSTCONDITION_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_POSTCONDITION_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_POSTCONDITION_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_POSTCONDITION_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_POSTCONDITION_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_FRONT, postcondition)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_POSTCONDITION_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_BACK, postcondition)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/contract/precondition.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/contract/precondition.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_PRECONDITION_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_PRECONDITION_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_PRECONDITION_IS_precondition (1) /* unary */
+#define precondition_CONTRACT_DETAIL_PP_KEYWORD_PRECONDITION_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_PRECONDITION_REMOVE_precondition /*nothing*/
+#define precondition_CONTRACT_DETAIL_PP_KEYWORD_PRECONDITION_REMOVE /*nothing*/
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_PRECONDITION_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_PRECONDITION_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_PRECONDITION_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_PRECONDITION_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_PRECONDITION_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PRECONDITION_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_PRECONDITION_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_PRECONDITION_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PRECONDITION_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_PRECONDITION_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_PRECONDITION_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PRECONDITION_FRONT, precondition)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_PRECONDITION_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PRECONDITION_BACK, precondition)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/contract/requires.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/contract/requires.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_REQUIRES_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_REQUIRES_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_REQUIRES_IS_requires (1) /* unary */
+#define requires_CONTRACT_DETAIL_PP_KEYWORD_REQUIRES_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_REQUIRES_REMOVE_requires /* nothing */
+#define requires_CONTRACT_DETAIL_PP_KEYWORD_REQUIRES_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_REQUIRES_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_REQUIRES_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_REQUIRES_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_REQUIRES_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_REQUIRES_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_REQUIRES_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_REQUIRES_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_REQUIRES_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_REQUIRES_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_REQUIRES_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_REQUIRES_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_REQUIRES_FRONT, requires)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_REQUIRES_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_REQUIRES_BACK, requires)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/cstddef/ptrdiff_t.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/cstddef/ptrdiff_t.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_PTRDIFF_T_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_PTRDIFF_T_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_PTRDIFF_T_IS_ptrdiff_t (1) /* unary */
+#define ptrdiff_t_CONTRACT_DETAIL_PP_KEYWORD_PTRDIFF_T_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_PTRDIFF_T_REMOVE_ptrdiff_t /* nothing */
+#define ptrdiff_t_CONTRACT_DETAIL_PP_KEYWORD_PTRDIFF_T_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_PTRDIFF_T_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_PTRDIFF_T_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_PTRDIFF_T_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_PTRDIFF_T_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_PTRDIFF_T_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PTRDIFF_T_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_PTRDIFF_T_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_PTRDIFF_T_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PTRDIFF_T_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_PTRDIFF_T_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_PTRDIFF_T_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PTRDIFF_T_FRONT, ptrdiff_t)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_PTRDIFF_T_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PTRDIFF_T_BACK, ptrdiff_t)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/cstddef/size_t.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/cstddef/size_t.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_SIZE_T_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_SIZE_T_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_SIZE_T_IS_size_t (1) /* unary */
+#define size_t_CONTRACT_DETAIL_PP_KEYWORD_SIZE_T_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_SIZE_T_REMOVE_size_t /* nothing */
+#define size_t_CONTRACT_DETAIL_PP_KEYWORD_SIZE_T_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_SIZE_T_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_SIZE_T_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_SIZE_T_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_SIZE_T_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_SIZE_T_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_SIZE_T_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_SIZE_T_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_SIZE_T_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_SIZE_T_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_SIZE_T_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_SIZE_T_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_SIZE_T_FRONT, size_t)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_SIZE_T_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_SIZE_T_BACK, size_t)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/char16_t.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/char16_t.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_CHAR16_T_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_CHAR16_T_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_CHAR16_T_IS_char16_t (1) /* unary */
+#define char16_t_CONTRACT_DETAIL_PP_KEYWORD_CHAR16_T_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_CHAR16_T_REMOVE_char16_t /* nothing */
+#define char16_t_CONTRACT_DETAIL_PP_KEYWORD_CHAR16_T_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_CHAR16_T_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_CHAR16_T_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_CHAR16_T_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_CHAR16_T_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CHAR16_T_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CHAR16_T_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_CHAR16_T_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CHAR16_T_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CHAR16_T_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_CHAR16_T_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CHAR16_T_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CHAR16_T_FRONT, char16_t)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CHAR16_T_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CHAR16_T_BACK, char16_t)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/char32_t.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/char32_t.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_CHAR32_T_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_CHAR32_T_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_CHAR32_T_IS_char32_t (1) /* unary */
+#define char32_t_CONTRACT_DETAIL_PP_KEYWORD_CHAR32_T_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_CHAR32_T_REMOVE_char32_t /* nothing */
+#define char32_t_CONTRACT_DETAIL_PP_KEYWORD_CHAR32_T_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_CHAR32_T_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_CHAR32_T_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_CHAR32_T_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_CHAR32_T_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CHAR32_T_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CHAR32_T_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_CHAR32_T_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CHAR32_T_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CHAR32_T_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_CHAR32_T_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CHAR32_T_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CHAR32_T_FRONT, char32_t)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CHAR32_T_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CHAR32_T_BACK, char32_t)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/constexpr.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/constexpr.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_CONSTEXPR_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_CONSTEXPR_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_CONSTEXPR_IS_constexpr (1) /* unary */
+#define constexpr_CONTRACT_DETAIL_PP_KEYWORD_CONSTEXPR_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_CONSTEXPR_REMOVE_constexpr /* nothing */
+#define constexpr_CONTRACT_DETAIL_PP_KEYWORD_CONSTEXPR_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_CONSTEXPR_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_CONSTEXPR_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_CONSTEXPR_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_CONSTEXPR_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CONSTEXPR_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CONSTEXPR_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_CONSTEXPR_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CONSTEXPR_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CONSTEXPR_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_CONSTEXPR_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CONSTEXPR_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CONSTEXPR_FRONT, constexpr)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_CONSTEXPR_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CONSTEXPR_BACK, constexpr)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/cstddef/nullptr_t.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/cstddef/nullptr_t.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_T_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_T_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_T_IS_nullptr_t (1) /* unary */
+#define nullptr_t_CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_T_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_T_REMOVE_nullptr_t /* nothing */
+#define nullptr_t_CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_T_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_NULLPTR_T_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_T_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_NULLPTR_T_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_T_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_T_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_NULLPTR_T_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_T_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_T_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_NULLPTR_T_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_T_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_T_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_NULLPTR_T_FRONT, nullptr_t)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_T_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_NULLPTR_T_BACK, nullptr_t)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/decltype.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/decltype.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_DECLTYPE_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_DECLTYPE_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_DECLTYPE_IS_decltype (1) /* unary */
+#define decltype_CONTRACT_DETAIL_PP_KEYWORD_DECLTYPE_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_DECLTYPE_REMOVE_decltype /* nothing */
+#define decltype_CONTRACT_DETAIL_PP_KEYWORD_DECLTYPE_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_DECLTYPE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_DECLTYPE_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_DECLTYPE_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_DECLTYPE_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DECLTYPE_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DECLTYPE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_DECLTYPE_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DECLTYPE_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DECLTYPE_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_DECLTYPE_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DECLTYPE_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DECLTYPE_FRONT, decltype)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DECLTYPE_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DECLTYPE_BACK, decltype)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/final.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/final.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_FINAL_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_FINAL_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_FINAL_IS_final (1) /* unary */
+#define final_CONTRACT_DETAIL_PP_KEYWORD_FINAL_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_FINAL_REMOVE_final /* nothing */
+#define final_CONTRACT_DETAIL_PP_KEYWORD_FINAL_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_FINAL_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_FINAL_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_FINAL_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_FINAL_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_FINAL_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_FINAL_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_FINAL_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_FINAL_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_FINAL_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_FINAL_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_FINAL_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_FINAL_FRONT, final)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_FINAL_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_FINAL_BACK, final)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/nullptr.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/nullptr.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_IS_nullptr (1) /* unary */
+#define nullptr_CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_REMOVE_nullptr /* nothing */
+#define nullptr_CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_NULLPTR_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_NULLPTR_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_NULLPTR_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_NULLPTR_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_NULLPTR_FRONT, nullptr)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_NULLPTR_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_NULLPTR_BACK, nullptr)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/override.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/override.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_OVERRIDE_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_OVERRIDE_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_OVERRIDE_IS_override (1) /* unary */
+#define override_CONTRACT_DETAIL_PP_KEYWORD_OVERRIDE_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_OVERRIDE_REMOVE_override /* nothing */
+#define override_CONTRACT_DETAIL_PP_KEYWORD_OVERRIDE_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_OVERRIDE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_OVERRIDE_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_OVERRIDE_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_OVERRIDE_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_OVERRIDE_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_OVERRIDE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_OVERRIDE_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_OVERRIDE_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_OVERRIDE_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_OVERRIDE_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_OVERRIDE_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_OVERRIDE_FRONT, override)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_OVERRIDE_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_OVERRIDE_BACK, override)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/static_assert.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/cxx11/static_assert.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_STATIC_ASSERT_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_STATIC_ASSERT_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_STATIC_ASSERT_IS_static_assert (1) /*unary*/
+#define static_assert_CONTRACT_DETAIL_PP_KEYWORD_STATIC_ASSERT_IS (1) /*unary*/
+#define CONTRACT_DETAIL_PP_KEYWORD_STATIC_ASSERT_REMOVE_static_assert/*nothing*/
+#define static_assert_CONTRACT_DETAIL_PP_KEYWORD_STATIC_ASSERT_REMOVE/*nothing*/
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_STATIC_ASSERT_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_STATIC_ASSERT_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_STATIC_ASSERT_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_STATIC_ASSERT_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_STATIC_ASSERT_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_STATIC_ASSERT_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_STATIC_ASSERT_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_STATIC_ASSERT_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_STATIC_ASSERT_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_STATIC_ASSERT_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_STATIC_ASSERT_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_STATIC_ASSERT_FRONT, static_assert)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_STATIC_ASSERT_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_STATIC_ASSERT_BACK, static_assert)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/default.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/default.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_DEFAULT_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_DEFAULT_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_DEFAULT_IS_default (1) /* unary */
+#define default_CONTRACT_DETAIL_PP_KEYWORD_DEFAULT_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_DEFAULT_REMOVE_default /* nothing */
+#define default_CONTRACT_DETAIL_PP_KEYWORD_DEFAULT_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_DEFAULT_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_DEFAULT_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_DEFAULT_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_DEFAULT_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DEFAULT_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DEFAULT_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_DEFAULT_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DEFAULT_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DEFAULT_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_DEFAULT_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DEFAULT_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DEFAULT_FRONT, default)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DEFAULT_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DEFAULT_BACK, default)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/delete.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/delete.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_DELETE_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_DELETE_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_DELETE_IS_delete (1) /* unary */
+#define delete_CONTRACT_DETAIL_PP_KEYWORD_DELETE_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_DELETE_REMOVE_delete /* nothing */
+#define delete_CONTRACT_DETAIL_PP_KEYWORD_DELETE_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_DELETE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_DELETE_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_DELETE_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_DELETE_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DELETE_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DELETE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_DELETE_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DELETE_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DELETE_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_DELETE_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DELETE_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DELETE_FRONT, delete)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DELETE_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DELETE_BACK, delete)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/do.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/do.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_DO_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_DO_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_DO_IS_do (1) /* unary */
+#define do_CONTRACT_DETAIL_PP_KEYWORD_DO_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_DO_REMOVE_do /* nothing */
+#define do_CONTRACT_DETAIL_PP_KEYWORD_DO_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_DO_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_DO_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_DO_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_DO_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DO_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DO_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_DO_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DO_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DO_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_DO_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DO_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DO_FRONT, do)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DO_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DO_BACK, do)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/double.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/double.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_DOUBLE_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_DOUBLE_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_DOUBLE_IS_double (1) /* unary */
+#define double_CONTRACT_DETAIL_PP_KEYWORD_DOUBLE_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_DOUBLE_REMOVE_double /* nothing */
+#define double_CONTRACT_DETAIL_PP_KEYWORD_DOUBLE_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_DOUBLE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_DOUBLE_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_DOUBLE_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_DOUBLE_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DOUBLE_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DOUBLE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_DOUBLE_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DOUBLE_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DOUBLE_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_DOUBLE_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DOUBLE_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DOUBLE_FRONT, double)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DOUBLE_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DOUBLE_BACK, double)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/dynamic_cast.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/dynamic_cast.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_DYNAMIC_CAST_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_DYNAMIC_CAST_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_DYNAMIC_CAST_IS_dynamic_cast (1) /* unary */
+#define dynamic_cast_CONTRACT_DETAIL_PP_KEYWORD_DYNAMIC_CAST_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_DYNAMIC_CAST_REMOVE_dynamic_cast /*nothing*/
+#define dynamic_cast_CONTRACT_DETAIL_PP_KEYWORD_DYNAMIC_CAST_REMOVE /*nothing*/
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_DYNAMIC_CAST_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_DYNAMIC_CAST_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_DYNAMIC_CAST_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_DYNAMIC_CAST_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DYNAMIC_CAST_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DYNAMIC_CAST_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_DYNAMIC_CAST_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DYNAMIC_CAST_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DYNAMIC_CAST_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_DYNAMIC_CAST_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DYNAMIC_CAST_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DYNAMIC_CAST_FRONT, dynamic_cast)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_DYNAMIC_CAST_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DYNAMIC_CAST_BACK, dynamic_cast)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/else.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/else.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_ELSE_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_ELSE_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_ELSE_IS_else (1) /* unary */
+#define else_CONTRACT_DETAIL_PP_KEYWORD_ELSE_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_ELSE_REMOVE_else /* nothing */
+#define else_CONTRACT_DETAIL_PP_KEYWORD_ELSE_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_ELSE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_ELSE_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_ELSE_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_ELSE_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_ELSE_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_ELSE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_ELSE_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_ELSE_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_ELSE_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_ELSE_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_ELSE_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_ELSE_FRONT, else)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_ELSE_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_ELSE_BACK, else)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/enum.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/enum.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_ENUM_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_ENUM_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_ENUM_IS_enum (1) /* unary */
+#define enum_CONTRACT_DETAIL_PP_KEYWORD_ENUM_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_ENUM_REMOVE_enum /* nothing */
+#define enum_CONTRACT_DETAIL_PP_KEYWORD_ENUM_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_ENUM_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_ENUM_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_ENUM_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_ENUM_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_ENUM_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_ENUM_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_ENUM_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_ENUM_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_ENUM_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_ENUM_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_ENUM_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_ENUM_FRONT, enum)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_ENUM_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_ENUM_BACK, enum)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/explicit.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/explicit.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_EXPLICIT_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_EXPLICIT_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_EXPLICIT_IS_explicit (1) /* unary */
+#define explicit_CONTRACT_DETAIL_PP_KEYWORD_EXPLICIT_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_EXPLICIT_REMOVE_explicit /* nothing */
+#define explicit_CONTRACT_DETAIL_PP_KEYWORD_EXPLICIT_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_EXPLICIT_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_EXPLICIT_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_EXPLICIT_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_EXPLICIT_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_EXPLICIT_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_EXPLICIT_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_EXPLICIT_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_EXPLICIT_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_EXPLICIT_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_EXPLICIT_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_EXPLICIT_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_EXPLICIT_FRONT, explicit)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_EXPLICIT_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_EXPLICIT_BACK, explicit)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/export.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/export.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_EXPORT_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_EXPORT_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_EXPORT_IS_export (1) /* unary */
+#define export_CONTRACT_DETAIL_PP_KEYWORD_EXPORT_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_EXPORT_REMOVE_export /* nothing */
+#define export_CONTRACT_DETAIL_PP_KEYWORD_EXPORT_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_EXPORT_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_EXPORT_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_EXPORT_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_EXPORT_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_EXPORT_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_EXPORT_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_EXPORT_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_EXPORT_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_EXPORT_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_EXPORT_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_EXPORT_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_EXPORT_FRONT, export)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_EXPORT_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_EXPORT_BACK, export)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/extern.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/extern.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_EXTERN_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_EXTERN_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_EXTERN_IS_extern (1) /* unary */
+#define extern_CONTRACT_DETAIL_PP_KEYWORD_EXTERN_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_EXTERN_REMOVE_extern /* nothing */
+#define extern_CONTRACT_DETAIL_PP_KEYWORD_EXTERN_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_EXTERN_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_EXTERN_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_EXTERN_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_EXTERN_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_EXTERN_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_EXTERN_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_EXTERN_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_EXTERN_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_EXTERN_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_EXTERN_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_EXTERN_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_EXTERN_FRONT, extern)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_EXTERN_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_EXTERN_BACK, extern)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/facilities/add.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/facilities/add.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,25 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_HPP_
+
+#include <boost/preprocessor/control/expr_iif.hpp>
+#include <boost/preprocessor/logical/compl.hpp>
+
+// `is_front_macro(tokens)` is 1 if `tokens` start w/ `keyword` to add, else 0.
+#define CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT( \
+ tokens, is_front_macro, keyword) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_COMPL(is_front_macro(tokens)), keyword) tokens
+
+// `is_back_macro(tokens)` is 1 if `tokens` end with `keyword` to add, else 0.
+#define CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK( \
+ tokens, is_back_macro, keyword) \
+ tokens BOOST_PP_EXPR_IIF(BOOST_PP_COMPL(is_back_macro(tokens)), keyword)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/facilities/is.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/facilities/is.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,46 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_HPP_
+
+#include <contract/detail/preprocessor/punctuation/has_paren.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_(a, b) \
+ CONTRACT_DETAIL_PP_HAS_PAREN(BOOST_PP_CAT(a, b))
+
+// PUBLIC //
+
+// `checking_prefix ## tokens` expand to unary (e.g., `(1)`) iff `tokens` start
+// with keyword to check.
+#define CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT( \
+ tokens, checking_prefix) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(tokens), \
+ /* on MSVC this check works even if tokens already unary but on */ \
+ /* C++03 (including GCC) this check on non-unary tokens gives */ \
+ /* a concatenation error -- so return false is tokens is not unary */ \
+ 0 BOOST_PP_TUPLE_EAT(2) \
+ , \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_ \
+ )(checking_prefix, tokens)
+
+// `token ## checking_postfix` expand to unary (e.g., `(1)`) iff `token` is the
+// keyword to check. This check only works if `token` is a single token, it
+// will always expand to 0 if token is multiple tokens (e.g., `const *this`).
+// This check will expand to 0 with no error if `token` starts with a
+// non-alphanumeric symbol (e.g., `*this`).
+#define CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK( \
+ token, checking_postfix) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_(token, checking_postfix)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/facilities/remove.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/facilities/remove.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_HPP_
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/config/config.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+// PRIVATE //
+
+// From PP_EXPAND (my own reentrant version).
+#if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC() && \
+ ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()
+# define CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_EXPAND_(x) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_EXPAND_I_(x)
+#else
+# define CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_EXPAND_(x) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_EXPAND_OO_((x))
+# define CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_EXPAND_OO_( \
+ par) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_EXPAND_I_ ## par
+#endif
+#define CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_EXPAND_I_(x) x
+
+// PUBLIC //
+
+// `is_front_macro(tokens)` is 1 if `tokens` start with keyword to remove.
+// `removing_prefix ## <keyword-to-remove>` must expand to nothing, else 0.
+#define CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT( \
+ tokens, is_front_macro, removing_prefix) \
+ /* without EXPAND doesn't expand on MSVC */ \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_EXPAND_( \
+ BOOST_PP_IIF(is_front_macro(tokens), \
+ BOOST_PP_CAT \
+ , \
+ tokens BOOST_PP_TUPLE_EAT(2) \
+ )(removing_prefix, tokens) \
+ )
+
+// `is_back_macro(tokens)` is 1 iff `tokens` end with keyword to remove.
+// `<keyword-to-remove> ## removing_postfix` must expand to nothing, else 0.
+#define CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK( \
+ tokens, is_back_macro, removing_prefix) \
+ BOOST_PP_IIF(is_back_macro(tokens), \
+ BOOST_PP_CAT \
+ , \
+ tokens BOOST_PP_TUPLE_EAT(2) \
+ )(tokens, removing_postfix)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/false.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/false.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_FALSE_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_FALSE_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_FALSE_IS_false (1) /* unary */
+#define false_CONTRACT_DETAIL_PP_KEYWORD_FALSE_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_FALSE_REMOVE_false /* nothing */
+#define false_CONTRACT_DETAIL_PP_KEYWORD_FALSE_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_FALSE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_FALSE_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_FALSE_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_FALSE_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_FALSE_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_FALSE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_FALSE_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_FALSE_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_FALSE_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_FALSE_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_FALSE_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_FALSE_FRONT, false)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_FALSE_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_FALSE_BACK, false)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/float.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/float.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_FLOAT_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_FLOAT_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_FLOAT_IS_float (1) /* unary */
+#define float_CONTRACT_DETAIL_PP_KEYWORD_FLOAT_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_FLOAT_REMOVE_float /* nothing */
+#define float_CONTRACT_DETAIL_PP_KEYWORD_FLOAT_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_FLOAT_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_FLOAT_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_FLOAT_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_FLOAT_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_FLOAT_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_FLOAT_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_FLOAT_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_FLOAT_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_FLOAT_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_FLOAT_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_FLOAT_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_FLOAT_FRONT, float)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_FLOAT_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_FLOAT_BACK, float)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/for.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/for.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_FOR_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_FOR_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_FOR_IS_for (1) /* unary */
+#define for_CONTRACT_DETAIL_PP_KEYWORD_FOR_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_FOR_REMOVE_for /* nothing */
+#define for_CONTRACT_DETAIL_PP_KEYWORD_FOR_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_FOR_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_FOR_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_FOR_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_FOR_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_FOR_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_FOR_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_FOR_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_FOR_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_FOR_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_FOR_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_FOR_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_FOR_FRONT, for)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_FOR_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_FOR_BACK, for)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/friend.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/friend.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_FRIEND_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_FRIEND_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_FRIEND_IS_friend (1) /* unary */
+#define friend_CONTRACT_DETAIL_PP_KEYWORD_FRIEND_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_FRIEND_REMOVE_friend /* nothing */
+#define friend_CONTRACT_DETAIL_PP_KEYWORD_FRIEND_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_FRIEND_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_FRIEND_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_FRIEND_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_FRIEND_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_FRIEND_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_FRIEND_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_FRIEND_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_FRIEND_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_FRIEND_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_FRIEND_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_FRIEND_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_FRIEND_FRONT, friend)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_FRIEND_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_FRIEND_BACK, friend)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/goto.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/goto.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_GOTO_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_GOTO_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_GOTO_IS_goto (1) /* unary */
+#define goto_CONTRACT_DETAIL_PP_KEYWORD_GOTO_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_GOTO_REMOVE_goto /* nothing */
+#define goto_CONTRACT_DETAIL_PP_KEYWORD_GOTO_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_GOTO_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_GOTO_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_GOTO_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_GOTO_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_GOTO_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_GOTO_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_GOTO_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_GOTO_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_GOTO_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_GOTO_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_GOTO_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_GOTO_FRONT, goto)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_GOTO_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_GOTO_BACK, goto)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/if.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/if.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_IF_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_IF_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_IF_IS_if (1) /* unary */
+#define if_CONTRACT_DETAIL_PP_KEYWORD_IF_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_IF_REMOVE_if /* nothing */
+#define if_CONTRACT_DETAIL_PP_KEYWORD_IF_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_IF_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IF_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_IF_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_IF_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IF_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_IF_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_IF_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IF_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_IF_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_IF_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IF_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_IF_FRONT, if)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IF_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_IF_BACK, if)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/inline.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/inline.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_INLINE_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_INLINE_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_INLINE_IS_inline (1) /* unary */
+#define inline_CONTRACT_DETAIL_PP_KEYWORD_INLINE_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_INLINE_REMOVE_inline /* nothing */
+#define inline_CONTRACT_DETAIL_PP_KEYWORD_INLINE_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_INLINE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_INLINE_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_INLINE_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_INLINE_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_INLINE_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_INLINE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_INLINE_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_INLINE_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_INLINE_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_INLINE_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_INLINE_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_INLINE_FRONT, inline)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_INLINE_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_INLINE_BACK, inline)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/int.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/int.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_INT_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_INT_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_INT_IS_int (1) /* unary */
+#define int_CONTRACT_DETAIL_PP_KEYWORD_INT_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_INT_REMOVE_int /* nothing */
+#define int_CONTRACT_DETAIL_PP_KEYWORD_INT_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_INT_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_INT_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_INT_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_INT_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_INT_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_INT_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_INT_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_INT_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_INT_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_INT_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_INT_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_INT_FRONT, int)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_INT_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_INT_BACK, int)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/long.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/long.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_LONG_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_LONG_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_LONG_IS_long (1) /* unary */
+#define long_CONTRACT_DETAIL_PP_KEYWORD_LONG_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_LONG_REMOVE_long /* nothing */
+#define long_CONTRACT_DETAIL_PP_KEYWORD_LONG_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_LONG_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_LONG_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_LONG_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_LONG_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_LONG_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_LONG_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_LONG_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_LONG_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_LONG_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_LONG_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_LONG_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_LONG_FRONT, long)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_LONG_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_LONG_BACK, long)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/mutable.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/mutable.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_MUTABLE_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_MUTABLE_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_MUTABLE_IS_mutable (1) /* unary */
+#define mutable_CONTRACT_DETAIL_PP_KEYWORD_MUTABLE_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_MUTABLE_REMOVE_mutable /* nothing */
+#define mutable_CONTRACT_DETAIL_PP_KEYWORD_MUTABLE_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_MUTABLE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_MUTABLE_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_MUTABLE_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_MUTABLE_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_MUTABLE_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_MUTABLE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_MUTABLE_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_MUTABLE_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_MUTABLE_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_MUTABLE_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_MUTABLE_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_MUTABLE_FRONT, mutable)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_MUTABLE_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_MUTABLE_BACK, mutable)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/namespace.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/namespace.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_NAMESPACE_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_NAMESPACE_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_NAMESPACE_IS_namespace (1) /* unary */
+#define namespace_CONTRACT_DETAIL_PP_KEYWORD_NAMESPACE_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_NAMESPACE_REMOVE_namespace /* nothing */
+#define namespace_CONTRACT_DETAIL_PP_KEYWORD_NAMESPACE_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_NAMESPACE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_NAMESPACE_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_NAMESPACE_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_NAMESPACE_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_NAMESPACE_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_NAMESPACE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_NAMESPACE_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_NAMESPACE_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_NAMESPACE_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_NAMESPACE_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_NAMESPACE_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_NAMESPACE_FRONT, namespace)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_NAMESPACE_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_NAMESPACE_BACK, namespace)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/new.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/new.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_NEW_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_NEW_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_NEW_IS_new (1) /* unary */
+#define new_CONTRACT_DETAIL_PP_KEYWORD_NEW_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_NEW_REMOVE_new /* nothing */
+#define new_CONTRACT_DETAIL_PP_KEYWORD_NEW_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_NEW_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_NEW_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_NEW_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_NEW_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_NEW_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_NEW_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_NEW_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_NEW_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_NEW_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_NEW_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_NEW_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_NEW_FRONT, new)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_NEW_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_NEW_BACK, new)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/not.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/not.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_NOT_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_NOT_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_NOT_IS_not (1) /* unary */
+#define not_CONTRACT_DETAIL_PP_KEYWORD_NOT_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_NOT_REMOVE_not /* nothing */
+#define not_CONTRACT_DETAIL_PP_KEYWORD_NOT_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_NOT_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_NOT_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_NOT_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_NOT_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_NOT_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_NOT_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_NOT_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_NOT_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_NOT_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_NOT_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_NOT_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_NOT_FRONT, not)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_NOT_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_NOT_BACK, not)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/not_eq.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/not_eq.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_NOT_EQ_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_NOT_EQ_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_NOT_EQ_IS_not_eq (1) /* unary */
+#define not_eq_CONTRACT_DETAIL_PP_KEYWORD_NOT_EQ_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_NOT_EQ_REMOVE_not_eq /* nothing */
+#define not_eq_CONTRACT_DETAIL_PP_KEYWORD_NOT_EQ_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_NOT_EQ_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_NOT_EQ_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_NOT_EQ_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_NOT_EQ_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_NOT_EQ_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_NOT_EQ_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_NOT_EQ_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_NOT_EQ_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_NOT_EQ_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_NOT_EQ_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_NOT_EQ_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_NOT_EQ_FRONT, not_eq)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_NOT_EQ_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_NOT_EQ_BACK, not_eq)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/operator.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/operator.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_OPERATOR_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_OPERATOR_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_OPERATOR_IS_operator (1) /* unary */
+#define operator_CONTRACT_DETAIL_PP_KEYWORD_OPERATOR_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_OPERATOR_REMOVE_operator /* nothing */
+#define operator_CONTRACT_DETAIL_PP_KEYWORD_OPERATOR_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_OPERATOR_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_OPERATOR_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_OPERATOR_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_OPERATOR_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_OPERATOR_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_OPERATOR_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_OPERATOR_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_OPERATOR_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_OPERATOR_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_OPERATOR_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_OPERATOR_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_OPERATOR_FRONT, operator)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_OPERATOR_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_OPERATOR_BACK, operator)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/or.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/or.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_OR_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_OR_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_OR_IS_or (1) /* unary */
+#define or_CONTRACT_DETAIL_PP_KEYWORD_OR_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_OR_REMOVE_or /* nothing */
+#define or_CONTRACT_DETAIL_PP_KEYWORD_OR_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_OR_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_OR_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_OR_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_OR_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_OR_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_OR_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_OR_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_OR_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_OR_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_OR_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_OR_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_OR_FRONT, or)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_OR_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_OR_BACK, or)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/or_eq.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/or_eq.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_OR_EQ_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_OR_EQ_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_OR_EQ_IS_or_eq (1) /* unary */
+#define or_eq_CONTRACT_DETAIL_PP_KEYWORD_OR_EQ_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_OR_EQ_REMOVE_or_eq /* nothing */
+#define or_eq_CONTRACT_DETAIL_PP_KEYWORD_OR_EQ_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_OR_EQ_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_OR_EQ_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_OR_EQ_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_OR_EQ_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_OR_EQ_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_OR_EQ_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_OR_EQ_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_OR_EQ_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_OR_EQ_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_OR_EQ_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_OR_EQ_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_OR_EQ_FRONT, or_eq)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_OR_EQ_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_OR_EQ_BACK, or_eq)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/private.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/private.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_PRIVATE_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_PRIVATE_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_PRIVATE_IS_private (1) /* unary */
+#define private_CONTRACT_DETAIL_PP_KEYWORD_PRIVATE_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_PRIVATE_REMOVE_private /* nothing */
+#define private_CONTRACT_DETAIL_PP_KEYWORD_PRIVATE_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_PRIVATE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_PRIVATE_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_PRIVATE_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_PRIVATE_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_PRIVATE_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PRIVATE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_PRIVATE_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_PRIVATE_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PRIVATE_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_PRIVATE_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_PRIVATE_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PRIVATE_FRONT, private)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_PRIVATE_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PRIVATE_BACK, private)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/protected.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/protected.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_PROTECTED_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_PROTECTED_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_PROTECTED_IS_protected (1) /* unary */
+#define protected_CONTRACT_DETAIL_PP_KEYWORD_PROTECTED_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_PROTECTED_REMOVE_protected /* nothing */
+#define protected_CONTRACT_DETAIL_PP_KEYWORD_PROTECTED_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_PROTECTED_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_PROTECTED_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_PROTECTED_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_PROTECTED_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_PROTECTED_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PROTECTED_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_PROTECTED_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_PROTECTED_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PROTECTED_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_PROTECTED_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_PROTECTED_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PROTECTED_FRONT, protected)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_PROTECTED_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PROTECTED_BACK, protected)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/public.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/public.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_PUBLIC_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_PUBLIC_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_PUBLIC_IS_public (1) /* unary */
+#define public_CONTRACT_DETAIL_PP_KEYWORD_PUBLIC_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_PUBLIC_REMOVE_public /* nothing */
+#define public_CONTRACT_DETAIL_PP_KEYWORD_PUBLIC_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_PUBLIC_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_PUBLIC_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_PUBLIC_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_PUBLIC_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_PUBLIC_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PUBLIC_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_PUBLIC_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_PUBLIC_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PUBLIC_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_PUBLIC_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_PUBLIC_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PUBLIC_FRONT, public)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_PUBLIC_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PUBLIC_BACK, public)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/register.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/register.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_REGISTER_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_REGISTER_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_REGISTER_IS_register (1) /* unary */
+#define register_CONTRACT_DETAIL_PP_KEYWORD_REGISTER_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_REGISTER_REMOVE_register /* nothing */
+#define register_CONTRACT_DETAIL_PP_KEYWORD_REGISTER_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_REGISTER_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_REGISTER_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_REGISTER_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_REGISTER_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_REGISTER_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_REGISTER_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_REGISTER_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_REGISTER_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_REGISTER_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_REGISTER_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_REGISTER_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_REGISTER_FRONT, register)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_REGISTER_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_REGISTER_BACK, register)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/reinterpret_cast.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/reinterpret_cast.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,62 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_REINTERPRET_CAST_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_REINTERPRET_CAST_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_REINTERPRET_CAST_IS_reinterpret_cast \
+ (1) /* unary */
+#define reinterpret_cast_CONTRACT_DETAIL_PP_KEYWORD_REINTERPRET_CAST_IS \
+ (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_REINTERPRET_CAST_REMOVE_reinterpret_cast \
+ /* nothing */
+#define reinterpret_cast_CONTRACT_DETAIL_PP_KEYWORD_REINTERPRET_CAST_REMOVE \
+ /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_REINTERPRET_CAST_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_REINTERPRET_CAST_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_REINTERPRET_CAST_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_REINTERPRET_CAST_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_REINTERPRET_CAST_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_REINTERPRET_CAST_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_REINTERPRET_CAST_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_REINTERPRET_CAST_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_REINTERPRET_CAST_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_REINTERPRET_CAST_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_REINTERPRET_CAST_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_REINTERPRET_CAST_FRONT, reinterpret_cast)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_REINTERPRET_CAST_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_REINTERPRET_CAST_BACK, reinterpret_cast)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/return.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/return.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_RETURN_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_RETURN_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_RETURN_IS_return (1) /* unary */
+#define return_CONTRACT_DETAIL_PP_KEYWORD_RETURN_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_RETURN_REMOVE_return /* nothing */
+#define return_CONTRACT_DETAIL_PP_KEYWORD_RETURN_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_RETURN_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_RETURN_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_RETURN_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_RETURN_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_RETURN_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_RETURN_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_RETURN_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_RETURN_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_RETURN_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_RETURN_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_RETURN_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_RETURN_FRONT, return)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_RETURN_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_RETURN_BACK, return)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/short.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/short.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_SHORT_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_SHORT_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_SHORT_IS_short (1) /* unary */
+#define short_CONTRACT_DETAIL_PP_KEYWORD_SHORT_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_SHORT_REMOVE_short /* nothing */
+#define short_CONTRACT_DETAIL_PP_KEYWORD_SHORT_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_SHORT_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_SHORT_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_SHORT_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_SHORT_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_SHORT_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_SHORT_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_SHORT_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_SHORT_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_SHORT_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_SHORT_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_SHORT_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_SHORT_FRONT, short)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_SHORT_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_SHORT_BACK, short)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/signed.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/signed.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_SIGNED_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_SIGNED_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_SIGNED_IS_signed (1) /* unary */
+#define signed_CONTRACT_DETAIL_PP_KEYWORD_SIGNED_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_SIGNED_REMOVE_signed /* nothing */
+#define signed_CONTRACT_DETAIL_PP_KEYWORD_SIGNED_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_SIGNED_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_SIGNED_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_SIGNED_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_SIGNED_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_SIGNED_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_SIGNED_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_SIGNED_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_SIGNED_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_SIGNED_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_SIGNED_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_SIGNED_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_SIGNED_FRONT, signed)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_SIGNED_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_SIGNED_BACK, signed)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/sizeof.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/sizeof.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_SIZEOF_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_SIZEOF_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_SIZEOF_IS_sizeof (1) /* unary */
+#define sizeof_CONTRACT_DETAIL_PP_KEYWORD_SIZEOF_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_SIZEOF_REMOVE_sizeof /* nothing */
+#define sizeof_CONTRACT_DETAIL_PP_KEYWORD_SIZEOF_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_SIZEOF_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_SIZEOF_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_SIZEOF_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_SIZEOF_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_SIZEOF_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_SIZEOF_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_SIZEOF_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_SIZEOF_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_SIZEOF_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_SIZEOF_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_SIZEOF_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_SIZEOF_FRONT, sizeof)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_SIZEOF_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_SIZEOF_BACK, sizeof)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/static.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/static.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_STATIC_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_STATIC_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_STATIC_IS_static (1) /* unary */
+#define static_CONTRACT_DETAIL_PP_KEYWORD_STATIC_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_STATIC_REMOVE_static /* nothing */
+#define static_CONTRACT_DETAIL_PP_KEYWORD_STATIC_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_STATIC_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_STATIC_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_STATIC_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_STATIC_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_STATIC_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_STATIC_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_STATIC_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_STATIC_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_STATIC_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_STATIC_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_STATIC_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_STATIC_FRONT, static)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_STATIC_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_STATIC_BACK, static)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/static_cast.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/static_cast.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_STATIC_CAST_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_STATIC_CAST_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_STATIC_CAST_IS_static_cast (1) /* unary */
+#define static_cast_CONTRACT_DETAIL_PP_KEYWORD_STATIC_CAST_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_STATIC_CAST_REMOVE_static_cast /* nothing */
+#define static_cast_CONTRACT_DETAIL_PP_KEYWORD_STATIC_CAST_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_STATIC_CAST_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_STATIC_CAST_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_STATIC_CAST_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_STATIC_CAST_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_STATIC_CAST_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_STATIC_CAST_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_STATIC_CAST_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_STATIC_CAST_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_STATIC_CAST_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_STATIC_CAST_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_STATIC_CAST_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_STATIC_CAST_FRONT, static_cast)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_STATIC_CAST_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_STATIC_CAST_BACK, static_cast)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/struct.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/struct.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_STRUCT_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_STRUCT_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_STRUCT_IS_struct (1) /* unary */
+#define struct_CONTRACT_DETAIL_PP_KEYWORD_STRUCT_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_STRUCT_REMOVE_struct /* nothing */
+#define struct_CONTRACT_DETAIL_PP_KEYWORD_STRUCT_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_STRUCT_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_STRUCT_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_STRUCT_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_STRUCT_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_STRUCT_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_STRUCT_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_STRUCT_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_STRUCT_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_STRUCT_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_STRUCT_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_STRUCT_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_STRUCT_FRONT, struct)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_STRUCT_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_STRUCT_BACK, struct)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/switch.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/switch.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_SWITCH_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_SWITCH_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_SWITCH_IS_switch (1) /* unary */
+#define switch_CONTRACT_DETAIL_PP_KEYWORD_SWITCH_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_SWITCH_REMOVE_switch /* nothing */
+#define switch_CONTRACT_DETAIL_PP_KEYWORD_SWITCH_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_SWITCH_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_SWITCH_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_SWITCH_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_SWITCH_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_SWITCH_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_SWITCH_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_SWITCH_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_SWITCH_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_SWITCH_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_SWITCH_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_SWITCH_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_SWITCH_FRONT, switch)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_SWITCH_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_SWITCH_BACK, switch)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/template.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/template.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_TEMPLATE_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_TEMPLATE_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_TEMPLATE_IS_template (1) /* unary */
+#define template_CONTRACT_DETAIL_PP_KEYWORD_TEMPLATE_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_TEMPLATE_REMOVE_template /* nothing */
+#define template_CONTRACT_DETAIL_PP_KEYWORD_TEMPLATE_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_TEMPLATE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_TEMPLATE_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_TEMPLATE_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_TEMPLATE_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_TEMPLATE_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TEMPLATE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_TEMPLATE_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_TEMPLATE_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TEMPLATE_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_TEMPLATE_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_TEMPLATE_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TEMPLATE_FRONT, template)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_TEMPLATE_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TEMPLATE_BACK, template)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/this.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/this.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_THIS_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_THIS_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_THIS_IS_this (1) /* unary */
+#define this_CONTRACT_DETAIL_PP_KEYWORD_THIS_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_THIS_REMOVE_this /* nothing */
+#define this_CONTRACT_DETAIL_PP_KEYWORD_THIS_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_THIS_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_THIS_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_THIS_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_THIS_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_THIS_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_THIS_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_THIS_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_THIS_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_THIS_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_THIS_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_THIS_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_THIS_FRONT, this)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_THIS_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_THIS_BACK, this)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/throw.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/throw.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_THROW_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_THROW_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_THROW_IS_throw (1) /* unary */
+#define throw_CONTRACT_DETAIL_PP_KEYWORD_THROW_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_THROW_REMOVE_throw /* nothing */
+#define throw_CONTRACT_DETAIL_PP_KEYWORD_THROW_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_THROW_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_THROW_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_THROW_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_THROW_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_THROW_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_THROW_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_THROW_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_THROW_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_THROW_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_THROW_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_THROW_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_THROW_FRONT, throw)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_THROW_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_THROW_BACK, throw)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/true.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/true.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_TRUE_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_TRUE_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_TRUE_IS_true (1) /* unary */
+#define true_CONTRACT_DETAIL_PP_KEYWORD_TRUE_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_TRUE_REMOVE_true /* nothing */
+#define true_CONTRACT_DETAIL_PP_KEYWORD_TRUE_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_TRUE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_TRUE_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_TRUE_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_TRUE_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_TRUE_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TRUE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_TRUE_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_TRUE_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TRUE_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_TRUE_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_TRUE_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TRUE_FRONT, true)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_TRUE_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TRUE_BACK, true)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/try.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/try.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_TRY_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_TRY_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_TRY_IS_try (1) /* unary */
+#define try_CONTRACT_DETAIL_PP_KEYWORD_TRY_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_TRY_REMOVE_try /* nothing */
+#define try_CONTRACT_DETAIL_PP_KEYWORD_TRY_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_TRY_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_TRY_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_TRY_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_TRY_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_TRY_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TRY_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_TRY_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_TRY_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TRY_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_TRY_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_TRY_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TRY_FRONT, try)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_TRY_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TRY_BACK, try)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/typedef.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/typedef.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_TYPEDEF_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_TYPEDEF_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_TYPEDEF_IS_typedef (1) /* unary */
+#define typedef_CONTRACT_DETAIL_PP_KEYWORD_TYPEDEF_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_TYPEDEF_REMOVE_typedef /* nothing */
+#define typedef_CONTRACT_DETAIL_PP_KEYWORD_TYPEDEF_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_TYPEDEF_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_TYPEDEF_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_TYPEDEF_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_TYPEDEF_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_TYPEDEF_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TYPEDEF_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_TYPEDEF_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_TYPEDEF_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TYPEDEF_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_TYPEDEF_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_TYPEDEF_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TYPEDEF_FRONT, typedef)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_TYPEDEF_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TYPEDEF_BACK, typedef)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/typeid.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/typeid.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_TYPEID_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_TYPEID_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_TYPEID_IS_typeid (1) /* unary */
+#define typeid_CONTRACT_DETAIL_PP_KEYWORD_TYPEID_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_TYPEID_REMOVE_typeid /* nothing */
+#define typeid_CONTRACT_DETAIL_PP_KEYWORD_TYPEID_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_TYPEID_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_TYPEID_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_TYPEID_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_TYPEID_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_TYPEID_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TYPEID_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_TYPEID_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_TYPEID_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TYPEID_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_TYPEID_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_TYPEID_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TYPEID_FRONT, typeid)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_TYPEID_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TYPEID_BACK, typeid)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/typename.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/typename.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_TYPENAME_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_TYPENAME_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_TYPENAME_IS_typename (1) /* unary */
+#define typename_CONTRACT_DETAIL_PP_KEYWORD_TYPENAME_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_TYPENAME_REMOVE_typename /* nothing */
+#define typename_CONTRACT_DETAIL_PP_KEYWORD_TYPENAME_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_TYPENAME_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_TYPENAME_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_TYPENAME_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_TYPENAME_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_TYPENAME_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TYPENAME_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_TYPENAME_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_TYPENAME_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TYPENAME_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_TYPENAME_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_TYPENAME_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TYPENAME_FRONT, typename)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_TYPENAME_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TYPENAME_BACK, typename)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/union.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/union.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_UNION_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_UNION_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_UNION_IS_union (1) /* unary */
+#define union_CONTRACT_DETAIL_PP_KEYWORD_UNION_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_UNION_REMOVE_union /* nothing */
+#define union_CONTRACT_DETAIL_PP_KEYWORD_UNION_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_UNION_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_UNION_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_UNION_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_UNION_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_UNION_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_UNION_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_UNION_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_UNION_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_UNION_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_UNION_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_UNION_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_UNION_FRONT, union)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_UNION_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_UNION_BACK, union)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/unsigned.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/unsigned.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_UNSIGNED_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_UNSIGNED_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_UNSIGNED_IS_unsigned (1) /* unary */
+#define unsigned_CONTRACT_DETAIL_PP_KEYWORD_UNSIGNED_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_UNSIGNED_REMOVE_unsigned /* nothing */
+#define unsigned_CONTRACT_DETAIL_PP_KEYWORD_UNSIGNED_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_UNSIGNED_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_UNSIGNED_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_UNSIGNED_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_UNSIGNED_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_UNSIGNED_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_UNSIGNED_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_UNSIGNED_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_UNSIGNED_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_UNSIGNED_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_UNSIGNED_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_UNSIGNED_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_UNSIGNED_FRONT, unsigned)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_UNSIGNED_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_UNSIGNED_BACK, unsigned)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/using.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/using.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_USING_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_USING_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_USING_IS_using (1) /* unary */
+#define using_CONTRACT_DETAIL_PP_KEYWORD_USING_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_USING_REMOVE_using /* nothing */
+#define using_CONTRACT_DETAIL_PP_KEYWORD_USING_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_USING_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_USING_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_USING_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_USING_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_USING_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_USING_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_USING_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_USING_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_USING_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_USING_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_USING_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_USING_FRONT, using)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_USING_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_USING_BACK, using)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/virtual.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/virtual.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_VIRTUAL_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_VIRTUAL_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_VIRTUAL_IS_virtual (1) /* unary */
+#define virtual_CONTRACT_DETAIL_PP_KEYWORD_VIRTUAL_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_VIRTUAL_REMOVE_virtual /* nothing */
+#define virtual_CONTRACT_DETAIL_PP_KEYWORD_VIRTUAL_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_VIRTUAL_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_VIRTUAL_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_VIRTUAL_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_VIRTUAL_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_VIRTUAL_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_VIRTUAL_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_VIRTUAL_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_VIRTUAL_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_VIRTUAL_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_VIRTUAL_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_VIRTUAL_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_VIRTUAL_FRONT, virtual)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_VIRTUAL_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_VIRTUAL_BACK, virtual)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/void.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/void.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_VOID_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_VOID_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_VOID_IS_void (1) /* unary */
+#define void_CONTRACT_DETAIL_PP_KEYWORD_VOID_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_VOID_REMOVE_void /* nothing */
+#define void_CONTRACT_DETAIL_PP_KEYWORD_VOID_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_VOID_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_VOID_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_VOID_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_VOID_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_VOID_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_VOID_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_VOID_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_VOID_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_VOID_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_VOID_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_VOID_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_VOID_FRONT, void)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_VOID_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_VOID_BACK, void)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/volatile.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/volatile.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_VOLATILE_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_VOLATILE_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_VOLATILE_IS_volatile (1) /* unary */
+#define volatile_CONTRACT_DETAIL_PP_KEYWORD_VOLATILE_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_VOLATILE_REMOVE_volatile /* nothing */
+#define volatile_CONTRACT_DETAIL_PP_KEYWORD_VOLATILE_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_VOLATILE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_VOLATILE_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_VOLATILE_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_VOLATILE_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_VOLATILE_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_VOLATILE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_VOLATILE_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_VOLATILE_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_VOLATILE_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_VOLATILE_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_VOLATILE_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_VOLATILE_FRONT, volatile)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_VOLATILE_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_VOLATILE_BACK, volatile)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/wchar_t.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/wchar_t.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_WCHAR_T_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_WCHAR_T_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_WCHAR_T_IS_wchar_t (1) /* unary */
+#define wchar_t_CONTRACT_DETAIL_PP_KEYWORD_WCHAR_T_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_WCHAR_T_REMOVE_wchar_t /* nothing */
+#define wchar_t_CONTRACT_DETAIL_PP_KEYWORD_WCHAR_T_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_WCHAR_T_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_WCHAR_T_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_WCHAR_T_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_WCHAR_T_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_WCHAR_T_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_WCHAR_T_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_WCHAR_T_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_WCHAR_T_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_WCHAR_T_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_WCHAR_T_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_WCHAR_T_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_WCHAR_T_FRONT, wchar_t)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_WCHAR_T_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_WCHAR_T_BACK, wchar_t)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/while.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/while.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_WHILE_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_WHILE_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_WHILE_IS_while (1) /* unary */
+#define while_CONTRACT_DETAIL_PP_KEYWORD_WHILE_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_WHILE_REMOVE_while /* nothing */
+#define while_CONTRACT_DETAIL_PP_KEYWORD_WHILE_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_WHILE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_WHILE_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_WHILE_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_WHILE_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_WHILE_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_WHILE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_WHILE_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_WHILE_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_WHILE_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_WHILE_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_WHILE_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_WHILE_FRONT, while)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_WHILE_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_WHILE_BACK, while)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/xor.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/xor.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_XOR_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_XOR_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_XOR_IS_xor (1) /* unary */
+#define xor_CONTRACT_DETAIL_PP_KEYWORD_XOR_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_XOR_REMOVE_xor /* nothing */
+#define xor_CONTRACT_DETAIL_PP_KEYWORD_XOR_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_XOR_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_XOR_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_XOR_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_XOR_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_XOR_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_XOR_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_XOR_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_XOR_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_XOR_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_XOR_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_XOR_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_XOR_FRONT, xor)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_XOR_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_XOR_BACK, xor)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/keyword/xor_eq.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/keyword/xor_eq.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_KEYWORD_XOR_EQ_HPP_
+#define CONTRACT_DETAIL_PP_KEYWORD_XOR_EQ_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/add.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PRIVATE //
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_KEYWORD_XOR_EQ_IS_xor_eq (1) /* unary */
+#define xor_eq_CONTRACT_DETAIL_PP_KEYWORD_XOR_EQ_IS (1) /* unary */
+#define CONTRACT_DETAIL_PP_KEYWORD_XOR_EQ_REMOVE_xor_eq /* nothing */
+#define xor_eq_CONTRACT_DETAIL_PP_KEYWORD_XOR_EQ_REMOVE /* nothing */
+
+// PUBLIC //
+
+// Is.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_XOR_EQ_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_XOR_EQ_IS_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_IS_XOR_EQ_BACK(token) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, \
+ _CONTRACT_DETAIL_PP_KEYWORD_XOR_EQ_IS)
+
+// Remove.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_XOR_EQ_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_XOR_EQ_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_XOR_EQ_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_XOR_EQ_REMOVE_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_XOR_EQ_BACK, \
+ _CONTRACT_DETAIL_PP_KEYWORD_XOR_EQ_REMOVE)
+
+// Add.
+
+#define CONTRACT_DETAIL_PP_KEYWORD_XOR_EQ_ADD_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_XOR_EQ_FRONT, xor_eq)
+
+#define CONTRACT_DETAIL_PP_KEYWORD_XOR_EQ_ADD_BACK(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_ADD_BACK(tokens, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_XOR_EQ_BACK, xor_eq)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/list/to_array.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/list/to_array.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,41 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_LIST_TO_ARRAY_HPP_
+#define CONTRACT_DETAIL_PP_LIST_TO_ARRAY_HPP_
+
+#include <boost/preprocessor/list/fold_left.hpp>
+#include <boost/preprocessor/control/if.hpp>
+#include <boost/preprocessor/array/push_back.hpp>
+#include <boost/preprocessor/list/adt.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_LIST_TO_ARRAY_ELEM_(d, array, elem) \
+ /* don't use ARRAY_SIZE instead of TUPLE_ELEM(2, 0, ...) because when */ \
+ /* size is 0 ARRAY_SIZE is undefined */ \
+ BOOST_PP_IF(BOOST_PP_TUPLE_ELEM(2, 0, array), \
+ BOOST_PP_ARRAY_PUSH_BACK \
+ , \
+ (1, (elem)) BOOST_PP_TUPLE_EAT(2) \
+ )(array, elem)
+
+// PUBLIC //
+
+// Precondition: list != NIL
+#define CONTRACT_DETAIL_PP_LIST_TO_ARRAY_D(d, list) \
+ BOOST_PP_LIST_FOLD_LEFT_ ## d(CONTRACT_DETAIL_PP_LIST_TO_ARRAY_ELEM_, \
+ (0, ()), list)
+
+// Precondition: list != NIL
+#define CONTRACT_DETAIL_PP_LIST_TO_ARRAY(list) \
+ CONTRACT_DETAIL_PP_LIST_TO_ARRAY_D(1, list)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/punctuation/curly.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/punctuation/curly.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,37 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_CURLY_HPP_
+#define CONTRACT_DETAIL_PP_CURLY_HPP_
+
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_IS_CURLY_CONTRACT_DETAIL_PP_LCURLY (1) /* unary */
+#define CONTRACT_DETAIL_PP_IS_CURLY_CONTRACT_DETAIL_PP_RCURLY (1) /* unary */
+
+// PUBLIC //
+
+// Curly parenthesis macros.
+
+#define CONTRACT_DETAIL_PP_LCURLY() {
+
+#define CONTRACT_DETAIL_PP_RCURLY() }
+
+// Detect curly parenthesis macros (not curly paren but actual macro names).
+
+#define CONTRACT_DETAIL_PP_IS_LCURLY_MACRO(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_IS_CURLY_)
+
+#define CONTRACT_DETAIL_PP_IS_RCURLY_MACRO(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_IS_CURLY_)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/punctuation/has_paren.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/punctuation/has_paren.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,46 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_HAS_PAREN_HPP_
+#define CONTRACT_DETAIL_PP_HAS_PAREN_HPP_
+
+#include <boost/config.hpp>
+
+// PUBLIC //
+
+#ifndef BOOST_NO_VARIADIC_MACROS
+
+# include <boost/preprocessor/config/config.hpp>
+# include <boost/preprocessor/detail/check.hpp>
+
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+# define CONTRACT_DETAIL_PP_HAS_PAREN(tokens) \
+ BOOST_PP_CHECK(tokens, CONTRACT_DETAIL_PP_HAS_PAREN_CHECK)
+# else
+# define CONTRACT_DETAIL_PP_HAS_PAREN(tokens) \
+ CONTRACT_DETAIL_PP_HAS_PAREN_I(tokens)
+# define CONTRACT_DETAIL_PP_HAS_PAREN_I(tokens) \
+ BOOST_PP_CHECK(tokens, CONTRACT_DETAIL_PP_HAS_PAREN_CHECK)
+# endif
+# define CONTRACT_DETAIL_PP_HAS_PAREN_CHECK(...) \
+ 1 /* variadics handle any arity */
+# define BOOST_PP_CHECK_RESULT_CONTRACT_DETAIL_PP_HAS_PAREN_CHECK \
+ 0, BOOST_PP_NIL
+
+#else
+
+# include <boost/preprocessor/detail/is_unary.hpp>
+
+// Expand to 1 iff tokens have parenthesis `(x)...` (only this case is handled
+// if no variadic macros), or `(x, y, ...)...`, or etc.
+# define CONTRACT_DETAIL_PP_HAS_PAREN(tokens) \
+ BOOST_PP_IS_UNARY(tokens)
+
+#endif
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/seq/to_list.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/seq/to_list.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,49 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_SEQ_TO_LIST_HPP_
+#define CONTRACT_DETAIL_PP_SEQ_TO_LIST_HPP_
+
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/to_list.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/seq/to_tuple.hpp>
+#include <boost/preprocessor/seq/seq.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_SEQ_TO_LIST_NOT_EMPTY_(is_head_empty_macro, seq) \
+ BOOST_PP_TUPLE_TO_LIST(BOOST_PP_SEQ_SIZE(seq), BOOST_PP_SEQ_TO_TUPLE(seq))
+
+#define CONTRACT_DETAIL_PP_SEQ_TO_LIST_EMPTY_(is_head_empty_macro, seq) \
+ BOOST_PP_NIL
+
+// Precondition: size(seq) == 1
+#define CONTRACT_DETAIL_PP_SEQ_TO_LIST_MAYBE_EMPTY_(is_head_empty_macro, seq) \
+ BOOST_PP_IIF(is_head_empty_macro(BOOST_PP_SEQ_HEAD(seq)), \
+ CONTRACT_DETAIL_PP_SEQ_TO_LIST_EMPTY_ \
+ , \
+ CONTRACT_DETAIL_PP_SEQ_TO_LIST_NOT_EMPTY_ \
+ )(is_head_empty_macro, seq)
+
+// PUBLIC //
+
+// Expand to PP_NIL list if is_head_empty_macro(SEQ_HEAD(seq)).
+#define CONTRACT_DETAIL_PP_SEQ_TO_LIST(is_head_empty_macro, seq) \
+ BOOST_PP_IIF(BOOST_PP_EQUAL(BOOST_PP_SEQ_SIZE(seq), 1), \
+ CONTRACT_DETAIL_PP_SEQ_TO_LIST_MAYBE_EMPTY_ \
+ , \
+ CONTRACT_DETAIL_PP_SEQ_TO_LIST_NOT_EMPTY_ \
+ )(is_head_empty_macro, seq)
+
+// Never expand to PP_NIL list.
+#define CONTRACT_DETAIL_PP_SEQ_TO_LIST_NEVER_EMPTY(seq) \
+ CONTRACT_DETAIL_PP_SEQ_TO_LIST_NOT_EMPTY_(~, seq)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/assertion.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/assertion.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,92 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_ASSERTION_TRAITS_HPP_
+#define CONTRACT_DETAIL_PP_ASSERTION_TRAITS_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/assertion.hpp>
+#include <contract/detail/preprocessor/traits/aux_/select_assertion_1.hpp>
+#include <contract/detail/preprocessor/keyword/contract/requires.hpp>
+#include <contract/detail/preprocessor/keyword/if.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/list/fold_left.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_ASSERTION_TRAITS_ELEM_( \
+ d, number_instruction_requirements_traits, assertion) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_IF_FRONT(assertion), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_1 \
+ , BOOST_PP_IIF(BOOST_PP_EXPAND( /* EXPAND needed for MSVC */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_IS_STATEMENT(assertion)), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_STATEMENT \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_REQUIRES_FRONT(assertion), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_REQUIRES \
+ , /* else: bool, const, or static assertion */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_CONDITION \
+ )))(d, assertion \
+ , BOOST_PP_TUPLE_ELEM(4, 0, number_instruction_requirements_traits) \
+ , BOOST_PP_TUPLE_ELEM(4, 1, number_instruction_requirements_traits) \
+ , BOOST_PP_TUPLE_ELEM(4, 2, number_instruction_requirements_traits) \
+ , BOOST_PP_TUPLE_ELEM(4, 3, number_instruction_requirements_traits) \
+ )
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_ASSERTION_TRAITS_D(d, assertions) \
+ BOOST_PP_TUPLE_ELEM(4, 3 /* select traits */ \
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_APPEND_TUPLE(d \
+ , BOOST_PP_LIST_FOLD_LEFT_ ## d( \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_ELEM_ \
+ , ( \
+ 0 /* number */ \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* instruction */ \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* requirements */ \
+ , \
+ BOOST_PP_NIL /* traits of all assertions */ \
+ ) \
+ , assertions \
+ ) \
+ ) \
+ )
+
+// PUBLIC //
+
+// Expand to a pp-list of assertion traits.
+#define CONTRACT_DETAIL_PP_ASSERTION_TRAITS(assertions) \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_D(1, assertions)
+
+// Expand to assertion number 1, 2, ... (for assertion statement, it is the
+// number previous assertion or 0 if no previous assertion).
+#define CONTRACT_DETAIL_PP_ASSERTION_TRAITS_NUMBER(assertion_traits) \
+ BOOST_PP_TUPLE_ELEM(3, 0, assertion_traits)
+
+// Expand to assertion instruction: bool_expr, const( vars ) const_bool_expr,
+// static_assert(static_bool_expr, string),
+// if(bool_expr | const( vars ) const_bool_expr), else, PP_RCURLY,
+// using directive, namespace directive, typedef type new_type.
+#define CONTRACT_DETAIL_PP_ASSERTION_TRAITS_INSTRUCTION(assertion_traits) \
+ BOOST_PP_TUPLE_ELEM(3, 1, assertion_traits)
+
+// Expand to 1 iff assertion is a statement (using, namespeace, typedef, etc
+// but no if, else, or } of select assertions).
+#define CONTRACT_DETAIL_PP_ASSERTION_TRAITS_IS_STATEMENT(assertion_traits) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_IS_STATEMENT( \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS_INSTRUCTION(assertion_traits))
+
+// Expand to [boolean_integral_expr] (always EMPTY for statement). Not using
+// plural REQUIREMENTS because not a list (or sequence).
+#define CONTRACT_DETAIL_PP_ASSERTION_TRAITS_REQUIREMENT(assertion_traits) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_, \
+ BOOST_PP_TUPLE_ELEM(3, 2, assertion_traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/aux_/apply-generate.py
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/aux_/apply-generate.py 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,88 @@
+
+# Copyright (C) 2008-2012 Lorenzo Caminiti
+# Distributed under 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)
+# Home at http://sourceforge.net/projects/contractpp
+
+import sys
+import shutil
+
+iterations = raw_input("maximum iterations [1] = ")
+if iterations == "": iterations = 1
+else: iterations = int(iterations)
+
+for i in range(0, iterations + 1): # 0 and iterations included in range.
+ if i == 0: p = ''
+ else: p = '_' + str(i)
+
+ header = sys.argv[0].replace("-generate.py", p + ".hpp", 1)
+ shutil.copyfile(header, header + ".bak")
+ h = open(header, 'w')
+
+ h.write('''
+#ifndef CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY{0}_HPP_
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY{0}_HPP_
+
+// WARNING: FILE AUTOMATICALLY GENERATED, DO NOT MODIFY IT!
+// Instead modify the generation script "<FILE>-generate.py" and run
+// `$ python <FILE_NAME>-generate.py > FILE_NAME.hpp`.
+// Used maximum number of iterations: {1}
+
+#include <boost/preprocessor/config/config.hpp>
+#include <boost/preprocessor/arithmetic/inc.hpp>
+#include <boost/preprocessor/array/data.hpp>
+#include <boost/preprocessor/array/size.hpp>
+#include <boost/preprocessor/config/config.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/tuple/rem.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+
+// PRIVATE //
+
+// From BOOST_PP_ARRAY_PUSH_BACK.
+#if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_ARRAY_PUSH_BACK{0}_(array, elem) \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ARRAY_PUSH_BACK_I_( \\
+ BOOST_PP_ARRAY_SIZE(array), BOOST_PP_ARRAY_DATA(array), elem)
+#else
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_ARRAY_PUSH_BACK{0}_(array, elem) \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ARRAY_PUSH_BACK_D{0}_(array, elem)
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_ARRAY_PUSH_BACK_D{0}_(array, elem) \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ARRAY_PUSH_BACK_I_( \\
+ BOOST_PP_ARRAY_SIZE(array), BOOST_PP_ARRAY_DATA(array), elem)
+#endif
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_ARRAY_PUSH_BACK_I{0}_(size, data, elem) \\
+ (BOOST_PP_INC(size), \\
+ (BOOST_PP_TUPLE_REM(size) data BOOST_PP_COMMA_IF(size) elem))
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY_INIT{0}( \\
+ traits_sign, trait_macro, sign_macro) \\
+ ( \\
+ ( 1 /* create 1-array */, ( trait_macro( \\
+ BOOST_PP_TUPLE_ELEM(2, 1, traits_sign)) ) ) \\
+ , \\
+ sign_macro(BOOST_PP_TUPLE_ELEM(2, 1, traits_sign)) \\
+ )
+
+// Expand to next `traits_sign` applying `trait_macro(sign)` and
+// `sign_macro(macro)`.
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY{0}( \\
+ traits_sign, trait_macro, sign_macro) \\
+ ( \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ARRAY_PUSH_BACK{0}_( \\
+ BOOST_PP_TUPLE_ELEM(2, 0, traits_sign), \\
+ trait_macro(BOOST_PP_TUPLE_ELEM(2, 1, traits_sign))) \\
+ , \\
+ sign_macro(BOOST_PP_TUPLE_ELEM(2, 1, traits_sign)) \\
+ )
+
+#endif // #include guard
+
+'''.format(p, iterations))
+
+ h.close()
+ print "Written:", header
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/aux_/apply.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/aux_/apply.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,67 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY_HPP_
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY_HPP_
+
+// WARNING: FILE AUTOMATICALLY GENERATED, DO NOT MODIFY IT!
+// Instead modify the generation script "<FILE>-generate.py" and run
+// `$ python <FILE_NAME>-generate.py > FILE_NAME.hpp`.
+// Used maximum number of iterations: 1
+
+#include <boost/preprocessor/config/config.hpp>
+#include <boost/preprocessor/arithmetic/inc.hpp>
+#include <boost/preprocessor/array/data.hpp>
+#include <boost/preprocessor/array/size.hpp>
+#include <boost/preprocessor/config/config.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/tuple/rem.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+
+// PRIVATE //
+
+// From BOOST_PP_ARRAY_PUSH_BACK.
+#if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_ARRAY_PUSH_BACK_(array, elem) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ARRAY_PUSH_BACK_I_( \
+ BOOST_PP_ARRAY_SIZE(array), BOOST_PP_ARRAY_DATA(array), elem)
+#else
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_ARRAY_PUSH_BACK_(array, elem) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ARRAY_PUSH_BACK_D_(array, elem)
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_ARRAY_PUSH_BACK_D_(array, elem) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ARRAY_PUSH_BACK_I_( \
+ BOOST_PP_ARRAY_SIZE(array), BOOST_PP_ARRAY_DATA(array), elem)
+#endif
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_ARRAY_PUSH_BACK_I_(size, data, elem) \
+ (BOOST_PP_INC(size), \
+ (BOOST_PP_TUPLE_REM(size) data BOOST_PP_COMMA_IF(size) elem))
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY_INIT( \
+ traits_sign, trait_macro, sign_macro) \
+ ( \
+ ( 1 /* create 1-array */, ( trait_macro( \
+ BOOST_PP_TUPLE_ELEM(2, 1, traits_sign)) ) ) \
+ , \
+ sign_macro(BOOST_PP_TUPLE_ELEM(2, 1, traits_sign)) \
+ )
+
+// Expand to next `traits_sign` applying `trait_macro(sign)` and
+// `sign_macro(macro)`.
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY( \
+ traits_sign, trait_macro, sign_macro) \
+ ( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ARRAY_PUSH_BACK_( \
+ BOOST_PP_TUPLE_ELEM(2, 0, traits_sign), \
+ trait_macro(BOOST_PP_TUPLE_ELEM(2, 1, traits_sign))) \
+ , \
+ sign_macro(BOOST_PP_TUPLE_ELEM(2, 1, traits_sign)) \
+ )
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/aux_/apply_1.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/aux_/apply_1.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,67 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY_1_HPP_
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY_1_HPP_
+
+// WARNING: FILE AUTOMATICALLY GENERATED, DO NOT MODIFY IT!
+// Instead modify the generation script "<FILE>-generate.py" and run
+// `$ python <FILE_NAME>-generate.py > FILE_NAME.hpp`.
+// Used maximum number of iterations: 1
+
+#include <boost/preprocessor/config/config.hpp>
+#include <boost/preprocessor/arithmetic/inc.hpp>
+#include <boost/preprocessor/array/data.hpp>
+#include <boost/preprocessor/array/size.hpp>
+#include <boost/preprocessor/config/config.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/tuple/rem.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+
+// PRIVATE //
+
+// From BOOST_PP_ARRAY_PUSH_BACK.
+#if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_ARRAY_PUSH_BACK_1_(array, elem) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ARRAY_PUSH_BACK_I_( \
+ BOOST_PP_ARRAY_SIZE(array), BOOST_PP_ARRAY_DATA(array), elem)
+#else
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_ARRAY_PUSH_BACK_1_(array, elem) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ARRAY_PUSH_BACK_D_1_(array, elem)
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_ARRAY_PUSH_BACK_D_1_(array, elem) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ARRAY_PUSH_BACK_I_( \
+ BOOST_PP_ARRAY_SIZE(array), BOOST_PP_ARRAY_DATA(array), elem)
+#endif
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_ARRAY_PUSH_BACK_I_1_(size, data, elem) \
+ (BOOST_PP_INC(size), \
+ (BOOST_PP_TUPLE_REM(size) data BOOST_PP_COMMA_IF(size) elem))
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY_INIT_1( \
+ traits_sign, trait_macro, sign_macro) \
+ ( \
+ ( 1 /* create 1-array */, ( trait_macro( \
+ BOOST_PP_TUPLE_ELEM(2, 1, traits_sign)) ) ) \
+ , \
+ sign_macro(BOOST_PP_TUPLE_ELEM(2, 1, traits_sign)) \
+ )
+
+// Expand to next `traits_sign` applying `trait_macro(sign)` and
+// `sign_macro(macro)`.
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY_1( \
+ traits_sign, trait_macro, sign_macro) \
+ ( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ARRAY_PUSH_BACK_1_( \
+ BOOST_PP_TUPLE_ELEM(2, 0, traits_sign), \
+ trait_macro(BOOST_PP_TUPLE_ELEM(2, 1, traits_sign))) \
+ , \
+ sign_macro(BOOST_PP_TUPLE_ELEM(2, 1, traits_sign)) \
+ )
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/aux_/assertion.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/aux_/assertion.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,107 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_HPP_
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/nil.hpp>
+#include <contract/detail/preprocessor/keyword/contract/requires.hpp>
+#include <contract/detail/preprocessor/keyword/using.hpp>
+#include <contract/detail/preprocessor/keyword/namespace.hpp>
+#include <contract/detail/preprocessor/keyword/typedef.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/arithmetic/inc.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/list/append.hpp>
+
+// PROTECTED //
+
+// Expand to 1 iff it is an assertion statement.
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_IS_STATEMENT(assertion) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_USING_FRONT(assertion), \
+ 1 \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_NAMESPACE_FRONT(assertion), \
+ 1 \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_TYPEDEF_FRONT(assertion), \
+ 1 \
+ , \
+ 0 \
+ )))
+
+// Append specified assertion traits to trait list.
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_APPEND( \
+ d, traits, number, instruction, requirements) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_IS_NIL_FRONT(instruction), \
+ traits BOOST_PP_TUPLE_EAT(2) \
+ , \
+ BOOST_PP_LIST_APPEND \
+ )(traits, ((number, instruction, requirements), BOOST_PP_NIL))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_APPEND_TUPLE( \
+ d, number_instruction_requirements_traits) \
+ ( \
+ BOOST_PP_TUPLE_ELEM(4, 0, number_instruction_requirements_traits) \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* instruction */ \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* requirements */ \
+ , \
+ /* append very last trait */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_APPEND(d \
+ , BOOST_PP_TUPLE_ELEM(4, 3, number_instruction_requirements_traits)\
+ , BOOST_PP_TUPLE_ELEM(4, 0, number_instruction_requirements_traits)\
+ , BOOST_PP_TUPLE_ELEM(4, 1, number_instruction_requirements_traits)\
+ , BOOST_PP_TUPLE_ELEM(4, 2, number_instruction_requirements_traits)\
+ ) \
+ )
+
+// To be used for assertion statements using, namespace, and typedef.
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_STATEMENT(d, statement, \
+ prev_number, prev_instruction, prev_requirements, traits) \
+ ( \
+ prev_number /* statement is not an assertion so don't inc number */ \
+ , \
+ statement /* statement instruction */ \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* statement has no requirement */ \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_APPEND(d, traits, prev_number, \
+ prev_instruction, prev_requirements) /* append prev traits */ \
+ )
+
+// To be used for assertion requirements.
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_REQUIRES(d, requirements, \
+ prev_number, prev_instruction, prev_requirements, traits) \
+ ( \
+ prev_number \
+ , \
+ prev_instruction \
+ , \
+ /* only update requirements for prev assertion */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL \
+ CONTRACT_DETAIL_PP_KEYWORD_REQUIRES_REMOVE_FRONT(requirements) \
+ , \
+ traits /* don't append, will append at next iteration */ \
+ )
+
+// To be used for boolean, const, and static assertions.
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_CONDITION(d, assertion, \
+ prev_number, prev_instruction, prev_requirements, traits) \
+ ( \
+ BOOST_PP_INC(prev_number) /* new actual assertion, inc number */ \
+ , \
+ assertion /* assertion instruction */ \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* no requirements (maybe next) */ \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_APPEND(d, traits, prev_number, \
+ prev_instruction, prev_requirements) /* append prev traits */ \
+ )
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/aux_/comma.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/aux_/comma.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,95 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_HPP_
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_HPP_
+
+#include <contract/detail/preprocessor/tuple/split.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_ARRAY_(size_tuple_rest) \
+ (BOOST_PP_TUPLE_ELEM(3, 0, size_tuple_rest), \
+ BOOST_PP_TUPLE_ELEM(3, 1, size_tuple_rest))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_AFTER_(size_tuple_rest) \
+ BOOST_PP_TUPLE_ELEM(3, 2, size_tuple_rest)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_SPLIT_(size) \
+ size, CONTRACT_DETAIL_PP_TUPLE_SPLIT(size) /* split */
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_comma(comma_count) \
+ /* tuple size is number of commas + 1 */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_SPLIT_(BOOST_PP_INC(comma_count))
+
+// tokens: `comma(n) (token0, ..., token_n) ...`
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_( \
+ after01, no_comma_macro, tokens) \
+ BOOST_PP_IIF(after01, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_AFTER_ \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_ARRAY_ \
+ )((BOOST_PP_CAT(CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_, tokens)))
+
+#ifndef BOOST_NO_VARIADIC_MACROS
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_PAREN_SPLIT_(...) \
+ CONTRACT_DETAIL_PP_VARIADIC_SIZE(__VA_ARGS__), (__VA_ARGS__), /*split*/
+#else
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_PAREN_SPLIT_(token) \
+ 1, (token), /* split */
+#endif
+
+// tokens: `(token0, ...) ...`
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_PAREN_( \
+ after01, no_comma_macro, tokens) \
+ BOOST_PP_IIF(after01, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_AFTER_ \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_ARRAY_ \
+ )((CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_PAREN_SPLIT_ tokens))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_NOT_AFTER_(rest) \
+ rest
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_NOT_ARRAY_(token) \
+ /* training EMPTY() so MSVC properly handle when token is empty */ \
+ BOOST_PP_IIF(BOOST_PP_IS_EMPTY(token BOOST_PP_EMPTY()), \
+ (0, ()) /* 0-size array for empty */ \
+ , \
+ (1, (token)) \
+ )
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_NOT_( \
+ after01, no_comma_macro, tokens) \
+ BOOST_PP_IIF(after01, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_NOT_AFTER_ \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_NOT_ARRAY_ \
+ )(no_comma_macro(tokens))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_DISPATCH_( \
+ after01, no_comma_macro, tokens) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_COMMA_FRONT(tokens), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(tokens), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_PAREN_ \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_NOT_ \
+ ))(after01, no_comma_macro, tokens)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA(no_comma_macro, tokens) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_DISPATCH_( \
+ 0 /* array, not after */, no_comma_macro, tokens)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_COMMA(no_comma_macro, tokens) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA_DISPATCH_( \
+ 1 /* after */, no_comma_macro, tokens)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/aux_/keyword.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/aux_/keyword.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,78 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_TRAITS_AUX_KEYWORD_HPP_
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_KEYWORD_HPP_
+
+#include <boost/preprocessor/control/expr_iif.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/facilities/expand.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+
+// PROTECTED //
+
+// A keyword.
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_KEYWORD(tokens, is_macro, keyword) \
+ BOOST_PP_EXPR_IIF(BOOST_PP_EXPAND(is_macro(tokens)), /* expand for MSVC */ \
+ keyword)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_KEYWORD(tokens, after_macro) \
+ after_macro(tokens)
+
+// A keyword among 2 possible ones.
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_KEYWORD2(tokens, \
+ is_macro1, keyword1, is_macro2, keyword2) \
+ BOOST_PP_IIF(is_macro1(tokens), \
+ keyword1 BOOST_PP_EMPTY \
+ , BOOST_PP_IIF(is_macro2(tokens), \
+ keyword2 BOOST_PP_EMPTY \
+ , \
+ BOOST_PP_EMPTY /* expand to nothing */ \
+ ))(/* expand empty */)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_KEYWORD2(tokens, \
+ is_macro1, after_macro1, is_macro2, after_macro2) \
+ BOOST_PP_IIF(is_macro1(tokens), \
+ after_macro1 \
+ , BOOST_PP_IIF(is_macro2(tokens), \
+ after_macro2 \
+ , \
+ tokens BOOST_PP_TUPLE_EAT(1) /* remove nothing */ \
+ ))(tokens)
+
+// A keyword among 3 possible ones.
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_KEYWORD3(tokens, \
+ is_macro1, keyword1, is_macro2, keyword2, is_macro3, keyword3) \
+ BOOST_PP_IIF(is_macro1(tokens), \
+ keyword1 BOOST_PP_EMPTY \
+ , BOOST_PP_IIF(is_macro2(tokens), \
+ keyword2 BOOST_PP_EMPTY \
+ , BOOST_PP_IIF(is_macro3(tokens), \
+ keyword3 BOOST_PP_EMPTY \
+ , \
+ BOOST_PP_EMPTY /* expand to nothing */ \
+ )))(/* expand empty */)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_KEYWORD3(tokens, \
+ is_macro1, after_macro1, is_macro2, after_macro2, \
+ is_macro3, after_macro3) \
+ BOOST_PP_IIF(is_macro1(tokens), \
+ after_macro1 \
+ , BOOST_PP_IIF(is_macro2(tokens), \
+ after_macro2 \
+ , BOOST_PP_IIF(is_macro3(tokens), \
+ after_macro3 \
+ , \
+ tokens BOOST_PP_TUPLE_EAT(1) /* remove nothing */ \
+ )))(tokens)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/aux_/list-generate.py
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/aux_/list-generate.py 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,275 @@
+
+# Copyright (C) 2008-2012 Lorenzo Caminiti
+# Distributed under 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)
+# Home at http://sourceforge.net/projects/contractpp
+
+import sys
+import shutil
+
+iterations = raw_input("maximum iterations [1] = ")
+if iterations == "": iterations = 1
+else: iterations = int(iterations)
+
+for i in range(0, iterations + 1): # 0 and iterations included in range.
+ if i == 0: p = ''
+ else: p = '_' + str(i)
+
+ header = sys.argv[0].replace("-generate.py", p + ".hpp", 1)
+ shutil.copyfile(header, header + ".bak")
+ h = open(header, 'w')
+
+ h.write('''
+#ifndef CONTRACT_DETAIL_PP_TRAITS_AUX_LIST{0}_HPP_
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST{0}_HPP_
+
+// WARNING: FILE AUTOMATICALLY GENERATED, DO NOT MODIFY IT!
+// Instead modify the generation script "<FILE>-generate.py" and run
+// `$ python <FILE_NAME>-generate.py > FILE_NAME.hpp`.
+// Used maximum number of iterations: {1}
+
+#include <contract/aux_/config.hpp>
+#include <contract/detail/preprocessor/punctuation/has_paren.hpp>
+#include <contract/detail/preprocessor/keyword/default.hpp>
+#include <contract/detail/preprocessor/keyword/void.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+#include <boost/preprocessor/config/config.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/list/append.hpp>
+#include <boost/preprocessor/seq/fold_right.hpp>
+#include <boost/preprocessor/debug/assert.hpp>
+#include <boost/config.hpp>
+
+// PRIVATE //
+
+#define CHECK_CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE{0} (1)
+#define ERASE_CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE{0} /* nothing */
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE_CHECK{0}_(tokens) \\
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(tokens), \\
+ 0 BOOST_PP_TUPLE_EAT(2) \\
+ , \\
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT \\
+ )(tokens, CHECK_)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE_ERASE{0}_(tokens) \\
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE_CHECK{0}_, ERASE_)
+
+// From PP_EXPAND (my own reentrant version).
+#if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC() && ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_EXPAND{0}_(x) \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_EXPAND_I{0}_(x)
+#else
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_EXPAND{0}_(x) \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_EXPAND_OO{0}_((x))
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_EXPAND_OO{0}_(par) \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_EXPAND_I{0}_ ## par
+#endif
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_EXPAND_I{0}_(x) x
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_DFLT_OP_LASTDFLT{0}_( \\
+ s, elem, list, last_default, elem_macro) \\
+ ( \\
+ list /* unchanged list */ \\
+ , \\
+ /* set last-default */ \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA(BOOST_PP_TUPLE_REM(1), \\
+ CONTRACT_DETAIL_PP_KEYWORD_DEFAULT_REMOVE_FRONT(elem)) \\
+ , \\
+ elem_macro /* unchanged op-macro */ \\
+ ) \\
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_DFLT_OP_ELEM{0}_( \\
+ s, elem, list, last_default, elem_macro) \\
+ ( \\
+ /* append elem_macro(elem) (in front because FOLD_RIGHT) */ \\
+ BOOST_PP_LIST_APPEND( \\
+ ( /* list of... */ \\
+ ( /* .. 2-tuple `(elem_macro(elem), default)` */ \\
+ elem_macro(elem) \\
+ , \\
+ last_default \\
+ ) \\
+ , BOOST_PP_NIL ), list) \\
+ , \\
+ (0, ()) /* no last-default */ \\
+ , \\
+ elem_macro /* unchanged op-macro */ \\
+ )
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_DFLT_OP{0}_( \\
+ s, list_lastdefault_macro, elem) \\
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_DEFAULT_FRONT(elem), \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_DFLT_OP_LASTDFLT{0}_ \\
+ , \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_DFLT_OP_ELEM{0}_ \\
+ )(s, elem, \\
+ BOOST_PP_TUPLE_ELEM(3, 0, list_lastdefault_macro), \\
+ BOOST_PP_TUPLE_ELEM(3, 1, list_lastdefault_macro), \\
+ BOOST_PP_TUPLE_ELEM(3, 2, list_lastdefault_macro))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_DFLT{0}_(seq, elem_macro) \\
+ BOOST_PP_TUPLE_ELEM(3, 0, CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_EXPAND{0}_(\\
+ BOOST_PP_SEQ_FOLD_RIGHT( \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_DFLT_OP{0}_, \\
+ ( BOOST_PP_NIL, \\
+ (0, ()), /* no last-default to start */ \\
+ elem_macro ), seq)))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_NODFLT_OP_ELEM{0}_( \\
+ s, elem, list, elem_macro) \\
+ ( \\
+ BOOST_PP_LIST_APPEND( \\
+ ( /* list of 1-tuple `elem_macro(elem)` */ \\
+ elem_macro(elem) \\
+ , BOOST_PP_NIL ), list) \\
+ , \\
+ elem_macro /* unchanged op-macro */ \\
+ )
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_NODFLT_OP{0}_( \\
+ s, list_macro, elem) \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_NODFLT_OP_ELEM{0}_(s, elem, \\
+ BOOST_PP_TUPLE_ELEM(2, 0, list_macro), \\
+ BOOST_PP_TUPLE_ELEM(2, 1, list_macro))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_NODFLT{0}_( \\
+ seq, elem_macro) \\
+ BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_SEQ_FOLD_RIGHT( \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_NODFLT_OP{0}_,\\
+ ( BOOST_PP_NIL, elem_macro ), seq))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_NOTEMPTY{0}_( \\
+ seq, allow_empty, with_defaults, elem_macro) \\
+ BOOST_PP_IIF(with_defaults, \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_DFLT{0}_ \\
+ , \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_NODFLT{0}_ \\
+ )(seq, elem_macro)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_EMPTY{0}_( \\
+ seq, allow_empty, with_defaults, elem_macro) \\
+ BOOST_PP_IIF(allow_empty, \\
+ BOOST_PP_NIL /* nil list */ \\
+ BOOST_PP_TUPLE_EAT(2) /* no error */ \\
+ , \\
+ BOOST_PP_ASSERT_MSG /* error */ \\
+ )(0, ERROR_unexpected_empty_token_list)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_IS_EMPTY_CHECK_HEAD{0}_( \\
+ seq) \\
+ CONTRACT_DETAIL_PP_KEYWORD_IS_VOID_FRONT(BOOST_PP_SEQ_HEAD(seq))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_IS_EMPTY_CHECK{0}_(seq) \\
+ BOOST_PP_IIF(BOOST_PP_EQUAL(BOOST_PP_SEQ_SIZE(seq), 1), \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_IS_EMPTY_CHECK_HEAD{0}_ \\
+ , \\
+ 0 BOOST_PP_TUPLE_EAT(1) \\
+ )(seq)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_IS_EMPTY{0}_(void_or_seq) \\
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_VOID_FRONT(void_or_seq), \\
+ 1 BOOST_PP_TUPLE_EAT(1) \\
+ , \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_IS_EMPTY_CHECK{0}_ \\
+ )(void_or_seq)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ{0}_( \\
+ void_or_seq, allow_empty, with_defaults, elem_macro) \\
+ BOOST_PP_IIF(BOOST_PP_EXPAND( /* expand for MSVC */ \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_IS_EMPTY{0}_( \\
+ void_or_seq)), \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_EMPTY{0}_ \\
+ , \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_NOTEMPTY{0}_ \\
+ )(void_or_seq, allow_empty, with_defaults, elem_macro)
+
+#ifndef BOOST_NO_VARIADIC_MACROS
+# include <contract/detail/preprocessor/variadic/to_seq.hpp>
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_SPLIT_SEQ{0}_(...) \\
+ CONTRACT_DETAIL_PP_VARIADIC_TO_SEQ(void, __VA_ARGS__) \\
+ , /* split into 2-tuple `(seq_from(__VA_ARGS__), following_tokens)` */
+#else // variadics
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_SPLIT_SEQ{0}_(seq) \\
+ seq \\
+ , /* split into 2-tuple `(seq_from(__VA_ARGS__), following_tokens)` */
+#endif // variadics
+
+// Expand from paren_tokens `(a, b, ...) tokens...` (variadics) or
+// `( (a) (b) ... ) tokens...` to `(a) (b) ...`.
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_GET_SEQ{0}_(paren_tokens) \\
+ BOOST_PP_TUPLE_ELEM(2, 0, \\
+ ( /* split expand to 2-tuple `(seq, ignore_tokens)` */ \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_SPLIT_SEQ{0}_ paren_tokens \\
+ ) \\
+ )
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST{0}_( \\
+ tokens, allow_empty, with_defaults, remove_tag_macro, elem_macro) \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ{0}_( \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_GET_SEQ{0}_( \\
+ remove_tag_macro(tokens)), \\
+ allow_empty, with_defaults, elem_macro)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST{0}(tokens, \\
+ allow_empty, with_defaults, \\
+ is_tagged_macro, remove_tag_macro, elem_macro) \\
+ BOOST_PP_IIF(is_tagged_macro(tokens), \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST{0}_ \\
+ , \\
+ BOOST_PP_NIL /* nil list */ \\
+ BOOST_PP_TUPLE_EAT(5) \\
+ )(tokens, allow_empty, with_defaults, remove_tag_macro, elem_macro)
+
+#ifndef BOOST_NO_VARIADIC_MACROS
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE{0}(...) /*nothing*/
+#else // variadics
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE{0}(seq) /*nothing*/
+#endif // variadics
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_TAGGED_LIST{0}( \\
+ tokens, is_tagged_macro, removing_prefix) \\
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \\
+ is_tagged_macro, removing_prefix)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST{0}(tokens, \\
+ allow_empty, with_defaults, elem_macro) \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ{0}_( \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_GET_SEQ{0}_(tokens), \\
+ allow_empty, with_defaults, elem_macro)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_LIST{0}(tokens) \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE_ERASE{0}_( \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_EXPAND{0}_( \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE{0} tokens \\
+ ))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_OPTIONAL_LIST{0}( \\
+ tokens, allow_empty, with_defaults, elem_macro) \\
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(tokens), \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST{0} /* list present */ \\
+ , \\
+ BOOST_PP_NIL BOOST_PP_TUPLE_EAT(4) /* expand to nil pp-list */ \\
+ )(tokens, allow_empty, with_defaults, elem_macro)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_OPTIONAL_LIST{0}(tokens) \\
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(tokens), \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_LIST{0} /* list present */ \\
+ , \\
+ tokens BOOST_PP_TUPLE_EAT(1) /* expand to tokens */ \\
+ )(tokens)
+
+#endif // #include guard
+
+'''.format(p, iterations))
+
+ h.close()
+ print "Written:", header
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/aux_/list.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/aux_/list.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,254 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_HPP_
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_HPP_
+
+// WARNING: FILE AUTOMATICALLY GENERATED, DO NOT MODIFY IT!
+// Instead modify the generation script "<FILE>-generate.py" and run
+// `$ python <FILE_NAME>-generate.py > FILE_NAME.hpp`.
+// Used maximum number of iterations: 1
+
+#include <contract/aux_/config.hpp>
+#include <contract/detail/preprocessor/punctuation/has_paren.hpp>
+#include <contract/detail/preprocessor/keyword/default.hpp>
+#include <contract/detail/preprocessor/keyword/void.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+#include <boost/preprocessor/config/config.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/list/append.hpp>
+#include <boost/preprocessor/seq/fold_right.hpp>
+#include <boost/preprocessor/debug/assert.hpp>
+#include <boost/config.hpp>
+
+// PRIVATE //
+
+#define CHECK_CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE (1)
+#define ERASE_CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE /* nothing */
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE_CHECK_(tokens) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(tokens), \
+ 0 BOOST_PP_TUPLE_EAT(2) \
+ , \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT \
+ )(tokens, CHECK_)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE_ERASE_(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE_CHECK_, ERASE_)
+
+// From PP_EXPAND (my own reentrant version).
+#if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC() && ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_EXPAND_(x) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_EXPAND_I_(x)
+#else
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_EXPAND_(x) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_EXPAND_OO_((x))
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_EXPAND_OO_(par) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_EXPAND_I_ ## par
+#endif
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_EXPAND_I_(x) x
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_DFLT_OP_LASTDFLT_( \
+ s, elem, list, last_default, elem_macro) \
+ ( \
+ list /* unchanged list */ \
+ , \
+ /* set last-default */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA(BOOST_PP_TUPLE_REM(1), \
+ CONTRACT_DETAIL_PP_KEYWORD_DEFAULT_REMOVE_FRONT(elem)) \
+ , \
+ elem_macro /* unchanged op-macro */ \
+ ) \
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_DFLT_OP_ELEM_( \
+ s, elem, list, last_default, elem_macro) \
+ ( \
+ /* append elem_macro(elem) (in front because FOLD_RIGHT) */ \
+ BOOST_PP_LIST_APPEND( \
+ ( /* list of... */ \
+ ( /* .. 2-tuple `(elem_macro(elem), default)` */ \
+ elem_macro(elem) \
+ , \
+ last_default \
+ ) \
+ , BOOST_PP_NIL ), list) \
+ , \
+ (0, ()) /* no last-default */ \
+ , \
+ elem_macro /* unchanged op-macro */ \
+ )
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_DFLT_OP_( \
+ s, list_lastdefault_macro, elem) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_DEFAULT_FRONT(elem), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_DFLT_OP_LASTDFLT_ \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_DFLT_OP_ELEM_ \
+ )(s, elem, \
+ BOOST_PP_TUPLE_ELEM(3, 0, list_lastdefault_macro), \
+ BOOST_PP_TUPLE_ELEM(3, 1, list_lastdefault_macro), \
+ BOOST_PP_TUPLE_ELEM(3, 2, list_lastdefault_macro))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_DFLT_(seq, elem_macro) \
+ BOOST_PP_TUPLE_ELEM(3, 0, CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_EXPAND_(\
+ BOOST_PP_SEQ_FOLD_RIGHT( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_DFLT_OP_, \
+ ( BOOST_PP_NIL, \
+ (0, ()), /* no last-default to start */ \
+ elem_macro ), seq)))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_NODFLT_OP_ELEM_( \
+ s, elem, list, elem_macro) \
+ ( \
+ BOOST_PP_LIST_APPEND( \
+ ( /* list of 1-tuple `elem_macro(elem)` */ \
+ elem_macro(elem) \
+ , BOOST_PP_NIL ), list) \
+ , \
+ elem_macro /* unchanged op-macro */ \
+ )
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_NODFLT_OP_( \
+ s, list_macro, elem) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_NODFLT_OP_ELEM_(s, elem, \
+ BOOST_PP_TUPLE_ELEM(2, 0, list_macro), \
+ BOOST_PP_TUPLE_ELEM(2, 1, list_macro))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_NODFLT_( \
+ seq, elem_macro) \
+ BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_SEQ_FOLD_RIGHT( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_NODFLT_OP_,\
+ ( BOOST_PP_NIL, elem_macro ), seq))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_NOTEMPTY_( \
+ seq, allow_empty, with_defaults, elem_macro) \
+ BOOST_PP_IIF(with_defaults, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_DFLT_ \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_NODFLT_ \
+ )(seq, elem_macro)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_EMPTY_( \
+ seq, allow_empty, with_defaults, elem_macro) \
+ BOOST_PP_IIF(allow_empty, \
+ BOOST_PP_NIL /* nil list */ \
+ BOOST_PP_TUPLE_EAT(2) /* no error */ \
+ , \
+ BOOST_PP_ASSERT_MSG /* error */ \
+ )(0, ERROR_unexpected_empty_token_list)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_IS_EMPTY_CHECK_HEAD_( \
+ seq) \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_VOID_FRONT(BOOST_PP_SEQ_HEAD(seq))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_IS_EMPTY_CHECK_(seq) \
+ BOOST_PP_IIF(BOOST_PP_EQUAL(BOOST_PP_SEQ_SIZE(seq), 1), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_IS_EMPTY_CHECK_HEAD_ \
+ , \
+ 0 BOOST_PP_TUPLE_EAT(1) \
+ )(seq)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_IS_EMPTY_(void_or_seq) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_VOID_FRONT(void_or_seq), \
+ 1 BOOST_PP_TUPLE_EAT(1) \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_IS_EMPTY_CHECK_ \
+ )(void_or_seq)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_( \
+ void_or_seq, allow_empty, with_defaults, elem_macro) \
+ BOOST_PP_IIF(BOOST_PP_EXPAND( /* expand for MSVC */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_IS_EMPTY_( \
+ void_or_seq)), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_EMPTY_ \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_NOTEMPTY_ \
+ )(void_or_seq, allow_empty, with_defaults, elem_macro)
+
+#ifndef BOOST_NO_VARIADIC_MACROS
+# include <contract/detail/preprocessor/variadic/to_seq.hpp>
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_SPLIT_SEQ_(...) \
+ CONTRACT_DETAIL_PP_VARIADIC_TO_SEQ(void, __VA_ARGS__) \
+ , /* split into 2-tuple `(seq_from(__VA_ARGS__), following_tokens)` */
+#else // variadics
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_SPLIT_SEQ_(seq) \
+ seq \
+ , /* split into 2-tuple `(seq_from(__VA_ARGS__), following_tokens)` */
+#endif // variadics
+
+// Expand from paren_tokens `(a, b, ...) tokens...` (variadics) or
+// `( (a) (b) ... ) tokens...` to `(a) (b) ...`.
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_GET_SEQ_(paren_tokens) \
+ BOOST_PP_TUPLE_ELEM(2, 0, \
+ ( /* split expand to 2-tuple `(seq, ignore_tokens)` */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_SPLIT_SEQ_ paren_tokens \
+ ) \
+ )
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_( \
+ tokens, allow_empty, with_defaults, remove_tag_macro, elem_macro) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_GET_SEQ_( \
+ remove_tag_macro(tokens)), \
+ allow_empty, with_defaults, elem_macro)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST(tokens, \
+ allow_empty, with_defaults, \
+ is_tagged_macro, remove_tag_macro, elem_macro) \
+ BOOST_PP_IIF(is_tagged_macro(tokens), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_ \
+ , \
+ BOOST_PP_NIL /* nil list */ \
+ BOOST_PP_TUPLE_EAT(5) \
+ )(tokens, allow_empty, with_defaults, remove_tag_macro, elem_macro)
+
+#ifndef BOOST_NO_VARIADIC_MACROS
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE(...) /*nothing*/
+#else // variadics
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE(seq) /*nothing*/
+#endif // variadics
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_TAGGED_LIST( \
+ tokens, is_tagged_macro, removing_prefix) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ is_tagged_macro, removing_prefix)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST(tokens, \
+ allow_empty, with_defaults, elem_macro) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_GET_SEQ_(tokens), \
+ allow_empty, with_defaults, elem_macro)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_LIST(tokens) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE_ERASE_( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_EXPAND_( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE tokens \
+ ))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_OPTIONAL_LIST( \
+ tokens, allow_empty, with_defaults, elem_macro) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(tokens), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST /* list present */ \
+ , \
+ BOOST_PP_NIL BOOST_PP_TUPLE_EAT(4) /* expand to nil pp-list */ \
+ )(tokens, allow_empty, with_defaults, elem_macro)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_OPTIONAL_LIST(tokens) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(tokens), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_LIST /* list present */ \
+ , \
+ tokens BOOST_PP_TUPLE_EAT(1) /* expand to tokens */ \
+ )(tokens)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/aux_/list_1.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/aux_/list_1.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,254 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_1_HPP_
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_1_HPP_
+
+// WARNING: FILE AUTOMATICALLY GENERATED, DO NOT MODIFY IT!
+// Instead modify the generation script "<FILE>-generate.py" and run
+// `$ python <FILE_NAME>-generate.py > FILE_NAME.hpp`.
+// Used maximum number of iterations: 1
+
+#include <contract/aux_/config.hpp>
+#include <contract/detail/preprocessor/punctuation/has_paren.hpp>
+#include <contract/detail/preprocessor/keyword/default.hpp>
+#include <contract/detail/preprocessor/keyword/void.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+#include <boost/preprocessor/config/config.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/list/append.hpp>
+#include <boost/preprocessor/seq/fold_right.hpp>
+#include <boost/preprocessor/debug/assert.hpp>
+#include <boost/config.hpp>
+
+// PRIVATE //
+
+#define CHECK_CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE_1 (1)
+#define ERASE_CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE_1 /* nothing */
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE_CHECK_1_(tokens) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(tokens), \
+ 0 BOOST_PP_TUPLE_EAT(2) \
+ , \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT \
+ )(tokens, CHECK_)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE_ERASE_1_(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE_CHECK_1_, ERASE_)
+
+// From PP_EXPAND (my own reentrant version).
+#if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC() && ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_EXPAND_1_(x) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_EXPAND_I_1_(x)
+#else
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_EXPAND_1_(x) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_EXPAND_OO_1_((x))
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_EXPAND_OO_1_(par) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_EXPAND_I_1_ ## par
+#endif
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_EXPAND_I_1_(x) x
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_DFLT_OP_LASTDFLT_1_( \
+ s, elem, list, last_default, elem_macro) \
+ ( \
+ list /* unchanged list */ \
+ , \
+ /* set last-default */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA(BOOST_PP_TUPLE_REM(1), \
+ CONTRACT_DETAIL_PP_KEYWORD_DEFAULT_REMOVE_FRONT(elem)) \
+ , \
+ elem_macro /* unchanged op-macro */ \
+ ) \
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_DFLT_OP_ELEM_1_( \
+ s, elem, list, last_default, elem_macro) \
+ ( \
+ /* append elem_macro(elem) (in front because FOLD_RIGHT) */ \
+ BOOST_PP_LIST_APPEND( \
+ ( /* list of... */ \
+ ( /* .. 2-tuple `(elem_macro(elem), default)` */ \
+ elem_macro(elem) \
+ , \
+ last_default \
+ ) \
+ , BOOST_PP_NIL ), list) \
+ , \
+ (0, ()) /* no last-default */ \
+ , \
+ elem_macro /* unchanged op-macro */ \
+ )
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_DFLT_OP_1_( \
+ s, list_lastdefault_macro, elem) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_DEFAULT_FRONT(elem), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_DFLT_OP_LASTDFLT_1_ \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_DFLT_OP_ELEM_1_ \
+ )(s, elem, \
+ BOOST_PP_TUPLE_ELEM(3, 0, list_lastdefault_macro), \
+ BOOST_PP_TUPLE_ELEM(3, 1, list_lastdefault_macro), \
+ BOOST_PP_TUPLE_ELEM(3, 2, list_lastdefault_macro))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_DFLT_1_(seq, elem_macro) \
+ BOOST_PP_TUPLE_ELEM(3, 0, CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_EXPAND_1_(\
+ BOOST_PP_SEQ_FOLD_RIGHT( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_DFLT_OP_1_, \
+ ( BOOST_PP_NIL, \
+ (0, ()), /* no last-default to start */ \
+ elem_macro ), seq)))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_NODFLT_OP_ELEM_1_( \
+ s, elem, list, elem_macro) \
+ ( \
+ BOOST_PP_LIST_APPEND( \
+ ( /* list of 1-tuple `elem_macro(elem)` */ \
+ elem_macro(elem) \
+ , BOOST_PP_NIL ), list) \
+ , \
+ elem_macro /* unchanged op-macro */ \
+ )
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_NODFLT_OP_1_( \
+ s, list_macro, elem) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_NODFLT_OP_ELEM_1_(s, elem, \
+ BOOST_PP_TUPLE_ELEM(2, 0, list_macro), \
+ BOOST_PP_TUPLE_ELEM(2, 1, list_macro))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_NODFLT_1_( \
+ seq, elem_macro) \
+ BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_SEQ_FOLD_RIGHT( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_NODFLT_OP_1_,\
+ ( BOOST_PP_NIL, elem_macro ), seq))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_NOTEMPTY_1_( \
+ seq, allow_empty, with_defaults, elem_macro) \
+ BOOST_PP_IIF(with_defaults, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_DFLT_1_ \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_NODFLT_1_ \
+ )(seq, elem_macro)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_EMPTY_1_( \
+ seq, allow_empty, with_defaults, elem_macro) \
+ BOOST_PP_IIF(allow_empty, \
+ BOOST_PP_NIL /* nil list */ \
+ BOOST_PP_TUPLE_EAT(2) /* no error */ \
+ , \
+ BOOST_PP_ASSERT_MSG /* error */ \
+ )(0, ERROR_unexpected_empty_token_list)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_IS_EMPTY_CHECK_HEAD_1_( \
+ seq) \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_VOID_FRONT(BOOST_PP_SEQ_HEAD(seq))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_IS_EMPTY_CHECK_1_(seq) \
+ BOOST_PP_IIF(BOOST_PP_EQUAL(BOOST_PP_SEQ_SIZE(seq), 1), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_IS_EMPTY_CHECK_HEAD_1_ \
+ , \
+ 0 BOOST_PP_TUPLE_EAT(1) \
+ )(seq)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_IS_EMPTY_1_(void_or_seq) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_VOID_FRONT(void_or_seq), \
+ 1 BOOST_PP_TUPLE_EAT(1) \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_IS_EMPTY_CHECK_1_ \
+ )(void_or_seq)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_1_( \
+ void_or_seq, allow_empty, with_defaults, elem_macro) \
+ BOOST_PP_IIF(BOOST_PP_EXPAND( /* expand for MSVC */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_IS_EMPTY_1_( \
+ void_or_seq)), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_EMPTY_1_ \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_NOTEMPTY_1_ \
+ )(void_or_seq, allow_empty, with_defaults, elem_macro)
+
+#ifndef BOOST_NO_VARIADIC_MACROS
+# include <contract/detail/preprocessor/variadic/to_seq.hpp>
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_SPLIT_SEQ_1_(...) \
+ CONTRACT_DETAIL_PP_VARIADIC_TO_SEQ(void, __VA_ARGS__) \
+ , /* split into 2-tuple `(seq_from(__VA_ARGS__), following_tokens)` */
+#else // variadics
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_SPLIT_SEQ_1_(seq) \
+ seq \
+ , /* split into 2-tuple `(seq_from(__VA_ARGS__), following_tokens)` */
+#endif // variadics
+
+// Expand from paren_tokens `(a, b, ...) tokens...` (variadics) or
+// `( (a) (b) ... ) tokens...` to `(a) (b) ...`.
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_GET_SEQ_1_(paren_tokens) \
+ BOOST_PP_TUPLE_ELEM(2, 0, \
+ ( /* split expand to 2-tuple `(seq, ignore_tokens)` */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_SPLIT_SEQ_1_ paren_tokens \
+ ) \
+ )
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_1_( \
+ tokens, allow_empty, with_defaults, remove_tag_macro, elem_macro) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_1_( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_GET_SEQ_1_( \
+ remove_tag_macro(tokens)), \
+ allow_empty, with_defaults, elem_macro)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_1(tokens, \
+ allow_empty, with_defaults, \
+ is_tagged_macro, remove_tag_macro, elem_macro) \
+ BOOST_PP_IIF(is_tagged_macro(tokens), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_1_ \
+ , \
+ BOOST_PP_NIL /* nil list */ \
+ BOOST_PP_TUPLE_EAT(5) \
+ )(tokens, allow_empty, with_defaults, remove_tag_macro, elem_macro)
+
+#ifndef BOOST_NO_VARIADIC_MACROS
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE_1(...) /*nothing*/
+#else // variadics
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE_1(seq) /*nothing*/
+#endif // variadics
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_TAGGED_LIST_1( \
+ tokens, is_tagged_macro, removing_prefix) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ is_tagged_macro, removing_prefix)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_1(tokens, \
+ allow_empty, with_defaults, elem_macro) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_FROM_SEQ_1_( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_GET_SEQ_1_(tokens), \
+ allow_empty, with_defaults, elem_macro)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_LIST_1(tokens) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE_ERASE_1_( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_EXPAND_1_( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE_1 tokens \
+ ))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_OPTIONAL_LIST_1( \
+ tokens, allow_empty, with_defaults, elem_macro) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(tokens), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST_1 /* list present */ \
+ , \
+ BOOST_PP_NIL BOOST_PP_TUPLE_EAT(4) /* expand to nil pp-list */ \
+ )(tokens, allow_empty, with_defaults, elem_macro)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_OPTIONAL_LIST_1(tokens) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(tokens), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_LIST_1 /* list present */ \
+ , \
+ tokens BOOST_PP_TUPLE_EAT(1) /* expand to tokens */ \
+ )(tokens)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/aux_/name.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/aux_/name.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,185 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_HPP_
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/type.hpp>
+#include <contract/detail/preprocessor/traits/aux_/nil.hpp>
+#include <contract/detail/preprocessor/facilities/is_digit.hpp>
+#include <contract/detail/preprocessor/keyword/contract/comma.hpp>
+#include <contract/detail/preprocessor/keyword/new.hpp>
+#include <contract/detail/preprocessor/keyword/delete.hpp>
+#include <contract/detail/preprocessor/keyword/operator.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/seq/cat.hpp>
+#include <boost/preprocessor/seq/for_each.hpp>
+
+// PRIVATE //
+
+#ifndef BOOST_NO_VARIADIC_MACROS
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_IS_COMMA_OPERATOR_SPLIT_(...) \
+ BOOST_PP_TUPLE_ELEM(CONTRACT_DETAIL_PP_VARIADIC_SIZE(__VA_ARGS__), 0, \
+ (__VA_ARGS__)) , /* split */
+#else
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_IS_COMMA_OPERATOR_SPLIT_(seq) \
+ seq , /* split */
+#endif
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_IS_COMMA_OPERATOR_2ND_(tokens) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_IS_DIGIT(BOOST_PP_TUPLE_ELEM(2, 0, \
+ BOOST_PP_EXPAND(( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_IS_COMMA_OPERATOR_SPLIT_ \
+ CONTRACT_DETAIL_PP_KEYWORD_COMMA_REMOVE_FRONT(tokens) \
+ )))), \
+ 0 /* e.g., `operator comam(1)(std::map<int, char>)` */ \
+ , \
+ 1 /* e.g., `operator comma ( ((int&) i) (int const j) )` */ \
+ )
+
+// Is comma operator `operator comma ( int i, int j )` (and not comma in macro
+// `operator comma(1)(std::map<int, char>) ( void )`).
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_IS_COMMA_OPERATOR_(tokens) \
+ BOOST_PP_EXPAND( /* EXPAND for MSVC */ \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_COMMA_FRONT(tokens), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_IS_COMMA_OPERATOR_2ND_ \
+ , \
+ 0 BOOST_PP_TUPLE_EAT(1) /* not `operator comma ...` */ \
+ )(tokens) \
+ )
+
+// Function name (not an operator): `(f) ( int i, int j)`.
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_(tokens) \
+ ( /* operator tokens (0-size array if not an operator) */ \
+ (0, ()) \
+ , /* alphanumeric name */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NAME(tokens) \
+ )
+
+// Symbolic operator: `operator(==)(equal)` and also commas in macros
+// `operator comma(1)(std::map<int, char>)(std_map)`.
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_OPERATOR_SYMBOL_(tokens) \
+ ( /* operator tokens (0-size array if not an operator) */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA(BOOST_PP_TUPLE_REM(1), tokens) \
+ , /* alphanumeric name */ \
+ BOOST_PP_SEQ_HEAD(CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_COMMA( \
+ BOOST_PP_TUPLE_REM(1), tokens)) \
+ )
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_NAME_OPERATOR_SYMBOL_OP_(tokens) \
+ /* skips after symbol and eats name `(symbol)(name)` */\
+ BOOST_PP_TUPLE_EAT(1) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_COMMA(BOOST_PP_TUPLE_REM(1), tokens) \
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_NAME_OPERATOR_SYMBOL_(tokens) \
+ BOOST_PP_EXPAND( /* extra OP and EXPAND macros needed for MSVC */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_NAME_OPERATOR_SYMBOL_OP_( \
+ tokens))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_OPERATOR_KEYWORD_SEQ_UNWRAP_( \
+ r, unused, type_bit) \
+ type_bit /* remove seq paren */
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_OPERATOR_KEYWORD_SEQ_(seq) \
+ ( /* operator tokens (0-size array if not an operator) */ \
+ (1, (BOOST_PP_SEQ_FOR_EACH( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_OPERATOR_KEYWORD_SEQ_UNWRAP_, \
+ ~, seq))) \
+ , /* alphanumeric name */ \
+ BOOST_PP_SEQ_CAT(seq) \
+ )
+
+// Keyword operator: `operator int const ( vooid )`, `operator new`.
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_OPERATOR_KEYWORD_(tokens) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_OPERATOR_KEYWORD_SEQ_( \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_NEW_FRONT(tokens), \
+ (new) BOOST_PP_TUPLE_EAT(1) \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_DELETE_FRONT(tokens), \
+ (delete) BOOST_PP_TUPLE_EAT(1) \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_COMMA_FRONT(tokens), \
+ (comma) BOOST_PP_TUPLE_EAT(1) \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_SEQ \
+ )))(tokens) \
+ )
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_NAME_OPERATOR_KEYWORD_(tokens) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_NEW_FRONT(tokens), \
+ CONTRACT_DETAIL_PP_KEYWORD_NEW_REMOVE_FRONT \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_DELETE_FRONT(tokens), \
+ CONTRACT_DETAIL_PP_KEYWORD_DELETE_REMOVE_FRONT \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_COMMA_FRONT(tokens), \
+ CONTRACT_DETAIL_PP_KEYWORD_COMMA_REMOVE_FRONT \
+ , /* operator type */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_TYPE \
+ )))(tokens)
+
+// Dispatch operator parsing.
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_OPERATOR_(tokens) \
+ /* the order of these if-statements matter */ \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_IS_COMMA_OPERATOR_( \
+ tokens), \
+ /* comma operator `operator comma ( int i, int j )` */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_OPERATOR_KEYWORD_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_COMMA_FRONT(tokens), \
+ /* comma in macors `operator comma(1)(map<int, char)(map) ( void )` */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_OPERATOR_SYMBOL_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(tokens), \
+ /* symbolic operator `operator(==)(equal)` */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_OPERATOR_SYMBOL_ \
+ , \
+ /* keyword operator `operator new`, `operator int const` */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_OPERATOR_KEYWORD_ \
+ )))(tokens)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_NAME_OPERATOR_(tokens) \
+ /* the order of these if-statements matter */ \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_IS_COMMA_OPERATOR_( \
+ tokens), \
+ /* comma operator `operator comma ( int i, int j )` */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_NAME_OPERATOR_KEYWORD_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_COMMA_FRONT(tokens), \
+ /* comma in macors `operator comma(1)(map<int, char)(map) ( void )` */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_NAME_OPERATOR_SYMBOL_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(tokens), \
+ /* symbolic operator `operator(==)(equal)` */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_NAME_OPERATOR_SYMBOL_ \
+ , \
+ /* keyword operator `operator new`, `operator int const` */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_NAME_OPERATOR_KEYWORD_ \
+ )))(tokens)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_SPLIT_(tokens) \
+ tokens , /* slits into 2-tuple `(tokens, following_tokens)` */
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_NAME(tokens) \
+ BOOST_PP_TUPLE_ELEM(2, 0, \
+ (CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_SPLIT_ tokens) )
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_NAME(tokens) \
+ BOOST_PP_TUPLE_ELEM(2, 1, \
+ (CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_SPLIT_ tokens) )
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_WITH_OPERATOR(tokens) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_OPERATOR_FRONT(tokens), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_OPERATOR_ \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_ \
+ )(CONTRACT_DETAIL_PP_KEYWORD_OPERATOR_REMOVE_FRONT(tokens))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_NAME_WITH_OPERATOR(tokens) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_OPERATOR_FRONT(tokens), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_NAME_OPERATOR_ \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_NAME \
+ )(CONTRACT_DETAIL_PP_KEYWORD_OPERATOR_REMOVE_FRONT(tokens))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/aux_/nil.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/aux_/nil.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,88 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_HPP_
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_HPP_
+
+#include <contract/detail/preprocessor/variadic/size.hpp>
+#include <contract/detail/preprocessor/variadic/eat.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/config.hpp>
+
+// PROTECTED //
+
+// Make sure NIL symbGl is not defined by users.
+#ifdef CONTRACT_DETAIL_PP_TRAITS_AUX_NIL
+# error "internal macro CONTRACT_DETAIL_PP_TRAITS_AUX_NIL must be undefined"
+#endif
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_IS_CONTRACT_DETAIL_PP_TRAITS_AUX_NIL \
+ (1) /* unary */
+#define \
+CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_CONTRACT_DETAIL_PP_TRAITS_AUX_NIL \
+ /* nothing */
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_IS_NIL_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_IS_)
+
+// Or directly PP_CAT with CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_ (faster).
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_IS_NIL_FRONT, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_)
+
+#ifndef BOOST_NO_VARIADIC_MACROS
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_IS_NIL_(...) \
+ BOOST_PP_IIF(BOOST_PP_EQUAL( \
+ CONTRACT_DETAIL_PP_VARIADIC_SIZE(__VA_ARGS__), 1), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_IS_NIL_FRONT \
+ , \
+ 0 CONTRACT_DETAIL_PP_VARIADIC_EAT \
+ )(__VA_ARGS__)
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_IS_NIL_SPLIT_(...) \
+ (__VA_ARGS__), /* comma split remaining tokens */
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_IS_NIL_PAREN_(paren_tokens) \
+ BOOST_PP_EXPAND( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_IS_NIL_ \
+ BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_EXPAND( \
+ (CONTRACT_DETAIL_PP_TRAITS_AUX_IS_NIL_SPLIT_ paren_tokens) \
+ )) \
+ )
+// Expand to 1 iff `(nil)...`.
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_IS_NIL_PAREN(...) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(__VA_ARGS__), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_IS_NIL_PAREN_ \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_IS_NIL_FRONT \
+ )(__VA_ARGS__)
+// Expand to 1 iff `nil, ...`.
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_IS_NIL(...) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_IS_NIL_FRONT( \
+ BOOST_PP_TUPLE_ELEM(CONTRACT_DETAIL_PP_VARIADIC_SIZE( \
+ __VA_ARGS__), 0 /* first variadic elem */, (__VA_ARGS__)))
+#else
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_IS_NIL_PAREN_(tokens) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_IS_NIL_FRONT(tokens)
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_IS_NIL_(paren_tokens) \
+ BOOST_PP_EXPAND( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_IS_NIL_PAREN_ paren_tokens)
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_IS_NIL_PAREN(tokens) \
+ BOOST_PP_IIF(BOOST_PP_IS_UNARY(tokens), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_IS_NIL_ \
+ , \
+ 0 BOOST_PP_TUPLE_EAT(1) \
+ )(tokens)
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_IS_NIL(tokens) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_IS_NIL_FRONT(tokens)
+#endif
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/aux_/oldof.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/aux_/oldof.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,39 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_TRAITS_AUX_OLDOF_HPP_
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_OLDOF_HPP_
+
+#include <contract/aux_/config.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/is.hpp>
+#include <contract/detail/preprocessor/keyword/facilities/remove.hpp>
+
+// PROTECTED //
+
+// Make sure OLDOF symbol is not defined by users.
+#ifdef CONTRACT_DETAIL_PP_TRAITS_OLDOF
+#error ERROR_internal_macro_CONTRACT_DETTAIL_PP_TRAITS_OLDOF_must_be_undefined
+#endif
+
+// These are not local macros -- DO NOT #UNDEF.
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_OLDOF_IS_CONTRACT_DETAIL_PP_TRAITS_OLDOF \
+ (1) /* unary */
+#define \
+CONTRACT_DETAIL_PP_TRAITS_AUX_OLDOF_REMOVE_CONTRACT_DETAIL_PP_TRAITS_OLDOF \
+ /* nothing */
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_IS_OLDOF_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_OLDOF_IS_)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_OLDOF_REMOVE_FRONT(tokens) \
+ CONTRACT_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT(tokens, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_IS_OLDOF_FRONT, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_OLDOF_REMOVE_)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/aux_/select_assertion.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/aux_/select_assertion.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,151 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_HPP_
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_HPP_
+
+#include <contract/detail/preprocessor/keyword/if.hpp>
+#include <contract/detail/preprocessor/keyword/else.hpp>
+#include <contract/detail/preprocessor/variadic/to_seq.hpp>
+#include <boost/config.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_SEQ_TO_LIST_( \
+ seq) \
+ BOOST_PP_TUPLE_TO_LIST(BOOST_PP_SEQ_SIZE(seq), BOOST_PP_SEQ_TO_TUPLE(seq))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_NIL_REMOVE_ \
+ /* must expand to nothing */
+
+#ifndef BOOST_NO_VARIADIC_MACROS
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_ELSE_(...) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_SEQ_TO_LIST_( \
+ CONTRACT_DETAIL_PP_VARIADIC_TO_SEQ( \
+ (ERROR_cannot_specify_empty_if_else_assertions), \
+ __VA_ARGS__))
+#else
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_ELSE_(seq) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_SEQ_TO_LIST_(seq)
+#endif
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_ELSE_LIST_YES_( \
+ else_tokens) \
+ BOOST_PP_CAT( \
+ BOOST_PP_EXPAND( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_ELSE_ \
+ CONTRACT_DETAIL_PP_KEYWORD_ELSE_REMOVE_FRONT(else_tokens)), \
+ REMOVE_ /* removes trailing NIL */)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_ELSE_LIST_( \
+ condition, then_assertions, else_tokens) \
+ (\
+ condition \
+ , \
+ then_assertions \
+ , \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_ELSE_FRONT(else_tokens), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_ELSE_LIST_YES_ \
+ , \
+ BOOST_PP_NIL /* empty list */ \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(else_tokens) \
+ )
+
+#ifndef BOOST_NO_VARIADIC_MACROS
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_SPLIT_THEN_(...) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_SEQ_TO_LIST_( \
+ CONTRACT_DETAIL_PP_VARIADIC_TO_SEQ( \
+ (ERROR_cannot_specify_empty_if_then_assertions), \
+ __VA_ARGS__)) \
+ , /* comma splits */
+#else
+# define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_SPLIT_THEN_(seq) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_SEQ_TO_LIST_(seq) \
+ , /* comma split */
+#endif
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_SPLIT_(cond) \
+ cond , /* comma splits */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_SPLIT_THEN_
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_PREPEND_RCURLY( \
+ d, number_instruction_requirements_traits) \
+ ( \
+ BOOST_PP_TUPLE_ELEM(4, 0, number_instruction_requirements_traits) \
+ , \
+ /* NOTE: cannot use `}` directly because instruction must be */ \
+ /* inspected for pp-keywords so it must start with alphanumeric */ \
+ CONTRACT_DETAIL_PP_RCURLY \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_APPEND(d \
+ , BOOST_PP_TUPLE_ELEM(4, 3, number_instruction_requirements_traits)\
+ , BOOST_PP_TUPLE_ELEM(4, 0, number_instruction_requirements_traits)\
+ , BOOST_PP_TUPLE_ELEM(4, 1, number_instruction_requirements_traits)\
+ , BOOST_PP_TUPLE_ELEM(4, 2, number_instruction_requirements_traits)\
+ ) \
+ )
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_PREPEND_ELSE( \
+ d, number_instruction_requirements_traits) \
+ ( \
+ BOOST_PP_TUPLE_ELEM(4, 0, number_instruction_requirements_traits) \
+ , \
+ else /* use needs to add trailing { */ \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_APPEND(d \
+ , BOOST_PP_TUPLE_ELEM(4, 3, number_instruction_requirements_traits)\
+ , BOOST_PP_TUPLE_ELEM(4, 0, number_instruction_requirements_traits)\
+ , BOOST_PP_TUPLE_ELEM(4, 1, number_instruction_requirements_traits)\
+ , BOOST_PP_TUPLE_ELEM(4, 2, number_instruction_requirements_traits)\
+ ) \
+ )
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_PREPEND_IF( \
+ d, select_condition, number_instruction_requirements_traits) \
+ ( \
+ BOOST_PP_TUPLE_ELEM(4, 0, number_instruction_requirements_traits) \
+ , \
+ if(select_condition) /* user needs to add trailing { */ \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_APPEND(d \
+ , BOOST_PP_TUPLE_ELEM(4, 3, number_instruction_requirements_traits)\
+ , BOOST_PP_TUPLE_ELEM(4, 0, number_instruction_requirements_traits)\
+ , BOOST_PP_TUPLE_ELEM(4, 1, number_instruction_requirements_traits)\
+ , BOOST_PP_TUPLE_ELEM(4, 2, number_instruction_requirements_traits)\
+ ) \
+ )
+
+// Traits of a single select assertion.
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION(assertion) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_ELSE_LIST_ \
+ BOOST_PP_EXPAND( ( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_SPLIT_ \
+ CONTRACT_DETAIL_PP_KEYWORD_IF_REMOVE_FRONT(assertion) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_NIL_ /* empty */ \
+ ) )
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_IF( \
+ traits) \
+ BOOST_PP_TUPLE_ELEM(3, 0, traits)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_THENS(traits) \
+ BOOST_PP_TUPLE_ELEM(3, 1, traits)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_ELSES(traits) \
+ BOOST_PP_TUPLE_ELEM(3, 2, traits)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/aux_/select_assertion_-generate.py
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/aux_/select_assertion_-generate.py 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,118 @@
+
+# Copyright (C) 2008-2012 Lorenzo Caminiti
+# Distributed under 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)
+# Home at http://sourceforge.net/projects/contractpp
+
+import sys
+import shutil
+
+CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS = raw_input(
+ "CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS form " +
+ "<contract/limits.hpp> [5] = ")
+if CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS == "":
+ CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS = 5
+else:
+ CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS = int(
+ CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS)
+
+# 1 and CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS included in range.
+for i in range(1, CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS + 1):
+ header = sys.argv[0].replace("-generate.py", str(i) + ".hpp", 1)
+ shutil.copyfile(header, header + ".bak")
+ h = open(header, 'w')
+
+ h.write('''
+#ifndef CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_{0}_HPP_
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_{0}_HPP_
+
+// WARNING: FILE AUTOMATICALLY GENERATED, DO NOT MODIFY IT!
+// Instead modify the generation script "<FILE>-generate.py" and run
+// `$ python <FILE_NAME>-generate.py > FILE_NAME.hpp`.
+// Used CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS: {2}
+
+#include <contract/limits.hpp>
+#if CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS != {2}
+#error "Code generation used incorrect CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS"
+#endif
+
+#include <contract/detail/preprocessor/traits/aux_/assertion.hpp>
+#include <contract/detail/preprocessor/traits/aux_/select_assertion.hpp>
+#if {1} <= {2}
+# include <contract/detail/preprocessor/traits/aux_/select_assertion_{1}.hpp>
+#endif
+#include <contract/detail/preprocessor/keyword/contract/requires.hpp>
+#include <contract/detail/preprocessor/keyword/if.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_ELEM_{0}_( \\
+ d, number_instruction_requirements_traits, assertion) \\
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_IF_FRONT(assertion), \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_{1} \\
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_IS_STATEMENT( \\
+ assertion), \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_STATEMENT \\
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_REQUIRES_FRONT(assertion), \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_REQUIRES \\
+ , /* else: bool, const, or static assert */ \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_CONDITION \\
+ )))(d, assertion \\
+ , BOOST_PP_TUPLE_ELEM(4, 0, number_instruction_requirements_traits) \\
+ , BOOST_PP_TUPLE_ELEM(4, 1, number_instruction_requirements_traits) \\
+ , BOOST_PP_TUPLE_ELEM(4, 2, number_instruction_requirements_traits) \\
+ , BOOST_PP_TUPLE_ELEM(4, 3, number_instruction_requirements_traits) \\
+ )
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_LIST_{0}_( \\
+ d, select_assertions, number_instruction_requirements_traits) \\
+ BOOST_PP_LIST_FOLD_LEFT_ ## d( \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_ELEM_{0}_, \\
+ number_instruction_requirements_traits, select_assertions)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_{0}_(d, select_traits, \\
+ prev_number, prev_instruction, prev_requirements, traits) \\
+ /* 6th, append right-curly to end else block */ \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_PREPEND_RCURLY(d \\
+ /* 5th, append else-assertions */ \\
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_LIST_{0}_(d \\
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_ELSES( \\
+ select_traits) \\
+ /* 4th, append else-statement `else` */ \\
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_PREPEND_ELSE(d \\
+ /* 3rd, append right-curly to end if block */ \\
+ ,CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_PREPEND_RCURLY(\\
+ d \\
+ /* 2nd, append then-assertions */ \\
+ ,CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_LIST_{0}_(\\
+ d \\
+ ,CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_THENS(\\
+ select_traits) \\
+ /* 1st, append if-statement `if(...)` */ \\
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_PREPEND_IF(d \\
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_IF(select_traits) \\
+ , (prev_number, prev_instruction, prev_requirements, traits) \\
+ ) \\
+ ) \\
+ ) \\
+ ) \\
+ ) \\
+ )
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_{0}(d, assertion, \\
+ prev_number, prev_instruction, prev_requirements, traits)\\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_APPEND_TUPLE(d, \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_{0}_(d, \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION(assertion),\\
+ prev_number, prev_instruction, prev_requirements, traits))
+
+#endif // #include guard
+
+'''.format(str(i), str(i + 1), str(CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS)))
+
+ h.close()
+ print "Written:", header
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/aux_/select_assertion_1.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/aux_/select_assertion_1.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,94 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_1_HPP_
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_1_HPP_
+
+// WARNING: FILE AUTOMATICALLY GENERATED, DO NOT MODIFY IT!
+// Instead modify the generation script "<FILE>-generate.py" and run
+// `$ python <FILE_NAME>-generate.py > FILE_NAME.hpp`.
+// Used CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS: 5
+
+#include <contract/limits.hpp>
+#if CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS != 5
+#error "Code generation used incorrect CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS"
+#endif
+
+#include <contract/detail/preprocessor/traits/aux_/assertion.hpp>
+#include <contract/detail/preprocessor/traits/aux_/select_assertion.hpp>
+#if 2 <= 5
+# include <contract/detail/preprocessor/traits/aux_/select_assertion_2.hpp>
+#endif
+#include <contract/detail/preprocessor/keyword/contract/requires.hpp>
+#include <contract/detail/preprocessor/keyword/if.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_ELEM_1_( \
+ d, number_instruction_requirements_traits, assertion) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_IF_FRONT(assertion), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_2 \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_IS_STATEMENT( \
+ assertion), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_STATEMENT \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_REQUIRES_FRONT(assertion), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_REQUIRES \
+ , /* else: bool, const, or static assert */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_CONDITION \
+ )))(d, assertion \
+ , BOOST_PP_TUPLE_ELEM(4, 0, number_instruction_requirements_traits) \
+ , BOOST_PP_TUPLE_ELEM(4, 1, number_instruction_requirements_traits) \
+ , BOOST_PP_TUPLE_ELEM(4, 2, number_instruction_requirements_traits) \
+ , BOOST_PP_TUPLE_ELEM(4, 3, number_instruction_requirements_traits) \
+ )
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_LIST_1_( \
+ d, select_assertions, number_instruction_requirements_traits) \
+ BOOST_PP_LIST_FOLD_LEFT_ ## d( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_ELEM_1_, \
+ number_instruction_requirements_traits, select_assertions)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_1_(d, select_traits, \
+ prev_number, prev_instruction, prev_requirements, traits) \
+ /* 6th, append right-curly to end else block */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_PREPEND_RCURLY(d \
+ /* 5th, append else-assertions */ \
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_LIST_1_(d \
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_ELSES( \
+ select_traits) \
+ /* 4th, append else-statement `else` */ \
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_PREPEND_ELSE(d \
+ /* 3rd, append right-curly to end if block */ \
+ ,CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_PREPEND_RCURLY(\
+ d \
+ /* 2nd, append then-assertions */ \
+ ,CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_LIST_1_(\
+ d \
+ ,CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_THENS(\
+ select_traits) \
+ /* 1st, append if-statement `if(...)` */ \
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_PREPEND_IF(d \
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_IF(select_traits) \
+ , (prev_number, prev_instruction, prev_requirements, traits) \
+ ) \
+ ) \
+ ) \
+ ) \
+ ) \
+ )
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_1(d, assertion, \
+ prev_number, prev_instruction, prev_requirements, traits)\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_APPEND_TUPLE(d, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_1_(d, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION(assertion),\
+ prev_number, prev_instruction, prev_requirements, traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/aux_/select_assertion_2.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/aux_/select_assertion_2.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,94 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_2_HPP_
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_2_HPP_
+
+// WARNING: FILE AUTOMATICALLY GENERATED, DO NOT MODIFY IT!
+// Instead modify the generation script "<FILE>-generate.py" and run
+// `$ python <FILE_NAME>-generate.py > FILE_NAME.hpp`.
+// Used CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS: 5
+
+#include <contract/limits.hpp>
+#if CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS != 5
+#error "Code generation used incorrect CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS"
+#endif
+
+#include <contract/detail/preprocessor/traits/aux_/assertion.hpp>
+#include <contract/detail/preprocessor/traits/aux_/select_assertion.hpp>
+#if 3 <= 5
+# include <contract/detail/preprocessor/traits/aux_/select_assertion_3.hpp>
+#endif
+#include <contract/detail/preprocessor/keyword/contract/requires.hpp>
+#include <contract/detail/preprocessor/keyword/if.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_ELEM_2_( \
+ d, number_instruction_requirements_traits, assertion) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_IF_FRONT(assertion), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_3 \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_IS_STATEMENT( \
+ assertion), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_STATEMENT \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_REQUIRES_FRONT(assertion), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_REQUIRES \
+ , /* else: bool, const, or static assert */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_CONDITION \
+ )))(d, assertion \
+ , BOOST_PP_TUPLE_ELEM(4, 0, number_instruction_requirements_traits) \
+ , BOOST_PP_TUPLE_ELEM(4, 1, number_instruction_requirements_traits) \
+ , BOOST_PP_TUPLE_ELEM(4, 2, number_instruction_requirements_traits) \
+ , BOOST_PP_TUPLE_ELEM(4, 3, number_instruction_requirements_traits) \
+ )
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_LIST_2_( \
+ d, select_assertions, number_instruction_requirements_traits) \
+ BOOST_PP_LIST_FOLD_LEFT_ ## d( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_ELEM_2_, \
+ number_instruction_requirements_traits, select_assertions)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_2_(d, select_traits, \
+ prev_number, prev_instruction, prev_requirements, traits) \
+ /* 6th, append right-curly to end else block */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_PREPEND_RCURLY(d \
+ /* 5th, append else-assertions */ \
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_LIST_2_(d \
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_ELSES( \
+ select_traits) \
+ /* 4th, append else-statement `else` */ \
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_PREPEND_ELSE(d \
+ /* 3rd, append right-curly to end if block */ \
+ ,CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_PREPEND_RCURLY(\
+ d \
+ /* 2nd, append then-assertions */ \
+ ,CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_LIST_2_(\
+ d \
+ ,CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_THENS(\
+ select_traits) \
+ /* 1st, append if-statement `if(...)` */ \
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_PREPEND_IF(d \
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_IF(select_traits) \
+ , (prev_number, prev_instruction, prev_requirements, traits) \
+ ) \
+ ) \
+ ) \
+ ) \
+ ) \
+ )
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_2(d, assertion, \
+ prev_number, prev_instruction, prev_requirements, traits)\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_APPEND_TUPLE(d, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_2_(d, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION(assertion),\
+ prev_number, prev_instruction, prev_requirements, traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/aux_/select_assertion_3.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/aux_/select_assertion_3.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,94 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_3_HPP_
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_3_HPP_
+
+// WARNING: FILE AUTOMATICALLY GENERATED, DO NOT MODIFY IT!
+// Instead modify the generation script "<FILE>-generate.py" and run
+// `$ python <FILE_NAME>-generate.py > FILE_NAME.hpp`.
+// Used CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS: 5
+
+#include <contract/limits.hpp>
+#if CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS != 5
+#error "Code generation used incorrect CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS"
+#endif
+
+#include <contract/detail/preprocessor/traits/aux_/assertion.hpp>
+#include <contract/detail/preprocessor/traits/aux_/select_assertion.hpp>
+#if 4 <= 5
+# include <contract/detail/preprocessor/traits/aux_/select_assertion_4.hpp>
+#endif
+#include <contract/detail/preprocessor/keyword/contract/requires.hpp>
+#include <contract/detail/preprocessor/keyword/if.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_ELEM_3_( \
+ d, number_instruction_requirements_traits, assertion) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_IF_FRONT(assertion), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_4 \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_IS_STATEMENT( \
+ assertion), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_STATEMENT \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_REQUIRES_FRONT(assertion), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_REQUIRES \
+ , /* else: bool, const, or static assert */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_CONDITION \
+ )))(d, assertion \
+ , BOOST_PP_TUPLE_ELEM(4, 0, number_instruction_requirements_traits) \
+ , BOOST_PP_TUPLE_ELEM(4, 1, number_instruction_requirements_traits) \
+ , BOOST_PP_TUPLE_ELEM(4, 2, number_instruction_requirements_traits) \
+ , BOOST_PP_TUPLE_ELEM(4, 3, number_instruction_requirements_traits) \
+ )
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_LIST_3_( \
+ d, select_assertions, number_instruction_requirements_traits) \
+ BOOST_PP_LIST_FOLD_LEFT_ ## d( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_ELEM_3_, \
+ number_instruction_requirements_traits, select_assertions)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_3_(d, select_traits, \
+ prev_number, prev_instruction, prev_requirements, traits) \
+ /* 6th, append right-curly to end else block */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_PREPEND_RCURLY(d \
+ /* 5th, append else-assertions */ \
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_LIST_3_(d \
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_ELSES( \
+ select_traits) \
+ /* 4th, append else-statement `else` */ \
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_PREPEND_ELSE(d \
+ /* 3rd, append right-curly to end if block */ \
+ ,CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_PREPEND_RCURLY(\
+ d \
+ /* 2nd, append then-assertions */ \
+ ,CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_LIST_3_(\
+ d \
+ ,CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_THENS(\
+ select_traits) \
+ /* 1st, append if-statement `if(...)` */ \
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_PREPEND_IF(d \
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_IF(select_traits) \
+ , (prev_number, prev_instruction, prev_requirements, traits) \
+ ) \
+ ) \
+ ) \
+ ) \
+ ) \
+ )
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_3(d, assertion, \
+ prev_number, prev_instruction, prev_requirements, traits)\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_APPEND_TUPLE(d, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_3_(d, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION(assertion),\
+ prev_number, prev_instruction, prev_requirements, traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/aux_/select_assertion_4.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/aux_/select_assertion_4.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,94 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_4_HPP_
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_4_HPP_
+
+// WARNING: FILE AUTOMATICALLY GENERATED, DO NOT MODIFY IT!
+// Instead modify the generation script "<FILE>-generate.py" and run
+// `$ python <FILE_NAME>-generate.py > FILE_NAME.hpp`.
+// Used CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS: 5
+
+#include <contract/limits.hpp>
+#if CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS != 5
+#error "Code generation used incorrect CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS"
+#endif
+
+#include <contract/detail/preprocessor/traits/aux_/assertion.hpp>
+#include <contract/detail/preprocessor/traits/aux_/select_assertion.hpp>
+#if 5 <= 5
+# include <contract/detail/preprocessor/traits/aux_/select_assertion_5.hpp>
+#endif
+#include <contract/detail/preprocessor/keyword/contract/requires.hpp>
+#include <contract/detail/preprocessor/keyword/if.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_ELEM_4_( \
+ d, number_instruction_requirements_traits, assertion) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_IF_FRONT(assertion), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_5 \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_IS_STATEMENT( \
+ assertion), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_STATEMENT \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_REQUIRES_FRONT(assertion), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_REQUIRES \
+ , /* else: bool, const, or static assert */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_CONDITION \
+ )))(d, assertion \
+ , BOOST_PP_TUPLE_ELEM(4, 0, number_instruction_requirements_traits) \
+ , BOOST_PP_TUPLE_ELEM(4, 1, number_instruction_requirements_traits) \
+ , BOOST_PP_TUPLE_ELEM(4, 2, number_instruction_requirements_traits) \
+ , BOOST_PP_TUPLE_ELEM(4, 3, number_instruction_requirements_traits) \
+ )
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_LIST_4_( \
+ d, select_assertions, number_instruction_requirements_traits) \
+ BOOST_PP_LIST_FOLD_LEFT_ ## d( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_ELEM_4_, \
+ number_instruction_requirements_traits, select_assertions)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_4_(d, select_traits, \
+ prev_number, prev_instruction, prev_requirements, traits) \
+ /* 6th, append right-curly to end else block */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_PREPEND_RCURLY(d \
+ /* 5th, append else-assertions */ \
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_LIST_4_(d \
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_ELSES( \
+ select_traits) \
+ /* 4th, append else-statement `else` */ \
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_PREPEND_ELSE(d \
+ /* 3rd, append right-curly to end if block */ \
+ ,CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_PREPEND_RCURLY(\
+ d \
+ /* 2nd, append then-assertions */ \
+ ,CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_LIST_4_(\
+ d \
+ ,CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_THENS(\
+ select_traits) \
+ /* 1st, append if-statement `if(...)` */ \
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_PREPEND_IF(d \
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_IF(select_traits) \
+ , (prev_number, prev_instruction, prev_requirements, traits) \
+ ) \
+ ) \
+ ) \
+ ) \
+ ) \
+ )
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_4(d, assertion, \
+ prev_number, prev_instruction, prev_requirements, traits)\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_APPEND_TUPLE(d, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_4_(d, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION(assertion),\
+ prev_number, prev_instruction, prev_requirements, traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/aux_/select_assertion_5.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/aux_/select_assertion_5.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,94 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_5_HPP_
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_5_HPP_
+
+// WARNING: FILE AUTOMATICALLY GENERATED, DO NOT MODIFY IT!
+// Instead modify the generation script "<FILE>-generate.py" and run
+// `$ python <FILE_NAME>-generate.py > FILE_NAME.hpp`.
+// Used CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS: 5
+
+#include <contract/limits.hpp>
+#if CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS != 5
+#error "Code generation used incorrect CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS"
+#endif
+
+#include <contract/detail/preprocessor/traits/aux_/assertion.hpp>
+#include <contract/detail/preprocessor/traits/aux_/select_assertion.hpp>
+#if 6 <= 5
+# include <contract/detail/preprocessor/traits/aux_/select_assertion_6.hpp>
+#endif
+#include <contract/detail/preprocessor/keyword/contract/requires.hpp>
+#include <contract/detail/preprocessor/keyword/if.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_ELEM_5_( \
+ d, number_instruction_requirements_traits, assertion) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_IF_FRONT(assertion), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_6 \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_IS_STATEMENT( \
+ assertion), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_STATEMENT \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_REQUIRES_FRONT(assertion), \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_REQUIRES \
+ , /* else: bool, const, or static assert */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_CONDITION \
+ )))(d, assertion \
+ , BOOST_PP_TUPLE_ELEM(4, 0, number_instruction_requirements_traits) \
+ , BOOST_PP_TUPLE_ELEM(4, 1, number_instruction_requirements_traits) \
+ , BOOST_PP_TUPLE_ELEM(4, 2, number_instruction_requirements_traits) \
+ , BOOST_PP_TUPLE_ELEM(4, 3, number_instruction_requirements_traits) \
+ )
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_LIST_5_( \
+ d, select_assertions, number_instruction_requirements_traits) \
+ BOOST_PP_LIST_FOLD_LEFT_ ## d( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_ELEM_5_, \
+ number_instruction_requirements_traits, select_assertions)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_5_(d, select_traits, \
+ prev_number, prev_instruction, prev_requirements, traits) \
+ /* 6th, append right-curly to end else block */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_PREPEND_RCURLY(d \
+ /* 5th, append else-assertions */ \
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_LIST_5_(d \
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_ELSES( \
+ select_traits) \
+ /* 4th, append else-statement `else` */ \
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_PREPEND_ELSE(d \
+ /* 3rd, append right-curly to end if block */ \
+ ,CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_PREPEND_RCURLY(\
+ d \
+ /* 2nd, append then-assertions */ \
+ ,CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_LIST_5_(\
+ d \
+ ,CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_THENS(\
+ select_traits) \
+ /* 1st, append if-statement `if(...)` */ \
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_PREPEND_IF(d \
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_IF(select_traits) \
+ , (prev_number, prev_instruction, prev_requirements, traits) \
+ ) \
+ ) \
+ ) \
+ ) \
+ ) \
+ )
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_5(d, assertion, \
+ prev_number, prev_instruction, prev_requirements, traits)\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_ASSERTION_APPEND_TUPLE(d, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION_5_(d, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_SELECT_ASSERTION(assertion),\
+ prev_number, prev_instruction, prev_requirements, traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/aux_/type.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/aux_/type.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,230 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_HPP_
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/comma.hpp>
+#include <contract/detail/preprocessor/punctuation/has_paren.hpp>
+#include <contract/detail/preprocessor/keyword/void.hpp>
+#include <contract/detail/preprocessor/keyword/bool.hpp>
+#include <contract/detail/preprocessor/keyword/char.hpp>
+#include <contract/detail/preprocessor/keyword/double.hpp>
+#include <contract/detail/preprocessor/keyword/float.hpp>
+#include <contract/detail/preprocessor/keyword/int.hpp>
+#include <contract/detail/preprocessor/keyword/wchar_t.hpp>
+#include <contract/detail/preprocessor/keyword/cstddef/size_t.hpp>
+#include <contract/detail/preprocessor/keyword/cstddef/ptrdiff_t.hpp>
+#include <contract/detail/preprocessor/keyword/const.hpp>
+#include <contract/detail/preprocessor/keyword/volatile.hpp>
+#include <contract/detail/preprocessor/keyword/long.hpp>
+#include <contract/detail/preprocessor/keyword/short.hpp>
+#include <contract/detail/preprocessor/keyword/signed.hpp>
+#include <contract/detail/preprocessor/keyword/unsigned.hpp>
+#include <contract/detail/preprocessor/keyword/int.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/control/while.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/facilities/expand.hpp>
+#include <boost/preprocessor/seq/for_each.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_NEXT_(type_tokens, \
+ type_elem, next_macro) \
+ ( \
+ BOOST_PP_TUPLE_ELEM(2, 0, type_tokens) (type_elem) /* make a seq */ \
+ , \
+ next_macro(BOOST_PP_TUPLE_ELEM(2, 1, type_tokens)) \
+ )
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_SKIP_(type_tokens, \
+ unused0, unused1) \
+ type_tokens
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_APPLY3_(macro, \
+ arg0, arg1, arg2) \
+ macro(arg0, arg1, arg2)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_IS_(is_macro, tokens) \
+ /* allows any paren (), (a), (a, b), etc to be within tokens (variadics) */\
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(tokens), \
+ 0 BOOST_PP_TUPLE_EAT(1) \
+ , \
+ is_macro \
+ )(tokens)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_FUNDAMENTAL_TYPE_( \
+ type_tokens) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_APPLY3_ \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_IS_( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_VOID_FRONT, \
+ BOOST_PP_TUPLE_ELEM(2, 1, type_tokens)), \
+ (CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_NEXT_, type_tokens, \
+ void, CONTRACT_DETAIL_PP_KEYWORD_VOID_REMOVE_FRONT) \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_IS_( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_BOOL_FRONT, \
+ BOOST_PP_TUPLE_ELEM(2, 1, type_tokens)), \
+ (CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_NEXT_, type_tokens, \
+ bool, CONTRACT_DETAIL_PP_KEYWORD_BOOL_REMOVE_FRONT) \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_IS_( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CHAR_FRONT, \
+ BOOST_PP_TUPLE_ELEM(2, 1, type_tokens)), \
+ (CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_NEXT_, type_tokens, \
+ char, CONTRACT_DETAIL_PP_KEYWORD_CHAR_REMOVE_FRONT) \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_IS_( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_DOUBLE_FRONT, \
+ BOOST_PP_TUPLE_ELEM(2, 1, type_tokens)), \
+ (CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_NEXT_, type_tokens, \
+ double, CONTRACT_DETAIL_PP_KEYWORD_DOUBLE_REMOVE_FRONT) \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_IS_( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_FLOAT_FRONT, \
+ BOOST_PP_TUPLE_ELEM(2, 1, type_tokens)), \
+ (CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_NEXT_, type_tokens, \
+ float, CONTRACT_DETAIL_PP_KEYWORD_FLOAT_REMOVE_FRONT) \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_IS_( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_INT_FRONT, \
+ BOOST_PP_TUPLE_ELEM(2, 1, type_tokens)), \
+ (CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_NEXT_, type_tokens, \
+ int, CONTRACT_DETAIL_PP_KEYWORD_INT_REMOVE_FRONT) \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_IS_( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_WCHAR_T_FRONT, \
+ BOOST_PP_TUPLE_ELEM(2, 1, type_tokens)), \
+ (CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_NEXT_, type_tokens, \
+ wchar_t, CONTRACT_DETAIL_PP_KEYWORD_WCHAR_T_REMOVE_FRONT) \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_IS_( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_SIZE_T_FRONT, \
+ BOOST_PP_TUPLE_ELEM(2, 1, type_tokens)), \
+ (CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_NEXT_, type_tokens, \
+ size_t, CONTRACT_DETAIL_PP_KEYWORD_SIZE_T_REMOVE_FRONT) \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_IS_( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PTRDIFF_T_FRONT, \
+ BOOST_PP_TUPLE_ELEM(2, 1, type_tokens)), \
+ (CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_NEXT_, type_tokens, \
+ ptrdiff_t, CONTRACT_DETAIL_PP_KEYWORD_PTRDIFF_T_REMOVE_FRONT) \
+ , \
+ (CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_SKIP_, type_tokens, ~, ~) \
+ )))))))))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_QUALIFIER_OP_( \
+ d, type_tokens) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_APPLY3_ \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_IS_( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CONST_FRONT, \
+ BOOST_PP_TUPLE_ELEM(2, 1, type_tokens)), \
+ (CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_NEXT_, type_tokens, \
+ const, CONTRACT_DETAIL_PP_KEYWORD_CONST_REMOVE_FRONT) \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_IS_( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_VOLATILE_FRONT, \
+ BOOST_PP_TUPLE_ELEM(2, 1, type_tokens)), \
+ (CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_NEXT_, type_tokens, \
+ volatile, CONTRACT_DETAIL_PP_KEYWORD_VOLATILE_REMOVE_FRONT) \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_IS_( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_LONG_FRONT, \
+ BOOST_PP_TUPLE_ELEM(2, 1, type_tokens)), \
+ (CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_NEXT_, type_tokens, \
+ long, CONTRACT_DETAIL_PP_KEYWORD_LONG_REMOVE_FRONT) \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_IS_( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_SHORT_FRONT, \
+ BOOST_PP_TUPLE_ELEM(2, 1, type_tokens)), \
+ (CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_NEXT_, type_tokens, \
+ short, CONTRACT_DETAIL_PP_KEYWORD_SHORT_REMOVE_FRONT) \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_IS_( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_SIGNED_FRONT, \
+ BOOST_PP_TUPLE_ELEM(2, 1, type_tokens)), \
+ (CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_NEXT_, type_tokens, \
+ signed, CONTRACT_DETAIL_PP_KEYWORD_SIGNED_REMOVE_FRONT) \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_IS_( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_UNSIGNED_FRONT, \
+ BOOST_PP_TUPLE_ELEM(2, 1, type_tokens)), \
+ (CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_NEXT_, type_tokens, \
+ unsigned, CONTRACT_DETAIL_PP_KEYWORD_UNSIGNED_REMOVE_FRONT) \
+ , \
+ (CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_SKIP_, type_tokens, ~, ~) \
+ ))))))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_QUALIFIER_PRED_( \
+ d, type_tokens) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_IS_( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CONST_FRONT, \
+ BOOST_PP_TUPLE_ELEM(2, 1, type_tokens)), \
+ 1 \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_IS_( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_VOLATILE_FRONT, \
+ BOOST_PP_TUPLE_ELEM(2, 1, type_tokens)), \
+ 1 \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_IS_( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_LONG_FRONT, \
+ BOOST_PP_TUPLE_ELEM(2, 1, type_tokens)), \
+ 1 \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_IS_( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_SHORT_FRONT, \
+ BOOST_PP_TUPLE_ELEM(2, 1, type_tokens)), \
+ 1 \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_IS_( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_SIGNED_FRONT, \
+ BOOST_PP_TUPLE_ELEM(2, 1, type_tokens)), \
+ 1 \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_IS_( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_UNSIGNED_FRONT, \
+ BOOST_PP_TUPLE_ELEM(2, 1, type_tokens)), \
+ 1 \
+ , \
+ 0 \
+ ))))))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_QUALIFIER_(type_tokens) \
+ BOOST_PP_WHILE(CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_QUALIFIER_PRED_, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_QUALIFIER_OP_, \
+ type_tokens)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_(tokens, after01) \
+ BOOST_PP_TUPLE_ELEM(2, after01, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_QUALIFIER_( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_FUNDAMENTAL_TYPE_( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_QUALIFIER_( \
+ (BOOST_PP_EMPTY(), tokens) \
+ ))))
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_SEQ_UNWRAP_(r, unused, type_bit) \
+ type_bit /* remove seq paren */
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_(tokens) \
+ BOOST_PP_SEQ_FOR_EACH(CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_SEQ_UNWRAP_, ~, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_SEQ(tokens))
+
+// Expand `(type) ...` or `keyword_type ...` to their remaining tokens `...`.
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_TYPE_(tokens) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_( \
+ tokens, 1 /* after, not current */)
+
+// PROTECTED //
+
+// Expand `(type) ...` to `type` (any set of tokens in `type` also `void`) or
+// `keyword_type ...` to `keyword_type` (no extra parenthesis) where:
+// qualifiers_:
+// [const] [volatile] [long] [short] [signed] [unsigned]
+// fundamental_type_:
+// void | bool | char | double | float | int | wchar_t | size_t | ptrdiff_t
+// keyword_type_:
+// qualifiers_ fundamental_type_ qualifiers_
+// (Note that both `(void)` and `void` are also allowed.)
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_SEQ(tokens) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_KEYWORD_( \
+ tokens, 0 /* current, not after */)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE(tokens) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE_, tokens)
+
+#define CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_TYPE(tokens) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_COMMA( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_TYPE_, tokens)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/base.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/base.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,34 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_BASE_TRAITS_HPP_
+#define CONTRACT_DETAIL_PP_BASE_TRAITS_HPP_
+
+#include <contract/detail/preprocessor/traits/base/virtual.hpp>
+#include <contract/detail/preprocessor/traits/base/access.hpp>
+#include <contract/detail/preprocessor/traits/base/type.hpp>
+#include <contract/detail/preprocessor/traits/base/type.hpp>
+#include <contract/detail/preprocessor/traits/aux_/nil.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+
+// PUBLIC //
+
+#define CONTRACT_DETAIL_PP_BASE_TRAITS(base_sign) \
+ BOOST_PP_TUPLE_ELEM(2, 0, /* get traits from `(traits, sign)` */ \
+ CONTRACT_DETAIL_PP_BASE_TRAITS_AUX_TYPE( \
+ CONTRACT_DETAIL_PP_BASE_TRAITS_AUX_VIRTUAL( \
+ CONTRACT_DETAIL_PP_BASE_TRAITS_AUX_ACCESS( \
+ ( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* no traits to start with */ \
+ , \
+ base_sign \
+ /* no trailing NIL because always type at end */ \
+ ) \
+ ))))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/base/access.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/base/access.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,53 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_BASE_TRAITS_ACCESS_HPP_
+#define CONTRACT_DETAIL_PP_BASE_TRAITS_ACCESS_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply_1.hpp>
+#include <contract/detail/preprocessor/traits/aux_/keyword.hpp>
+#include <contract/detail/preprocessor/traits/aux_/nil.hpp>
+#include <contract/detail/preprocessor/keyword/public.hpp>
+#include <contract/detail/preprocessor/keyword/protected.hpp>
+#include <contract/detail/preprocessor/keyword/private.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_BASE_TRAITS_ACCESS_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_KEYWORD3(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PUBLIC_FRONT, public, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PROTECTED_FRONT, protected, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PRIVATE_FRONT, private)
+
+#define CONTRACT_DETAIL_PP_BASE_TRAITS_ACCESS_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_KEYWORD3(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PUBLIC_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_PUBLIC_REMOVE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PROTECTED_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_PROTECTED_REMOVE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PRIVATE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_PRIVATE_REMOVE_FRONT)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_BASE_TRAITS_AUX_ACCESS(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY_INIT_1(traits_sign, \
+ CONTRACT_DETAIL_PP_BASE_TRAITS_ACCESS_TRAIT_, \
+ CONTRACT_DETAIL_PP_BASE_TRAITS_ACCESS_SIGN_)
+
+// PUBLIC //
+
+// Expand to `[public | protected | private]`.
+#define CONTRACT_DETAIL_PP_BASE_TRAITS_ACCESS(base_traits) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_, \
+ BOOST_PP_ARRAY_ELEM(0, base_traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/base/type.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/base/type.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,34 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_BASE_TRAITS_TYPE_HPP_
+#define CONTRACT_DETAIL_PP_BASE_TRAITS_TYPE_HPP_
+
+#include <boost/preprocessor/tuple/rem.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_BASE_TRAITS_AUX_TYPE_(sign) \
+ /* PP_REM because only type left in sign */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA(BOOST_PP_TUPLE_REM(1), sign)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_BASE_TRAITS_AUX_TYPE(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY_1(traits_sign, \
+ CONTRACT_DETAIL_PP_BASE_TRAITS_AUX_TYPE_, \
+ BOOST_PP_TUPLE_REM(1)) /* nothing left in sign */
+
+// PUBLIC //
+
+// Expand to `(n, (base_token0, ...))` (array for unwrapped commas).
+#define CONTRACT_DETAIL_PP_BASE_TRAITS_TYPE(base_traits) \
+ BOOST_PP_ARRAY_ELEM(2, base_traits)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/base/virtual.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/base/virtual.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,44 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_BASE_TRAITS_VIRTUAL_HPP_
+#define CONTRACT_DETAIL_PP_BASE_TRAITS_VIRTUAL_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply_1.hpp>
+#include <contract/detail/preprocessor/traits/aux_/keyword.hpp>
+#include <contract/detail/preprocessor/traits/aux_/nil.hpp>
+#include <contract/detail/preprocessor/keyword/virtual.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_BASE_TRAITS_VIRTUAL_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* optional trait */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_VIRTUAL_FRONT, virtual) \
+
+#define CONTRACT_DETAIL_PP_BASE_TRAITS_VIRTUAL_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_VIRTUAL_REMOVE_FRONT)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_BASE_TRAITS_AUX_VIRTUAL(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY_1(traits_sign, \
+ CONTRACT_DETAIL_PP_BASE_TRAITS_VIRTUAL_TRAIT_, \
+ CONTRACT_DETAIL_PP_BASE_TRAITS_VIRTUAL_SIGN_)
+
+// PUBLIC //
+
+// Expand to `[virtual]`.
+#define CONTRACT_DETAIL_PP_BASE_TRAITS_VIRTUAL(base_traits) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_, \
+ BOOST_PP_ARRAY_ELEM(1, base_traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/body.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/body.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,54 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_BODY_TRAITS_HPP_
+#define CONTRACT_DETAIL_PP_BODY_TRAITS_HPP_
+
+// PRIVATE //
+
+// Precondition: name_sign starts with alphanumeric token (i.e., not `~dtor`).
+#define CONTRACT_DETAIL_PP_BODY_TRAITS_MAYBE_OPERATOR_(body_name_sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_OPERATOR_FRONT(body_name_sign),\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_WITH_OPERATOR \
+ , \
+ ( (0, ()) , body_name_sign ) BOOST_PP_TUPLE_EAT(1) \
+ )( \
+ body_name_sign \
+ /* NIL padding for func params and expected last NIL */ \
+ (CONTRACT_DETAIL_PP_TRAITS_AUX_NIL) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL \
+ )
+
+// PUBLIC //
+
+// body_name_sign: ctor | ~dtor | f | operator ... (usual operator sign).
+#define CONTRACT_DETAIL_PP_BODY_TRAITS( \
+ is_constructor01, is_destructor01, body_name_sign) \
+ BOOST_PP_IIF(BOOST_PP_BITOR(is_constructor01, is_destructor01), \
+ ( (0, ()) , body_name_sign ) BOOST_PP_TUPLE_EAT(1) \
+ , \
+ CONTRACT_DETAIL_PP_BODY_TRAITS_MAYBE_OPERATOR_ \
+ )(body_name_sign)
+
+// Expand to `(n, (token1, ...))` (array to handle commas within operator
+// symbol token, 0-size if not an operator).
+#define CONTRACT_DETAIL_PP_BODY_TRAITS_OPERATOR(body_name_traits) \
+ BOOST_PP_TUPLE_ELEM(2, 0, body_name_traits)
+
+// Expand to alphanumeric function, constructor, operator name or to
+// (non-alphanumeric) `~name` for destructor.
+#define CONTRACT_DETAIL_PP_BODY_TRAITS_NAME(body_name_traits) \
+ BOOST_PP_TUPLE_ELEM(2, 1, body_name_traits)
+
+// Input is not a trait but the class_type signature (possibly with extra
+// parenthesis to wrap commas). Expand to `(n, (token1, ...))` (array to handle
+// commas within class type for class templates, etc).
+#define CONTRACT_DETAIL_PP_BODY_TRAITS_CLASS_TYPE(class_type_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA(BOOST_PP_TUPLE_REM(1), class_type_sign)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/class.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/class.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,48 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_CLASS_TRAITS_HPP_
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_HPP_
+
+#include <contract/detail/preprocessor/traits/class/access.hpp>
+#include <contract/detail/preprocessor/traits/class/export.hpp>
+#include <contract/detail/preprocessor/traits/class/template.hpp>
+#include <contract/detail/preprocessor/traits/class/concepts.hpp>
+#include <contract/detail/preprocessor/traits/class/kind.hpp>
+#include <contract/detail/preprocessor/traits/class/friend.hpp>
+#include <contract/detail/preprocessor/traits/class/name.hpp>
+#include <contract/detail/preprocessor/traits/class/specializations.hpp>
+#include <contract/detail/preprocessor/traits/class/final.hpp>
+#include <contract/detail/preprocessor/traits/class/bases.hpp>
+#include <contract/detail/preprocessor/traits/aux_/nil.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+
+// PUBLIC //
+
+// Expand to class traits (inspect using `CLASS_TRAITS`).
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS(class_signature) \
+ BOOST_PP_TUPLE_ELEM(2, 0, /* get traits from `(traits, sign)` */ \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_AUX_BASES( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_AUX_FINAL( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_AUX_SPECIALIZATIONS( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_AUX_NAME( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_AUX_KIND( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_AUX_FRIEND( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_AUX_CONCEPTS( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_AUX_TEMPLATE( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_AUX_EXPORT( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_AUX_ACCESS( \
+ ( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* no traits to start with */ \
+ , \
+ class_signature \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* terminates and for empty */ \
+ ) \
+ )))))))))))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/class/access.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/class/access.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,53 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_CLASS_TRAITS_ACCESS_HPP_
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_ACCESS_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/keyword.hpp>
+#include <contract/detail/preprocessor/traits/aux_/nil.hpp>
+#include <contract/detail/preprocessor/keyword/public.hpp>
+#include <contract/detail/preprocessor/keyword/protected.hpp>
+#include <contract/detail/preprocessor/keyword/private.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_ACCESS_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* optional trait */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_KEYWORD3(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PUBLIC_FRONT, public, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PROTECTED_FRONT, protected, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PRIVATE_FRONT, private)
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_ACCESS_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_KEYWORD3(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PUBLIC_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_PUBLIC_REMOVE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PROTECTED_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_PROTECTED_REMOVE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PRIVATE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_PRIVATE_REMOVE_FRONT)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_AUX_ACCESS(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY_INIT(traits_sign, \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_ACCESS_TRAIT_, \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_ACCESS_SIGN_)
+
+// PUBLIC //
+
+// Expand to `[public | protected | private]`.
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_ACCESS(class_traits) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_, \
+ BOOST_PP_ARRAY_ELEM(0, class_traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/class/bases.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/class/bases.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,49 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_CLASS_TRAITS_BASES_HPP_
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_BASES_HPP_
+
+#include <contract/detail/preprocessor/traits/base.hpp>
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/list.hpp>
+#include <contract/detail/preprocessor/keyword/contract/extends.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_BASES_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST(sign, \
+ 0, /* might not be empty */ \
+ 0, /* might not have defaults */ \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_EXTENDS_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_EXTENDS_REMOVE_FRONT, \
+ CONTRACT_DETAIL_PP_BASE_TRAITS)
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_BASES_REMOVE_extends \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_BASES_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_TAGGED_LIST(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_EXTENDS_FRONT, \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_BASES_REMOVE_)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_AUX_BASES(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_BASES_TRAIT_, \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_BASES_SIGN_)
+
+// PUBLIC //
+
+// Expand to pp-list of base classes (see `BASE_CLASS_TRAITS` macros).
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_BASES(class_traits) \
+ BOOST_PP_ARRAY_ELEM(9, class_traits)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/class/concepts.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/class/concepts.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,53 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_CLASS_TRAITS_CONCEPTS_HPP_
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_CONCEPTS_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/list.hpp>
+#include <contract/detail/preprocessor/keyword/contract/requires.hpp>
+#include <boost/preprocessor/tuple/rem.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_CONCEPTS_TRAIT_COMMA_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA(BOOST_PP_TUPLE_REM(1), sign)
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_CONCEPTS_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST(sign, \
+ 0, /* might not be empty */ \
+ 0, /* might not have defaults */ \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_REQUIRES_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_REQUIRES_REMOVE_FRONT, \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_CONCEPTS_TRAIT_COMMA_)
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_CONCEPTS_REMOVE_requires \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_CONCEPTS_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_TAGGED_LIST(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_REQUIRES_FRONT, \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_CONCEPTS_REMOVE_)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_AUX_CONCEPTS(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_CONCEPTS_TRAIT_, \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_CONCEPTS_SIGN_)
+
+// PUBLIC //
+
+// Expand to pp-list of concept types `(n, (concept_token0, ...))` (array for
+// unwrapped commas).
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_CONCEPTS(class_traits) \
+ BOOST_PP_ARRAY_ELEM(3, class_traits)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/class/export.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/class/export.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,44 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_CLASS_TRAITS_EXPORT_HPP_
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_EXPORT_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/keyword.hpp>
+#include <contract/detail/preprocessor/traits/aux_/nil.hpp>
+#include <contract/detail/preprocessor/keyword/export.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_EXPORT_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* optional trait */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_EXPORT_FRONT, export)
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_EXPORT_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_EXPORT_REMOVE_FRONT)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_AUX_EXPORT(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_EXPORT_TRAIT_, \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_EXPORT_SIGN_)
+
+// PUBLIC //
+
+// Expand to `[export]`.
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_EXPORT(class_traits) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_, \
+ BOOST_PP_ARRAY_ELEM(1, class_traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/class/final.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/class/final.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,44 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_CLASS_TRAITS_FINAL_HPP_
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_FINAL_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/keyword.hpp>
+#include <contract/detail/preprocessor/traits/aux_/nil.hpp>
+#include <contract/detail/preprocessor/keyword/cxx11/final.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_FINAL_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* optional trait */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_FINAL_FRONT, final)
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_FINAL_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_FINAL_REMOVE_FRONT)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_AUX_FINAL(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_FINAL_TRAIT_, \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_FINAL_SIGN_)
+
+// PUBLIC //
+
+// Expand to `[final]`.
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_FINAL(class_traits) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_, \
+ BOOST_PP_ARRAY_ELEM(8, class_traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/class/friend.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/class/friend.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,43 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_CLASS_TRAITS_FRIEND_HPP_
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_FRIEND_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/keyword.hpp>
+#include <contract/detail/preprocessor/keyword/friend.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_FRIEND_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* optional trait */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_FRIEND_FRONT, friend)
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_FRIEND_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_FRIEND_REMOVE_FRONT)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_AUX_FRIEND(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_FRIEND_TRAIT_, \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_FRIEND_SIGN_)
+
+// PUBLIC //
+
+// Expand to `[friend]`.
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_FRIEND(func_traits) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_, \
+ BOOST_PP_ARRAY_ELEM(4, func_traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/class/kind.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/class/kind.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,45 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_CLASS_TRAITS_KIND_HPP_
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_KIND_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/keyword.hpp>
+#include <contract/detail/preprocessor/keyword/class.hpp>
+#include <contract/detail/preprocessor/keyword/struct.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_KIND_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_KEYWORD2(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CLASS_FRONT, class, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_STRUCT_FRONT, struct)
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_KIND_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_KEYWORD2(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CLASS_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_CLASS_REMOVE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_STRUCT_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_STRUCT_REMOVE_FRONT)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_AUX_KIND(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_KIND_TRAIT_, \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_KIND_SIGN_)
+
+// PUBLIC //
+
+// Expand to `class | struct`.
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_KIND(class_traits) \
+ BOOST_PP_ARRAY_ELEM(5, class_traits)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/class/name.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/class/name.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,29 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_CLASS_TRAITS_NAME_HPP_
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_NAME_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/name.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_AUX_NAME(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NAME, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_NAME)
+
+// PUBLIC //
+
+// Expand to `class_name`.
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_NAME(class_traits) \
+ BOOST_PP_ARRAY_ELEM(6, class_traits)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/class/specializations.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/class/specializations.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,42 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_CLASS_TRAITS_SPECIALIZATIONS_HPP_
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_SPECIALIZATIONS_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/list.hpp>
+#include <boost/preprocessor/tuple/rem.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+// For reentrancy on GCC with C++0x.
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_SPECIALIZATIONS_REM_(tokens) tokens
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_SPECIALIZATIONS_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_OPTIONAL_LIST(sign, \
+ 0, /* might not be empty (when present) */ \
+ 0, /* might not have defaults */ \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_SPECIALIZATIONS_REM_)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_AUX_SPECIALIZATIONS(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_SPECIALIZATIONS_TRAIT_, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_OPTIONAL_LIST)
+
+// PUBLIC //
+
+// Expand to pp-list of template specialization types (empty iff the class is
+// not a template specialization).
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_SPECIALIZATIONS(class_traits) \
+ BOOST_PP_ARRAY_ELEM(7, class_traits)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/class/template.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/class/template.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,74 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_HPP_
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_HPP_
+
+#include <contract/detail/preprocessor/traits/params.hpp>
+#include <contract/detail/preprocessor/traits/template_param.hpp>
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/list.hpp>
+#include <contract/detail/preprocessor/keyword/template.hpp>
+#include <boost/preprocessor/tuple/rem.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_TRAIT_(sign) \
+ ( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TEMPLATE_FRONT(sign) \
+ , \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAMS_TRAITS(sign) \
+ )
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_REMOVE_template \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_TAGGED_LIST(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TEMPLATE_FRONT, \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_INDEX_ 2
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_AUX_TEMPLATE(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_TRAIT_, \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_SIGN_)
+
+// PUBLIC //
+
+// Expand to 1 iff it is a template (even if no params `template<>`).
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_IS_TEMPLATE(class_traits) \
+ BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_ARRAY_ELEM( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_INDEX_, class_traits))
+
+// Expand to tparams traits (see `TEMPLATE_PARAM_TRAITS` macros).
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_PARAMS(class_traits) \
+ BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_ARRAY_ELEM( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_INDEX_, \
+ class_traits))
+
+#define CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_REPLACE( \
+ class_traits, template_sign) \
+ /* can't use ARRAY_REPLACE here because it has reentrancy _D */ \
+ ( BOOST_PP_ARRAY_SIZE(class_traits), \
+ ( \
+ CONTRACT_DETAIL_PP_ARRAY_REM(CONTRACT_DETAIL_PP_ARRAY_FIRST_N( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_INDEX_, \
+ class_traits)) \
+ , CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_TRAIT_(template_sign) \
+ , CONTRACT_DETAIL_PP_ARRAY_REM(CONTRACT_DETAIL_PP_ARRAY_REST_N( \
+ BOOST_PP_INC( \
+ CONTRACT_DETAIL_PP_CLASS_TRAITS_TEMPLATE_INDEX_), \
+ class_traits)) \
+ ) )
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/class_invariant.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/class_invariant.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,205 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_HPP_
+#define CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_HPP_
+
+#include <contract/detail/preprocessor/keyword/void.hpp>
+#include <contract/detail/preprocessor/keyword/class.hpp>
+#include <contract/detail/preprocessor/keyword/volatile.hpp>
+#include <contract/detail/preprocessor/keyword/static.hpp>
+#include <contract/detail/preprocessor/seq/to_list.hpp>
+#include <contract/detail/preprocessor/variadic/to_seq.hpp>
+#include <boost/config.hpp>
+
+// PRIVATE //
+
+#ifndef BOOST_NO_VARIADIC_MACROS
+# define CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_TO_SEQ_(...) \
+ CONTRACT_DETAIL_PP_VARIADIC_TO_SEQ((void), __VA_ARGS__ )
+#else
+# define CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_TO_SEQ_(seq) seq
+#endif
+
+#define CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_LIST_( \
+ remove_macro, assertion) \
+ CONTRACT_DETAIL_PP_SEQ_TO_LIST(CONTRACT_DETAIL_PP_KEYWORD_IS_VOID_FRONT, \
+ /* cat TO_SEQ_ with class(...) and invoke macro above */ \
+ BOOST_PP_EXPAND( \
+ CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_TO_SEQ_ \
+ CONTRACT_DETAIL_PP_KEYWORD_CLASS_REMOVE_FRONT( \
+ remove_macro(assertion)) \
+ ) \
+ )
+
+#define CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_STATIC_(s, \
+ has_const01, const_invs, has_constvolatile01, constvolatile_invs, \
+ has_static01, static_invs, assertion) \
+ ( \
+ has_const01 \
+ , \
+ const_invs \
+ , \
+ has_constvolatile01 \
+ , \
+ constvolatile_invs \
+ , \
+ 1 /* static class inv specified (still it could be empty) */ \
+ , \
+ BOOST_PP_LIST_APPEND(static_invs, \
+ CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_LIST_( \
+ CONTRACT_DETAIL_PP_KEYWORD_STATIC_REMOVE_FRONT, \
+ assertion)) \
+ )
+
+#define CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_CONST_VOLATILE_(s, \
+ has_const01, const_invs, has_constvolatile01, constvolatile_invs, \
+ has_static01, static_invs, assertion) \
+ ( \
+ has_const01 \
+ , \
+ const_invs \
+ , \
+ 1 /* const volatile class inv specified (still it could be empty) */ \
+ , \
+ BOOST_PP_LIST_APPEND(constvolatile_invs, \
+ CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_LIST_( \
+ CONTRACT_DETAIL_PP_KEYWORD_VOLATILE_REMOVE_FRONT, \
+ assertion)) \
+ , \
+ has_static01 \
+ , \
+ static_invs \
+ )
+
+#define CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_CONST_(s, \
+ has_const01, const_invs, has_constvolatile01, constvolatile_invs, \
+ has_static01, static_invs, assertion) \
+ ( \
+ 1 /* const class inv specified (still it could be empty) */ \
+ , \
+ BOOST_PP_LIST_APPEND(const_invs, (assertion, BOOST_PP_NIL)) \
+ , \
+ has_constvolatile01 \
+ , \
+ constvolatile_invs \
+ , \
+ has_static01 \
+ , \
+ static_invs \
+ )
+
+#define CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_IS_( \
+ is_macro, remove_macro, tokens) \
+ BOOST_PP_BITAND( \
+ BOOST_PP_EXPAND(is_macro(tokens)) /* EXPAND for MSVC */ \
+ , CONTRACT_DETAIL_PP_KEYWORD_IS_CLASS_FRONT(remove_macro(tokens)) \
+ )
+
+#define CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_( \
+ s, const01inv_constvolatile01inv_static01inv, assertion) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_IS_( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_VOLATILE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_VOLATILE_REMOVE_FRONT, assertion), \
+ CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_CONST_VOLATILE_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_IS_( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_STATIC_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_STATIC_REMOVE_FRONT, assertion), \
+ CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_STATIC_ \
+ , \
+ CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_CONST_ \
+ ))(s \
+ , BOOST_PP_TUPLE_ELEM(6, 0, const01inv_constvolatile01inv_static01inv) \
+ , BOOST_PP_TUPLE_ELEM(6, 1, const01inv_constvolatile01inv_static01inv) \
+ , BOOST_PP_TUPLE_ELEM(6, 2, const01inv_constvolatile01inv_static01inv) \
+ , BOOST_PP_TUPLE_ELEM(6, 3, const01inv_constvolatile01inv_static01inv) \
+ , BOOST_PP_TUPLE_ELEM(6, 4, const01inv_constvolatile01inv_static01inv) \
+ , BOOST_PP_TUPLE_ELEM(6, 5, const01inv_constvolatile01inv_static01inv) \
+ , assertion \
+ )
+
+#define CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_ASSERTIONS_( \
+ const01inv_constvolatile01inv_static01inv) \
+ ( \
+ BOOST_PP_TUPLE_ELEM(6, 0, const01inv_constvolatile01inv_static01inv) \
+ , \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS(BOOST_PP_TUPLE_ELEM(6, 1, \
+ const01inv_constvolatile01inv_static01inv)) \
+ , \
+ BOOST_PP_TUPLE_ELEM(6, 2, const01inv_constvolatile01inv_static01inv) \
+ , \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS(BOOST_PP_TUPLE_ELEM(6, 3, \
+ const01inv_constvolatile01inv_static01inv)) \
+ , \
+ BOOST_PP_TUPLE_ELEM(6, 4, const01inv_constvolatile01inv_static01inv) \
+ , \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS(BOOST_PP_TUPLE_ELEM(6, 5, \
+ const01inv_constvolatile01inv_static01inv)) \
+ )
+
+#define CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_EMPTY_(seq) \
+ ( \
+ 0 /* const class inv not specified */ \
+ , \
+ BOOST_PP_NIL /* const class inv list */ \
+ , \
+ 0 /* const volatile class inv not specified */ \
+ , \
+ BOOST_PP_NIL /* const volatile class inv list */ \
+ , \
+ 0 /* static class inv not specified */ \
+ , \
+ BOOST_PP_NIL /* static class inv list */ \
+ )
+
+#define CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_NOT_EMPTY_(seq) \
+ CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_ASSERTIONS_( \
+ BOOST_PP_SEQ_FOLD_LEFT( \
+ CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_, \
+ /* start empty */ \
+ CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_EMPTY_(seq), \
+ seq))
+
+// Precondition: size(seq) == 1
+#define CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_MAYBE_EMPTY_(seq) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_VOID_FRONT(BOOST_PP_SEQ_HEAD( \
+ seq)), \
+ CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_EMPTY_ \
+ , \
+ CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_NOT_EMPTY_ \
+ )(seq)
+
+// PUBLIC //
+
+#define CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS(seq) \
+ BOOST_PP_IIF(BOOST_PP_EQUAL(BOOST_PP_SEQ_SIZE(seq), 1), \
+ CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_MAYBE_EMPTY_ \
+ , \
+ CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_NOT_EMPTY_ \
+ )(seq)
+
+#define CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_HAS_CONST(traits) \
+ BOOST_PP_TUPLE_ELEM(6, 0, traits)
+
+#define CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_CONST(traits) \
+ BOOST_PP_TUPLE_ELEM(6, 1, traits)
+
+// If volatile class(...) specified at all.
+#define CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_HAS_CONST_VOLATILE(traits) \
+ BOOST_PP_TUPLE_ELEM(6, 2, traits)
+
+#define CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_CONST_VOLATILE(traits) \
+ BOOST_PP_TUPLE_ELEM(6, 3, traits)
+
+#define CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_HAS_STATIC(traits) \
+ BOOST_PP_TUPLE_ELEM(6, 4, traits)
+
+#define CONTRACT_DETAIL_PP_CLASS_INVARIANT_TRAITS_STATIC(traits) \
+ BOOST_PP_TUPLE_ELEM(6, 5, traits)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/const_expr.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/const_expr.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,91 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_CONST_EXPR_TRAITS_HPP_
+#define CONTRACT_DETAIL_PP_CONST_EXPR_TRAITS_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/type.hpp>
+#include <contract/detail/preprocessor/keyword/void.hpp>
+#include <contract/detail/preprocessor/keyword/const.hpp>
+#include <contract/detail/preprocessor/variadic/to_seq.hpp>
+#include <boost/config.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_CONST_EXPR_TRAITS_VAR_(d, vars, var) \
+ BOOST_PP_LIST_APPEND(vars, \
+ ( \
+ ( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* could be empty */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE(var) \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_TYPE(var) \
+ ) \
+ , \
+ BOOST_PP_NIL \
+ ) \
+ )
+
+// Precondition: size(seq) == 1
+#define CONTRACT_DETAIL_PP_CONST_EXPR_TRAITS_VARS_SEQ_IS_EMPTY_HEAD_(vars_seq) \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_VOID_FRONT(BOOST_PP_BOOST_PP_SEQ_HEAD(seq))
+
+#define CONTRACT_DETAIL_PP_CONST_EXPR_TRAITS_VARS_SEQ_IS_EMPTY_(vars_seq) \
+ BOOST_PP_IIF(BOOST_PP_EQUAL(1, BOOST_PP_SEQ_SIZE(vars_seq)), \
+ CONTRACT_DETAIL_PP_CONST_EXPR_TRAITS_VARS_SEQ_IS_EMPTY_HEAD_ \
+ , \
+ 0 BOOST_PP_TUPLE_EAT(1) \
+ )(vars_seq)
+
+#define CONTRACT_DETAIL_PP_CONST_EXPR_TRAITS_VARS_FROM_SEQ_(vars_seq) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_CONST_EXPR_TRAITS_VARS_SEQ_IS_EMPTY_( \
+ vars_seq), \
+ BOOST_PP_NIL /* empty list */ BOOST_PP_TUPLE_EAT(3) \
+ , \
+ BOOST_PP_SEQ_FOLD_LEFT \
+ )(CONTRACT_DETAIL_PP_CONST_EXPR_TRAITS_VAR_, BOOST_PP_NIL, vars_seq)
+
+#ifndef BOOST_NO_VARIADIC_MACROS
+# define CONTRACT_DETAIL_PP_CONST_EXPR_TRAITS_SPLIT_(...) \
+ CONTRACT_DETAIL_PP_VARIADIC_TO_SEQ(void, __VA_ARGS__) \
+ , /* comma to split */
+#else
+# define CONTRACT_DETAIL_PP_CONST_EXPR_TRAITS_SPLIT_(seq) \
+ seq, /* comma to split */
+#endif
+
+#define CONTRACT_DETAIL_PP_CONST_EXPR_TRAITS_(varseq_instruction) \
+ ( /* const expr traits is 2-tuple `(vars, instruction)` */ \
+ CONTRACT_DETAIL_PP_CONST_EXPR_TRAITS_VARS_FROM_SEQ_( \
+ BOOST_PP_TUPLE_ELEM(2, 0, varseq_instruction)) \
+ , \
+ BOOST_PP_TUPLE_ELEM(2, 1, varseq_instruction) \
+ )
+
+// PUBLIC //
+
+#define CONTRACT_DETAIL_PP_CONST_EXPR_TRAITS(const_expr) \
+ CONTRACT_DETAIL_PP_CONST_EXPR_TRAITS_(BOOST_PP_EXPAND( ( \
+ CONTRACT_DETAIL_PP_CONST_EXPR_TRAITS_SPLIT_ \
+ CONTRACT_DETAIL_PP_KEYWORD_CONST_REMOVE_FRONT(const_expr) \
+ ) ))
+
+#define CONTRACT_DETAIL_PP_CONST_EXPR_TRAITS_EXPR(traits) \
+ BOOST_PP_TUPLE_ELEM(2, 1, traits)
+
+#define CONTRACT_DETAIL_PP_CONST_EXPR_TRAITS_VARS(traits) \
+ BOOST_PP_TUPLE_ELEM(2, 0, traits)
+
+#define CONTRACT_DETAIL_PP_CONST_EXPR_VAR_TRAITS_TYPE(var_traits) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_, \
+ BOOST_PP_TUPLE_ELEM(2, 0, var_traits))
+
+#define CONTRACT_DETAIL_PP_CONST_EXPR_VAR_TRAITS_NAME(var_traits) \
+ BOOST_PP_TUPLE_ELEM(2, 1, var_traits)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,75 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_TRAITS_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_HPP_
+
+#include <contract/detail/preprocessor/traits/func/access.hpp>
+#include <contract/detail/preprocessor/traits/func/export.hpp>
+#include <contract/detail/preprocessor/traits/func/template.hpp>
+#include <contract/detail/preprocessor/traits/func/concepts.hpp>
+#include <contract/detail/preprocessor/traits/func/explicit.hpp>
+#include <contract/detail/preprocessor/traits/func/inline.hpp>
+#include <contract/detail/preprocessor/traits/func/extern.hpp>
+#include <contract/detail/preprocessor/traits/func/static.hpp>
+#include <contract/detail/preprocessor/traits/func/virtual.hpp>
+#include <contract/detail/preprocessor/traits/func/friend.hpp>
+#include <contract/detail/preprocessor/traits/func/result_type.hpp>
+#include <contract/detail/preprocessor/traits/func/name.hpp>
+#include <contract/detail/preprocessor/traits/func/params.hpp>
+#include <contract/detail/preprocessor/traits/func/param_concepts.hpp>
+#include <contract/detail/preprocessor/traits/func/const.hpp>
+#include <contract/detail/preprocessor/traits/func/volatile.hpp>
+#include <contract/detail/preprocessor/traits/func/override.hpp>
+#include <contract/detail/preprocessor/traits/func/new.hpp>
+#include <contract/detail/preprocessor/traits/func/final.hpp>
+#include <contract/detail/preprocessor/traits/func/exceptions.hpp>
+#include <contract/detail/preprocessor/traits/func/preconditions.hpp>
+#include <contract/detail/preprocessor/traits/func/postconditions.hpp>
+#include <contract/detail/preprocessor/traits/func/initializers.hpp>
+#include <contract/detail/preprocessor/traits/func/catches.hpp>
+#include <contract/detail/preprocessor/traits/aux_/nil.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+
+// PUBLIC //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS(function_signature) \
+ BOOST_PP_TUPLE_ELEM(2, 0, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_CATCHES( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_INITIALIZERS( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_POSTCONDITIONS( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_PRECONDITIONS( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_EXCEPTIONS( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_FINAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_NEW( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_OVERRIDE( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_VOLATILE( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_CONST( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_PARAM_CONCEPTS( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_PARAMS( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_NAME( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_RESULT_TYPE( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_FRIEND( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_VIRTUAL( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_STATIC( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_EXTERN( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_INLINE( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_EXPLICIT( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_CONCEPTS( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_TEMPLATE( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_EXPORT( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_ACCESS( \
+ ( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* no traits to start wtih */ \
+ , \
+ function_signature \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* terminates and for empty */ \
+ ) \
+ )))))))))))))))))))))))))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func/access.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func/access.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,53 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_TRAITS_ACCESS_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_ACCESS_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/keyword.hpp>
+#include <contract/detail/preprocessor/traits/aux_/nil.hpp>
+#include <contract/detail/preprocessor/keyword/public.hpp>
+#include <contract/detail/preprocessor/keyword/protected.hpp>
+#include <contract/detail/preprocessor/keyword/private.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_ACCESS_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* optional trait */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_KEYWORD3(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PUBLIC_FRONT, public, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PROTECTED_FRONT, protected, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PRIVATE_FRONT, private)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_ACCESS_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_KEYWORD3(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PUBLIC_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_PUBLIC_REMOVE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PROTECTED_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_PROTECTED_REMOVE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PRIVATE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_PRIVATE_REMOVE_FRONT)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_ACCESS(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY_INIT(traits_sign, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_ACCESS_TRAIT_, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_ACCESS_SIGN_)
+
+// PUBLIC //
+
+// Expand to `[public | protected | private]`.
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_ACCESS(func_traits) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_, \
+ BOOST_PP_ARRAY_ELEM(0, func_traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func/catches-generate.py
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func/catches-generate.py 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,139 @@
+
+# Copyright (C) 2008-2012 Lorenzo Caminiti
+# Distributed under 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)
+# Home at http://sourceforge.net/projects/contractpp
+
+import sys
+import shutil
+
+def data(max):
+ s = ''
+ for i in range(0, max):
+ i = max - i - 1 # Reverse iteration order.
+ if i == 0: p = ""
+ else: p = "_" + str(i)
+ if i == max - 1:
+ next_sign_macro = "ERROR_support_maximum_of_" + str(max) + \
+ "_catch_statements"
+ else:
+ next_sign_macro = \
+ "CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_" + \
+ str(i + 1) + "_"
+ s = s + '''
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_NEXT{0}_(seq_sign) \\
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_CATCH_FRONT( \\
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \\
+ {1} \\
+ , \\
+ seq_sign BOOST_PP_TUPLE_EAT(2) \\
+ )(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN{0}_(seq, sign) \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_NEXT{0}_( ( \\
+ seq BOOST_PP_CAT( \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_EXCEPTION_DECL_, sign) \\
+ ) ) \
+'''.format(p, next_sign_macro)
+ return s
+
+CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES = raw_input(
+ "CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES" +
+ " from <contract/limits.hpp> [10] = ")
+if CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES == "":
+ CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES = 10
+else:
+ CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES = int(
+ CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES)
+
+header = sys.argv[0].replace("-generate.py", ".hpp", 1)
+shutil.copyfile(header, header + ".bak")
+h = open(header, 'w')
+
+h.write('''
+#ifndef CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_HPP_
+
+// WARNING: FILE AUTOMATICALLY GENERATED, DO NOT MODIFY IT!
+// Instead modify the generation script "<FILE>-generate.py" and run
+// `$ python <FILE_NAME>-generate.py > FILE_NAME.hpp`.
+// Used: #define CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES {0}
+
+#include <contract/limits.hpp>
+#if CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES != {0}
+#error "Code generation used incorrect CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES"
+#endif
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/keyword/catch.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_STATEMENTS_(statements) \\
+ /* beginning of seq elem of 3-tuple from DECL_catch here */ \\
+ statements)), /* this comma splits */
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_EXCEPTION_DECL_catch( \\
+ exception_decl) \\
+ ((exception_decl, CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_STATEMENTS_ \\
+ /* end of seq elem of 3-tuple from STATEMENTS_ here */
+{1}
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_LIST_(sign) \\
+ CONTRACT_DETAIL_PP_SEQ_TO_LIST_NEVER_EMPTY(BOOST_PP_TUPLE_ELEM(2, 0, \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_( \\
+ BOOST_PP_EMPTY(), sign)))
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_(sign) \\
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_CATCH_FRONT(sign), \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_LIST_ \\
+ , \\
+ BOOST_PP_NIL BOOST_PP_TUPLE_EAT(1) /* empty catch list */ \\
+ )(sign)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_REMOVE_(sign) \\
+ BOOST_PP_TUPLE_ELEM(2, 1, \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_( \\
+ BOOST_PP_EMPTY(), sign))
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_SIGN_(sign) \\
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_CATCH_FRONT(sign), \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_REMOVE_ \\
+ , \\
+ sign BOOST_PP_TUPLE_EAT(1) \\
+ )(sign)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_CATCHES(traits_sign) \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_, \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_SIGN_)
+
+// PUBLIC //
+
+// Expand to pp-list of catch traits `(exception_decl, statements)`.
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES(func_traits) \\
+ BOOST_PP_ARRAY_ELEM(23, func_traits)
+
+// Expand to either `exception_type exception_var` or `...`.
+#define CONTRACT_DETAIL_PP_CATCH_TRAITS_EXCEPTION_DECL(catch_traits) \\
+ BOOST_PP_TUPLE_ELEM(2, 0, catch_traits)
+
+// Expand to `instruction; instruction; ...` (all instructions optional).
+#define CONTRACT_DETAIL_PP_CATCH_TRAITS_STATEMENTS(catch_traits) \\
+ BOOST_PP_TUPLE_ELEM(2, 1, catch_traits)
+
+#endif // #include guard
+
+'''.format(CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES,
+ data(CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES)))
+
+h.close()
+print "Written:", header
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func/catches.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func/catches.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,207 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_HPP_
+
+// WARNING: FILE AUTOMATICALLY GENERATED, DO NOT MODIFY IT!
+// Instead modify the generation script "<FILE>-generate.py" and run
+// `$ python <FILE_NAME>-generate.py > FILE_NAME.hpp`.
+// Used: #define CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES 10
+
+#include <contract/limits.hpp>
+#if CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES != 10
+#error "Code generation used incorrect CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES"
+#endif
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/keyword/catch.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_STATEMENTS_(statements) \
+ /* beginning of seq elem of 3-tuple from DECL_catch here */ \
+ statements)), /* this comma splits */
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_EXCEPTION_DECL_catch( \
+ exception_decl) \
+ ((exception_decl, CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_STATEMENTS_ \
+ /* end of seq elem of 3-tuple from STATEMENTS_ here */
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_NEXT_9_(seq_sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_CATCH_FRONT( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ ERROR_support_maximum_of_10_catch_statements \
+ , \
+ seq_sign BOOST_PP_TUPLE_EAT(2) \
+ )(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_9_(seq, sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_NEXT_9_( ( \
+ seq BOOST_PP_CAT( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_EXCEPTION_DECL_, sign) \
+ ) )
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_NEXT_8_(seq_sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_CATCH_FRONT( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_9_ \
+ , \
+ seq_sign BOOST_PP_TUPLE_EAT(2) \
+ )(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_8_(seq, sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_NEXT_8_( ( \
+ seq BOOST_PP_CAT( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_EXCEPTION_DECL_, sign) \
+ ) )
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_NEXT_7_(seq_sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_CATCH_FRONT( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_8_ \
+ , \
+ seq_sign BOOST_PP_TUPLE_EAT(2) \
+ )(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_7_(seq, sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_NEXT_7_( ( \
+ seq BOOST_PP_CAT( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_EXCEPTION_DECL_, sign) \
+ ) )
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_NEXT_6_(seq_sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_CATCH_FRONT( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_7_ \
+ , \
+ seq_sign BOOST_PP_TUPLE_EAT(2) \
+ )(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_6_(seq, sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_NEXT_6_( ( \
+ seq BOOST_PP_CAT( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_EXCEPTION_DECL_, sign) \
+ ) )
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_NEXT_5_(seq_sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_CATCH_FRONT( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_6_ \
+ , \
+ seq_sign BOOST_PP_TUPLE_EAT(2) \
+ )(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_5_(seq, sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_NEXT_5_( ( \
+ seq BOOST_PP_CAT( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_EXCEPTION_DECL_, sign) \
+ ) )
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_NEXT_4_(seq_sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_CATCH_FRONT( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_5_ \
+ , \
+ seq_sign BOOST_PP_TUPLE_EAT(2) \
+ )(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_4_(seq, sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_NEXT_4_( ( \
+ seq BOOST_PP_CAT( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_EXCEPTION_DECL_, sign) \
+ ) )
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_NEXT_3_(seq_sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_CATCH_FRONT( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_4_ \
+ , \
+ seq_sign BOOST_PP_TUPLE_EAT(2) \
+ )(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_3_(seq, sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_NEXT_3_( ( \
+ seq BOOST_PP_CAT( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_EXCEPTION_DECL_, sign) \
+ ) )
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_NEXT_2_(seq_sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_CATCH_FRONT( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_3_ \
+ , \
+ seq_sign BOOST_PP_TUPLE_EAT(2) \
+ )(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_2_(seq, sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_NEXT_2_( ( \
+ seq BOOST_PP_CAT( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_EXCEPTION_DECL_, sign) \
+ ) )
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_NEXT_1_(seq_sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_CATCH_FRONT( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_2_ \
+ , \
+ seq_sign BOOST_PP_TUPLE_EAT(2) \
+ )(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_1_(seq, sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_NEXT_1_( ( \
+ seq BOOST_PP_CAT( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_EXCEPTION_DECL_, sign) \
+ ) )
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_NEXT_(seq_sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_CATCH_FRONT( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_1_ \
+ , \
+ seq_sign BOOST_PP_TUPLE_EAT(2) \
+ )(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_(seq, sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_NEXT_( ( \
+ seq BOOST_PP_CAT( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_EXCEPTION_DECL_, sign) \
+ ) )
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_LIST_(sign) \
+ CONTRACT_DETAIL_PP_SEQ_TO_LIST_NEVER_EMPTY(BOOST_PP_TUPLE_ELEM(2, 0, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_( \
+ BOOST_PP_EMPTY(), sign)))
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_(sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_CATCH_FRONT(sign), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_LIST_ \
+ , \
+ BOOST_PP_NIL BOOST_PP_TUPLE_EAT(1) /* empty catch list */ \
+ )(sign)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_REMOVE_(sign) \
+ BOOST_PP_TUPLE_ELEM(2, 1, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_SIGN_( \
+ BOOST_PP_EMPTY(), sign))
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_SIGN_(sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_CATCH_FRONT(sign), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_REMOVE_ \
+ , \
+ sign BOOST_PP_TUPLE_EAT(1) \
+ )(sign)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_CATCHES(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_TRAIT_, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES_SIGN_)
+
+// PUBLIC //
+
+// Expand to pp-list of catch traits `(exception_decl, statements)`.
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CATCHES(func_traits) \
+ BOOST_PP_ARRAY_ELEM(23, func_traits)
+
+// Expand to either `exception_type exception_var` or `...`.
+#define CONTRACT_DETAIL_PP_CATCH_TRAITS_EXCEPTION_DECL(catch_traits) \
+ BOOST_PP_TUPLE_ELEM(2, 0, catch_traits)
+
+// Expand to `instruction; instruction; ...` (all instructions optional).
+#define CONTRACT_DETAIL_PP_CATCH_TRAITS_STATEMENTS(catch_traits) \
+ BOOST_PP_TUPLE_ELEM(2, 1, catch_traits)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func/concepts.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func/concepts.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,69 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_TRAITS_CONCEPTS_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CONCEPTS_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/list.hpp>
+#include <contract/detail/preprocessor/keyword/contract/requires.hpp>
+#include <boost/preprocessor/tuple/rem.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CONCEPTS_TRAIT_COMMA_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA(BOOST_PP_TUPLE_REM(1), sign)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CONCEPTS_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST(sign, \
+ 0, /* might not be empty */ \
+ 0, /* might not have defaults */ \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_REQUIRES_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_REQUIRES_REMOVE_FRONT, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CONCEPTS_TRAIT_COMMA_)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CONCEPTS_REMOVE_requires \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CONCEPTS_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_TAGGED_LIST(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_REQUIRES_FRONT, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CONCEPTS_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CONCEPTS_INDEX_ 3
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_CONCEPTS(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CONCEPTS_TRAIT_, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CONCEPTS_SIGN_)
+
+// PUBLIC //
+
+// Expand to pp-list of concept types.
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CONCEPTS(func_traits) \
+ BOOST_PP_ARRAY_ELEM(CONTRACT_DETAIL_PP_FUNC_TRAITS_CONCEPTS_INDEX_, \
+ func_traits)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CONCEPTS_REPLACE( \
+ func_traits, concepts_sign) \
+ /* can't use ARRAY_REPLACE because it has reentrancy _D */ \
+ ( BOOST_PP_ARRAY_SIZE(func_traits), \
+ ( \
+ CONTRACT_DETAIL_PP_ARRAY_REM(CONTRACT_DETAIL_PP_ARRAY_FIRST_N( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CONCEPTS_INDEX_, \
+ func_traits)) \
+ , CONTRACT_DETAIL_PP_FUNC_TRAITS_CONCEPTS_TRAIT_(concepts_sign) \
+ , CONTRACT_DETAIL_PP_ARRAY_REM(CONTRACT_DETAIL_PP_ARRAY_REST_N( \
+ BOOST_PP_INC(CONTRACT_DETAIL_PP_FUNC_TRAITS_CONCEPTS_INDEX_), \
+ func_traits)) \
+ ) )
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func/const.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func/const.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,44 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_TRAITS_CONST_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CONST_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/keyword.hpp>
+#include <contract/detail/preprocessor/traits/aux_/nil.hpp>
+#include <contract/detail/preprocessor/keyword/const.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CONST_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* optional trait */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_CONST_FRONT, const)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CONST_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_CONST_REMOVE_FRONT)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_CONST(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CONST_TRAIT_, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CONST_SIGN_)
+
+// PUBLIC //
+
+// Expand to `[const]`.
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_CONST(func_traits) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_, \
+ BOOST_PP_ARRAY_ELEM(14, func_traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func/exceptions.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func/exceptions.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,63 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_TRAITS_EXCEPTIONS_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_EXCEPTIONS_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/list.hpp>
+#include <contract/detail/preprocessor/keyword/throw.hpp>
+#include <boost/preprocessor/tuple/rem.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_EXCEPTIONS_TRAIT_COMMA_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA(BOOST_PP_TUPLE_REM(1), sign)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_EXCEPTIONS_TRAIT_(sign) \
+ ( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_THROW_FRONT(sign) \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST(sign, \
+ /* empty list from both `throw( )` and `throw( void )` */ \
+ 1, /* might be empty (for non-throw specification) */ \
+ 0, /* might not have defaults */ \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_THROW_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_THROW_REMOVE_FRONT, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_EXCEPTIONS_TRAIT_COMMA_) \
+ )
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_EXCEPTIONS_REMOVE_throw \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_EXCEPTIONS_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_TAGGED_LIST(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_THROW_FRONT, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_EXCEPTIONS_REMOVE_)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_EXCEPTIONS(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_EXCEPTIONS_TRAIT_, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_EXCEPTIONS_SIGN_)
+
+// PUBLIC //
+
+// Expand to 1 iff it has exception specifications (even if no exceptions
+// `throw()` for no-throw)
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_HAS_EXCEPTION_SPEC(func_traits) \
+ BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_ARRAY_ELEM(19, func_traits))
+
+// Expand to pp-list of exception specification types
+// `(n, (exception_token0, ...))` (array to handle unwrapped commas).
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_EXCEPTIONS(func_traits) \
+ BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_ARRAY_ELEM(19, func_traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func/explicit.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func/explicit.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,43 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_TRAITS_EXPLICIT_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_EXPLICIT_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/keyword.hpp>
+#include <contract/detail/preprocessor/keyword/explicit.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_EXPLICIT_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* optional trait */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_EXPLICIT_FRONT, explicit)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_EXPLICIT_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_EXPLICIT_REMOVE_FRONT)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_EXPLICIT(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_EXPLICIT_TRAIT_, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_EXPLICIT_SIGN_)
+
+// PUBLIC //
+
+// Expand to `[explicit]`.
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_EXPLICIT(func_traits) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_, \
+ BOOST_PP_ARRAY_ELEM(4, func_traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func/export.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func/export.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,44 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_TRAITS_EXPORT_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_EXPORT_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/keyword.hpp>
+#include <contract/detail/preprocessor/traits/aux_/nil.hpp>
+#include <contract/detail/preprocessor/keyword/export.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_EXPORT_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* optional trait */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_EXPORT_FRONT, export)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_EXPORT_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_EXPORT_REMOVE_FRONT)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_EXPORT(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_EXPORT_TRAIT_, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_EXPORT_SIGN_)
+
+// PUBLIC //
+
+// Expand to `[export]`.
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_EXPORT(func_traits) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_, \
+ BOOST_PP_ARRAY_ELEM(1, func_traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func/extern.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func/extern.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,43 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_TRAITS_EXTERN_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_EXTERN_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/keyword.hpp>
+#include <contract/detail/preprocessor/keyword/extern.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_EXTERN_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* optional trait */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_EXTERN_FRONT, extern)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_EXTERN_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_EXTERN_REMOVE_FRONT)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_EXTERN(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_EXTERN_TRAIT_, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_EXTERN_SIGN_)
+
+// PUBLIC //
+
+// Expand to `[extern]`.
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_EXTERN(func_traits) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_, \
+ BOOST_PP_ARRAY_ELEM(6, func_traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func/final.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func/final.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,44 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_TRAITS_FINAL_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_FINAL_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/keyword.hpp>
+#include <contract/detail/preprocessor/traits/aux_/nil.hpp>
+#include <contract/detail/preprocessor/keyword/cxx11/override.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_FINAL_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* optional trait */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_FINAL_FRONT, override)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_FINAL_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_FINAL_REMOVE_FRONT)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_FINAL(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_FINAL_TRAIT_, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_FINAL_SIGN_)
+
+// PUBLIC //
+
+// Expand to `[override]`.
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_FINAL(func_traits) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_, \
+ BOOST_PP_ARRAY_ELEM(18, func_traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func/friend.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func/friend.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,43 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_TRAITS_FRIEND_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_FRIEND_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/keyword.hpp>
+#include <contract/detail/preprocessor/keyword/friend.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_FRIEND_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* optional trait */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_FRIEND_FRONT, friend)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_FRIEND_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_FRIEND_REMOVE_FRONT)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_FRIEND(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_FRIEND_TRAIT_, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_FRIEND_SIGN_)
+
+// PUBLIC //
+
+// Expand to `[friend]`.
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_FRIEND(func_traits) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_, \
+ BOOST_PP_ARRAY_ELEM(9, func_traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func/initializers.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func/initializers.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,67 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_TRAITS_INITIALIZERS_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_INITIALIZERS_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/list.hpp>
+#include <contract/detail/preprocessor/keyword/contract/initialize.hpp>
+#include <contract/detail/preprocessor/keyword/try.hpp>
+#include <boost/preprocessor/tuple/rem.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_INITIALIZERS_TRAIT_COMMA_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_COMMA(BOOST_PP_TUPLE_REM(1), sign)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_INITIALIZERS_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST(sign, \
+ 0, /* might not be empty */ \
+ 0, /* might not have defaults */ \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_INITIALIZE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_INITIALIZE_REMOVE_FRONT, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_INITIALIZERS_TRAIT_COMMA_)\
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_INITIALIZERS_REMOVE_initialize \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_INITIALIZERS_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_TAGGED_LIST(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_INITIALIZE_FRONT, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_INITIALIZERS_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_INITIALIZERS_REMOVE_TRY_( \
+ traits_sign) \
+ ( \
+ BOOST_PP_TUPLE_ELEM(2, 0, traits_sign) \
+ , \
+ CONTRACT_DETAIL_PP_KEYWORD_TRY_REMOVE_FRONT(BOOST_PP_TUPLE_ELEM(2, 1, \
+ traits_sign)) \
+ )
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_INITIALIZERS(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY( \
+ /* always remove eventual leading `try` to handle */ \
+ /* function-try-blocks around initializers */ \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_INITIALIZERS_REMOVE_TRY_( \
+ traits_sign), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_INITIALIZERS_TRAIT_, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_INITIALIZERS_SIGN_)
+
+// PUBLIC //
+
+// Expand to pp-list of member initializers `(n, (init_token0, ...))` (array
+// for possible unwrapped commas).
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_INITIALIZERS(func_traits) \
+ BOOST_PP_ARRAY_ELEM(22, func_traits)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func/inline.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func/inline.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,43 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_TRAITS_INLINE_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_INLINE_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/keyword.hpp>
+#include <contract/detail/preprocessor/keyword/inline.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_INLINE_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* optional trait */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_INLINE_FRONT, inline)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_INLINE_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_INLINE_REMOVE_FRONT)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_INLINE(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_INLINE_TRAIT_, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_INLINE_SIGN_)
+
+// PUBLIC //
+
+// Expand to `[inline]`.
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_INLINE(func_traits) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_, \
+ BOOST_PP_ARRAY_ELEM(5, func_traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func/name.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func/name.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,56 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_TRAITS_NAME_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_NAME_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/name.hpp>
+#include <contract/detail/preprocessor/array/first_n.hpp>
+#include <contract/detail/preprocessor/array/rest_n.hpp>
+#include <contract/detail/preprocessor/array/rem.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_NAME_INDEX_ 11
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_NAME(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_WITH_OPERATOR, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_NAME_WITH_OPERATOR)
+
+// PUBLIC //
+
+// Expand to `name` (this is always alphanumeric even for operators).
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_NAME(func_traits) \
+ BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_ARRAY_ELEM( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_NAME_INDEX_, func_traits))
+
+// Expand to `(n, (token1, ...))` (array to handle commas in operator tokens,
+// 0-size if not an operator, tokens do not include the `operator` keyword).
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_OPERATOR(func_traits) \
+ BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_ARRAY_ELEM( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_NAME_INDEX_, func_traits))
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_NAME_REPLACE(func_traits, name_sign) \
+ /* cannot use ARRAY_REPLACE because it has reentrancy _D */ \
+ ( BOOST_PP_ARRAY_SIZE(func_traits), \
+ ( \
+ CONTRACT_DETAIL_PP_ARRAY_REM(CONTRACT_DETAIL_PP_ARRAY_FIRST_N( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_NAME_INDEX_, \
+ func_traits)) \
+ , CONTRACT_DETAIL_PP_TRAITS_AUX_NAME_WITH_OPERATOR(name_sign) \
+ , CONTRACT_DETAIL_PP_ARRAY_REM(CONTRACT_DETAIL_PP_ARRAY_REST_N( \
+ BOOST_PP_INC(CONTRACT_DETAIL_PP_FUNC_TRAITS_NAME_INDEX_), \
+ func_traits)) \
+ ) )
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func/new.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func/new.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,44 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_TRAITS_NEW_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_NEW_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/keyword.hpp>
+#include <contract/detail/preprocessor/traits/aux_/nil.hpp>
+#include <contract/detail/preprocessor/keyword/new.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_NEW_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* optional trait */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_NEW_FRONT, new)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_NEW_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_NEW_REMOVE_FRONT)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_NEW(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_NEW_TRAIT_, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_NEW_SIGN_)
+
+// PUBLIC //
+
+// Expand to `[new]`.
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_NEW(func_traits) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_, \
+ BOOST_PP_ARRAY_ELEM(17, func_traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func/override.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func/override.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,44 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_TRAITS_OVERRIDE_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_OVERRIDE_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/keyword.hpp>
+#include <contract/detail/preprocessor/traits/aux_/nil.hpp>
+#include <contract/detail/preprocessor/keyword/cxx11/override.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_OVERRIDE_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* optional trait */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_OVERRIDE_FRONT, override)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_OVERRIDE_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_OVERRIDE_REMOVE_FRONT)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_OVERRIDE(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_OVERRIDE_TRAIT_, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_OVERRIDE_SIGN_)
+
+// PUBLIC //
+
+// Expand to `[override]`.
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_OVERRIDE(func_traits) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_, \
+ BOOST_PP_ARRAY_ELEM(16, func_traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func/param_concepts.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func/param_concepts.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,52 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAM_CONCEPTS_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAM_CONCEPTS_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/list.hpp>
+#include <contract/detail/preprocessor/keyword/contract/requires.hpp>
+#include <boost/preprocessor/tuple/rem.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+// For reentrancy on GCC++0x, PP_TUPLE_REM(1) doesn't work.
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAM_CONCEPTS_REM_(tokens) tokens
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAM_CONCEPTS_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST(sign, \
+ 0, /* might not be empty */ \
+ 0, /* might not have defaults */ \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_REQUIRES_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_REQUIRES_REMOVE_FRONT, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAM_CONCEPTS_REM_)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAM_CONCEPTS_REMOVE_requires \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAM_CONCEPTS_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_TAGGED_LIST(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_REQUIRES_FRONT, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_CONCEPTS_REMOVE_)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_PARAM_CONCEPTS(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAM_CONCEPTS_TRAIT_, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAM_CONCEPTS_SIGN_)
+
+// PUBLIC //
+
+// Expand to pp-list of function parameter (not template param) concept types.
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAM_CONCEPTS(func_traits) \
+ BOOST_PP_ARRAY_ELEM(13, func_traits)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func/params.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func/params.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,50 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/list.hpp>
+#include <contract/detail/preprocessor/traits/params.hpp>
+#include <boost/preprocessor/arithmetic/inc.hpp>
+#include <boost/preprocessor/array/size.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS_INDEX_ 12
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_PARAMS(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_FUNC_PARAMS_TRAITS, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_LIST)
+
+// PUBLIC //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS(func_traits) \
+ BOOST_PP_ARRAY_ELEM(CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS_INDEX_, \
+ func_traits)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS_REPLACE( \
+ func_traits, fparams_sign) \
+ /* can't use ARRAY_REPLACE because it has reentrancy _D */ \
+ ( BOOST_PP_ARRAY_SIZE(func_traits), \
+ ( \
+ CONTRACT_DETAIL_PP_ARRAY_REM(CONTRACT_DETAIL_PP_ARRAY_FIRST_N( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS_INDEX_, \
+ func_traits)) \
+ , CONTRACT_DETAIL_PP_FUNC_PARAMS_TRAITS(fparams_sign) \
+ , CONTRACT_DETAIL_PP_ARRAY_REM(CONTRACT_DETAIL_PP_ARRAY_REST_N( \
+ BOOST_PP_INC(CONTRACT_DETAIL_PP_FUNC_TRAITS_PARAMS_INDEX_), \
+ func_traits)) \
+ ) )
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func/postconditions-generate.py
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func/postconditions-generate.py 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,402 @@
+
+# Copyright (C) 2008-2012 Lorenzo Caminiti
+# Distributed under 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)
+# Home at http://sourceforge.net/projects/contractpp
+
+import sys
+import shutil
+
+def data(max):
+ s = ''
+ for i in reversed(range(1, max)): # i == 0 handled separately (no `seq`).
+ p = "_" + str(i)
+ if i == max - 1:
+ next_sign_macro = "ERROR_support_maximum_of_" + str(max) + \
+ "_old_value_declarations"
+ else:
+ next_sign_macro = \
+ "CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_" + \
+ str(i + 1) + "_"
+ s = s + '''
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT{0}_( \\
+ seq_sign) \\
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_FRONT( \\
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \\
+ {1} \\
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN( \\
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \\
+ {1} \\
+ , \\
+ seq_sign BOOST_PP_TUPLE_EAT(2) \\
+ ))(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN{0}_( \\
+ seq, sign) \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT{0}_( ( \\
+ seq \\
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(sign), \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_postcondition \\
+ , \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_CAT_ \\
+ )(sign) \\
+ ) ) \
+'''.format(p, next_sign_macro)
+ return s
+
+CONTRACT_LIMIT_OLDOFS = raw_input("CONTRACT_LIMIT_OLDOFS" +
+ "from <contract/limits.hpp> [15] = ")
+if CONTRACT_LIMIT_OLDOFS == "": CONTRACT_LIMIT_OLDOFS = 15
+else: CONTRACT_LIMIT_OLDOFS = int(CONTRACT_LIMIT_OLDOFS)
+
+header = sys.argv[0].replace("-generate.py", ".hpp", 1)
+shutil.copyfile(header, header + ".bak")
+h = open(header, 'w')
+
+h.write('''
+#ifndef CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_HPP_
+
+// WARNING: FILE AUTOMATICALLY GENERATED, DO NOT MODIFY IT!
+// Instead modify the generation script "<FILE>-generate.py" and run
+// `$ python <FILE_NAME>-generate.py > FILE_NAME.hpp`.
+// Used: #define CONTRACT_LIMIT_OLDOFS {0}
+
+#include <contract/limits.hpp>
+#if CONTRACT_LIMIT_OLDOFS != {0}
+#error "Code generation used incorrect CONTRACT_LIMIT_OLDOFS"
+#endif
+
+// Old-of already parsed but header included here for user to access this trait.
+#include <contract/detail/preprocessor/traits/oldof.hpp>
+
+#include <contract/detail/preprocessor/traits/aux_/oldof.hpp>
+#include <contract/detail/preprocessor/traits/aux_/type.hpp>
+#include <contract/detail/preprocessor/traits/aux_/nil.hpp>
+#include <contract/detail/preprocessor/traits/assertion.hpp>
+#include <contract/detail/preprocessor/keyword/contract/postcondition.hpp>
+#include <contract/detail/preprocessor/keyword/auto.hpp>
+#include <contract/detail/preprocessor/variadic/to_seq.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/config/config.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/control/expr_iif.hpp>
+#include <boost/preprocessor/logical/compl.hpp>
+#include <boost/preprocessor/debug/assert.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+#include <boost/preprocessor/seq/fold_right.hpp>
+#include <boost/preprocessor/list/append.hpp>
+#include <boost/config.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_OLDOF_TYPE_( \\
+ oldof_typed_assignment) \\
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_AUTO_FRONT( \\
+ oldof_typed_assignment), \\
+ /* 0-size array for no type (`auto` for typeof deduction) */ \\
+ (0, ()) BOOST_PP_TUPLE_EAT(1) \\
+ , \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE \\
+ )(oldof_typed_assignment)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_OLDOF_ASSIGNMENT_( \\
+ oldof_typed_assignment) \\
+ CONTRACT_DETAIL_PP_KEYWORD_AUTO_REMOVE_FRONT( \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_TYPE( \\
+ oldof_typed_assignment \\
+ ))
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_OLDOF_TYPED_ASSIGNMENT_(\\
+ s, result_oldofs_assertions_lastoldofexpr, oldof_typed_assignment) \\
+ ( \\
+ BOOST_PP_TUPLE_ELEM(4, 0, result_oldofs_assertions_lastoldofexpr) \\
+ , \\
+ BOOST_PP_LIST_APPEND( \\
+ ( /* pp-list */ \\
+ (3, ( /* oldof pp-array with `NIL type, var =, expr` */ \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_OLDOF_TYPE_(\\
+ oldof_typed_assignment) \\
+ , \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_OLDOF_ASSIGNMENT_( \\
+ oldof_typed_assignment) \\
+ , \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_OLDOF_REMOVE_FRONT( \\
+ BOOST_PP_TUPLE_ELEM(4, 3, \\
+ result_oldofs_assertions_lastoldofexpr)) \\
+ ) ) \\
+ , \\
+ BOOST_PPNIL \\
+ ) \\
+ , BOOST_PP_TUPLE_ELEM(4, 1, \\
+ result_oldofs_assertions_lastoldofexpr)) \\
+ , \\
+ BOOST_PP_TUPLE_ELEM(4, 2, result_oldofs_assertions_lastoldofexpr) \\
+ , \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* no open old-of expr */ \\
+ )
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_OLDOF_EXPR_( \\
+ s, result_oldofs_assertions_lastoldofexpr, oldof_expr) \\
+ ( \\
+ BOOST_PP_TUPLE_ELEM(4, 0, result_oldofs_assertions_lastoldofexpr) \\
+ , \\
+ BOOST_PP_TUPLE_ELEM(4, 1, result_oldofs_assertions_lastoldofexpr) \\
+ , \\
+ BOOST_PP_TUPLE_ELEM(4, 2, result_oldofs_assertions_lastoldofexpr) \\
+ , \\
+ oldof_expr /* open an old-of expr (expect old-of assignment next) */ \\
+ )
+
+#define return_CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_STRIP_RETURN \\
+ /* nothing */
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_RESULT_ASSIGNMENT_( \\
+ s, result_oldofs_assertions_lastoldofexpr, result_assignment) \\
+ ( \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* optional trait */ \\
+ /* LIMITATION: With this implementation, multiple result */ \\
+ /* declarations override each other (instead of compiler error) */ \\
+ CONTRACT_DETAIL_PP_KEYWORD_AUTO_REMOVE_FRONT(BOOST_PP_CAT( \\
+ result_assignment, \\
+ _CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_STRIP_RETURN)) \\
+ , \\
+ BOOST_PP_TUPLE_ELEM(4, 1, result_oldofs_assertions_lastoldofexpr) \\
+ , \\
+ BOOST_PP_TUPLE_ELEM(4, 2, result_oldofs_assertions_lastoldofexpr) \\
+ , \\
+ BOOST_PP_TUPLE_ELEM(4, 3, result_oldofs_assertions_lastoldofexpr) \\
+ )
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_ASSERTION_( \\
+ s, result_oldofs_assertions_lastoldofexpr, assertion) \\
+ ( \\
+ BOOST_PP_TUPLE_ELEM(4, 0, result_oldofs_assertions_lastoldofexpr) \\
+ , \\
+ BOOST_PP_TUPLE_ELEM(4, 1, result_oldofs_assertions_lastoldofexpr) \\
+ , \\
+ BOOST_PP_LIST_APPEND( ( assertion, BOOST_PP_NIL ), \\
+ BOOST_PP_TUPLE_ELEM(4, 2, \\
+ result_oldofs_assertions_lastoldofexpr)) \\
+ , \\
+ BOOST_PP_TUPLE_ELEM(4, 3, result_oldofs_assertions_lastoldofexpr) \\
+ )
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_FROM_SEQ_OP_( \\
+ s, result_oldofs_assertions_lastoldofexpr, elem) \\
+ BOOST_PP_IIF(BOOST_PP_COMPL(CONTRACT_DETAIL_PP_TRAITS_AUX_IS_NIL( \\
+ BOOST_PP_TUPLE_ELEM(4, 3, \\
+ result_oldofs_assertions_lastoldofexpr))), \\
+ /* prev there was an old-of expr so elem must be old-of assignment */\\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_OLDOF_TYPED_ASSIGNMENT_ \\
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_IS_OLDOF_FRONT(elem), \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_OLDOF_EXPR_ \\
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_AUTO_FRONT(elem), \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_RESULT_ASSIGNMENT_ \\
+ , /* else, it is an assertion */ \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_ASSERTION_ \\
+ )))(s, result_oldofs_assertions_lastoldofexpr, elem)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_FROM_SEQ_3TUPLE_( \\
+ result_oldofs_assertions_lastoldofexpr) \\
+ ( /* after folding, ignore 4th elem `lastoldofexpr` */ \\
+ BOOST_PP_TUPLE_ELEM(4, 0, result_oldofs_assertions_lastoldofexpr) \\
+ , \\
+ BOOST_PP_TUPLE_ELEM(4, 1, result_oldofs_assertions_lastoldofexpr) \\
+ , \\
+ BOOST_PP_TUPLE_ELEM(4, 2, result_oldofs_assertions_lastoldofexpr) \\
+ )
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_FROM_SEQ_(seq_sign) \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_FROM_SEQ_3TUPLE_( \\
+ BOOST_PP_SEQ_FOLD_RIGHT( \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_FROM_SEQ_OP_, \\
+ ( \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* no result */ \\
+ , \\
+ BOOST_PP_NIL /* no oldofs */ \\
+ , \\
+ BOOST_PP_NIL /* no assertions */ \\
+ , \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* no last oldof expr */ \\
+ ), \\
+ BOOST_PP_TUPLE_ELEM(2, 0, seq_sign) \\
+ ) \\
+ )
+
+// Adapted from PP_CAT (needed for reentrancy as CAT already used by VARIADIC).
+#if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+# define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_CAT_(a, b) \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_CAT_I_(a, b)
+#else
+# define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_CAT_(a, b) \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_CAT_OO_((a, b))
+# define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_CAT_OO_(par) \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_CAT_I_ ## par
+#endif
+#if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+# define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_CAT_I_(a, b) a ## b
+#else
+# define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_CAT_I_(a, b) \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_CAT_II_(a ## b)
+# define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_CAT_II_(res) res
+#endif
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_PAREN_(paren) \\
+ CONTRACT_DETAIL_PP_TUPLE_SPLIT(1) paren
+#ifndef BOOST_NO_VARIADIC_MACROS
+# include <contract/detail/preprocessor/variadic/to_seq.hpp>
+# define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_VARIADIC_( \\
+ ...) \\
+ CONTRACT_DETAIL_PP_VARIADIC_TO_SEQ(void, __VA_ARGS__) , /*comma split*/
+# define \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_MAYBE_PAREN1_( \
+ paren) \\
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_FRONT( \\
+ CONTRACT_DETAIL_PP_VARIADIC_EAT paren), \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_PAREN_ \\
+ /* unfortunately this needs to know that initialize is next (needed */\\
+ /* to handle typed old-of when no variadic macros) */ \\
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_INITIALIZE_FRONT( \\
+ CONTRACT_DETAIL_PP_VARIADIC_EAT paren), \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_PAREN_ \\
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_IS_NIL_FRONT( \\
+ CONTRACT_DETAIL_PP_VARIADIC_EAT paren), \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_PAREN_ \\
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN( \\
+ CONTRACT_DETAIL_PP_VARIADIC_EAT paren), \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_PAREN_ \\
+ , \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_VARIADIC_ \\
+ ))))(paren)
+# define \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_MAYBE_PAREN_( \\
+ tokens) \\
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(tokens), \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_MAYBE_PAREN1_ \\
+ , \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_VARIADIC_ \\
+ )(tokens)
+# define \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_postcondition(...)\\
+ BOOST_PP_IIF(BOOST_PP_EQUAL(1, CONTRACT_DETAIL_PP_VARIADIC_SIZE( \\
+ __VA_ARGS__)), \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_MAYBE_PAREN_ \\
+ , \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_VARIADIC_ \\
+ )(__VA_ARGS__)
+#else
+# define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_TOKEN_( \\
+ token) \\
+ (token) , /* comma split */
+# define \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_postcondition( \\
+ tokens) \\
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(tokens), \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_PAREN_ \\
+ , \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_TOKEN_ \\
+ )(tokens)
+#endif
+
+// Precondition: sign is `postcondition(...)`.
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_CAT_(sign) \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_CAT_( \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_, sign)
+{1}
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_( \\
+ seq_sign) \\
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_FRONT( \\
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_1_ \\
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN( \\
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_1_ \\
+ , \\
+ seq_sign BOOST_PP_TUPLE_EAT(2) \\
+ ))(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_(sign) \\
+ BOOST_PP_EXPAND( \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_( ( \\
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(sign), \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_postcondition \\
+ , \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_CAT_ \\
+ )(sign) \\
+ ) ) )
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_ASSERTION_LIST_( \\
+ result_oldofs_assertions) \\
+ ( \\
+ BOOST_PP_TUPLE_ELEM(3, 0, result_oldofs_assertions) \\
+ , \\
+ BOOST_PP_TUPLE_ELEM(3, 1, result_oldofs_assertions) \\
+ , \\
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS(BOOST_PP_TUPLE_ELEM(3, 2, \\
+ result_oldofs_assertions)) /* process assertion traits */ \\
+ )
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_LIST_(sign) \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_ASSERTION_LIST_( \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_FROM_SEQ_( \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_( \\
+ sign \\
+ )))
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_(sign) \\
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_FRONT(sign), \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_LIST_ \\
+ , \\
+ ( \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* no result */ \\
+ , \\
+ BOOST_PP_NIL /* no oldofs */ \\
+ , \\
+ BOOST_PP_NIL /* no assertions */ \\
+ ) \\
+ BOOST_PP_TUPLE_EAT(1) \\
+ )(sign)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_REMOVE_(sign) \\
+ BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_EXPAND( \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_(sign)))
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SIGN_(sign) \\
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_FRONT(sign), \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_REMOVE_ \\
+ , \\
+ sign BOOST_PP_TUPLE_EAT(1) \\
+ )(sign)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_POSTCONDITIONS(traits_sign) \\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_, \\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SIGN_)
+
+// PUBLIC //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITION_RESULT_ASSIGNMENT( \\
+ func_traits) \\
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_, \\
+ BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_ARRAY_ELEM(21, func_traits)))
+
+// Expand to pp-list of oldofs (see `OLDOF_TRAITS`).
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITION_OLDOFS(func_traits) \\
+ BOOST_PP_TUPLE_ELEM(3, 1, BOOST_PP_ARRAY_ELEM(21, func_traits))
+
+// Expand to pp-list of postcondition assertions.
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS(func_traits) \\
+ BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_ARRAY_ELEM(21, func_traits))
+
+#endif // #include guard
+
+'''.format(CONTRACT_LIMIT_OLDOFS, data(CONTRACT_LIMIT_OLDOFS)))
+
+h.close()
+print "Written:", header
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func/postconditions.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func/postconditions.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,641 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_HPP_
+
+// WARNING: FILE AUTOMATICALLY GENERATED, DO NOT MODIFY IT!
+// Instead modify the generation script "<FILE>-generate.py" and run
+// `$ python <FILE_NAME>-generate.py > FILE_NAME.hpp`.
+// Used: #define CONTRACT_LIMIT_OLDOFS 15
+
+#include <contract/limits.hpp>
+#if CONTRACT_LIMIT_OLDOFS != 15
+#error "Code generation used incorrect CONTRACT_LIMIT_OLDOFS"
+#endif
+
+// Old-of already parsed but header included here for user to access this trait.
+#include <contract/detail/preprocessor/traits/oldof.hpp>
+
+#include <contract/detail/preprocessor/traits/aux_/oldof.hpp>
+#include <contract/detail/preprocessor/traits/aux_/type.hpp>
+#include <contract/detail/preprocessor/traits/aux_/nil.hpp>
+#include <contract/detail/preprocessor/traits/assertion.hpp>
+#include <contract/detail/preprocessor/keyword/contract/postcondition.hpp>
+#include <contract/detail/preprocessor/keyword/auto.hpp>
+#include <contract/detail/preprocessor/variadic/to_seq.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/config/config.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/control/expr_iif.hpp>
+#include <boost/preprocessor/logical/compl.hpp>
+#include <boost/preprocessor/debug/assert.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+#include <boost/preprocessor/seq/fold_right.hpp>
+#include <boost/preprocessor/list/append.hpp>
+#include <boost/config.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_OLDOF_TYPE_( \
+ oldof_typed_assignment) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_AUTO_FRONT( \
+ oldof_typed_assignment), \
+ /* 0-size array for no type (`auto` for typeof deduction) */ \
+ (0, ()) BOOST_PP_TUPLE_EAT(1) \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE \
+ )(oldof_typed_assignment)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_OLDOF_ASSIGNMENT_( \
+ oldof_typed_assignment) \
+ CONTRACT_DETAIL_PP_KEYWORD_AUTO_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_TYPE( \
+ oldof_typed_assignment \
+ ))
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_OLDOF_TYPED_ASSIGNMENT_(\
+ s, result_oldofs_assertions_lastoldofexpr, oldof_typed_assignment) \
+ ( \
+ BOOST_PP_TUPLE_ELEM(4, 0, result_oldofs_assertions_lastoldofexpr) \
+ , \
+ BOOST_PP_LIST_APPEND( \
+ ( /* pp-list */ \
+ (3, ( /* oldof pp-array with `NIL type, var =, expr` */ \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_OLDOF_TYPE_(\
+ oldof_typed_assignment) \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_OLDOF_ASSIGNMENT_( \
+ oldof_typed_assignment) \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_OLDOF_REMOVE_FRONT( \
+ BOOST_PP_TUPLE_ELEM(4, 3, \
+ result_oldofs_assertions_lastoldofexpr)) \
+ ) ) \
+ , \
+ BOOST_PPNIL \
+ ) \
+ , BOOST_PP_TUPLE_ELEM(4, 1, \
+ result_oldofs_assertions_lastoldofexpr)) \
+ , \
+ BOOST_PP_TUPLE_ELEM(4, 2, result_oldofs_assertions_lastoldofexpr) \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* no open old-of expr */ \
+ )
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_OLDOF_EXPR_( \
+ s, result_oldofs_assertions_lastoldofexpr, oldof_expr) \
+ ( \
+ BOOST_PP_TUPLE_ELEM(4, 0, result_oldofs_assertions_lastoldofexpr) \
+ , \
+ BOOST_PP_TUPLE_ELEM(4, 1, result_oldofs_assertions_lastoldofexpr) \
+ , \
+ BOOST_PP_TUPLE_ELEM(4, 2, result_oldofs_assertions_lastoldofexpr) \
+ , \
+ oldof_expr /* open an old-of expr (expect old-of assignment next) */ \
+ )
+
+#define return_CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_STRIP_RETURN \
+ /* nothing */
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_RESULT_ASSIGNMENT_( \
+ s, result_oldofs_assertions_lastoldofexpr, result_assignment) \
+ ( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* optional trait */ \
+ /* LIMITATION: With this implementation, multiple result */ \
+ /* declarations override each other (instead of compiler error) */ \
+ CONTRACT_DETAIL_PP_KEYWORD_AUTO_REMOVE_FRONT(BOOST_PP_CAT( \
+ result_assignment, \
+ _CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_STRIP_RETURN)) \
+ , \
+ BOOST_PP_TUPLE_ELEM(4, 1, result_oldofs_assertions_lastoldofexpr) \
+ , \
+ BOOST_PP_TUPLE_ELEM(4, 2, result_oldofs_assertions_lastoldofexpr) \
+ , \
+ BOOST_PP_TUPLE_ELEM(4, 3, result_oldofs_assertions_lastoldofexpr) \
+ )
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_ASSERTION_( \
+ s, result_oldofs_assertions_lastoldofexpr, assertion) \
+ ( \
+ BOOST_PP_TUPLE_ELEM(4, 0, result_oldofs_assertions_lastoldofexpr) \
+ , \
+ BOOST_PP_TUPLE_ELEM(4, 1, result_oldofs_assertions_lastoldofexpr) \
+ , \
+ BOOST_PP_LIST_APPEND( ( assertion, BOOST_PP_NIL ), \
+ BOOST_PP_TUPLE_ELEM(4, 2, \
+ result_oldofs_assertions_lastoldofexpr)) \
+ , \
+ BOOST_PP_TUPLE_ELEM(4, 3, result_oldofs_assertions_lastoldofexpr) \
+ )
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_FROM_SEQ_OP_( \
+ s, result_oldofs_assertions_lastoldofexpr, elem) \
+ BOOST_PP_IIF(BOOST_PP_COMPL(CONTRACT_DETAIL_PP_TRAITS_AUX_IS_NIL( \
+ BOOST_PP_TUPLE_ELEM(4, 3, \
+ result_oldofs_assertions_lastoldofexpr))), \
+ /* prev there was an old-of expr so elem must be old-of assignment */\
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_OLDOF_TYPED_ASSIGNMENT_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_IS_OLDOF_FRONT(elem), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_OLDOF_EXPR_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_AUTO_FRONT(elem), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_RESULT_ASSIGNMENT_ \
+ , /* else, it is an assertion */ \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_ASSERTION_ \
+ )))(s, result_oldofs_assertions_lastoldofexpr, elem)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_FROM_SEQ_3TUPLE_( \
+ result_oldofs_assertions_lastoldofexpr) \
+ ( /* after folding, ignore 4th elem `lastoldofexpr` */ \
+ BOOST_PP_TUPLE_ELEM(4, 0, result_oldofs_assertions_lastoldofexpr) \
+ , \
+ BOOST_PP_TUPLE_ELEM(4, 1, result_oldofs_assertions_lastoldofexpr) \
+ , \
+ BOOST_PP_TUPLE_ELEM(4, 2, result_oldofs_assertions_lastoldofexpr) \
+ )
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_FROM_SEQ_(seq_sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_FROM_SEQ_3TUPLE_( \
+ BOOST_PP_SEQ_FOLD_RIGHT( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_FROM_SEQ_OP_, \
+ ( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* no result */ \
+ , \
+ BOOST_PP_NIL /* no oldofs */ \
+ , \
+ BOOST_PP_NIL /* no assertions */ \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* no last oldof expr */ \
+ ), \
+ BOOST_PP_TUPLE_ELEM(2, 0, seq_sign) \
+ ) \
+ )
+
+// Adapted from PP_CAT (needed for reentrancy as CAT already used by VARIADIC).
+#if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+# define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_CAT_(a, b) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_CAT_I_(a, b)
+#else
+# define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_CAT_(a, b) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_CAT_OO_((a, b))
+# define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_CAT_OO_(par) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_CAT_I_ ## par
+#endif
+#if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+# define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_CAT_I_(a, b) a ## b
+#else
+# define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_CAT_I_(a, b) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_CAT_II_(a ## b)
+# define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_CAT_II_(res) res
+#endif
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_PAREN_(paren) \
+ CONTRACT_DETAIL_PP_TUPLE_SPLIT(1) paren
+#ifndef BOOST_NO_VARIADIC_MACROS
+# include <contract/detail/preprocessor/variadic/to_seq.hpp>
+# define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_VARIADIC_( \
+ ...) \
+ CONTRACT_DETAIL_PP_VARIADIC_TO_SEQ(void, __VA_ARGS__) , /*comma split*/
+# define \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_MAYBE_PAREN1_( paren) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_FRONT( \
+ CONTRACT_DETAIL_PP_VARIADIC_EAT paren), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_PAREN_ \
+ /* unfortunately this needs to know that initialize is next (needed */\
+ /* to handle typed old-of when no variadic macros) */ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_INITIALIZE_FRONT( \
+ CONTRACT_DETAIL_PP_VARIADIC_EAT paren), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_PAREN_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_TRAITS_AUX_IS_NIL_FRONT( \
+ CONTRACT_DETAIL_PP_VARIADIC_EAT paren), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_PAREN_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN( \
+ CONTRACT_DETAIL_PP_VARIADIC_EAT paren), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_PAREN_ \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_VARIADIC_ \
+ ))))(paren)
+# define \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_MAYBE_PAREN_( \
+ tokens) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(tokens), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_MAYBE_PAREN1_ \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_VARIADIC_ \
+ )(tokens)
+# define \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_postcondition(...)\
+ BOOST_PP_IIF(BOOST_PP_EQUAL(1, CONTRACT_DETAIL_PP_VARIADIC_SIZE( \
+ __VA_ARGS__)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_MAYBE_PAREN_ \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_VARIADIC_ \
+ )(__VA_ARGS__)
+#else
+# define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_TOKEN_( \
+ token) \
+ (token) , /* comma split */
+# define \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_postcondition( \
+ tokens) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(tokens), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_PAREN_ \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_TOKEN_ \
+ )(tokens)
+#endif
+
+// Precondition: sign is `postcondition(...)`.
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_CAT_(sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_CAT_( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_, sign)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_14_( \
+ seq_sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_FRONT( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ ERROR_support_maximum_of_15_old_value_declarations \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ ERROR_support_maximum_of_15_old_value_declarations \
+ , \
+ seq_sign BOOST_PP_TUPLE_EAT(2) \
+ ))(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_14_( \
+ seq, sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_14_( ( \
+ seq \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(sign), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_postcondition \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_CAT_ \
+ )(sign) \
+ ) )
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_13_( \
+ seq_sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_FRONT( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_14_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_14_ \
+ , \
+ seq_sign BOOST_PP_TUPLE_EAT(2) \
+ ))(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_13_( \
+ seq, sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_13_( ( \
+ seq \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(sign), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_postcondition \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_CAT_ \
+ )(sign) \
+ ) )
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_12_( \
+ seq_sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_FRONT( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_13_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_13_ \
+ , \
+ seq_sign BOOST_PP_TUPLE_EAT(2) \
+ ))(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_12_( \
+ seq, sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_12_( ( \
+ seq \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(sign), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_postcondition \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_CAT_ \
+ )(sign) \
+ ) )
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_11_( \
+ seq_sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_FRONT( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_12_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_12_ \
+ , \
+ seq_sign BOOST_PP_TUPLE_EAT(2) \
+ ))(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_11_( \
+ seq, sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_11_( ( \
+ seq \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(sign), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_postcondition \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_CAT_ \
+ )(sign) \
+ ) )
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_10_( \
+ seq_sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_FRONT( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_11_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_11_ \
+ , \
+ seq_sign BOOST_PP_TUPLE_EAT(2) \
+ ))(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_10_( \
+ seq, sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_10_( ( \
+ seq \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(sign), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_postcondition \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_CAT_ \
+ )(sign) \
+ ) )
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_9_( \
+ seq_sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_FRONT( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_10_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_10_ \
+ , \
+ seq_sign BOOST_PP_TUPLE_EAT(2) \
+ ))(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_9_( \
+ seq, sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_9_( ( \
+ seq \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(sign), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_postcondition \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_CAT_ \
+ )(sign) \
+ ) )
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_8_( \
+ seq_sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_FRONT( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_9_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_9_ \
+ , \
+ seq_sign BOOST_PP_TUPLE_EAT(2) \
+ ))(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_8_( \
+ seq, sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_8_( ( \
+ seq \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(sign), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_postcondition \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_CAT_ \
+ )(sign) \
+ ) )
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_7_( \
+ seq_sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_FRONT( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_8_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_8_ \
+ , \
+ seq_sign BOOST_PP_TUPLE_EAT(2) \
+ ))(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_7_( \
+ seq, sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_7_( ( \
+ seq \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(sign), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_postcondition \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_CAT_ \
+ )(sign) \
+ ) )
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_6_( \
+ seq_sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_FRONT( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_7_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_7_ \
+ , \
+ seq_sign BOOST_PP_TUPLE_EAT(2) \
+ ))(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_6_( \
+ seq, sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_6_( ( \
+ seq \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(sign), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_postcondition \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_CAT_ \
+ )(sign) \
+ ) )
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_5_( \
+ seq_sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_FRONT( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_6_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_6_ \
+ , \
+ seq_sign BOOST_PP_TUPLE_EAT(2) \
+ ))(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_5_( \
+ seq, sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_5_( ( \
+ seq \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(sign), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_postcondition \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_CAT_ \
+ )(sign) \
+ ) )
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_4_( \
+ seq_sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_FRONT( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_5_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_5_ \
+ , \
+ seq_sign BOOST_PP_TUPLE_EAT(2) \
+ ))(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_4_( \
+ seq, sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_4_( ( \
+ seq \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(sign), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_postcondition \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_CAT_ \
+ )(sign) \
+ ) )
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_3_( \
+ seq_sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_FRONT( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_4_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_4_ \
+ , \
+ seq_sign BOOST_PP_TUPLE_EAT(2) \
+ ))(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_3_( \
+ seq, sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_3_( ( \
+ seq \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(sign), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_postcondition \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_CAT_ \
+ )(sign) \
+ ) )
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_2_( \
+ seq_sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_FRONT( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_3_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_3_ \
+ , \
+ seq_sign BOOST_PP_TUPLE_EAT(2) \
+ ))(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_2_( \
+ seq, sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_2_( ( \
+ seq \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(sign), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_postcondition \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_CAT_ \
+ )(sign) \
+ ) )
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_1_( \
+ seq_sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_FRONT( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_2_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_2_ \
+ , \
+ seq_sign BOOST_PP_TUPLE_EAT(2) \
+ ))(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_1_( \
+ seq, sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_1_( ( \
+ seq \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(sign), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_postcondition \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_CAT_ \
+ )(sign) \
+ ) )
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_( \
+ seq_sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_FRONT( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_1_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN( \
+ BOOST_PP_TUPLE_ELEM(2, 1, seq_sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_1_ \
+ , \
+ seq_sign BOOST_PP_TUPLE_EAT(2) \
+ ))(BOOST_PP_TUPLE_ELEM(2, 0, seq_sign), BOOST_PP_TUPLE_ELEM(2, 1, seq_sign))
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_(sign) \
+ BOOST_PP_EXPAND( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_NEXT_( ( \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(sign), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_postcondition \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SPLIT_SEQ_CAT_ \
+ )(sign) \
+ ) ) )
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_ASSERTION_LIST_( \
+ result_oldofs_assertions) \
+ ( \
+ BOOST_PP_TUPLE_ELEM(3, 0, result_oldofs_assertions) \
+ , \
+ BOOST_PP_TUPLE_ELEM(3, 1, result_oldofs_assertions) \
+ , \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS(BOOST_PP_TUPLE_ELEM(3, 2, \
+ result_oldofs_assertions)) /* process assertion traits */ \
+ )
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_LIST_(sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_ASSERTION_LIST_( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_FROM_SEQ_( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_( \
+ sign \
+ )))
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_(sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_FRONT(sign), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_LIST_ \
+ , \
+ ( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* no result */ \
+ , \
+ BOOST_PP_NIL /* no oldofs */ \
+ , \
+ BOOST_PP_NIL /* no assertions */ \
+ ) \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(sign)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_REMOVE_(sign) \
+ BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_EXPAND( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_SIGN_(sign)))
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SIGN_(sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_POSTCONDITION_FRONT(sign), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_REMOVE_ \
+ , \
+ sign BOOST_PP_TUPLE_EAT(1) \
+ )(sign)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_POSTCONDITIONS(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_TRAIT_, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS_SIGN_)
+
+// PUBLIC //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITION_RESULT_ASSIGNMENT( \
+ func_traits) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_, \
+ BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_ARRAY_ELEM(21, func_traits)))
+
+// Expand to pp-list of oldofs (see `OLDOF_TRAITS`).
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITION_OLDOFS(func_traits) \
+ BOOST_PP_TUPLE_ELEM(3, 1, BOOST_PP_ARRAY_ELEM(21, func_traits))
+
+// Expand to pp-list of postcondition assertions.
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_POSTCONDITIONS(func_traits) \
+ BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_ARRAY_ELEM(21, func_traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func/preconditions.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func/preconditions.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,54 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_TRAITS_PRECONDITIONS_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_PRECONDITIONS_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/list.hpp>
+#include <contract/detail/preprocessor/traits/assertion.hpp>
+#include <contract/detail/preprocessor/keyword/contract/precondition.hpp>
+#include <boost/preprocessor/tuple/rem.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+// For reentrancy on GCC with C++0x.
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_PRECONDITIONS_REM_(tokens) tokens
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_PRECONDITIONS_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_ASSERTION_TRAITS( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST(sign, \
+ 0, /* might not be empty */ \
+ 0, /* might not have defaults */ \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PRECONDITION_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_PRECONDITION_REMOVE_FRONT, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PRECONDITIONS_REM_))
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_PRECONDITIONS_REMOVE_precondition \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_PRECONDITIONS_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_TAGGED_LIST(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_PRECONDITION_FRONT, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PRECONDITIONS_REMOVE_)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_PRECONDITIONS(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PRECONDITIONS_TRAIT_, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_PRECONDITIONS_SIGN_)
+
+// PUBLIC //
+
+// Expand to pp-list of precondition assertions.
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_PRECONDITIONS(func_traits) \
+ BOOST_PP_ARRAY_ELEM(20, func_traits)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func/result_type.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func/result_type.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,170 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/type.hpp>
+#include <contract/detail/preprocessor/traits/aux_/nil.hpp>
+#include <contract/detail/preprocessor/traits/aux_/list.hpp>
+#include <contract/detail/preprocessor/traits/aux_/name.hpp>
+#include <contract/detail/preprocessor/punctuation/has_paren.hpp>
+#include <contract/detail/preprocessor/keyword/contract/comma.hpp>
+#include <contract/detail/preprocessor/keyword/operator.hpp>
+#include <contract/detail/preprocessor/keyword/new.hpp>
+#include <contract/detail/preprocessor/keyword/delete.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/logical/bitand.hpp>
+#include <boost/preprocessor/logical/bitor.hpp>
+#include <boost/preprocessor/logical/compl.hpp>
+#include <boost/preprocessor/detail/is_unary.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_NOT_PAREN_(tokens) \
+ BOOST_PP_COMPL(CONTRACT_DETAIL_PP_HAS_PAREN(tokens))
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_NOT_OPERATOR_PAREN_(tokens) \
+ BOOST_PP_COMPL(BOOST_PP_BITAND( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_OPERATOR_FRONT(tokens) \
+ , CONTRACT_DETAIL_PP_HAS_PAREN( \
+ CONTRACT_DETAIL_PP_KEYWORD_OPERATOR_REMOVE_FRONT(tokens)) \
+ ))
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_NOT_OPERATOR_NEW_(tokens) \
+ BOOST_PP_COMPL(BOOST_PP_BITAND( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_OPERATOR_FRONT(tokens) \
+ , CONTRACT_DETAIL_PP_KEYWORD_IS_NEW_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_OPERATOR_REMOVE_FRONT(tokens)) \
+ ))
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_NOT_OPERATOR_DELETE_( \
+ tokens) \
+ BOOST_PP_COMPL(BOOST_PP_BITAND( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_OPERATOR_FRONT(tokens) \
+ , CONTRACT_DETAIL_PP_KEYWORD_IS_DELETE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_OPERATOR_REMOVE_FRONT(tokens)) \
+ ))
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_NOT_OPERATOR_COMMA_( \
+ tokens) \
+ BOOST_PP_COMPL(BOOST_PP_BITAND( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_OPERATOR_FRONT(tokens) \
+ , CONTRACT_DETAIL_PP_KEYWORD_IS_COMMA_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_OPERATOR_REMOVE_FRONT(tokens)) \
+ ))
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_IS_EMPTY_CHECK_OPERATOR_( \
+ next_next_sign) \
+ BOOST_PP_BITAND( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_NOT_OPERATOR_PAREN_( \
+ next_next_sign) \
+ , BOOST_PP_BITAND( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_NOT_OPERATOR_NEW_( \
+ next_next_sign) \
+ , BOOST_PP_BITAND( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_NOT_OPERATOR_DELETE_( \
+ next_next_sign) \
+ , CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_NOT_OPERATOR_COMMA_( \
+ next_next_sign) \
+ )))
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_IS_EMPTY_CHECK_NOT_NIL_( \
+ next_next_sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_NOT_PAREN_( \
+ next_next_sign), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_IS_EMPTY_CHECK_OPERATOR_ \
+ , \
+ 0 BOOST_PP_TUPLE_EAT(1) \
+ )(next_next_sign)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_IS_EMPTY_CHECK_( \
+ next_next_sign) \
+ /* result is empty <=> next_next_sign == nil || (next_next_sign != ()... */\
+ /* && != opeator(...)... && != operator new... && != operator delete...) */\
+ /* (this supports type conversion `operator T()` which has no result) */ \
+ BOOST_PP_EXPAND(BOOST_PP_IIF( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_IS_NIL_PAREN(next_next_sign), \
+ 1 BOOST_PP_TUPLE_EAT(1) \
+ , \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_IS_EMPTY_CHECK_NOT_NIL_ \
+ )(next_next_sign))
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_IS_EMPTY_PAREN_(sign) \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_IS_EMPTY_CHECK_( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_LIST( /* next */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_NAME( /* next */ \
+ sign \
+ )) \
+ )
+
+#ifndef BOOST_NO_VARIADIC_MACROS
+# define CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_MAYBE_NAME_1TOKEN_SIZE_( \
+ ...) \
+ CONTRACT_DETAIL_PP_VARIADIC_SIZE(__VA_ARGS__),
+#else
+# define CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_MAYBE_NAME_1TOKEN_SIZE_( \
+ token) \
+ 1, /* must always be 1 token `(token)` if no variadics */
+#endif
+
+#define CONRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_MAYBE_NAME_1TOKEN_(sign) \
+ BOOST_PP_EQUAL(BOOST_PP_TUPLE_ELEM(2, 0, ( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_MAYBE_NAME_1TOKEN_SIZE_ \
+ sign)), 1)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_MAYBE_NAME_(sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(sign), \
+ CONRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_MAYBE_NAME_1TOKEN_ \
+ , \
+ 0 BOOST_PP_TUPLE_EAT(1) \
+ )(sign)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_IS_EMPTY_(sign) \
+ BOOST_PP_IIF(BOOST_PP_EXPAND( /* EXPAND for MSVC */ \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_MAYBE_NAME_(sign)), \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_IS_EMPTY_PAREN_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_COMMA_FRONT(sign), \
+ 0 BOOST_PP_TUPLE_EAT(1) \
+ , \
+ 0 BOOST_PP_TUPLE_EAT(1) \
+ ))(sign)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_TRAIT_(sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_IS_EMPTY_(sign), \
+ (0, ()) /* empty array for no result type */ \
+ BOOST_PP_TUPLE_EAT(1) \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE \
+ )(sign)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_SIGN_(sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_IS_EMPTY_(sign), \
+ sign BOOST_PP_TUPLE_EAT(1) /* no result_type to skip */ \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_TYPE /* skip result_type */ \
+ )(sign)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_RESULT_TYPE(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_TRAIT_, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE_SIGN_)
+
+// PUBLIC //
+
+// Expand to `(comma_n, (result_type_token1, ...))` (array for unwrapped
+// commas, 0-size array if no result type for constructors and destructors).
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_RESULT_TYPE(func_traits) \
+ BOOST_PP_ARRAY_ELEM(10, func_traits)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func/static.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func/static.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,43 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_TRAITS_STATIC_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_STATIC_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/keyword.hpp>
+#include <contract/detail/preprocessor/keyword/static.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_STATIC_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* optional trait */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_STATIC_FRONT, static)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_STATIC_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_STATIC_REMOVE_FRONT)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_STATIC(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_STATIC_TRAIT_, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_STATIC_SIGN_)
+
+// PUBLIC //
+
+// Expand to `[static]`.
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_STATIC(func_traits) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_, \
+ BOOST_PP_ARRAY_ELEM(7, func_traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func/template.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func/template.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,75 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_HPP_
+
+#include <contract/detail/preprocessor/traits/template_param.hpp>
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/list.hpp>
+#include <contract/detail/preprocessor/array/first_n.hpp>
+#include <contract/detail/preprocessor/array/rest_n.hpp>
+#include <contract/detail/preprocessor/array/rem.hpp>
+#include <contract/detail/preprocessor/keyword/template.hpp>
+#include <boost/preprocessor/tuple/rem.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_TRAIT_(sign) \
+ ( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TEMPLATE_FRONT(sign) \
+ , \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAMS_TRAITS(sign) \
+ )
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_REMOVE_template \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_TAGGED_LIST(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TEMPLATE_FRONT, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_REMOVE_)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_INDEX_ 2
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_TEMPLATE(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_TRAIT_, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_SIGN_)
+
+// PUBLIC //
+
+// Expand to 1 iff it is a template (even if no params `template<>`).
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_IS_TEMPLATE(func_traits) \
+ BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_ARRAY_ELEM( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_INDEX_, func_traits))
+
+// Expand to pp-list of template params (see `TEMPLATE_PARAM_TRAITS` macros).
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_PARAMS(func_traits) \
+ BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_ARRAY_ELEM( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_INDEX_, func_traits))
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_REPLACE( \
+ func_traits, template_sign) \
+ /* can't use ARRAY_REPLACE here because it has reentrancy _D */ \
+ ( BOOST_PP_ARRAY_SIZE(func_traits), \
+ ( \
+ CONTRACT_DETAIL_PP_ARRAY_REM(CONTRACT_DETAIL_PP_ARRAY_FIRST_N( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_INDEX_, \
+ func_traits)) \
+ , CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_TRAIT_(template_sign) \
+ , CONTRACT_DETAIL_PP_ARRAY_REM(CONTRACT_DETAIL_PP_ARRAY_REST_N( \
+ BOOST_PP_INC( \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_TEMPLATE_INDEX_),\
+ func_traits)) \
+ ) )
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func/virtual.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func/virtual.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,43 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_TRAITS_VIRTUAL_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_VIRTUAL_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/keyword.hpp>
+#include <contract/detail/preprocessor/keyword/virtual.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_VIRTUAL_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* optional trait */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_VIRTUAL_FRONT, virtual)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_VIRTUAL_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_VIRTUAL_REMOVE_FRONT)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_VIRTUAL(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_VIRTUAL_TRAIT_, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_VIRTUAL_SIGN_)
+
+// PUBLIC //
+
+// Expand to `[virtual]`.
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_VIRTUAL(func_traits) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_, \
+ BOOST_PP_ARRAY_ELEM(8, func_traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func/volatile.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func/volatile.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,44 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_TRAITS_VOLATILE_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_VOLATILE_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/keyword.hpp>
+#include <contract/detail/preprocessor/traits/aux_/nil.hpp>
+#include <contract/detail/preprocessor/keyword/volatile.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_VOLATILE_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* optional trait */ \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_VOLATILE_FRONT, volatile)
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_VOLATILE_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_KEYWORD(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_VOLATILE_REMOVE_FRONT)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_AUX_VOLATILE(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY(traits_sign, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_VOLATILE_TRAIT_, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS_VOLATILE_SIGN_)
+
+// PUBLIC //
+
+// Expand to `[volatile]`.
+#define CONTRACT_DETAIL_PP_FUNC_TRAITS_VOLATILE(func_traits) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_, \
+ BOOST_PP_ARRAY_ELEM(15, func_traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func_param.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func_param.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,37 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_HPP_
+
+// Default value already processed, header included for user to access traits.
+#include <contract/detail/preprocessor/traits/func_param/default.hpp>
+
+#include <contract/detail/preprocessor/traits/func_param/classifier.hpp>
+#include <contract/detail/preprocessor/traits/func_param/type.hpp>
+#include <contract/detail/preprocessor/traits/func_param/name.hpp>
+#include <contract/detail/preprocessor/traits/aux_/nil.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+
+// PUBLIC //
+
+// Expand to template parameter traits (inspect with FUNC_PARAM_TRAITS).
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS(fparam_sign) \
+ BOOST_PP_TUPLE_ELEM(2, 0, \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_AUX_NAME( \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_AUX_TYPE( \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_AUX_CLASSIFIER( \
+ ( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* no traits to start with */ \
+ , \
+ fparam_sign \
+ /* no trailing NIL because always name at end */ \
+ ) \
+ ))))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func_param/classifier.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func_param/classifier.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,129 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply_1.hpp>
+#include <contract/detail/preprocessor/traits/aux_/nil.hpp>
+#include <contract/detail/preprocessor/keyword/contract/deduce.hpp>
+#include <contract/detail/preprocessor/keyword/contract/in.hpp>
+#include <contract/detail/preprocessor/keyword/contract/out.hpp>
+#include <contract/detail/preprocessor/keyword/register.hpp>
+#include <contract/detail/preprocessor/keyword/auto.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+// Second `auto` is for named parameter any type.
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER_AUTO_2ND_(sign) \
+ BOOST_PP_EXPR_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_AUTO_FRONT(sign), \
+ auto \
+ )
+
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER_REQUIRES_(sign) \
+ BOOST_PP_EXPR_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_REQUIRES_FRONT(sign), \
+ requires \
+ ) \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER_AUTO_2ND_( \
+ CONTRACT_DETAIL_PP_KEYWORD_REQUIRES_REMOVE_FRONT(sign))
+
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER_OUT_(sign) \
+ BOOST_PP_EXPR_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_OUT_FRONT(sign), \
+ out \
+ ) \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER_REQUIRES_( \
+ CONTRACT_DETAIL_PP_KEYWORD_OUT_REMOVE_FRONT(sign))
+
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER_IN_(sign) \
+ BOOST_PP_EXPR_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_IN_FRONT(sign), \
+ in \
+ ) \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER_OUT_( \
+ CONTRACT_DETAIL_PP_KEYWORD_IN_REMOVE_FRONT(sign))
+
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER_DEDUCE_(sign) \
+ BOOST_PP_EXPR_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_DEDUCE_FRONT(sign), \
+ deduce \
+ ) \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER_IN_( \
+ CONTRACT_DETAIL_PP_KEYWORD_DEDUCE_REMOVE_FRONT(sign))
+
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER_REGISTER_(sign) \
+ BOOST_PP_EXPR_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_REGISTER_FRONT(sign), \
+ register \
+ ) \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER_DEDUCE_( \
+ CONTRACT_DETAIL_PP_KEYWORD_REGISTER_REMOVE_FRONT(sign))
+
+// First `auto` is for storage classifiers.
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER_AUTO_1ST_(sign) \
+ BOOST_PP_EXPR_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_AUTO_FRONT(sign), \
+ auto \
+ ) \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER_REGISTER_( \
+ CONTRACT_DETAIL_PP_KEYWORD_AUTO_REMOVE_FRONT(sign))
+
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* optional trait */ \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER_AUTO_1ST_(sign)
+
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER_TRAIT_xx(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* optional trait */ \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_AUTO_FRONT(sign), \
+ auto BOOST_PP_TUPLE_EAT(1) /* auto for storage classifier */ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_REGISTER_FRONT(sign), \
+ register BOOST_PP_TUPLE_EAT(1) \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_DEDUCE_FRONT(sign), \
+ deduce CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER_IN_xx \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_IN_FRONT(sign), \
+ in CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER_OUT_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_OUT_FRONT(sign), \
+ out CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER_REQUIRES_ \
+ , \
+ BOOST_PP_TUPLE_EAT(1) /* empty (for not classified pos param) */ \
+ )))))( /* the following removal order is important */ \
+ CONTRACT_DETAIL_PP_KEYWORD_OUT_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_IN_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_DEDUCE_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_REGISTER_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_AUTO_REMOVE_FRONT( \
+ sign \
+ ))))) \
+ )
+
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER_SIGN_(sign) \
+ /* the following removal order is important */ \
+ CONTRACT_DETAIL_PP_KEYWORD_REQUIRES_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_AUTO_REMOVE_FRONT( /* named param any type */ \
+ CONTRACT_DETAIL_PP_KEYWORD_OUT_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_IN_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_DEDUCE_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_REGISTER_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_AUTO_REMOVE_FRONT( /* storage classifier */ \
+ sign \
+ )))))))
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_AUX_CLASSIFIER(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY_INIT_1(traits_sign, \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER_TRAIT_, \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER_SIGN_)
+
+// PUBLIC //
+
+// Expand to `[deduce] in | out | in out [auto | requires]` for named params,
+// or `[auto | register]` for positional param.
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER(fparam_traits) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_, \
+ BOOST_PP_ARRAY_ELEM(0, BOOST_PP_TUPLE_ELEM(2, 0, fparam_traits)))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func_param/default.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func_param/default.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_DEFAULT_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_DEFAULT_HPP_
+
+#include <boost/preprocessor/tuple/elem.hpp>
+
+// PUBLIC //
+
+// Expand to `(comma_n, (default_value_token1, ...))` (array for unwrapped
+// commas, 0-size array if no default value).
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_DEFAULT(fparam) \
+ BOOST_PP_TUPLE_ELEM(2, 1, fparam)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func_param/name.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func_param/name.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,31 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply_1.hpp>
+#include <boost/preprocessor/tuple/rem.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_AUX_NAME(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY_1(traits_sign, \
+ /* there's nothing else left in sign (no trailing nil) */ \
+ BOOST_PP_TUPLE_REM(1), \
+ BOOST_PP_TUPLE_REM(1))
+
+// PUBLIC //
+
+// Expand to parameter name.
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME(fparam_traits) \
+ BOOST_PP_ARRAY_ELEM(2, BOOST_PP_TUPLE_ELEM(2, 0, fparam_traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/func_param/type.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/func_param/type.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,82 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_TYPE_HPP_
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_TYPE_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply_1.hpp>
+#include <contract/detail/preprocessor/traits/aux_/type.hpp>
+#include <contract/detail/preprocessor/keyword/contract/requires.hpp>
+#include <contract/detail/preprocessor/keyword/contract/deduce.hpp>
+#include <contract/detail/preprocessor/keyword/auto.hpp>
+#include <contract/detail/preprocessor/keyword/void.hpp>
+#include <contract/detail/preprocessor/keyword/using.hpp>
+#include <contract/detail/preprocessor/keyword/namespace.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+#include <boost/preprocessor/array/push_front.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_TYPE_NO_(sign, after01) \
+ BOOST_PP_IIF(after01, \
+ sign \
+ , \
+ (0, ()) /* no type */ \
+ )
+
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_TYPE_YES_(sign, after01) \
+ BOOST_PP_IIF(after01, \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_TYPE \
+ , \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TYPE \
+ )(sign)
+
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_TYPE_(sign, after01) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_VOID_FRONT(sign), \
+ /* skip `void` for empty param list `(void)` */ \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_TYPE_NO_ \
+ , BOOST_PP_IIF(BOOST_PP_AND( /* BITAND doesn't expand properly on MSVC */ \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_USING_FRONT(sign), \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_NAMESPACE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_USING_REMOVE_FRONT(sign))), \
+ /* skip named params `using namespace tag` as it has no type */ \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_TYPE_NO_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_DEDUCE_FRONT(sign), \
+ /* skip deduced named params list `deduce( ... )` has no type */ \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_TYPE_NO_ \
+ , \
+ /* actual type or requirement (for positional and named param) */ \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_TYPE_YES_ \
+ )))(sign, after01)
+
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_AUX_TYPE_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_TYPE_(sign, 0 /* current */)
+
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_AUX_TYPE_SIGN_(sign) \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_TYPE_(sign, 1 /* after */)
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_AUX_TYPE(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY_1(traits_sign, \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_AUX_TYPE_TRAIT_, \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_AUX_TYPE_SIGN_)
+
+// PUBLIC //
+
+// Expand to type or named param only requirement `(n, (type_token0, ...))`
+// (0-sized array for no type (e.g., named param any type), array to handle
+// unwrapped commas).
+#define CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_TYPE(fparam_traits) \
+ BOOST_PP_ARRAY_ELEM(1, BOOST_PP_TUPLE_ELEM(2, 0, fparam_traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/oldof.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/oldof.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,17 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_OLDOF_TRAITS_HPP_
+#define CONTRACT_DETAIL_PP_OLDOF_TRAITS_HPP_
+
+// Old-of already parsed but headers included for user to access these traits.
+#include <contract/detail/preprocessor/traits/oldof/type.hpp>
+#include <contract/detail/preprocessor/traits/oldof/assignment.hpp>
+#include <contract/detail/preprocessor/traits/oldof/expr.hpp>
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/oldof/assignment.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/oldof/assignment.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,20 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_OLDOF_TRAITS_ASSIGNMENT_HPP_
+#define CONTRACT_DETAIL_PP_OLDOF_TRAITS_ASSIGNMENT_HPP_
+
+#include <boost/preprocessor/array/elem.hpp>
+
+// PUBLIC //
+
+// Expand to `variable =`.
+#define CONTRACT_DETAIL_PP_OLDOF_TRAITS_ASSIGNMENT(oldof_traits) \
+ BOOST_PP_ARRAY_ELEM(1, oldof_traits)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/oldof/expr.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/oldof/expr.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,20 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_OLDOF_TRAITS_EXPR_HPP_
+#define CONTRACT_DETAIL_PP_OLDOF_TRAITS_EXPR_HPP_
+
+#include <boost/preprocessor/array/elem.hpp>
+
+// PUBLIC //
+
+// Expand to `expression`.
+#define CONTRACT_DETAIL_PP_OLDOF_TRAITS_EXPR(oldof_traits) \
+ BOOST_PP_ARRAY_ELEM(2, oldof_traits)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/oldof/type.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/oldof/type.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_OLDOF_TRAITS_TYPE_HPP_
+#define CONTRACT_DETAIL_PP_OLDOF_TRAITS_TYPE_HPP_
+
+#include <boost/preprocessor/array/elem.hpp>
+
+// PUBLIC //
+
+// Expand to `(n, (type_token0, ...))` (array for unwrapped commas, 0-size
+// array for no old-of type specified).
+#define CONTRACT_DETAIL_PP_OLDOF_TRAITS_TYPE(oldof_traits) \
+ BOOST_PP_ARRAY_ELEM(0, oldof_traits)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/params.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/params.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,76 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_PARAMS_TRAITS_HPP_
+#define CONTRACT_DETAIL_PP_PARAMS_TRAITS_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply.hpp>
+#include <contract/detail/preprocessor/traits/aux_/list.hpp>
+#include <contract/detail/preprocessor/traits/aux_/nil.hpp>
+#include <contract/detail/preprocessor/traits/params/void.hpp>
+#include <contract/detail/preprocessor/traits/params/namespace.hpp>
+#include <contract/detail/preprocessor/traits/params/group.hpp>
+#include <contract/detail/preprocessor/traits/func_param.hpp>
+#include <contract/detail/preprocessor/keyword/template.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/facilities/expand.hpp>
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/arithmetic/dec.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/list/adt.hpp>
+#include <boost/preprocessor/list/at.hpp>
+#include <boost/preprocessor/list/size.hpp>
+#include <boost/preprocessor/list/first_n.hpp>
+#include <boost/preprocessor/list/append.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PUBLIC //
+
+// Expand to 4-tuple `(NIL tag_namespace, positional_params, named_params,
+// deduced_params)` (params are all pp-list and they are NIL is no params).
+#define CONTRACT_DETAIL_PP_TEMPLATE_PARAMS_TRAITS(sign) \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_AUX_GROUP( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_AUX_NAMESPACE( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_AUX_VOID( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST( \
+ sign \
+ , 1 /* might be empty (for tpl specializations) */ \
+ , 1 /* might have defaults */ \
+ , CONTRACT_DETAIL_PP_KEYWORD_IS_TEMPLATE_FRONT \
+ , CONTRACT_DETAIL_PP_KEYWORD_TEMPLATE_REMOVE_FRONT \
+ , CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS \
+ ) \
+ , CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_NAME \
+ ) \
+ , CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_NAME \
+ ) \
+ , CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND \
+ )
+
+// Expand to 4-tuple `(NIL tag_namespace, positional_params, named_params,
+// deduced_params)` (params are all pp-list and they are NIL is no params).
+#define CONTRACT_DETAIL_PP_FUNC_PARAMS_TRAITS(sign) \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_AUX_GROUP( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_AUX_NAMESPACE( \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_AUX_VOID( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_LIST( \
+ sign \
+ , 1 /* might be empty */ \
+ , 1 /* might have defaults */ \
+ , CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS \
+ ) \
+ , CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME \
+ ) \
+ , CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_NAME \
+ ) \
+ , CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_CLASSIFIER \
+ )
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/params/group.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/params/group.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,140 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_PARAMS_TRAITS_GROUP_HPP_
+#define CONTRACT_DETAIL_PP_PARAMS_TRAITS_GROUP_HPP_
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_PARAMS_TRAITS_GROUP_POSITIONAL_(d, p, \
+ tag_namespace, positional_params, named_params, deduced_params, \
+ param_classifier_macro) \
+ ( \
+ tag_namespace \
+ , \
+ BOOST_PP_LIST_APPEND(positional_params, (p, BOOST_PP_NIL)) \
+ , \
+ named_params \
+ , \
+ deduced_params \
+ , \
+ param_classifier_macro \
+ )
+
+#define CONTRACT_DETAIL_PP_PARAMS_TRAITS_GROUP_NAMED_(d, p, \
+ tag_namespace, positional_params, named_params, deduced_params, \
+ param_classifier_macro) \
+ ( \
+ tag_namespace \
+ , \
+ positional_params \
+ , \
+ BOOST_PP_LIST_APPEND(named_params, (p, BOOST_PP_NIL)) \
+ , \
+ deduced_params \
+ , \
+ param_classifier_macro \
+ )
+
+#define CONTRACT_DETAIL_PP_PARAMS_TRAITS_GROUP_DEDUCED_(d, p, \
+ tag_namespace, positional_params, named_params, deduced_params, \
+ param_classifier_macro) \
+ ( \
+ tag_namespace \
+ , \
+ positional_params \
+ , \
+ named_params \
+ , \
+ BOOST_PP_LIST_APPEND(deduced_params, (p, BOOST_PP_NIL)) \
+ , \
+ param_classifier_macro \
+ )
+
+#define CONTRACT_DETAIL_PP_PARAMS_TRAITS_GROUP_BY_CLASSIFIER_(d, p, \
+ tag_namespace, positional_params, named_params, deduced_params, \
+ param_classifier_macro) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_DEDUCE_FRONT( \
+ param_classifier_macro(p)), \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_GROUP_DEDUCED_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_IN_FRONT( /* also `in out` */ \
+ param_classifier_macro(p)), \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_GROUP_NAMED_ \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_OUT_FRONT( \
+ param_classifier_macro(p)), \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_GROUP_NAMED_ \
+ , \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_GROUP_POSITIONAL_ \
+ )))(d, p, tag_namespace, positional_params, named_params, deduced_params, \
+ param_classifier_macro)
+
+#define CONTRACT_DETAIL_PP_PARAMS_TRAITS_GROUP_TUPLE_( \
+ d, tag_positional_named_deduced_classifier, p) \
+ BOOST_PP_IIF(BOOST_PP_IS_EMPTY( \
+ /* only positional param can have EMPTY classifier */ \
+ BOOST_PP_TUPLE_ELEM(5, 4, \
+ tag_positional_named_deduced_classifier)(p)), \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_GROUP_POSITIONAL_ \
+ , \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_GROUP_BY_CLASSIFIER_ \
+ )(d, p, \
+ BOOST_PP_TUPLE_ELEM(5, 0, tag_positional_named_deduced_classifier), \
+ BOOST_PP_TUPLE_ELEM(5, 1, tag_positional_named_deduced_classifier), \
+ BOOST_PP_TUPLE_ELEM(5, 2, tag_positional_named_deduced_classifier), \
+ BOOST_PP_TUPLE_ELEM(5, 3, tag_positional_named_deduced_classifier), \
+ BOOST_PP_TUPLE_ELEM(5, 4, tag_positional_named_deduced_classifier) \
+ )
+
+#define CONTRACT_DETAIL_PP_PARAMS_TRAITS_GROUP_TUPLE_5TO4_( \
+ tag_positional_named_deduced_classifier) \
+ ( \
+ BOOST_PP_TUPLE_ELEM(5, 0, tag_positional_named_deduced_classifier) \
+ , \
+ BOOST_PP_TUPLE_ELEM(5, 1, tag_positional_named_deduced_classifier) \
+ , \
+ BOOST_PP_TUPLE_ELEM(5, 2, tag_positional_named_deduced_classifier) \
+ , \
+ BOOST_PP_TUPLE_ELEM(5, 3, tag_positional_named_deduced_classifier) \
+ )
+
+// PRIVATE //
+
+// Group params pp-list into positional, named, and deduced.
+#define CONTRACT_DETAIL_PP_PARAMS_TRAITS_AUX_GROUP( \
+ namespace_params, param_classifier_macro) \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_GROUP_TUPLE_5TO4_( \
+ BOOST_PP_LIST_FOLD_LEFT(CONTRACT_DETAIL_PP_PARAMS_TRAITS_GROUP_TUPLE_, \
+ ( \
+ BOOST_PP_TUPLE_ELEM(2, 0, namespace_params) \
+ , \
+ BOOST_PP_NIL /* positinal params */ \
+ , \
+ BOOST_PP_NIL /* named params */ \
+ , \
+ BOOST_PP_NIL /* deduced params */ \
+ , \
+ param_classifier_macro \
+ ) \
+ , BOOST_PP_TUPLE_ELEM(2, 1, namespace_params) \
+ ))
+
+// PUBLIC //
+
+// Expand to pp-list of positional params (see PARAM_TRAITS).
+#define CONTRACT_DETAIL_PP_PARAMS_TRAITS_POSITIONAL(params_traits) \
+ BOOST_PP_TUPLE_ELEM(4, 1, params_traits)
+
+// Expand to pp-list of named (induced) params (see PARAM_TRAITS).
+#define CONTRACT_DETAIL_PP_PARAMS_TRAITS_NAMED(params_traits) \
+ BOOST_PP_TUPLE_ELEM(4, 2, params_traits)
+
+// Expand to pp-list of (named) deduced params (see PARAM_TRAITS).
+#define CONTRACT_DETAIL_PP_PARAMS_TRAITS_DEDUCED(params_traits) \
+ BOOST_PP_TUPLE_ELEM(4, 3, params_traits)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/params/namespace.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/params/namespace.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,67 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_PARAMS_TRAITS_NAMESPACE_HPP_
+#define CONTRACT_DETAIL_PP_PARAMS_TRAITS_NAMESPACE_HPP_
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_PARAMS_TRAITS_NAMESPACE_GET_( \
+ params, param_name_macro) \
+ ( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* optional trait */ \
+ CONTRACT_DETAIL_PP_KEYWORD_NAMESPACE_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_USING_REMOVE_FRONT( \
+ param_name_macro(BOOST_PP_LIST_FIRST(params)))) \
+ , \
+ BOOST_PP_LIST_REST(params) \
+ )
+
+// Precondition: size(params) >= 1 (i.e., is_cons(params)).
+#define CONTRACT_DETAIL_PP_PARAMS_TRAITS_NAMESPACE_CHECK_( \
+ params, param_name_macro) \
+ BOOST_PP_IIF(BOOST_PP_BITAND( \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_USING_FRONT( \
+ param_name_macro(BOOST_PP_LIST_FIRST(params))), \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_NAMESPACE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_USING_REMOVE_FRONT( \
+ param_name_macro(BOOST_PP_LIST_FIRST(params))))), \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_NAMESPACE_GET_ \
+ , \
+ ( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* no tag-namespace */ \
+ , \
+ params \
+ ) \
+ BOOST_PP_TUPLE_EAT(2) \
+ )(params, param_name_macro)
+
+// PROTECTED //
+
+// Expand to 2-tuple `(tag_namespace, params)`.
+#define CONTRACT_DETAIL_PP_PARAMS_TRAITS_AUX_NAMESPACE( \
+ params, param_name_macro) \
+ BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(params), \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_NAMESPACE_CHECK_ \
+ , \
+ ( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* no tag-namespace */ \
+ , \
+ params \
+ ) \
+ BOOST_PP_TUPLE_EAT(2) \
+ )(params, param_name_macro)
+
+// PUBLIC //
+
+// Expand to `[tag_namespace]` (empty is not specified).
+#define CONTRACT_DETAIL_PP_PARAMS_TRAITS_NAMESPACE(params_traits) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_, \
+ BOOST_PP_TUPLE_ELEM(4, 0, params_traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/params/void.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/params/void.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,33 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_PARAMS_TRAITS_VOID_HPP_
+#define CONTRACT_DETAIL_PP_PARAMS_TRAITS_VOID_HPP_
+
+// PRIVATE //
+
+// Precondition: size(params) == 1.
+#define CONTRACT_DETAIL_PP_PARAMS_TRAITS_CHECK_VOID_(params, param_name_macro) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_VOID_FRONT( /* false if unary */\
+ param_name_macro(BOOST_PP_LIST_FIRST(params))), \
+ BOOST_PP_NIL /* `(func_name)( void )` returns empty param pp-list */ \
+ , \
+ params \
+ )
+
+// PROTECTED //
+
+// Expand to nil pp-list if params is `(void, NIL)`.
+#define CONTRACT_DETAIL_PP_PARAMS_TRAITS_AUX_VOID(params, param_name_macro) \
+ BOOST_PP_IIF(BOOST_PP_EQUAL(BOOST_PP_LIST_SIZE(params), 1), \
+ CONTRACT_DETAIL_PP_PARAMS_TRAITS_CHECK_VOID_ \
+ , \
+ params BOOST_PP_TUPLE_EAT(2) \
+ )(params, param_name_macro)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/static_assert.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/static_assert.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,30 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_STATIC_ASSERT_TRAITS_HPP_
+#define CONTRACT_DETAIL_PP_STATIC_ASSERT_TRAITS_HPP_
+
+#include <contract/detail/preprocessor/keyword/cxx11/static_assert.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+
+// PUBLIC //
+
+// Where static_assert_instruction is `static_assert(condition, error)`.
+#define CONTRACT_DETAIL_PP_STATIC_ASSERT_TRAITS(static_assert_instruction) \
+ CONTRACT_DETAIL_PP_KEYWORD_STATIC_ASSERT_REMOVE_FRONT( \
+ static_assert_instruction)
+
+#define CONTRACT_DETAIL_PP_STATIC_ASSERT_TRAITS_CONDITION( \
+ static_assert_traits) \
+ BOOST_PP_TUPLE_ELEM(2, 0, static_assert_traits)
+
+#define CONTRACT_DETAIL_PP_STATIC_ASSERT_TRAITS_ERROR( \
+ static_assert_traits) \
+ BOOST_PP_TUPLE_ELEM(2, 1, static_assert_traits)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/template_param.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/template_param.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,37 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_HPP_
+#define CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_HPP_
+
+// Default value already processed, header included for user to access traits.
+#include <contract/detail/preprocessor/traits/template_param/default.hpp>
+
+#include <contract/detail/preprocessor/traits/template_param/kind.hpp>
+#include <contract/detail/preprocessor/traits/template_param/requirement.hpp>
+#include <contract/detail/preprocessor/traits/template_param/name.hpp>
+#include <contract/detail/preprocessor/traits/aux_/nil.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+
+// PUBLIC //
+
+// Expand to template parameter traits (inspect with TEMPLATE_PARAM_TRAITS).
+#define CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS(tparam_sign) \
+ BOOST_PP_TUPLE_ELEM(2, 0, \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_AUX_NAME( \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_AUX_REQUIREMENT( \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_AUX_KIND( \
+ ( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* no traits to start with */ \
+ , \
+ tparam_sign \
+ /* no trailing NIL because always name at end */ \
+ ) \
+ ))))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/template_param/default.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/template_param/default.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_DEFAULT_HPP_
+#define CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_DEFAULT_HPP_
+
+#include <boost/preprocessor/tuple/elem.hpp>
+
+// PUBLIC //
+
+// Expand to `(comma_n, (default_value_token1, ...))` (array for unwrapped
+// commas, 0-size array if no default value).
+#define CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_DEFAULT(tparam) \
+ BOOST_PP_TUPLE_ELEM(2, 1, tparam)
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/template_param/kind.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/template_param/kind.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,138 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND_HPP_
+#define CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply_1.hpp>
+#include <contract/detail/preprocessor/traits/aux_/list_1.hpp>
+#include <contract/detail/preprocessor/traits/aux_/nil.hpp>
+#include <contract/detail/preprocessor/keyword/contract/deduce.hpp>
+#include <contract/detail/preprocessor/keyword/contract/in.hpp>
+#include <contract/detail/preprocessor/keyword/contract/out.hpp>
+#include <contract/detail/preprocessor/keyword/typename.hpp>
+#include <contract/detail/preprocessor/keyword/class.hpp>
+#include <contract/detail/preprocessor/keyword/template.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/rem.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PRIVATE //
+
+// Cannot use PP_TUPLE_REM for reentrancy on GCC with C++0x.
+#define CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND_REM_(tokens) tokens
+
+#define CONTRACT_DETAIL_PP_TEMPLATE_PARAM_REQUIRES_AUTO_(sign) \
+ BOOST_PP_EXPR_IF(CONTRACT_DETAIL_PP_KEYWORD_IS_REQUIRES_FRONT(sign), \
+ requires \
+ ) \
+ BOOST_PP_EXPR_IF(CONTRACT_DETAIL_PP_KEYWORD_IS_AUTO_FRONT(sign), \
+ auto /* named value template parameter any type */ \
+ )
+
+#define CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND_TPL_REMOVE_template\
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_REMOVE
+
+#define CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND_TPL_YES_( \
+ sign) \
+ template( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_TAGGED_LIST_1(sign, \
+ 1, /* might be empty */ \
+ 0, /* no defaults (use usual `=` instead) */ \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TEMPLATE_FRONT, \
+ CONTRACT_DETAIL_PP_KEYWORD_TEMPLATE_REMOVE_FRONT, \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND_REM_) \
+ ) \
+ BOOST_PP_EXPR_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_CLASS_FRONT( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_TAGGED_LIST(sign, \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TEMPLATE_FRONT, \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND_TPL_REMOVE_)), \
+ class \
+ )
+
+#define CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND_TPL_(sign) \
+ /* template tparam `template(tparam_list) class` */ \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_TEMPLATE_FRONT(sign), \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND_TPL_YES_ \
+ , \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(sign)
+
+#define CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND_TPL_REQUIRES_AUTO_(sign) \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND_TPL_(sign) \
+ /* requires and auto (named params only ) */ \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_REQUIRES_AUTO_( \
+ CONTRACT_DETAIL_PP_KEYWORD_CLASS_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_TAGGED_LIST( \
+ sign \
+ , CONTRACT_DETAIL_PP_KEYWORD_IS_TEMPLATE_FRONT \
+ , CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND_TPL_REMOVE_ \
+ )))
+
+#define CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND_TRAIT_(sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_NIL /* optional trait */ \
+ BOOST_PP_EXPR_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_DEDUCE_FRONT(sign), \
+ deduce \
+ ) \
+ BOOST_PP_EXPR_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_IN_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_DEDUCE_REMOVE_FRONT(sign)), \
+ in \
+ ) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_TYPENAME_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_IN_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_DEDUCE_REMOVE_FRONT(sign))), \
+ BOOST_PP_IDENTITY(typename) \
+ , BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_CLASS_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_IN_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_DEDUCE_REMOVE_FRONT(sign))), \
+ BOOST_PP_IDENTITY(class) \
+ , BOOST_PP_EMPTY \
+ ))() \
+ /* template tparam `template(tparam_list) class` */ \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND_TPL_REQUIRES_AUTO_( \
+ /* the following removal order matters */ \
+ CONTRACT_DETAIL_PP_KEYWORD_CLASS_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_TYPENAME_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_IN_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_DEDUCE_REMOVE_FRONT( \
+ sign \
+ )))))
+
+#define CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND_SIGN_(sign) \
+ /* the following removal order matters */ \
+ CONTRACT_DETAIL_PP_KEYWORD_AUTO_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_REQUIRES_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_CLASS_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_AFTER_TAGGED_LIST( \
+ CONTRACT_DETAIL_PP_KEYWORD_TYPENAME_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_CLASS_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_IN_REMOVE_FRONT( \
+ CONTRACT_DETAIL_PP_KEYWORD_DEDUCE_REMOVE_FRONT( \
+ sign \
+ )))), \
+ CONTRACT_DETAIL_PP_KEYWORD_IS_TEMPLATE_FRONT, \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND_TPL_REMOVE_ \
+ ))))
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_AUX_KIND(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY_INIT_1(traits_sign, \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND_TRAIT_, \
+ CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND_SIGN_)
+
+// PUBLIC //
+
+// Expand to `[deduce] [in] [typename | class | template(tparam_list) class]
+// [auto | requires]` (empty for positional value tparam).
+#define CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_KIND(tparam_traits) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_TRAITS_AUX_NIL_REMOVE_, \
+ BOOST_PP_ARRAY_ELEM(0, BOOST_PP_TUPLE_ELEM(2, 0, tparam_traits)))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/template_param/name.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/template_param/name.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,31 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_NAME_HPP_
+#define CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_NAME_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply_1.hpp>
+#include <boost/preprocessor/tuple/rem.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_AUX_NAME(traits_sign) \
+ CONTRACT_DETAIL_PP_TRAITS_AUX_APPLY_1(traits_sign, \
+ /* there's nothing else left in sign (no trailing nil) */ \
+ BOOST_PP_TUPLE_REM(1), \
+ BOOST_PP_TUPLE_REM(1))
+
+// PUBLIC //
+
+// Expand to parameter name.
+#define CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_NAME(tparam_traits) \
+ BOOST_PP_ARRAY_ELEM(2, BOOST_PP_TUPLE_ELEM(2, 0, tparam_traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/traits/template_param/requirement.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/traits/template_param/requirement.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,33 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_REQUIREMENT_HPP_
+#define CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_REQUIREMENT_HPP_
+
+#include <contract/detail/preprocessor/traits/aux_/apply_1.hpp>
+#include <contract/detail/preprocessor/traits/aux_/type.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// PROTECTED //
+
+#define CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_AUX_REQUIREMENT(traits_sign) \
+ /* reuse func param parsing */ \
+ CONTRACT_DETAIL_PP_FUNC_PARAM_TRAITS_AUX_TYPE(traits_sign)
+
+// PUBLIC //
+
+// Expand to type or named param only requirement `(n, (type_token0, ...))`
+// (0-sized array for no type (e.g., named param any type), array to handle
+// unwrapped commas).
+#define CONTRACT_DETAIL_PP_TEMPLATE_PARAM_TRAITS_REQUIREMENT(tparam_traits) \
+ BOOST_PP_ARRAY_ELEM(1, BOOST_PP_TUPLE_ELEM(2, 0, tparam_traits))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/tuple/split-generate.py
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/tuple/split-generate.py 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,85 @@
+
+# Copyright (C) 2008-2012 Lorenzo Caminiti
+# Distributed under 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)
+# Home at http://sourceforge.net/projects/contractpp
+
+import sys
+import shutil
+
+def placeholders(start, stop):
+ (s, comma) = ('', '')
+ for i in range(start, stop):
+ (s, comma) = (s + comma + '_' + str(i + 1), ', ')
+ return s
+
+def data(max_size):
+ s = ''
+ for size in range(1, max_size + 1):
+ s = s + '''
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_{0}({1}) \\
+ ({1}) , /* comma splits */ \
+'''.format(size, placeholders(0, size))
+ return s
+
+BOOST_PP_LIMIT_TUPLE = raw_input("BOOST_PP_LIMIT_TUPLE" +
+ " from <boost/preprocessor/limit.hpp> [64] = ")
+if BOOST_PP_LIMIT_TUPLE == "": BOOST_PP_LIMIT_TUPLE = 64
+else: BOOST_PP_LIMIT_TUPLE = int(BOOST_PP_LIMIT_TUPLE)
+
+header = sys.argv[0].replace("-generate.py", ".hpp", 1)
+shutil.copyfile(header, header + ".bak")
+h = open(header, 'w')
+
+h.write('''
+#ifndef CONTRACT_DETAIL_PP_TUPLE_SPLIT_HPP_
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_HPP_
+
+// WARNING: FILE AUTOMATICALLY GENERATED, DO NOT MODIFY IT!
+// Instead modify the generation script "<FILE>-generate.py" and run
+// `$ python <FILE_NAME>-generate.py > FILE_NAME.hpp`.
+// Used: #define BOOST_PP_LIMIT_TUPLE {0}
+
+#include <boost/preprocessor/limits.hpp>
+#if BOOST_PP_LIMIT_TUPLE != {0}
+#error "Code generation used incorrect BOOST_PP_LIMIT_TUPLE"
+#endif
+
+// PRIVATE //
+
+// Own version of PP_CAT for reentrancy.
+#if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+# define CONTRACT_DETAIL_PP_TUPLE_SPLIT_CAT_(a, b) \\
+ CONTRACT_DETAIL_PP_TUPLE_SPLIT_CAT_I_(a, b)
+#else
+# define CONTRACT_DETAIL_PP_TUPLE_SPLIT_CAT_(a, b) \\
+ CONTRACT_DETAIL_PP_TUPLE_SPLIT_CAT_OO_((a, b))
+# define CONTRACT_DETAIL_PP_TUPLE_SPLIT_CAT_OO_(par) \\
+ CONTRACT_DETAIL_PP_TUPLE_SPLIT_CAT_I_ ## par
+#endif
+#if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+# define CONTRACT_DETAIL_PP_TUPLE_SPLIT_CAT_I_(a, b) \\
+ a ## b
+#else
+# define CONTRACT_DETAIL_PP_TUPLE_SPLIT_CAT_I_(a, b) \\
+ CONTRACT_DETAIL_PP_TUPLE_SPLIT_CAT_II_(~, a ## b)
+# define CONTRACT_DETAIL_PP_TUPLE_SPLIT_CAT_II_(p, res) \\
+ res
+#endif
+
+// PUBLIC //
+
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT(size) \\
+ CONTRACT_DETAIL_PP_TUPLE_SPLIT_CAT_(CONTRACT_DETAIL_PP_TUPLE_SPLIT_, size)
+
+// DATA //
+{1}
+
+#endif // #include guard
+
+'''.format(BOOST_PP_LIMIT_TUPLE, data(BOOST_PP_LIMIT_TUPLE)))
+
+h.close()
+print "Written", header
+
Added: sandbox/contract/include/contract/detail/preprocessor/tuple/split.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/tuple/split.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,180 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_TUPLE_SPLIT_HPP_
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_HPP_
+
+// WARNING: FILE AUTOMATICALLY GENERATED, DO NOT MODIFY IT!
+// Instead modify the generation script "<FILE>-generate.py" and run
+// `$ python <FILE_NAME>-generate.py > FILE_NAME.hpp`.
+// Used: #define BOOST_PP_LIMIT_TUPLE 64
+
+#include <boost/preprocessor/limits.hpp>
+#if BOOST_PP_LIMIT_TUPLE != 64
+#error "Code generation used incorrect BOOST_PP_LIMIT_TUPLE"
+#endif
+
+// PRIVATE //
+
+// Own version of PP_CAT for reentrancy.
+#if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+# define CONTRACT_DETAIL_PP_TUPLE_SPLIT_CAT_(a, b) \
+ CONTRACT_DETAIL_PP_TUPLE_SPLIT_CAT_I_(a, b)
+#else
+# define CONTRACT_DETAIL_PP_TUPLE_SPLIT_CAT_(a, b) \
+ CONTRACT_DETAIL_PP_TUPLE_SPLIT_CAT_OO_((a, b))
+# define CONTRACT_DETAIL_PP_TUPLE_SPLIT_CAT_OO_(par) \
+ CONTRACT_DETAIL_PP_TUPLE_SPLIT_CAT_I_ ## par
+#endif
+#if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+# define CONTRACT_DETAIL_PP_TUPLE_SPLIT_CAT_I_(a, b) \
+ a ## b
+#else
+# define CONTRACT_DETAIL_PP_TUPLE_SPLIT_CAT_I_(a, b) \
+ CONTRACT_DETAIL_PP_TUPLE_SPLIT_CAT_II_(~, a ## b)
+# define CONTRACT_DETAIL_PP_TUPLE_SPLIT_CAT_II_(p, res) \
+ res
+#endif
+
+// PUBLIC //
+
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT(size) \
+ CONTRACT_DETAIL_PP_TUPLE_SPLIT_CAT_(CONTRACT_DETAIL_PP_TUPLE_SPLIT_, size)
+
+// DATA //
+
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_1(_1) \
+ (_1) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_2(_1, _2) \
+ (_1, _2) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_3(_1, _2, _3) \
+ (_1, _2, _3) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_4(_1, _2, _3, _4) \
+ (_1, _2, _3, _4) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_5(_1, _2, _3, _4, _5) \
+ (_1, _2, _3, _4, _5) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_6(_1, _2, _3, _4, _5, _6) \
+ (_1, _2, _3, _4, _5, _6) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_7(_1, _2, _3, _4, _5, _6, _7) \
+ (_1, _2, _3, _4, _5, _6, _7) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_8(_1, _2, _3, _4, _5, _6, _7, _8) \
+ (_1, _2, _3, _4, _5, _6, _7, _8) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_9(_1, _2, _3, _4, _5, _6, _7, _8, _9) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_52(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_53(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_54(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_55(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_56(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_57(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_58(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_59(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_60(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_61(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_62(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_63(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63) , /* comma splits */
+#define CONTRACT_DETAIL_PP_TUPLE_SPLIT_64(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) \
+ (_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64) , /* comma splits */
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/variadic/eat.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/variadic/eat.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,22 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_VARIADIC_EAT_HPP_
+#define CONTRACT_DETAIL_PP_VARIADIC_EAT_HPP_
+
+// Do not use Boost.PP variadic because they use a different config macro.
+#include <boost/config.hpp>
+#ifndef BOOST_NO_VARIADIC_MACROS
+
+// PUBLIC //
+
+#define CONTRACT_DETAIL_PP_VARIADIC_EAT(...) /* must expand to nothing */
+
+#endif
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/variadic/is.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/variadic/is.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,93 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_IS_VARIADIC_HPP_
+#define CONTRACT_DETAIL_PP_IS_VARIADIC_HPP_
+
+// Do not use Boost.PP variadic because they use a different config macro.
+#include <boost/config.hpp>
+#ifndef BOOST_NO_VARIADIC_MACROS
+
+#include <contract/detail/preprocessor/variadic/size.hpp>
+#include <contract/detail/preprocessor/variadic/eat.hpp>
+#include <boost/preprocessor/logical/compl.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+// `IS_UNARY` not working on Borland and other pp which have no variadic anyway.
+#include <boost/preprocessor/detail/is_unary.hpp>
+
+// PRIVATE //
+
+// Define own version of EXPAND for reentrancy.
+#if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC() && \
+ ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()
+# define CONTRACT_DETAIL_PP_IS_VARIADIC_EXPAND_(x) \
+ CONTRACT_DETAIL_PP_IS_VARIADIC_EXPAND_I_(x)
+#else
+# define CONTRACT_DETAIL_PP_IS_VARIADIC_EXPAND_(x) \
+ CONTRACT_DETAIL_PP_IS_VARIADIC_EXPAND_OO_((x))
+# define CONTRACT_DETAIL_PP_IS_VARIADIC_EXPAND_OO_(par) \
+ CONTRACT_DETAIL_PP_IS_VARIADIC_EXPAND_I_ ## par
+#endif
+#define CONTRACT_DETAIL_PP_IS_VARIADIC_EXPAND_I_(x) x
+
+#define CONTRACT_DETAIL_PP_IS_VARIADIC_UNARY_SINGLE_TOKEN_(tokens) \
+ BOOST_PP_EQUAL(1, CONTRACT_DETAIL_PP_VARIADIC_SIZE tokens)
+
+#define CONTRACT_DETAIL_PP_IS_VARIADIC_UNARY_SIGNLE_SPLIT_(...) \
+ (__VA_ARGS__),
+
+// Precondition: tokens = `(...) ...`.
+#define CONTRACT_DETAIL_PP_IS_VARIADIC_UNARY_SIGNLE_(tokens) \
+ CONTRACT_DETAIL_PP_IS_VARIADIC_UNARY_SINGLE_TOKEN_( \
+ BOOST_PP_TUPLE_ELEM(2, 0, \
+ (CONTRACT_DETAIL_PP_IS_VARIADIC_UNARY_SIGNLE_SPLIT_ tokens)) \
+ )
+
+#define CONTRACT_DETAIL_PP_IS_VARIADIC_UNARY_(tokens) \
+ CONTRACT_DETAIL_PP_IS_VARIADIC_EXPAND_( /* EXPAND for MSVC */ \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(tokens), \
+ CONTRACT_DETAIL_PP_IS_VARIADIC_UNARY_SIGNLE_ \
+ , \
+ 0 BOOST_PP_TUPLE_EAT(1) \
+ )(tokens) \
+ )
+
+// Precondition: size == 1 AND 1st token is unary.
+#define CONTRACT_DETAIL_PP_IS_VARIADIC_NOT_UNARY_2ND_(tokens) \
+ BOOST_PP_COMPL(CONTRACT_DETAIL_PP_IS_VARIADIC_UNARY_( \
+ CONTRACT_DETAIL_PP_VARIADIC_EAT tokens \
+ (1) /* handle empty (1st is unary so all unary) */ \
+ ))
+
+// Precondition: size == 1.
+#define CONTRACT_DETAIL_PP_IS_VARIADIC_NOT_UNARY_1ST_(tokens) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_IS_VARIADIC_UNARY_(tokens), \
+ CONTRACT_DETAIL_PP_IS_VARIADIC_NOT_UNARY_2ND_ \
+ , \
+ 1 BOOST_PP_TUPLE_EAT(1) /* 1st not unary thus not seq and variadic */ \
+ )(tokens)
+
+#define CONTRACT_DETAIL_PP_IS_VARIADIC_(size, ...) \
+ BOOST_PP_IIF(BOOST_PP_EQUAL(size, 1), \
+ CONTRACT_DETAIL_PP_IS_VARIADIC_NOT_UNARY_1ST_ \
+ , /* size == 0 or size > 1 */ \
+ 1 CONTRACT_DETAIL_PP_VARIADIC_EAT \
+ )(__VA_ARGS__)
+
+// PUBLIC //
+
+#define CONTRACT_DETAIL_PP_IS_VARIADIC(...) \
+ CONTRACT_DETAIL_PP_IS_VARIADIC_( \
+ CONTRACT_DETAIL_PP_VARIADIC_SIZE_MAYBE_EMPTY(__VA_ARGS__), \
+ __VA_ARGS__)
+
+#endif
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/variadic/rem.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/variadic/rem.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,22 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_VARIADIC_REM_HPP_
+#define CONTRACT_DETAIL_PP_VARIADIC_REM_HPP_
+
+// Do not use Boost.PP variadic because they use a different config macro.
+#include <boost/config.hpp>
+#ifndef BOOST_NO_VARIADIC_MACROS
+
+// PUBLIC //
+
+#define CONTRACT_DETAIL_PP_VARIADIC_REM(...) __VA_ARGS__
+
+#endif
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/variadic/size.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/variadic/size.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,63 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_VARIADIC_SIZE_HPP_
+#define CONTRACT_DETAIL_PP_VARIADIC_SIZE_HPP_
+
+// Do not use Boost.PP variadic because they use a different config macro.
+#include <boost/config.hpp>
+#ifndef BOOST_NO_VARIADIC_MACROS
+
+#include <contract/detail/preprocessor/variadic/eat.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+#include <boost/preprocessor/facilities/is_empty.hpp>
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/cat.hpp>
+// `IS_UNARY` not working on Borland and other pp which have no variadic anyway.
+#include <boost/preprocessor/detail/is_unary.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_VARIADIC_SIZE_1OR0_TOKEN_(maybe_empty) \
+ BOOST_PP_IIF(BOOST_PP_IS_EMPTY(maybe_empty (/*expand empty */) ), 0, 1)
+
+#define CONTRACT_DETAIL_PP_VARIADIC_SIZE_1OR0_(maybe_empty) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_HAS_PAREN(maybe_empty(/*exapnd empty */)), \
+ 1 BOOST_PP_TUPLE_EAT(1) \
+ , \
+ CONTRACT_DETAIL_PP_VARIADIC_SIZE_1OR0_TOKEN_ \
+ )(maybe_empty)
+
+#define CONTRACT_DETAIL_PP_VARIADIC_SIZE_HANDLE_EMPTY_(size, ...) \
+ BOOST_PP_IIF(BOOST_PP_EQUAL(size, 1), \
+ CONTRACT_DETAIL_PP_VARIADIC_SIZE_1OR0_ \
+ , \
+ size \
+ CONTRACT_DETAIL_PP_VARIADIC_EAT \
+ )(__VA_ARGS__ BOOST_PP_EMPTY)
+
+// PUBLIC //
+
+#if BOOST_MSVC
+# define CONTRACT_DETAIL_PP_VARIADIC_SIZE(...) \
+ BOOST_PP_CAT(CONTRACT_DETAIL_PP_VARIADIC_SIZE_I_(__VA_ARGS__, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1,),)
+#else // MSVC
+# define CONTRACT_DETAIL_PP_VARIADIC_SIZE(...) \
+ CONTRACT_DETAIL_PP_VARIADIC_SIZE_I_(__VA_ARGS__, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1,)
+#endif // MSVC
+#define CONTRACT_DETAIL_PP_VARIADIC_SIZE_I_(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63, size, ...) size
+
+#define CONTRACT_DETAIL_PP_VARIADIC_SIZE_MAYBE_EMPTY(...) \
+ CONTRACT_DETAIL_PP_VARIADIC_SIZE_HANDLE_EMPTY_( \
+ CONTRACT_DETAIL_PP_VARIADIC_SIZE(__VA_ARGS__), __VA_ARGS__)
+
+#endif
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/detail/preprocessor/variadic/to_seq.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/detail/preprocessor/variadic/to_seq.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,50 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_DETAIL_PP_VARIADIC_TO_SEQ_HPP_
+#define CONTRACT_DETAIL_PP_VARIADIC_TO_SEQ_HPP_
+
+// Do not use Boost.PP variadic because they use a different config macro.
+#include <boost/config.hpp>
+#ifndef BOOST_NO_VARIADIC_MACROS
+
+#include <contract/detail/preprocessor/variadic/is.hpp>
+#include <contract/detail/preprocessor/variadic/size.hpp>
+#include <contract/detail/preprocessor/variadic/rem.hpp>
+#include <contract/detail/preprocessor/variadic/eat.hpp>
+#include <boost/preprocessor/tuple/to_seq.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/control/if.hpp>
+
+// PRIVATE //
+
+#define CONTRACT_DETAIL_PP_VARIADIC_TO_SEQ_(...) \
+ BOOST_PP_TUPLE_TO_SEQ(CONTRACT_DETAIL_PP_VARIADIC_SIZE(__VA_ARGS__), \
+ (__VA_ARGS__))
+
+#define CONTRACT_DETAIL_PP_VARIADIC_TO_SEQ_NOT_EMPTY_(...) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_IS_VARIADIC(__VA_ARGS__), \
+ CONTRACT_DETAIL_PP_VARIADIC_TO_SEQ_ \
+ , \
+ CONTRACT_DETAIL_PP_VARIADIC_REM \
+ )(__VA_ARGS__)
+
+// PUBLIC //
+
+// Expand to `(arg0)(arg1)...` is __VA_ARGS__ is `arg0, arg1, ...` or already
+// `(arg0)(arg1)...`, if __VA_ARGS__ is empty `` expand to `empty_seq`.
+#define CONTRACT_DETAIL_PP_VARIADIC_TO_SEQ(empty_seq, ...) \
+ BOOST_PP_IF(CONTRACT_DETAIL_PP_VARIADIC_SIZE_MAYBE_EMPTY(__VA_ARGS__), \
+ CONTRACT_DETAIL_PP_VARIADIC_TO_SEQ_NOT_EMPTY_ \
+ , \
+ empty_seq CONTRACT_DETAIL_PP_VARIADIC_EAT \
+ )(__VA_ARGS__)
+
+#endif
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/function.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/function.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,85 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_FUNCTION_HPP_
+#define CONTRACT_FUNCTION_HPP_
+
+/** @file
+@brief Macros used to declare free functions, member functions, and operators
+with contracts (this header is automatically included by <c>contract.hpp</c>).
+*/
+
+#include <contract/aux_/macro/function.hpp>
+#include <contract/aux_/preprocessor/func_kind.hpp>
+#include <contract/detail/preprocessor/traits/func.hpp>
+#include <boost/local_function/detail/preprocessor/line_counter.hpp>
+
+/**
+@brief Macro used to declare free functions, free function operators, member
+functions, and member function operators with contracts.
+
+This macro is used to declare a function with possible preconditions and
+postconditions.
+At least all public member functions and public member function operators of a
+class with non-empty class invariants should be declared using this macro in
+order to check the class invariants (even if the functions and operators have
+no precondition and no postcondition).
+
+The semantics of a call to a function with contracts are explained in the
+@RefSect{contract_programming_overview, Contract Programming Overview} section.
+Constructors and destructors are declared using the
+@RefMacro{CONTRACT_CONSTRUCTOR} and @RefMacro{CONTRACT_DESTRUCTOR} macros
+respectively.
+
+@Params
+@Param{function_declaration,
+The function declaration syntax is explained in the @RefSect{grammar\, Grammar}
+section.
+Member functions must always repeat their access level <c>public</c>\,
+<c>protected</c>\, or <c>private</c>.
+Operators use a special syntax to specify their symbols and names.
+}
+@EndParams
+
+The @RefMacro{CONTRACT_CLASS} macro must be used to declare classes enclosing
+member functions and member function operators declared using this macro.
+
+Within a type-dependent scope (e.g., within templates), the
+@RefMacro{CONTRACT_FUNCTION_TPL} macro must be used instead of this macro.
+
+The @RefMacro{CONTRACT_FREE_BODY} and @RefMacro{CONTRACT_MEMBER_BODY} macros
+must be used when separating free and member function body definitions from the
+function declarations programmed using this macro.
+
+@SeeAlso @RefSect{tutorial, Tutorial} section.
+*/
+#define CONTRACT_FUNCTION(function_declaration) \
+ CONTRACT_AUX_FUNCTION( \
+ BOOST_LOCAL_FUNCTION_DETAIL_PP_LINE_COUNTER, \
+ 0, /* outside template */ \
+ CONTRACT_AUX_PP_FUNC_KIND_FUNCTION, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS(function_declaration))
+
+/**
+@brief Macro used to declared free functions, free function operators, member
+functions, and member function operators with contracts within a type-dependent
+scope (e.g., within templates).
+
+This macro is the exact same as @RefMacro{CONTRACT_FUNCTION} but it must be
+used when declaring functions with contracts within a type-dependent scope.
+
+@SeeAlso @RefSect{tutorial, Tutorial} section.
+*/
+#define CONTRACT_FUNCTION_TPL(function_declaration) \
+ CONTRACT_AUX_FUNCTION( \
+ BOOST_LOCAL_FUNCTION_DETAIL_PP_LINE_COUNTER, \
+ 1, /* inside template */ \
+ CONTRACT_AUX_PP_FUNC_KIND_FUNCTION, \
+ CONTRACT_DETAIL_PP_FUNC_TRAITS(function_declaration))
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/limits.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/limits.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,70 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_LIMITS_HPP_
+#define CONTRACT_LIMITS_HPP_
+
+/** @file
+@brief Macros reporting bounds of some library constructs (this header is
+automatically included by <c>contract.hpp</c>).
+
+These are <em>not</em> configuration macros so programmers cannot change these
+values.
+These macros are used to inform programmers of bounds on some of this library
+constructs.
+*/
+
+/**
+@brief Upper bound on possible maximum number of postcondition old variables.
+
+The maximum possible number of postcondition old variables is <c>15</c> (the
+actual maximum value is controlled by @RefMacro{CONTRACT_CONFIG_OLDOF_MAX}).
+
+For compilers that do not support variadic macros, this is the maximum possible
+total number of postcondition statements (total of old variable declarations,
+plus return value declaration, plus assertions, etc).
+
+@Note This is not a configuration macro.
+The value of this macro is fixed and programmers cannot change it.
+
+@SeeAlso @RefSect{tutorial, Tutorial} section,
+@RefSect{no_variadic_macros, No Variadic Macros} section.
+*/
+#define CONTRACT_LIMIT_OLDOFS 15
+
+/**
+@brief Maximum number of select assertions that can be nested into one another.
+
+The maximum number of select assertions that can be nested into one another is
+<c>5</c>.
+
+@Note This is not a configuration macro.
+The value of this macro is fixed and programmers cannot change it.
+
+@SeeAlso @RefSect{advanced_topics, Advanced Topics} section.
+*/
+#define CONTRACT_LIMIT_NESTED_SELECT_ASSERTIONS 5
+
+/**
+@brief Maximum number of catch statements for a constructor-try block with
+member initializers.
+
+The maximum number of catch statements for a constructor-try block with member
+initializers is <c>10</c>.
+(Constructor-try blocks are specified outside the
+@RefMacro{CONTRACT_CONSTRUCTOR} macro when the is no member initializers so
+this limit does not apply to that case.)
+
+@Note This is not a configuration macro.
+The value of this macro is fixed and programmers cannot change it.
+
+@SeeAlso @RefSect{advanced_topics, Advanced Topics} section.
+*/
+#define CONTRACT_LIMIT_CONSTRUCTOR_TRY_BLOCK_CATCHES 10
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/loop_variant.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/loop_variant.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,133 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_LOOP_VARIANT_HPP_
+#define CONTRACT_LOOP_VARIANT_HPP_
+
+/** @file
+@brief Macros used to specify loop variants (this header is automatically
+included by <c>contract.hpp</c>).
+*/
+
+#include <contract/aux_/loop_variant.hpp>
+#include <contract/aux_/macro/loop_variant.hpp>
+#include <contract/detail/preprocessor/variadic/to_seq.hpp>
+#include <boost/local_function/detail/preprocessor/line_counter.hpp>
+#include <boost/config.hpp>
+
+// PUBLIC //
+
+/**
+@brief Macro used to declare a loop that will specify a loop variant.
+
+This macro must be used to declare a loop that will later specify a loop
+variant using the @RefMacro{CONTRACT_LOOP_VARIANT} macro.
+
+@Params
+@Param{loop_declaration,
+This is a loop declaration (<c>for</c>\, <c>while</c>\, etc) that follows the
+usual C++ syntax (see also the @RefSect{grammar\, Grammar} section).
+}
+@EndParams
+
+@SeeAlso @RefSect{advanced_topics, Advanced Topics} section.
+*/
+// No need for LOOP_TPL because variant decl always int and never type-depend.
+#define CONTRACT_LOOP(loop_declaration) \
+ /* NOTE: this declared trick (originally from Boost.ScopeExit) allows */ \
+ /* redefine the old variant with the same name in the same scope */ \
+ /* without the "duplicate definition" compiler-error (this avoids the */ \
+ /* need to wrap the code into a local scope {...} and therefore */ \
+ /* avoiding an additional LOOP_END macro) plus it prevents the compiler */ \
+ /* warning "unused variable" in case the loop variant expression is */ \
+ /* disabled by importance ordering */ \
+ BOOST_PP_EXPR_IIF(CONTRACT_AUX_CONFIG_LOOP_VARIANTS_01, \
+ ::contract::aux::loop_variant::declared< \
+ ::contract::aux::loop_variant::resolve< \
+ sizeof(CONTRACT_AUX_CODE_LOOP_VARIANT_OLD_VAR) \
+ >::cmp1<0>::cmp2 \
+ > CONTRACT_AUX_CODE_LOOP_VARIANT_OLD_VAR; \
+ CONTRACT_AUX_CODE_LOOP_VARIANT_OLD_VAR.value = \
+ ::contract::aux::loop_variant::uninitialized; \
+ ) \
+ loop_declaration
+
+#ifndef DOXYGEN
+
+#ifndef BOOST_NO_VARIADIC_MACROS
+
+#define CONTRACT_LOOP_VARIANT(...) \
+ CONTRACT_AUX_LOOP_VARIANT( \
+ BOOST_LOCAL_FUNCTION_DETAIL_PP_LINE_COUNTER, \
+ 0 /* outside template */, \
+ CONTRACT_DETAIL_PP_VARIADIC_TO_SEQ( \
+ ERROR_loop_variant_cannot_be_empty, __VA_ARGS__))
+
+#define CONTRACT_LOOP_VARIANT_TPL(...) \
+ CONTRACT_AUX_LOOP_VARIANT( \
+ BOOST_LOCAL_FUNCTION_DETAIL_PP_LINE_COUNTER, \
+ 1 /* inside template */, \
+ CONTRACT_DETAIL_PP_VARIADIC_TO_SEQ( \
+ ERROR_loop_variant_cannot_be_empty, __VA_ARGS__))
+
+#else
+
+#define CONTRACT_LOOP_VARIANT(seq) \
+ CONTRACT_AUX_LOOP_VARIANT( \
+ BOOST_LOCAL_FUNCTION_DETAIL_PP_LINE_COUNTER, \
+ 0, /* outside template */ \
+ seq)
+
+#define CONTRACT_LOOP_VARIANT_TPL(seq) \
+ CONTRACT_AUX_LOOP_VARIANT( \
+ BOOST_LOCAL_FUNCTION_DETAIL_PP_LINE_COUNTER, \
+ 1, /* inside template */ \
+ seq)
+
+#endif
+
+#else
+
+/**
+@brief Macro used to specify a loop variant.
+
+This macro is used to specify loop variants which ensure that loops terminate.
+This macro must be used within the body <c>{ ... }</c> of a loop declared using
+the @RefMacro{CONTRACT_LOOP} macro.
+Each loop can have at most one loop variant.
+
+@Params
+@Param{loop_variant,
+The loop variant must be a non-negative integral expression that monotonically
+decreases when calculated at each subsequent loop iteration
+(constant-expressions can also be used\, see the @RefSect{grammar\, Grammar}
+section).
+}
+@EndParams
+
+Within type-dependent scope (e.g., within templates), the
+@RefMacro{CONTRACT_LOOP_VARIANT_TPL} macro must be used instead of this macro.
+
+@SeeAlso @RefSect{advanced_topics, Advanced Topics} section.
+*/
+#define CONTRACT_LOOP_VARIANT(loop_variant)
+
+/**
+@brief Macro used to specify a loop variant within a type-dependent scope
+(e.g., within templates).
+
+This macro is the exact same as @RefMacro{CONTRACT_LOOP_VARIANT} but it must be
+used when specifying loop variants within a type-dependent scope.
+
+@SeeAlso @RefSect{advanced_topics, Advanced Topics} section.
+*/
+#define CONTRACT_LOOP_VARIANT_TPL(loop_variant)
+
+#endif
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/oldof.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/oldof.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,91 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_OLDOF_HPP_
+#define CONTRACT_OLDOF_HPP_
+
+/** @file
+@brief Constructs to declare postcondition old values (this header is
+automatically included by <c>contract.hpp</c>).
+*/
+
+#include <boost/mpl/bool.hpp>
+
+/**
+@brief Macro used to refer to the old value of an expression.
+
+This macro refers the old value of the expression that follows the macro
+(i.e., the value the expression had after function entry but before body
+execution).
+This macro must be used to initialize old value declarations within
+postconditions (see also the @RefSect{grammar, Grammar} section):
+
+@code
+auto old_variable = CONTRACT_OLDOF odlof_expression
+@endcode
+
+The specified expression that follows the macro might or not be wrapped within parenthesis.
+
+The old-of expression type can be explicitly specified instead of <c>auto</c>
+but it must be wrapped within parenthesis unless it is a fundamental type
+containing no symbol.
+If not explicitly specified, the library will automatically deduce the type
+using Boost.Typeof (as always, types must be properly registered with
+Boost.Typeof for type-of emulation mode on compilers that do not support native
+type-of).
+
+@SeeAlso @RefSect{tutorial, Tutorial} section,
+@RefSect{advanced_topics, Advanced Topics} section.
+*/
+// Used to mark start of oldof expression within an oldof assignment
+// (unbalanced parenthesis `) ... (` will balance within user code).
+#define CONTRACT_OLDOF ) postcondition(CONTRACT_DETAIL_PP_TRAITS_OLDOF
+
+namespace contract {
+
+/**
+@brief Trait used to determine if a type can be copied for an old value or not.
+
+A type can be used for a postcondition old value if and only if it can be
+copied using the @RefClass{contract::copy} template.
+By default, all types that have a constant-correct copy constructor (i.e., that are <c>ConstantCopyConstructible</c>) can be copied by
+@RefClass{contract::copy}.
+
+If a type cannot be copied, an old value declaration using such a type will not
+fail but it will generate an old value that will cause a compile-time error as
+soon as it is used in a contract assertion.
+Therefore, this trait can be used to program assertion requirements for those
+assertions that use old values on generic types that are not always known to be
+copyable.
+This way, the assertions will be disabled by the requirement instead of
+generating a compile-time error when the old values they use cannot be copied.
+
+@Params
+@Param{OldofExpressionType,
+The type of the expression specified to the @RefMacro{CONTRACT_OLDOF} macro for
+a given postcondition old value declaration.
+}
+@EndParams
+
+Unfortunately, in C++ it is not possible to portably implement a template
+meta-function that checks if a generic type has a constant-correct copy
+constructor (or even just a copy constructor).
+Therefore, the default implementation of this trait is <c>boost::mpl::true_</c>
+for any type <c>OdlofExpressionType</c>.
+This will cause compile-time errors for old value types that cannot be copied
+in which case users can specialize this unary boolean meta-function to inherit
+from <c>boost::mpl::false_</c> for such types.
+
+@SeeAlso @RefSect{advanced_topics, Advanced Topics} section.
+*/
+template< typename OldofExpressionType >
+struct has_oldof : boost::mpl::true_ {};
+
+} // namespace contract
+
+#endif // #include guard
+
Added: sandbox/contract/include/contract/parameter.hpp
==============================================================================
--- (empty file)
+++ sandbox/contract/include/contract/parameter.hpp 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,224 @@
+
+// Copyright (C) 2008-2012 Lorenzo Caminiti
+// Distributed under 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)
+// Home at http://sourceforge.net/projects/contractpp
+
+#ifndef CONTRACT_PARAMETER_HPP_
+#define CONTRACT_PARAMETER_HPP_
+
+/** @file
+@brief Macros used to program named and deduced parameters (this header is
+automatically included by <c>contract.hpp</c>).
+*/
+
+#include <contract/aux_/named_params.hpp>
+#include <contract/aux_/macro/parameter.hpp>
+#include <contract/aux_/macro/body.hpp>
+#include <contract/aux_/macro/code_/named_params_/constructor.hpp>
+#include <contract/detail/preprocessor/keyword/namespace.hpp>
+
+// PRIVATE //
+
+#ifndef DOXYGEN
+
+#define CONTRACT_PARAMETER_TRAITS_NAMESPACE_SPLIT_namespace(tag_namespace) \
+ tag_namespace,
+
+#define CONTRACT_PARAMETER_TRAITS_NAMESPACE_YES_(sign) \
+ ( CONTRACT_PARAMETER_TRAITS_NAMESPACE_SPLIT_ ## sign )
+
+#define CONTRACT_PARAMETER_TRAITS_NAMESPACE_(sign) \
+ BOOST_PP_IIF(CONTRACT_DETAIL_PP_KEYWORD_IS_NAMESPACE_FRONT(sign), \
+ CONTRACT_PARAMETER_TRAITS_NAMESPACE_YES_ \
+ , \
+ (CONTRACT_AUX_CONFIG_NAMED_PARAMETER_TAG_NAMESPACE_DEFAULT, sign) \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(sign)
+
+#define CONTRACT_PARAMETER_TRAITS_PASSING_SPLIT_(passing_name) \
+ passing_name,
+
+#define CONTRACT_PARAMETER_TRAITS_PASSING_YES_(tag_namespace, sign) \
+ ( \
+ tag_namespace \
+ , \
+ BOOST_PP_TUPLE_ELEM(2, 0, \
+ (CONTRACT_PARAMETER_TRAITS_PASSING_SPLIT_ sign) ) \
+ , \
+ BOOST_PP_TUPLE_ELEM(2, 1, \
+ (CONTRACT_PARAMETER_TRAITS_PASSING_SPLIT_ sign) ) \
+ )
+
+#define CONTRACT_PARAMETER_TRAITS_PASSING_NO_(tag_namespace, name) \
+ /* default passing name postfixed with `_` (postfix like for Boost */ \
+ /* keyword identifiers, named parameters are also called keyword */ \
+ /* parameters, plus if prefix like for placeholder then can generate */ \
+ /* reserved symbols if in global namespace and starting with upper */ \
+ /* case, for example for template parameters _Valuetype) */ \
+ (tag_namespace, BOOST_PP_CAT(name, _), name)
+
+#define CONTRACT_PARAMETER_TRAITS_PASSING_(namespace_sign) \
+ BOOST_PP_IIF(BOOST_PP_IS_UNARY(BOOST_PP_TUPLE_ELEM(2, 1, namespace_sign)), \
+ CONTRACT_PARAMETER_TRAITS_PASSING_YES_ \
+ , \
+ CONTRACT_PARAMETER_TRAITS_PASSING_NO_ \
+ )( \
+ BOOST_PP_TUPLE_ELEM(2, 0, namespace_sign) \
+ , BOOST_PP_TUPLE_ELEM(2, 1, namespace_sign) \
+ )
+
+#define CONTRACT_PARAMETER_TRAITS_(sign) \
+ CONTRACT_PARAMETER_TRAITS_PASSING_( \
+ CONTRACT_PARAMETER_TRAITS_NAMESPACE_( \
+ sign \
+ ))
+
+#endif // DOXYGEN
+
+// PUBLIC //
+
+/**
+@brief Macro used to access constructor named or deduced arguments within
+member initializers.
+
+This macro must be used to access the constructor arguments within the member
+initializers.
+Outside of the member initializers, the parameter names are used directly as
+usual and without using this macro.
+
+@Params
+@Param{parameter_name,
+The name of a constructor named or deduced parameter previously declared using
+the @RefMacro{CONTRACT_PARAMETER} macro.
+}
+@EndParams
+
+@SeeAlso @RefSect{named_parameters, Named Parameters} section.
+*/
+// To be used to access parameter values within constructor member initializers
+// and try-blocks (this limitation comes from lack of delegating constructors).
+#define CONTRACT_CONSTRUCTOR_ARG(parameter_name) \
+ /* extra parenthesis () to make sure this expr is evaluated as whole */ \
+ ( CONTRACT_AUX_CODE_NAMED_PARAMS_CONSTRUCTOR_ARG(parameter_name) )
+
+/**
+@brief Macro used to access the actual type of a named or deduced parameter.
+
+Named and deduced parameters can have generic types (possibly matching
+predicate type requirements) so the actual parameter types are known at
+compile-time but only after the function call has been resolved.
+This macro is used to refer to the actual parameter type as it was determined
+by the function call resolution.
+
+@Params
+@Param{parameter_name,
+The name of a named or deduced parameter previously declared using the
+@RefMacro{CONTRACT_PARAMETER} macro.
+}
+@EndParams
+
+This macro can be used within both the function declaration and the body
+definition.
+
+@SeeAlso @RefSect{named_parameters, Named Parameters} section.
+*/
+// Do not expose Boost.Parameter's internal conventions to use
+// tag::param_name::_ or param_name_type to access type plus uses the same
+// way to access param type in all requirement expressions, concepts, etc.
+#define CONTRACT_PARAMETER_TYPEOF(parameter_name) \
+ CONTRACT_AUX_PARAMETER_BOOST_TYPE(parameter_name)
+
+/**
+@brief Macro used to declare a named or deduced function parameter.
+
+This macro is used to declare a named or deduced parameter that will later be
+used within a function declared using the @RefMacro{CONTRACT_FUNCTION} or the
+@RefMacro{CONTRACT_CONSTRUCTOR} macros.
+This macro should be used at namespace scope.
+
+@Params
+@Param{named_parameter_declaration,
+The syntax of named and deduced parameter declarations is explained in the
+@RefSect{grammar\, Grammar} section.
+At lest the parameter name must be specified.
+}
+@EndParams
+
+It is recommended to always use this macro within an enclosing namespace
+different from the global namespace so to control and avoid clashing
+declarations of named and deduced parameters that have the same name.
+
+@SeeAlso @RefSect{named_parameters, Named Parameters} section.
+*/
+// sign: [namespace(tag_namespace_)] [(passing_name_)] name_
+#define CONTRACT_PARAMETER(named_parameter_declaration) \
+ BOOST_PP_EXPAND(CONTRACT_AUX_PARAMETER_BOOST_PARAM \
+ CONTRACT_PARAMETER_TRAITS_(named_parameter_declaration))
+
+/**
+@brief Macro used to declare a named or deduced template parameter.
+
+This macro is used to declare a named or deduced parameter that will later be
+used within a class template declared using the @RefMacro{CONTRACT_CLASS}
+macro.
+This macro should be used at namespace scope.
+
+@Params
+@Param{named_parameter_declaration,
+The syntax of named and deduced parameter declarations is explained in the
+@RefSect{grammar\, Grammar} section.
+At lest the template parameter name must be specified.
+}
+@EndParams
+
+It is recommended to always use this macro within an enclosing namespace
+different from the global namespace so to control and avoid clashing
+declarations of named and deduced parameters that have the same name.
+
+@SeeAlso @RefSect{named_parameters, Named Parameters} section.
+*/
+// sign: [namespace(tag_namespace_)] [(passing_name_)] name_
+#define CONTRACT_TEMPLATE_PARAMETER(named_parameter_declaration) \
+ BOOST_PP_EXPAND(CONTRACT_AUX_PARAMETER_BOOST_TEMPLATE_PARAM \
+ CONTRACT_PARAMETER_TRAITS_(named_parameter_declaration))
+
+/**
+@brief Macro used to name the body of free and member functions with named
+parameters.
+
+This macro is used to name the body of a function with named parameters when
+the body is defined separately from the function declaration.
+
+@Params
+@Param{function_name,
+The name of the function with named parameters.
+}
+@EndParams
+
+For member functions, the class type must precede this macro (this allows to
+use this same macro for both free and member functions):
+@code
+class_type::CONTRACT_PARAMETER_BODY(function_name)
+@endcode
+
+@Note Named parameters are currently not supported for operators so this
+function name cannot be the name of an operator (because of a Boost.Parameter
+bug).
+Constructors with named parameters cannot defer the definition of their body
+(because of lack of delegating constructors in C++03).
+Finally, destructors have no parameter so named parameters do not apply to
+destructors.
+Therefore, this macro is never used for operators, constructors, and
+destructors.
+
+@SeeAlso @RefSect{named_parameters, Named Parameters} section.
+*/
+#define CONTRACT_PARAMETER_BODY(function_name) \
+ /* always "contracted" because named parameter functions always need to */ \
+ /* use the extra body function regardless of contract enabled or not */ \
+ CONTRACT_AUX_BODY_PARAMETER_FUNCTION_CONTRACTED(function_name)
+
+#endif // #include guard
+
Added: sandbox/contract/include/generate.py
==============================================================================
--- (empty file)
+++ sandbox/contract/include/generate.py 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,35 @@
+
+# Copyright (C) 2008-2012 Lorenzo Caminiti
+# Distributed under 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)
+# Home at http://sourceforge.net/projects/contractpp
+
+import os
+
+scripts = [
+ ("contract/detail/preprocessor/array", "first_n-generate.py"),
+ ("contract/detail/preprocessor/array", "rest_n-generate.py"),
+ ("contract/detail/preprocessor/facilities", "is_digit-generate.py"),
+ ("contract/detail/preprocessor/traits/aux_", "apply-generate.py"),
+ ("contract/detail/preprocessor/traits/aux_", "list-generate.py"),
+ ("contract/detail/preprocessor/traits/aux_",
+ "select_assertion_-generate.py"),
+ ("contract/detail/preprocessor/traits/func", "catches-generate.py"),
+ ("contract/detail/preprocessor/traits/func", "postconditions-generate.py"),
+ ("contract/detail/preprocessor/tuple", "split-generate.py"),
+]
+
+root = os.getcwd()
+for s in scripts:
+ dir = s[0]
+ cmd = "python " + s[1]
+ print
+ print dir + "$ " + cmd
+ os.chdir(dir)
+ os.system(cmd)
+ os.chdir(root)
+
+print
+print "Done. (Add any missing generation Python script to this script.)",
+
Added: sandbox/contract/index.html
==============================================================================
--- (empty file)
+++ sandbox/contract/index.html 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,15 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+ <meta http-equiv="refresh" content="0; URL=http://contractpp.svn.sourceforge.net/viewvc/contractpp/releases/contractpp_0_4_1/doc/html/index.html">
+ </head>
+ <body>
+ Automatic redirection failed, click this
+ link <hr>
+ <p>© Copyright Lorenzo Caminiti, 2008-2012</p>
+ <p>Distributed under the Boost Software License, Version 1.0 (see
+ accompanying file <a href="LICENSE_1_0.txt">
+ LICENSE_1_0.txt</a> or a copy at
+ www.boost.org/LICENSE_1_0.txt)</p>
+ </body>
+</html>
Added: sandbox/contract/logo.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/screenshot1.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/screenshot2.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/screenshot3.png
==============================================================================
Binary file. No diff available.
Added: sandbox/contract/tools/boost_setup/cygwin-boost-env.sh
==============================================================================
--- (empty file)
+++ sandbox/contract/tools/boost_setup/cygwin-boost-env.sh 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -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).
+
+#export BOOST_ROOT="$HOME/Desktop/code/boost/trunk.cyg"
+export BOOST_ROOT="$HOME/Desktop/code/boost_1_50_0.cyg"
+export PATH="$BOOST_ROOT:$PATH"
+
+echo "HOME=$HOME"
+echo "BOOST_ROOT=$BOOST_ROOT"
+echo
+echo "Make sure \"$HOME/user-config.jam\" exists and it is correct"
+
Added: sandbox/contract/tools/boost_setup/cygwin-user-config.jam
==============================================================================
--- (empty file)
+++ sandbox/contract/tools/boost_setup/cygwin-user-config.jam 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,10 @@
+
+# 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).
+
+# Toolset.
+using gcc ;
+using python ;
+
Added: sandbox/contract/tools/boost_setup/linux-boost-env.sh
==============================================================================
--- (empty file)
+++ sandbox/contract/tools/boost_setup/linux-boost-env.sh 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,15 @@
+
+# Copyright (C) 2008-2012 Lorenzo Caminiti
+# Distributed under 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)
+# Home at http://sourceforge.net/projects/contractpp
+
+export BOOST_ROOT="$HOME/Desktop/code/boost/trunk.linux"
+export PATH="$BOOST_ROOT:$PATH"
+
+echo "HOME=$HOME"
+echo "BOOST_ROOT=$BOOST_ROOT"
+echo
+echo "Make sure \"$HOME/user-config.jam\" exists and it is correct"
+
Added: sandbox/contract/tools/boost_setup/linux-user-config.jam
==============================================================================
--- (empty file)
+++ sandbox/contract/tools/boost_setup/linux-user-config.jam 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,19 @@
+
+# Copyright (C) 2008-2012 Lorenzo Caminiti
+# Distributed under 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)
+# Home at http://sourceforge.net/projects/contractpp
+
+using gcc ;
+using python ;
+
+# Documentation tools.
+using quickbook ;
+using xsltproc ;
+using boostbook
+ : "/usr/share/xml/docbook/stylesheet/nwalsh"
+ : "/usr/share/xml/docbook/schema/dtd/4.2"
+ ;
+using doxygen ;
+
Added: sandbox/contract/tools/boost_setup/windows-boost-env.bat
==============================================================================
--- (empty file)
+++ sandbox/contract/tools/boost_setup/windows-boost-env.bat 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,17 @@
+
+REM Copyright (C) 2009-2011 Lorenzo Caminiti
+REM Use, modification, and distribution is subject to the Boost Software
+REM License, Version 1.0 (see accompanying file LICENSE_1_0.txt or a
+REM copy at http://www.boost.org/LICENSE_1_0.txt).
+
+@ECHO OFF
+
+set BOOST_ROOT=%HOMEDRIVE%%HOMEPATH%\Desktop\code\boost_1_50_0.win
+set PATH="C:\PROGRA~2\boost\xml\bin";%BOOST_ROOT%;%PATH%
+
+ECHO HOME=%HOMEDRIVE%%HOMEPATH%
+ECHO BOOST_ROOT=%BOOST_ROOT%
+ECHO BOOST_BUILD_PATH=%BOOST_BUILD_PATH%
+ECHO.
+ECHO Make sure "%HOMEDRIVE%%HOMEPATH%\user-config.jam" exists and it is correct
+
Added: sandbox/contract/tools/boost_setup/windows-user-config.jam
==============================================================================
--- (empty file)
+++ sandbox/contract/tools/boost_setup/windows-user-config.jam 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -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).
+
+# Toolset.
+using msvc ;
+using python ;
+
+# Documentation tools
+using quickbook : "C:/PROGRA~2/boost/xml/bin/quickbook.exe" : ;
+using xsltproc : "C:/PROGRA~2/boost/xml/bin/xsltproc.exe" ;
+using boostbook
+ : "C:/PROGRA~2/boost/xml/docbook-xsl"
+ : "C:/PROGRA~2/boost/xml/docbook-xml"
+ ;
+using doxygen : "C:/PROGRA~2/doxygen/bin/doxygen.exe" ;
+# For PDF documentation.
+using fop
+ : "C:/PROGRA~1/RenderX/XEP/xep.bat"
+ : "C:/PROGRA~1/Java/jre6/bin"
+ ;
+
Added: sandbox/contract/tools/copyright_header.py
==============================================================================
--- (empty file)
+++ sandbox/contract/tools/copyright_header.py 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,121 @@
+
+# Copyright (C) 2008-2012 Lorenzo Caminiti
+# Distributed under 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)
+# Home at http://sourceforge.net/projects/contractpp
+
+import sys
+import os;
+import re;
+import getopt;
+import sh;
+
+def parse_args():
+ COMMENT_FOR_FILE = { # Comment line start and end characters.
+ '.cpp': ['// ', ''],
+ '.hpp': ['// ', ''],
+ '.qbk': ['[/ ', ' ]'],
+ '.jam': ['# ', ''],
+ '.v2': ['# ', ''],
+ '.py': ['# ', ''],
+ '.sh': ['# ', ''],
+ '.bat': ['REM ', ''],
+ }
+ START_WORD_DFLT = 'Copyright' # Default header starting word.
+ HEADER_FILE_DFLT = "../COPYRIGHT.txt" # Default header text file.
+
+ try:
+ (opts, args) = getopt.getopt(sys.argv[1:], '', [])
+ if len(args) == 0:
+ raise getopt.GetoptError('Missing DIR argument')
+ elif len(args) == 1:
+ dir = args[0]
+ header_file = HEADER_FILE_DFLT
+ start_word = START_WORD_DFLT
+ elif len(args) == 2:
+ dir = args[0]
+ header_file = args[1]
+ start_word = START_WORD_DFLT
+ elif len(args) == 3:
+ dir = args[0]
+ header_file = args[1]
+ start_word = args[2]
+ else:
+ raise getopt.GetoptError('Too many arguments')
+ except getopt.GetoptError, err:
+ print "Error: ", err
+ print """
+Usage: python %s DIR [HEADER_FILE] [START_WORD]
+Replace text starting with the work START_WORD at file's header with the test
+from HEADER_FILE.
+
+All files in DIR with the following extensions are recursively processed:
+ %s
+
+Defaults:
+ HEADER_FILE %s
+ START_WORD %s
+""" % (os.path.split(sys.argv[0])[1], COMMENT_FOR_FILE.keys(),
+ HEADER_FILE_DFLT, START_WORD_DFLT)
+ exit(1)
+ return (dir, header_file, start_word, COMMENT_FOR_FILE)
+
+class header:
+ def __init__(self, header_file):
+ f = open(header_file, 'rU')
+ self.__lines = []
+ for ln in f.xreadlines(): self.__lines.append(ln.rstrip('\n'))
+ f.close();
+
+ def text(self, line_start = '// ', line_end = ''):
+ s = ''
+ for ln in self.__lines: s = s + line_start + ln + line_end + '\n'
+ return s
+
+class replace_header:
+ def __init__(self, header_file, start_word, comment_for_file):
+ self.__header = header(header_file)
+ self.__start_word = start_word
+ self.__comment_for_file = comment_for_file
+
+ def __call__(self, ln, inheader, file_path, line_num):
+ if line_num <= 1: sh.info('Updating "' + file_path + '"...')
+ (ret_ln, ret_inheader) = ('', None)
+
+ (file_root, file_ext) = os.path.splitext(file_path)
+ comment_start = self.__comment_for_file[file_ext][0]
+ comment_end = self.__comment_for_file[file_ext][1]
+ new_header = '\n' + self.__header.text(comment_start,
+ comment_end) + '\n'
+ header_start_re = '^' + re.escape(comment_start +
+ self.__start_word) + '.*$'
+ header_continue_re = '^' + re.escape(comment_start) + '.*$'
+
+ if inheader is None: # At very top of file.
+ if re.match('^ *$', ln): # Skip empty lines at top.
+ (ret_ln, ret_inheader) = ('', None)
+ elif re.match(header_start_re, ln): # Old header starts.
+ (ret_ln, ret_inheader) = ('', True)
+ else: # Old header ends -- replace it.
+ (ret_ln, ret_inheader) = (new_header + ln, False)
+ elif inheader:
+ if re.match(header_continue_re, ln): # In old header -- skip it.
+ (ret_ln, ret_inheader) = ('', True)
+ elif re.match('^ *$', ln): # Skip empty lines after old header.
+ (ret_ln, ret_inheader) = ('', True)
+ else: # Old header ends -- replace it.
+ (ret_ln, ret_inheader) = (new_header + ln, False)
+ else: # Not in nor entering header.
+ (ret_ln, ret_inheader) = (ln, False)
+ return (ret_ln, ret_inheader)
+
+(dir, header_file, start_word, comment_for_file) = parse_args()
+replacer = replace_header(header_file, start_word, comment_for_file)
+name_re = ''
+for file_ext in comment_for_file.keys():
+ if name_re != '': name_re = name_re + '|'
+ name_re = name_re + '(.*' + re.escape(file_ext) + '$)'
+
+sh.replace(dir, name_re, replacer)
+
Added: sandbox/contract/tools/release_instructions.txt
==============================================================================
--- (empty file)
+++ sandbox/contract/tools/release_instructions.txt 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,54 @@
+
+RELEASE INSTRUCTIONS
+====================
+
+How to release this library version X.Y.Z from SVN trunk to SourceForge (SF).
+
+1. PREPARE TO RELEASE
+
+* Make sure all examples and test compiles.
+* Make sure that documentation, release version, and release notes are up-to-date.
+* Make sure that "trunk/index.html" redirects to "releases/contractpp_X_Y_Z/doc/html/index.html".
+
+Commit everything (code, documentation, etc) to SVN trunk.
+
+2. RELEASE BRANCH
+
+Create a SVN branch for the release X.Y.Z for example from trunk, make sure all code is correctly checked into trunk, then:
+
+ $ svn cp https://contractpp.svn.sourceforge.net/svnroot/contractpp/trunk https://contractpp.svn.sourceforge.net/svnroot/contractpp/releases/contractpp_X_Y_Z
+
+3. ZIP FILE
+
+Create a "contractpp_X_Y_Z.zip" file from the release branch (this ZIP file
+should not go in SVN, just uploaded it on SF as explained in the next step):
+
+ $ zip contractpp/release/contractpp_X_Y_Z contractpp_X_Y_Z.zip
+
+4. UPLOAD ZIP FILE TO SF
+
+Log in to SF website and go to Contract++ page, click Files, then "releases", and then Add File to upload "contract_X_Y_Z.zip".
+Click the information icon ("I" icon on the right-hand-side of the file) and select the newly added file as the "Default Download" for all platform then click Save (the file should now show as the "latest version" on the top of the page and SF will link it to the "Download" from the library documentation).
+
+5. UPLOAD DOCUMENTATION INDEX.HTML
+
+Using FileZilla connect to the location below and drag-and-drop releases/contract_X_Y_Z/index.html to the project-web/contractpp/htdocs/ localtion:
+
+ Host web.sourceforge.net
+ Protocol SFTP
+ Port 22
+ Username ...
+ Password ...
+ Upload to /home/project-web/contractpp/htdocs
+
+The LICENSE_1_0.txt and COPYRIGHT.txt files should be copied to this location also (but they might already be there).
+
+6. FINAL CHECKS
+
+* Go to the project web http://contractpp.sourceforge.net and check that the latest documentation shows up.
+* Click on "Download" for the documentation and check that contractpp_X_Y_Z.zip is downloaded (correct version).
+
+7. UPDATE INFORMATION ON SF (IF NEEDED)
+
+Update the information on SF if needed: library release status (pre-alpha, beta, etc), library logo on SF, name, description, feature list, screenshots, etc.
+
Added: sandbox/contract/tools/sh.py
==============================================================================
--- (empty file)
+++ sandbox/contract/tools/sh.py 2013-02-28 17:56:57 EST (Thu, 28 Feb 2013)
@@ -0,0 +1,118 @@
+
+# Copyright (C) 2008-2012 Lorenzo Caminiti
+# Distributed under 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)
+# Home at http://sourceforge.net/projects/contractpp
+
+import sys
+import os
+import shutil
+import re
+import tempfile
+import time
+
+silent = False
+
+def info(msg, newline = True):
+ if not silent:
+ if newline: print msg
+ else: sys.stdout.write(msg)
+
+def err(msg):
+ print "Error:", msg
+
+def run(cmd):
+ if os.system(cmd) != 0:
+ err('Unable to execute command "' + cmd + '"')
+ exit()
+
+def quit_if_exist_is(path, exist, err_msg = ""):
+ if os.access(path, os.F_OK) == exist:
+ if err_msg == "":
+ if not exist: err('File path "' + path + '" not found')
+ else: err('File path "' + path + '" already exists')
+ else: err(err_msg)
+ exit()
+
+def cp(src, dst):
+ info("Copying: " + src + " -> " + dst)
+ quit_if_exist_is(src, False)
+ if os.path.isdir(src):
+ quit_if_exist_is(dst, True) # `copytree()` requires dst not exist.
+ shutil.copytree(src, dst)
+ else:
+ shutil.copy2(src, dst)
+
+def mkdir(dir):
+ if not os.access(dir, os.F_OK): os.makedirs(dir)
+
+def read(msg = '', default = ''):
+ if msg != '': info(msg, False)
+ s = raw_input()
+ if s == '': s = default
+ return s
+
+def rm(path, interactive = True):
+ if os.access(path, os.F_OK):
+ if interactive: user_in = ''
+ else: user_in = 'y'
+ while user_in != 'y' and user_in != 'n':
+ user_in = read(
+ 'Warning: If "y", existing file(s) will be lost!\n' +
+ 'Override existing path "' + path + '"? (y/n) ')
+ if user_in == 'y':
+ if os.path.isdir(path): shutil.rmtree(path)
+ else: os.remove(path)
+ else:
+ err('Unable to override existing path "' + path +
+ '" -- manually remove it first')
+ exit()
+
+def find(dir, name_re, exec_func = None):
+ found = []
+ for root, dirs, files in os.walk(dir):
+ for dir in dirs:
+ path = os.path.join(root, dir)
+ if re.match(name_re, path):
+ if not exec_func is None: exec_func(path)
+ found.append(path)
+ for file in files:
+ path = os.path.join(root, file)
+ if re.match(name_re, path):
+ if not exec_func is None: exec_func(path)
+ found.append(path)
+ return found
+
+# Can be passed as `replace_func` to `replace()` for simple text replace.
+class replace_text:
+ def __init__(self, find_re, repl_txt):
+ self.__find_re = find_re
+ self.__repl_txt = repl_txt
+ def __call__(self, ln, unused, file_name, line_num):
+ return (re.sub(self.__find_re, self.__repl_txt, ln), unused)
+
+def replace(dir, name_re, replace_func, data = None):
+ class _replace_func:
+ def __init__(self, func, data):
+ self.__func = func
+ self.__data = data
+ def __call__(self, ifile_name):
+ ifile = open(ifile_name, 'rU')
+ ofile_name = ifile_name + str(time.time()) # Time for temp file.
+ ofile = open(ofile_name, 'w')
+ func = self.__func
+ data = self.__data # Copy data so self's data not changed.
+ ln_num = 0
+ for ln in ifile.xreadlines():
+ ln_num = ln_num + 1
+ (repl_ln, repl_data) = func(ln, data, ifile_name, ln_num)
+ data = repl_data # Update data within this file replacement.
+ ofile.write(repl_ln)
+ ifile.close()
+ ofile.close()
+ os.remove(ifile.name)
+ os.rename(ofile.name, ifile.name)
+ f = _replace_func(replace_func, data)
+ find(dir, name_re, f)
+
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