Squashed 'third_party/boostorg/function_types/' content from commit ae4fde2
Change-Id: I946aaade9862a3a50fdce89fbc618c914b0edae6
git-subtree-dir: third_party/boostorg/function_types
git-subtree-split: ae4fde2e2ae88291d6d656137169ff4003d184a1
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..3e84d7c
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,96 @@
+* text=auto !eol svneol=native#text/plain
+*.gitattributes text svneol=native#text/plain
+
+# Scriptish formats
+*.bat text svneol=native#text/plain
+*.bsh text svneol=native#text/x-beanshell
+*.cgi text svneol=native#text/plain
+*.cmd text svneol=native#text/plain
+*.js text svneol=native#text/javascript
+*.php text svneol=native#text/x-php
+*.pl text svneol=native#text/x-perl
+*.pm text svneol=native#text/x-perl
+*.py text svneol=native#text/x-python
+*.sh eol=lf svneol=LF#text/x-sh
+configure eol=lf svneol=LF#text/x-sh
+
+# Image formats
+*.bmp binary svneol=unset#image/bmp
+*.gif binary svneol=unset#image/gif
+*.ico binary svneol=unset#image/ico
+*.jpeg binary svneol=unset#image/jpeg
+*.jpg binary svneol=unset#image/jpeg
+*.png binary svneol=unset#image/png
+*.tif binary svneol=unset#image/tiff
+*.tiff binary svneol=unset#image/tiff
+*.svg text svneol=native#image/svg%2Bxml
+
+# Data formats
+*.pdf binary svneol=unset#application/pdf
+*.avi binary svneol=unset#video/avi
+*.doc binary svneol=unset#application/msword
+*.dsp text svneol=crlf#text/plain
+*.dsw text svneol=crlf#text/plain
+*.eps binary svneol=unset#application/postscript
+*.gz binary svneol=unset#application/gzip
+*.mov binary svneol=unset#video/quicktime
+*.mp3 binary svneol=unset#audio/mpeg
+*.ppt binary svneol=unset#application/vnd.ms-powerpoint
+*.ps binary svneol=unset#application/postscript
+*.psd binary svneol=unset#application/photoshop
+*.rdf binary svneol=unset#text/rdf
+*.rss text svneol=unset#text/xml
+*.rtf binary svneol=unset#text/rtf
+*.sln text svneol=native#text/plain
+*.swf binary svneol=unset#application/x-shockwave-flash
+*.tgz binary svneol=unset#application/gzip
+*.vcproj text svneol=native#text/xml
+*.vcxproj text svneol=native#text/xml
+*.vsprops text svneol=native#text/xml
+*.wav binary svneol=unset#audio/wav
+*.xls binary svneol=unset#application/vnd.ms-excel
+*.zip binary svneol=unset#application/zip
+
+# Text formats
+.htaccess text svneol=native#text/plain
+*.bbk text svneol=native#text/xml
+*.cmake text svneol=native#text/plain
+*.css text svneol=native#text/css
+*.dtd text svneol=native#text/xml
+*.htm text svneol=native#text/html
+*.html text svneol=native#text/html
+*.ini text svneol=native#text/plain
+*.log text svneol=native#text/plain
+*.mak text svneol=native#text/plain
+*.qbk text svneol=native#text/plain
+*.rst text svneol=native#text/plain
+*.sql text svneol=native#text/x-sql
+*.txt text svneol=native#text/plain
+*.xhtml text svneol=native#text/xhtml%2Bxml
+*.xml text svneol=native#text/xml
+*.xsd text svneol=native#text/xml
+*.xsl text svneol=native#text/xml
+*.xslt text svneol=native#text/xml
+*.xul text svneol=native#text/xul
+*.yml text svneol=native#text/plain
+boost-no-inspect text svneol=native#text/plain
+CHANGES text svneol=native#text/plain
+COPYING text svneol=native#text/plain
+INSTALL text svneol=native#text/plain
+Jamfile text svneol=native#text/plain
+Jamroot text svneol=native#text/plain
+Jamfile.v2 text svneol=native#text/plain
+Jamrules text svneol=native#text/plain
+Makefile* text svneol=native#text/plain
+README text svneol=native#text/plain
+TODO text svneol=native#text/plain
+
+# Code formats
+*.c text svneol=native#text/plain
+*.cpp text svneol=native#text/plain
+*.h text svneol=native#text/plain
+*.hpp text svneol=native#text/plain
+*.ipp text svneol=native#text/plain
+*.tpp text svneol=native#text/plain
+*.jam text svneol=native#text/plain
+*.java text svneol=native#text/plain
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..c3fc6e7
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,40 @@
+# Copyright 2016 Edward Diener
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
+
+language: cpp
+
+sudo: false
+
+python: "2.7"
+
+os:
+ - linux
+ - osx
+
+branches:
+ only:
+ - master
+ - develop
+
+install:
+ - cd ..
+ - git clone -b $TRAVIS_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
+ - cd boost-root
+ - git submodule update --init tools/build
+ - git submodule update --init libs/config
+ - git submodule update --init tools/boostdep
+ - cp -r $TRAVIS_BUILD_DIR/* libs/function_types
+ - python tools/boostdep/depinst/depinst.py -I example function_types
+ - ./bootstrap.sh
+ - ./b2 headers
+
+script:
+ - TOOLSET=gcc,clang
+ - if [ $TRAVIS_OS_NAME == osx ]; then TOOLSET=clang; fi
+ - ./b2 --verbose-test libs/config/test//config_info toolset=$TOOLSET || true
+ - ./b2 libs/function_types/test toolset=$TOOLSET
+
+notifications:
+ email:
+ on_success: always
diff --git a/appveyor.yml b/appveyor.yml
new file mode 100644
index 0000000..ede2020
--- /dev/null
+++ b/appveyor.yml
@@ -0,0 +1,36 @@
+# Copyright 2017 Edward Diener
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
+
+version: 1.0.{build}-{branch}
+
+shallow_clone: true
+
+branches:
+ only:
+ - master
+ - develop
+
+environment:
+ matrix:
+ - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
+ TOOLSET: msvc-9.0,msvc-10.0,msvc-11.0,msvc-12.0,msvc-14.0
+ - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
+ TOOLSET: msvc-14.1
+
+install:
+ - cd ..
+ - git clone -b %APPVEYOR_REPO_BRANCH% https://github.com/boostorg/boost.git boost-root
+ - cd boost-root
+ - git submodule update --init tools/build
+ - git submodule update --init libs/config
+ - git submodule update --init tools/boostdep
+ - xcopy /s /e /q %APPVEYOR_BUILD_FOLDER% libs\function_types
+ - python tools/boostdep/depinst/depinst.py -I example function_types
+ - bootstrap
+ - b2 headers
+
+build: off
+
+test_script:
+ - b2 libs/function_types/test toolset=%TOOLSET%
diff --git a/build/Jamfile b/build/Jamfile
new file mode 100644
index 0000000..38b185a
--- /dev/null
+++ b/build/Jamfile
@@ -0,0 +1,30 @@
+
+# (C) Copyright Tobias Schwinger
+#
+# Use modification and distribution are subject to the boost Software License,
+# Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+# Generates preprocessed files with wave.
+
+actions wave
+{
+ $(>[1]) -S../../.. $(>[2]) -o $(<)
+}
+
+W = ../../../tools/wave/build//wave ;
+
+make arity_loops
+ : preprocess_arity_loops.cpp $(W) : wave : <location>build/timestamps
+ ;
+
+make encoding
+ : preprocess_encoding.cpp $(W) : wave : <location>build/timestamps
+ ;
+
+
+make cc_names
+ : preprocess_cc_names.cpp $(W) : wave : <location>build/timestamps
+ ;
+
+explicit arity_loops encoding cc_names ;
+
diff --git a/build/preprocess_arity_loops.cpp b/build/preprocess_arity_loops.cpp
new file mode 100644
index 0000000..d39b65c
--- /dev/null
+++ b/build/preprocess_arity_loops.cpp
@@ -0,0 +1,88 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#if !defined(BOOST_FT_PREPROCESSING_MODE)
+
+# ifndef __WAVE__
+# error "Boost.Wave preprocessor required"
+# endif
+
+# include <boost/preprocessor/seq/cat.hpp>
+# include <boost/preprocessor/stringize.hpp>
+
+# if BOOST_PP_NIL // enable dependency scanning for dynamically included files
+# include <boost/function_types/detail/encoding/def.hpp>
+# include <boost/function_types/detail/components_impl/master.hpp>
+# include <boost/function_types/detail/synthesize_impl/master.hpp>
+# include <boost/function_types/detail/classifier_impl/master.hpp>
+# endif
+
+# pragma wave option(line: 0, preserve: 2)
+timestamp file
+# pragma wave option(output: null)
+
+# define BOOST_FT_PREPROCESSING_MODE
+
+# define BOOST_FT_HEADER \
+ BOOST_PP_SEQ_CAT((arity)(BOOST_FT_MAX_ARITY)(_)(BOOST_FT_mfp)).hpp
+ #define BOOST_FT_OUT_FILE \
+ BOOST_PP_STRINGIZE(../../../BOOST_FT_al_path/BOOST_FT_HEADER)
+
+# define BOOST_FT_al_path boost/function_types/detail/components_impl
+# include __FILE__
+# undef BOOST_FT_al_path
+
+# define BOOST_FT_al_path boost/function_types/detail/synthesize_impl
+# include __FILE__
+# undef BOOST_FT_al_path
+
+# define BOOST_FT_al_path boost/function_types/detail/classifier_impl
+# include __FILE__
+# undef BOOST_FT_al_path
+
+#elif !defined(BOOST_FT_mfp)
+
+# define BOOST_FT_mfp 0
+# include __FILE__
+# undef BOOST_FT_mfp
+
+# define BOOST_FT_mfp 1
+# include __FILE__
+# undef BOOST_FT_mfp
+
+#elif !defined(BOOST_FT_MAX_ARITY)
+
+# define BOOST_FT_FROM_ARITY 0
+# define BOOST_FT_MAX_ARITY 10
+# include __FILE__
+
+# define BOOST_FT_FROM_ARITY 10
+# define BOOST_FT_MAX_ARITY 20
+# include __FILE__
+
+# define BOOST_FT_FROM_ARITY 20
+# define BOOST_FT_MAX_ARITY 30
+# include __FILE__
+
+# define BOOST_FT_FROM_ARITY 30
+# define BOOST_FT_MAX_ARITY 40
+# include __FILE__
+
+# define BOOST_FT_FROM_ARITY 40
+# define BOOST_FT_MAX_ARITY 50
+# include __FILE__
+
+#else
+
+# pragma message(generating BOOST_FT_OUT_FILE)
+# pragma wave option(preserve: 2, output: BOOST_FT_OUT_FILE)
+# include <boost/function_types/detail/pp_arity_loop.hpp>
+# undef BOOST_FT_MAX_ARITY
+
+#endif
+
diff --git a/build/preprocess_cc_names.cpp b/build/preprocess_cc_names.cpp
new file mode 100644
index 0000000..803667c
--- /dev/null
+++ b/build/preprocess_cc_names.cpp
@@ -0,0 +1,27 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef __WAVE__
+# error "Boost.Wave preprocessor required"
+#endif
+
+#pragma wave option(line: 0, preserve: 2)
+timestamp file
+#pragma wave option(output: null)
+
+#define BOOST_FT_PREPROCESSING_MODE
+
+
+#define BOOST_FT_OUT_FILE \
+ "../../../boost/function_types/detail/pp_cc_loop/preprocessed.hpp"
+#pragma message(generating BOOST_FT_OUT_FILE)
+#pragma wave option(output: BOOST_FT_OUT_FILE, preserve: 2)
+#include <boost/function_types/detail/pp_cc_loop/master.hpp>
+#pragma wave option(output: null)
+#undef BOOST_FT_OUT_FILE
+
diff --git a/build/preprocess_encoding.cpp b/build/preprocess_encoding.cpp
new file mode 100644
index 0000000..886bec3
--- /dev/null
+++ b/build/preprocess_encoding.cpp
@@ -0,0 +1,45 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef __WAVE__
+# error "Boost.Wave preprocessor required"
+#endif
+
+#pragma wave option(line: 0, preserve: 2)
+timestamp file
+#pragma wave option(output: null)
+
+#define BOOST_FT_PREPROCESSING_MODE
+
+
+#define BOOST_FT_OUT_FILE \
+ "../../../boost/function_types/detail/pp_tags/preprocessed.hpp"
+#pragma message(generating BOOST_FT_OUT_FILE)
+#pragma wave option(output: BOOST_FT_OUT_FILE, preserve: 2)
+#include <boost/function_types/detail/pp_tags/master.hpp>
+#pragma wave option(output: null)
+#undef BOOST_FT_OUT_FILE
+
+#define BOOST_FT_OUT_FILE \
+ "../../../boost/function_types/detail/pp_variate_loop/preprocessed.hpp"
+#pragma message(generating BOOST_FT_OUT_FILE)
+#pragma wave option(output: BOOST_FT_OUT_FILE, preserve: 2)
+#include <boost/function_types/detail/pp_variate_loop/master.hpp>
+#pragma wave option(output: null)
+#undef BOOST_FT_OUT_FILE
+
+#define BOOST_FT_OUT_FILE \
+ "../../../boost/function_types/detail/pp_retag_default_cc/preprocessed.hpp"
+#pragma message(generating BOOST_FT_OUT_FILE)
+#pragma wave option(output: BOOST_FT_OUT_FILE, preserve: 2)
+#include <boost/function_types/detail/pp_retag_default_cc/master.hpp>
+#pragma wave option(output: null)
+
+#undef BOOST_FT_OUT_FILE
+
+
diff --git a/build/timestamps/arity_loops b/build/timestamps/arity_loops
new file mode 100644
index 0000000..f91091c
--- /dev/null
+++ b/build/timestamps/arity_loops
@@ -0,0 +1 @@
+timestamp file
diff --git a/build/timestamps/cc_names b/build/timestamps/cc_names
new file mode 100644
index 0000000..f91091c
--- /dev/null
+++ b/build/timestamps/cc_names
@@ -0,0 +1 @@
+timestamp file
diff --git a/build/timestamps/encoding b/build/timestamps/encoding
new file mode 100644
index 0000000..f91091c
--- /dev/null
+++ b/build/timestamps/encoding
@@ -0,0 +1 @@
+timestamp file
diff --git a/doc/Jamfile b/doc/Jamfile
new file mode 100644
index 0000000..1544b8d
--- /dev/null
+++ b/doc/Jamfile
@@ -0,0 +1,27 @@
+
+# (C) Copyright Tobias Schwinger
+#
+# Use modification and distribution are subject to the boost Software License,
+# Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+using quickbook ;
+
+xml function_types : function_types.qbk ;
+boostbook standalone
+ :
+ function_types
+ :
+ <xsl:param>boost.root=../../../..
+ <xsl:param>chunk.first.sections=1
+ <xsl:param>chunk.section.depth=2
+ <xsl:param>generate.section.toc.level=2
+ <xsl:param>toc.section.depth=1
+ <xsl:param>toc.max.depth=1
+ ;
+
+
+###############################################################################
+alias boostdoc ;
+explicit boostdoc ;
+alias boostrelease : standalone ;
+explicit boostrelease ;
diff --git a/doc/function_types.qbk b/doc/function_types.qbk
new file mode 100644
index 0000000..598a7b5
--- /dev/null
+++ b/doc/function_types.qbk
@@ -0,0 +1,1105 @@
+[library Boost.FunctionTypes
+ [quickbook 1.3]
+ [version 2.5]
+ [authors [Schwinger, Tobias]]
+ [copyright 2004-2007 Tobias Schwinger]
+ [license
+ 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])
+ ]
+ [purpose Meta-programming support library]
+ [category template]
+ [category generic]
+ [last-revision $Date$]
+]
+
+[def __unspecified__ /unspecified/]
+
+[def __mpl__ [@../../../mpl/index.html MPL]]
+[def __mpl_integral_constant__ __mpl__ - [@../../../mpl/doc/refmanual/integral-constant.html Integral Constant]]
+[def __mpl_fwd_seq__ __mpl__ - [@../../../mpl/doc/refmanual/forward-sequence.html Forward Sequence]]
+[def __mpl_fb_ext_ra_seq__ __mpl__ - [@../../../mpl/doc/refmanual/front-extensible-sequence.html Front] / [@../../../mpl/doc/refmanual/back-extensible-sequence.html Back ][@../../../mpl/doc/refmanual/extensible-sequence.html Extensible ][@../../../mpl/doc/refmanual/random-access-sequence.html Random Access Sequence]]
+[def __mpl_lambda_expression__ __mpl__ - [@../../../mpl/doc/refmanual/lambda-expression.html Lambda Expression]]
+
+[def __is_function [link boost_functiontypes.reference.classification.is_function is_function]]
+[def __is_function_pointer [link boost_functiontypes.reference.classification.is_function_pointer is_function_pointer]]
+[def __is_function_reference [link boost_functiontypes.reference.classification.is_function_reference is_function_reference]]
+[def __is_member_function_pointer [link boost_functiontypes.reference.classification.is_member_function_pointer is_member_function_pointer]]
+[def __is_callable_builtin [link boost_functiontypes.reference.classification.is_callable_builtin is_callable_builtin]]
+[def __is_nonmember_callable_builtin [link boost_functiontypes.reference.classification.is_nonmember_callable_builtin is_nonmember_callable_builtin]]
+
+[def __components [link boost_functiontypes.reference.decomposition.components components]]
+[def __parameter_types [link boost_functiontypes.reference.decomposition.parameter_types parameter_types]]
+[def __function_arity [link boost_functiontypes.reference.decomposition.function_arity function_arity]]
+[def __result_type [link boost_functiontypes.reference.decomposition.result_type result_type]]
+
+[def __function_type [link boost_functiontypes.reference.synthesis.function_type function_type]]
+[def __function_pointer [link boost_functiontypes.reference.synthesis.function_pointer function_pointer]]
+[def __function_reference [link boost_functiontypes.reference.synthesis.function_reference function_reference]
+[def __member_function_pointer [link boost_functiontypes.reference.synthesis.member_function_pointer member_function_pointer]]
+
+[def __null_tag [link boost_functiontypes.reference.tag_types.null_tag null_tag]]
+
+[/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]
+
+[section:introduction Introduction]
+
+Boost.FunctionTypes provides functionality to classify, decompose and synthesize
+function, function pointer, function reference and pointer to member types.
+
+We collectively refer to these types as /callable builtin/ types.
+
+In particular, the library can be used to:
+
+* test whether a type is a specific callable, builtin type,
+* extract all component properties from callable, builtin types, and
+* create callable, builtin types from specified properties.
+
+The library is designed to work well with other Boost libraries and uses
+well-accepted concepts introduced by Boost and TR1.
+
+Templates that encapsulate boolean or numeric properties define a static member
+constant called [^value].
+
+ __is_function_pointer< bool(*)(int) >::value // == true
+
+ __function_arity< bool(*)(int) >::value // == 1
+
+Templates that encapsulate properties that are single types contain a type
+member called [^type].
+
+ __function_type< mpl::vector<bool,int> >::type // is bool(int)
+
+ __result_type< bool(&)(int) >::type // is bool
+
+Templates that encapsulate properties that are type lists model an
+MPL-compatible type sequence.
+
+ __parameter_types< bool(int) > // models an MPL sequence
+
+[endsect]
+
+[section:use_cases Use Cases]
+
+Generic libraries that accept callable arguments are common in C++.
+Accepting a callable argument of builin type often involves a lot of repetitive
+code because the accepting function is overloaded for different function
+arities. Further, member functions may have [^const]/[^volatile]-qualifiers,
+a function may take a variable number of (additional, POD-typed) arguments (such
+as [^printf]) and several C++ implementations encode a calling convention with
+each function's type to allow calls across language or (sub-)system boundaries.
+
+ template<typename R>
+ void accept_function(R(* func)());
+
+ template<typename R>
+ void accept_function(R(& func)());
+
+ template<typename R, typename C>
+ void accept_function(R(C::* func)());
+
+ template<typename R, typename C>
+ void accept_function(R(C::* func)() const);
+
+ template<typename R, typename C>
+ void accept_function(R(C::* func)() volatile);
+
+ template<typename R, typename C>
+ void accept_function(R(C::* func)() const volatile);
+
+ template<typename R>
+ void accept_function(R(* func)(...));
+
+ template<typename R>
+ void accept_function(R(& func)(...));
+
+ template<typename R, typename C>
+ void accept_function(R(C::* func)(...));
+
+ template<typename R, typename C>
+ void accept_function(R(C::* func)(...) const);
+
+ template<typename R, typename C>
+ void accept_function(R(C::* func)(...) volatile);
+
+ template<typename R, typename C>
+ void accept_function(R(C::* func)(...) const volatile);
+
+ // ...
+
+ // needs to be repeated for every additional function parameter
+ // times the number of possible calling conventions
+
+The "overloading approach" obviously does not scale well: There might be several
+functions that accept callable arguments in one library and client code might
+end up using several libraries that use this pattern.
+On the developer side, library developers spend their time solving the same
+problem, working around the same portability issues, and apply similar
+optimizations to keep the compilation time down.
+
+Using Boost.FunctionTypes it is possible to write a single function template
+instead:
+
+ template<typename F>
+ void accept_function(F f)
+ {
+ // ... use Boost.FunctionTypes to analyse F
+ }
+
+The combination with a tuples library that provides an invoker component, such
+as [@../../../fusion/index.html Boost.Fusion], allows to build flexible callback
+facilities that are entirely free of repetitive code as shown by the
+[@../../../function_types/example/interpreter.hpp interpreter example].
+
+When taking the address of an overloaded function or function template, the
+type of the function must be known from the context the expression is used
+in. The code below shows three examples for choosing the [^float(float)]
+overload of [^std::abs].
+
+ float (*ptr_absf)(float) = & std::abs;
+
+
+ void foo(float(*func)(float));
+
+ void bar()
+ {
+ foo(& std::abs);
+ }
+
+
+ std::transform(b, e, o, static_cast<float(*)(float)>(& std::abs));
+
+The library's type synthesis capabilities can be used to automate overload
+selection and instantiation of function templates. Given an overloaded function
+template
+
+ template<typename R, typename T0>
+ R overloaded(T0);
+
+ template<typename R, typename T0, typename T1>
+ R overloaded(T0,T1);
+
+ template<typename R. typename T0, typename T1, typename T2>
+ R overloaded(T0,T1,T2);
+
+we can pick any of the three overloads and instantiate the template with
+template arguments from a type sequence in a single expression:
+
+ static_cast<__function_pointer<Seq>::type>(& overloaded)
+
+This technique can be occasionally more flexible than template argument
+deduction from a function call because the exact types from the sequence
+are used to specialize the template (including possibly cv-qualified
+reference types and the result type). It is applied twice in the
+[@../../../function_types/example/interface.hpp interface example].
+
+Another interersting property of callable, builtin types is that they can be
+valid types for non-type template parameters. This way, a function can be
+pinpointed at compile time, allowing the compiler to eliminate the call by
+inlining.
+The [@../../../function_types/example/fast_mem_fn.hpp fast_mem_fn example]
+exploits this characteristic and implements a potentially inlining version of
+[@../../../bind/mem_fn.html boost::mem_fn]
+limited to member functions that are known at compile time.
+
+[endsect]
+
+
+[/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]
+[section:about_tag_types About Tag Types]
+
+Boost.FunctionTypes uses tag types to encode properties that are not types
+per se, such as calling convention or whether a function is variadic or cv-
+qualified.
+
+These tags can be used to determine whether one property of a type has a
+particular value.
+
+ is_function<int(...), variadic>::value // == true
+ is_function<int() , variadic>::value // == false
+
+A compound property tag describes a combination of possible values of different
+properties.
+The type [^components<F>], where [^F] is a callable builtin type, is a compound
+property tag that describes [^F].
+The [^tag] class template can be used to combine property tags.
+
+ tag<non_const,default_cc> // combination of two properties
+
+When several values for the same property are specified in [^tag]'s argument
+list, only the rightmost one is used; others are ignored.
+
+ tag<components<F>, default_cc> // overrides F's calling convention property
+
+When compound property tag is specified to analyse a type, all of its component
+properties must match.
+
+ is_member_function_pointer< F, tag<const_qualified,default_cc> >::value
+ // true for
+ // F = void(a_class::*)() const
+ // false for
+ // F = void(a_class::*)()
+ // F = void(__fastcall a_class::*)() const
+
+Default values are selected for properties not specified by the tag in the
+context of type synthesis.
+
+ // given S = mpl::vector<int,a_class const &>
+
+ member_function_pointer<S>::type // is int (a_class::*)() const
+ // note: the cv-qualification is picked based on the class type,
+ // a nonvariadic signature and the default calling convention
+ // are used
+
+ member_function_pointer<S,non_const>::type // is int (a_class::*)()
+ // no const qualification, as explicitly specified by the tag type
+
+[endsect]
+
+
+[/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]
+
+[section:reference Reference]
+
+
+[section:classification Class templates for type classification]
+
+[section:is_function is_function]
+
+ template<typename T, typename Tag = __null_tag>
+ struct is_function;
+
+[*Header]
+
+ #include <boost/function_types/is_function.hpp>
+
+[variablelist
+ [[[^T]][Type to analyze]]
+ [[[^Tag]][Further properties required for a positive result]]
+ [[[^is_function<T,Tag>]][Predicate value as __mpl_integral_constant__]]
+ [[[^is_function<T,Tag>::value]][Constant boolean value]]
+]
+
+Determines whether a given type is a function, possibly with
+additional properties as specified by a property tag.
+
+[endsect]
+
+
+[section:is_function_pointer is_function_pointer]
+
+ template<typename T, typename Tag = __null_tag>
+ struct is_function_pointer;
+
+[*Header]
+
+ #include <boost/function_types/is_function_pointer.hpp>
+
+[variablelist
+ [[[^T]][Type to analyze]]
+ [[[^Tag]][Further properties required for a positive result]]
+ [[[^is_function_pointer<T,Tag>]][Predicate value __mpl_integral_constant__]]
+ [[[^is_function_pointer<T,Tag>::value]][Constant boolean value]]
+]
+
+Determines whether a given type is a function pointer, possibly with
+additional properties as specified by a property tag.
+
+[endsect]
+
+
+[section:is_function_reference is_function_reference]
+
+ template<typename T, typename Tag = __null_tag>
+ struct is_function_reference;
+
+[*Header]
+
+ #include <boost/function_types/is_function_reference.hpp>
+
+[variablelist
+ [[[^T]][Type to analyze]]
+ [[[^Tag]][Further properties required for a positive result]]
+ [[[^is_function_reference<T,Tag>]][Predicate value __mpl_integral_constant__]]
+ [[[^is_function_reference<T,Tag>::value]][Constant boolean value]]
+]
+
+Determines whether a given type is a function reference, possibly with
+additional properties as specified by a property tag.
+
+[endsect]
+
+
+[section:is_member_pointer is_member_pointer]
+
+ template<typename T, typename Tag = __null_tag>
+ struct is_member_pointer;
+
+[*Header]
+
+ #include <boost/function_types/is_member_pointer.hpp>
+
+[variablelist
+ [[[^T]][Type to analyze]]
+ [[[^Tag]][Further properties required for a positive result]]
+ [[[^is_member_pointer<T,Tag>]][Predicate value __mpl_integral_constant__]]
+ [[[^is_member_pointer<T,Tag>::value]][Constant boolean value]]
+]
+
+Determines whether a given type is a pointer to member (object or function)
+type, possibly with additional properties as specified by a property tag.
+
+[endsect]
+
+
+[section:is_member_object_pointer is_member_object_pointer]
+
+ template<typename T>
+ struct is_member_object_pointer;
+
+[*Header]
+
+ #include <boost/function_types/is_member_object_pointer.hpp>
+
+[variablelist
+ [[[^T]][Type to analyze]]
+ [[[^is_member_object_pointer<T>]][Predicate value __mpl_integral_constant__]]
+ [[[^is_member_object_pointer<T>::value]][Constant boolean value]]
+]
+
+Determines whether a given type is a pointer to member object type.
+
+[endsect]
+
+
+[section:is_member_function_pointer is_member_function_pointer]
+
+ template<typename T, typename Tag = __null_tag>
+ struct is_member_function_pointer;
+
+[*Header]
+
+ #include <boost/function_types/is_member_function_pointer.hpp>
+
+[variablelist
+ [[[^T]][Type to analyze]]
+ [[[^Tag]][Further properties required for a positive result]]
+ [[[^is_member_function_pointer<T,Tag>]][Predicate value __mpl_integral_constant__]]
+ [[[^is_member_function_pointer<T,Tag>::value]][Constant boolean value]]
+]
+
+Determines whether a given type is a member function pointer, possibly with
+additional properties as specified by a property tag.
+
+[endsect]
+
+
+[section:is_callable_builtin is_callable_builtin]
+
+ template<typename T, typename Tag = __null_tag>
+ struct is_callable_builtin;
+
+[*Header]
+
+ #include <boost/function_types/is_callable_builtin.hpp>
+
+[variablelist
+ [[[^T]][Type to analyze]]
+ [[[^Tag]][Further properties required for a positive result]]
+ [[[^is_callable_builtin<T,Tag>]][Predicate value as __mpl_integral_constant__]]
+ [[[^is_callable_builtin<T,Tag>::value]][Constant boolean value]]
+]
+
+Determines whether a given type is a callable builtin, possibly with
+additional properties as specified by a property tag.
+
+[endsect]
+
+
+
+[section:is_nonmember_callable_builtin is_nonmember_callable_builtin]
+
+ template<typename T, typename Tag = __null_tag>
+ struct is_nonmember_callable_builtin;
+
+[*Header]
+
+ #include <boost/function_types/is_nonmember_callable_builtin.hpp>
+
+[variablelist
+ [[[^T]][Type to analyze]]
+ [[[^Tag]][Further properties required for a positive result]]
+ [[[^is_nonmember_callable_builtin<T,Tag>]][Predicate value as __mpl_integral_constant__]]
+ [[[^is_nonmember_callable_builtin<T,Tag>::value]][Constant boolean value]]
+]
+
+Determines whether a given type is a callable builtin that is not a
+member function pointer, possibly with
+additional properties as specified by a property tag.
+
+[endsect]
+
+
+[endsect] [/ Class templates for type classification ]
+
+[/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]
+
+[section:decomposition Class templates for type decomposition]
+
+
+[section:result_type result_type]
+
+ template<typename F>
+ struct result_type;
+
+[*Header]
+
+ #include <boost/function_types/result_type.hpp>
+
+[variablelist
+ [[[^F]][Type to analyze]]
+ [[[^result_type<F>::type]][Result type of [^F]]]
+]
+
+Extracts the result type of a callable, builtin type.
+
+If [^F] is no callable, builtin type, any attempt to access the
+[^type] member results in a compile error.
+
+[endsect]
+
+
+[section:parameter_types parameter_types]
+
+ template<typename F, class ClassTransform = add_reference<_> >
+ struct parameter_types;
+
+[*Header]
+
+ #include <boost/function_types/parameter_types.hpp>
+
+[variablelist
+ [[[^F]][Type to analyze]]
+ [[[^ClassTransform]]
+ [__mpl_lambda_expression__ to transform the
+ class type if [^F] is a member function pointer]]
+
+ [[[^parameter_types<F,ClassTransform>]]
+ [__mpl_fb_ext_ra_seq__ of parameter types]]
+]
+
+Extracts the parameter types of a callable, builtin type.
+
+If [^F] is no callable, builtin type, any attempt to access the
+sequence results in a compile error.
+
+[endsect]
+
+
+[section:function_arity function_arity]
+
+ template<typename F>
+ struct function_arity;
+
+[*Header]
+
+ #include <boost/function_types/function_arity.hpp>
+
+[variablelist
+ [[[^F]][Callable builtin type]]
+ [[[^function_arity<F>]][Function arity as __mpl_integral_constant__]]
+ [[[^function_arity<F>::value]][Constant value of the function arity]]
+]
+
+Extracts the function arity, that is the number of parameters.
+The hidden [^this] of member function pointers counts, in other words
+the arity value is always greater than or equal to one if [^F] is a
+member function pointer.
+
+If [^F] is no callable, builtin type, any attempt to access the
+value results in a compile error.
+
+[endsect]
+
+
+[section:components components]
+
+ template<typename T, class ClassTransform = add_reference<_> >
+ struct components;
+
+[*Header]
+
+ #include <boost/function_types/components.hpp>
+
+[variablelist
+ [[[^T]][Type to analyze]]
+ [[[^ClassTransform]]
+ [__mpl_lambda_expression__ to transform the
+ class type if [^T] is a member function pointer]]
+
+ [[[^components<T,ClassTransform>]]
+ [__mpl_fb_ext_ra_seq__ of all
+ component types and property tag]]
+ [[[^components<T,ClassTransform>::types]]
+ [Decorated MPL Sequence, exposed for optimization]]
+]
+
+Extracts all properties of a callable builtin type, that is the result type,
+followed by the parameter types (including the type of [^this] for member
+function pointers).
+
+If [^T] is no callable builtin type, the component types are an empty
+sequence and the Tag's meaning is equivalent to the [^__null_tag].
+
+[endsect]
+
+[endsect] [/ Class templates for type decomposition]
+
+[/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]
+
+[section:synthesis Class templates for type synthesis]
+
+
+[section:function_type function_type]
+
+ template<typename Types, typename Tag = __null_tag>
+ struct function_type;
+
+[*Header]
+
+ #include <boost/function_types/function_type.hpp>
+
+[variablelist
+ [[[^Types]][Component types in form of an __mpl_fwd_seq__ or another callable, builtin type]]
+ [[[^Tag]][Further properties]]
+ [[[^function_type<Types,Tag>::type]][Synthesized type]]
+]
+
+Synthesizes a function type from given properties.
+
+If the template parameters do not describe a valid type, any attempt
+to access the [^type] member will result in a compile error.
+
+[endsect]
+
+
+[section:function_pointer function_pointer]
+
+ template<typename Types, typename Tag = __null_tag>
+ struct function_pointer;
+
+[*Header]
+
+ #include <boost/function_types/function_pointer.hpp>
+
+[variablelist
+ [[[^Types]][Component types in form of an __mpl_fwd_seq__ or another callable, builtin type]]
+ [[[^Tag]][Further properties]]
+ [[[^function_pointer<Types,Tag>::type]][Synthesized type]]
+]
+
+Synthesizes a function pointer type from given properties.
+
+If the template parameters do not describe a valid type, any attempt
+to access the [^type] member will result in a compile error.
+
+[endsect]
+
+
+[section:function_reference function_reference]
+
+ template<typename Types, typename Tag = __null_tag>
+ struct function_reference;
+
+[*Header]
+
+ #include <boost/function_types/function_reference.hpp>
+
+[variablelist
+ [[[^Types]][Component types in form of an __mpl_fwd_seq__ or another callable, builtin type]]
+ [[[^Tag]][Further properties]]
+ [[[^function_reference<Types,Tag>::type]][Synthesized type]]
+]
+
+Synthesizes a function reference type from given properties.
+
+If the template parameters do not describe a valid type, any attempt
+to access the [^type] member will result in a compile error.
+
+[endsect]
+
+
+[section:member_function_pointer member_function_pointer]
+
+ template<typename Types, typename Tag = __null_tag>
+ struct member_function_pointer;
+
+[*Header]
+
+ #include <boost/function_types/member_function_pointer.hpp>
+
+[variablelist
+ [[[^Types]][Component types in form of an __mpl_fwd_seq__ or another callable, builtin type]]
+ [[[^Tag]][Further properties]]
+ [[[^member_function_pointer<Types,Tag>::type]][Synthesized type]]
+]
+
+Synthesizes a member function pointer type from given properties.
+
+An optional reference or possibly cv-qualified pointer is removed from
+the second type in the sequence to determine the the class type.
+The cv-qualification of the resulting type applies to the member
+function, unless otherwise explicitly specified by the property tag.
+
+If the template parameters do not describe a valid type, any attempt
+to access the [^type] member will result in a compile error.
+
+[endsect]
+
+
+[endsect] [/ Class templates for type synthesis ]
+
+[/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]
+
+[section:tag_types Tag Types]
+
+[section:variadic variadic]
+
+ typedef __unspecified__ variadic;
+
+[*Header]
+
+ #include <boost/function_types/property_tags.hpp>
+
+States that a function type takes a variable number of arguments through
+an ellipsis parameter (such as [^printf]).
+
+[endsect]
+
+[section:non_variadic non_variadic]
+
+ typedef __unspecified__ non_variadic;
+
+[*Header]
+
+ #include <boost/function_types/property_tags.hpp>
+
+States that a function type does not have an ellipsis parameter.
+
+[endsect]
+
+[section:default_cc default_cc]
+
+ typedef __unspecified__ default_cc;
+
+[*Header]
+
+ #include <boost/function_types/property_tags.hpp>
+
+States that a function type encodes the default calling convention.
+
+[endsect]
+
+[section:const_qualified const_qualified]
+
+ typedef __unspecified__ const_qualified;
+
+[*Header]
+
+ #include <boost/function_types/property_tags.hpp>
+
+States that a function type is const qualified.
+
+[endsect]
+
+[section:non_const non_const]
+
+ typedef __unspecified__ non_const;
+
+[*Header]
+
+ #include <boost/function_types/property_tags.hpp>
+
+States that a function type is not const qualified.
+
+[endsect]
+
+[section:volatile_qualified volatile_qualified]
+
+ typedef __unspecified__ volatile_qualified;
+
+[*Header]
+
+ #include <boost/function_types/property_tags.hpp>
+
+States that a function type is volatile qualified.
+
+[endsect]
+
+[section:non_volatile non_volatile]
+
+ typedef __unspecified__ non_volatile;
+
+[*Header]
+
+ #include <boost/function_types/property_tags.hpp>
+
+States that a function type is not volatile qualified.
+
+[endsect]
+
+[section:non_cv non_cv]
+
+ typedef __unspecified__ non_cv;
+
+[*Header]
+
+ #include <boost/function_types/property_tags.hpp>
+
+States that a function type is neither const nor volatile qualified.
+Equivalent to `__tag<__non_const,__non_volatile>`, but involves
+fewer template instantiations when evaluated.
+
+[endsect]
+
+[section:const_non_volatile const_non_volatile]
+
+ typedef __unspecified__ const_non_volatile;
+
+[*Header]
+
+ #include <boost/function_types/property_tags.hpp>
+
+States that a function type is const but not volatile qualified.
+Equivalent to `__tag<__const_qualified,__non_volatile>`, but involves
+fewer template instantiations when evaluated.
+
+[endsect]
+
+[section:volatile_non_const volatile_non_const]
+
+ typedef __unspecified__ volatile_non_const;
+
+[*Header]
+
+ #include <boost/function_types/property_tags.hpp>
+
+States that a function type is volatile but not const qualified.
+Equivalent to `__tag<__volatile_qualified,__non_const>`, but involves
+fewer template instantiations when evaluated.
+
+[endsect]
+
+[section:cv_qualfied cv_qualfied]
+
+ typedef __unspecified__ cv_qualified;
+
+[*Header]
+
+ #include <boost/function_types/property_tags.hpp>
+
+States that a function type is both const and volatile qualified.
+Equivalent to `__tag<__const_qualified,__volatile_qualified>`, but involves
+fewer template instantiations when evaluated.
+
+[endsect]
+
+[section:null_tag null_tag]
+
+ typedef __unspecified__ null_tag;
+
+[*Header]
+
+ #include <boost/function_types/property_tags.hpp>
+
+States nothing.
+
+[endsect]
+
+[section:tag tag]
+
+ template<class Tag1, class Tag2,
+ class Tag3 = null_tag, class Tag4 = null_tag>
+ struct tag;
+
+[*Header]
+
+ #include <boost/function_types/property_tags.hpp>
+
+[variablelist
+ [[[^Tag['N]]][Property tag]]
+ [[[^tag<Tag1,Tag2...>]][Compound property tag]]
+]
+
+Combination of up to four property tags. If the arguments describe different
+values for the same property the value of the rightmost argument is used.
+
+[endsect]
+
+[endsect] [/ Tag Types]
+
+[/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]
+
+[section:macros Macros]
+
+[section:BOOST_FT_MAX_ARITY BOOST_FT_MAX_ARITY]
+
+Expands to a numeric value that describes the maximum function arity
+supported by the library.
+
+Defaults to 20 if not explicitly defined by the user before inclusion
+of the first library header.
+
+[endsect]
+
+
+
+[*The following macros do not need to be defined, unless to configure
+the library to work with a compiler and/or calling convention not covered by
+the auto-detection mechanism in [^boost/function_types/config/compiler.hpp].]
+
+
+[section:BOOST_FT_CC_NAMES BOOST_FT_CC_NAMES]
+
+Expands to a [@../../../preprocessor/doc/data/sequences.html sequence] of
+ternary [@../../../preprocessor/doc/data/tuples.html tuples] (these data
+types are defined in the [@../../../preprocessor/doc/index.html
+documentation of the Boost Preprocessor library]).
+Each sequence element describes one calling convention specifier.
+The first element in each tuple is the macro suffix for
+[link boost_functiontypes.reference.macros.BOOST_FT_CC [^BOOST_FT\_CC\_*]],
+the second element is the name of the tag that describes the calling
+convention and the third is the name of the specifier.
+The specifier is allowed to be an empty string, so the third tuple element
+is either [@../../../preprocessor/doc/ref/empty.html [^BOOST_PP_EMPTY]] or
+[@../../../preprocessor/doc/ref/identity.html [^BOOST_PP_IDENTITY]][^(['name])].
+
+Define this macro to extend the set of possible names for custom calling
+conventions. The macro expands to nothing by default.
+
+The following names are predefined by the library and must not occur in the
+definition of [^BOOST_FT_CC_NAMES]:
+
+ #define BOOST_FT_BUILTIN_CC_NAMES \
+ (( IMPLICIT , implicit_cc , BOOST_PP_EMPTY ))\
+ (( CDECL , cdecl_cc , BOOST_PP_IDENTITY(__cdecl ) ))\
+ (( STDCALL , stdcall_cc , BOOST_PP_IDENTITY(__stdcall ) ))\
+ (( PASCAL , pascal_cc , BOOST_PP_IDENTITY(pascal ) ))\
+ (( FASTCALL , fastcall_cc , BOOST_PP_IDENTITY(__fastcall) ))\
+ (( CLRCALL , clrcall_cc , BOOST_PP_IDENTITY(__clrcall ) ))\
+ (( THISCALL , thiscall_cc , BOOST_PP_IDENTITY(__thiscall) ))\
+ (( IMPLICIT_THISCALL , thiscall_cc , BOOST_PP_EMPTY ))
+ // Don't get confused by the last line, here (thiscall can't be specified
+ // explicitly prior to MSVC 8).
+
+[endsect]
+
+[section:BOOST_FT_CC BOOST_FT\_CC\_*]
+
+Enables a specific calling convention. * denotes the macro suffix, as
+defined by
+[link boost_functiontypes.reference.macros.BOOST_FT_CC_NAMES [^BOOST_FT_CC_NAMES]]
+or
+[link boost_functiontypes.reference.macros.BOOST_FT_CC_NAMES [^BOOST_FT_BUILTIN_CC_NAMES]].
+
+The macro expands to a list of restrictions, separated by the [^|] character.
+Possible items are:
+
+* callable_builtin
+* member
+* non_member
+* variadic
+* non_variadic
+
+If no such macro is defined for a particular calling convention, it is disabled.
+Example:
+
+ #define BOOST_FT_CC_STDCALL non_variadic|callable_builtin
+ // enables stdcall calling convention for all non-variadic,
+ // callable, builtin types
+
+[endsect]
+
+[section:BOOST_FT_COMMON_X86_CCs BOOST_FT_COMMON_X86_CCs]
+
+Defining this macro causes the following macros to be defined, if not defined
+already:
+
+ #define BOOST_FT_CC_CDECL BOOST_FT_COMMON_X86_CCs
+ #define BOOST_FT_CC_STDCALL non_variadic|BOOST_FT_COMMON_X86_CCs
+ #define BOOST_FT_CC_FASTCALL non_variadic|BOOST_FT_COMMON_X86_CCs
+
+[endsect]
+
+[section:BOOST_FT_SYNTAX BOOST_FT_SYNTAX]
+
+This macro allows to change the syntax of callable builtin types.
+It is useful to handle the compiler specific placement of the calling
+convention specifier.
+
+The default definition is as follows:
+
+ #define BOOST_FT_SYNTAX(result,lparen,cc_spec,type_mod,name,rparen) \
+ result() lparen() cc_spec() type_mod() name() rparen()
+
+[endsect]
+
+[section:BOOST_FT_NULLARY_PARAM BOOST_FT_NULLARY_PARAM]
+
+Set to [^void] for compilers that insist on a [^void] parameter for
+nullary function types, empty by default.
+
+[endsect]
+
+[section:BOOST_FT_NO_CV_FUNC_SUPPORT BOOST_FT_NO_CV_FUNC_SUPPORT]
+
+Disables support for cv-qualified function types.
+Cv-qualified function types are illegal by the current standard
+version, but there is a pending defect report on that issue.
+It defaults to [^1] until the standard changes, setting this macro
+to [^0] may not work.
+
+[endsect]
+
+
+
+[*The following macros are useful for testing when changing the source code of
+the library.]
+
+
+
+[section:BOOST_FT_PREPROCESSING_MODE BOOST_FT_PREPROCESSING_MODE]
+
+Makes the compiler preprocess as much as possible of the library code
+(rather than loading already-preprocessed header files) if defined.
+
+[endsect]
+
+[section:BOOST_FT_CC_PREPROCESSING BOOST_FT_CC_PREPROCESSING]
+
+Makes the compiler preprocess the loop over possible names for custom
+calling conventions (rather than loading an already-preprocessed header
+file) if defined.
+
+This macro is defined automatically if
+[link boost_functiontypes.reference.macros.BOOST_FT_CC_NAMES [^BOOST_FT_CC_NAMES]]
+has been defined.
+
+[endsect]
+
+[endsect]
+
+[endsect]
+
+[/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ]
+
+[section:rationale Rationale]
+
+[heading Error handling rationale]
+
+The library does not define the required members of class templates in
+case of an error. This technique causes the compiler to stop displaying
+diagnostics in client code, at the point where the error actually is,
+instead of tracing template instantiations into the implementation of
+the library.
+
+The library's components have limited error conditions, so problematic
+input can be spotted easily.
+
+
+[heading Why MPL Sequences?]
+
+MPL provides algorithms on Sequences, so transformations (such as turning
+by-value parameter types into const references for optimized forwarding
+or computing a signature to specialize
+[@../../../function/index.html [^boost::function]] after applying
+[@../../../bind/index.html [^boost::bind]]) can be expressed more
+easily. The MPL Sequence concept is compatible with several other Boost
+libraries (most importantly [@../../../fusion/index.html Fusion]),
+so another reason is interoperability.
+
+
+[heading Pointer to member object types]
+
+Despite their syntax, pointer to member object types can be seen as
+dereferencing functionals.
+
+
+[heading The ClassTransform template parameter]
+
+[^This]-pointer, [^this]-reference or just the object (or maybe even a
+smart pointer to the object) plus adjustments of cv-qualification - all
+these cases have their place, somewhere and there is no single best answer.
+
+Special treatment of the class type within the sequence can significantly
+complicate client code. A custom [^ClassTransform] argument allows the
+client to adjust the class type before the sequence is formed and then
+treat all parameters uniformly.
+
+
+[heading Why tag types?]
+
+Let's consider the alternatives.
+
+The first one is just using more templates so every property has to be
+asked for explicitly. This approach results in more complicated client
+code if more than one propery has to be checked and in a exponentially
+larger library interface.
+
+The second alternative is having the client pass in bit patterns via
+non-type template parameters. The logic has to be performed by the
+client and there are much more error conditions. Further, class templates
+with non-type template parameters do not work within MPL lambda
+expressions and can cause problems with older compilers.
+
+[heading Is it safe to have the synthesis templates take a callable
+builtin type or an MPL sequence as the first template argument?]
+
+Yes, but it isn't immediately obvious as the set of possible MPL sequences
+isn't inherently disjoint from the set of callable builtin types.
+
+However, any attempt to make a builtin type work as an MPL sequence is
+a bad idea, because builtin types are accessible before the headers that
+make the type a sequence have been included, which can easily violate the
+ODR.
+
+[heading Why does the hidden [^this] parameter count for the
+function arity of member functions?]
+
+It was found preferable that the following condition holds:
+
+ mpl::size< __parameter_types<T> >::value == __function_arity<T>::value
+
+[heading Why ignore top-level cv-qualifiers on pointers?]
+
+A cv-qualified pointer is still a pointer. It usually doesn't matter and
+even if it does, it's a job for
+[@../../../type_traits/index.html Boost.TypeTraits].
+
+
+[endsect]
+
+[section:acknowledgements Acknowledgements]
+
+Thanks go to the following people for supporting the development of this
+library in one or the other way:
+
+* David Abrahams
+* Tom Brinkman
+* Aleksey Gurtovoy
+* Jody Hagins
+* Hartmut Kaiser
+* Andy Little
+* John Maddock
+* Paul Mensonides
+* Alexander Nasonov
+* Richard Smith
+* Rob Stewart
+* Jonathan Turkanis
+* Pavel Vozenilek
+* Steven Watanabe
+* K. Noel Belcourt
+
+[endsect]
+
diff --git a/doc/html/boost_functiontypes/about_tag_types.html b/doc/html/boost_functiontypes/about_tag_types.html
new file mode 100644
index 0000000..9000b58
--- /dev/null
+++ b/doc/html/boost_functiontypes/about_tag_types.html
@@ -0,0 +1,95 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>About Tag Types</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. Boost.FunctionTypes 2.5">
+<link rel="up" href="../index.html" title="Chapter 1. Boost.FunctionTypes 2.5">
+<link rel="prev" href="use_cases.html" title="Use Cases">
+<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"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
+<td align="center"><a href="../../../../../index.html">Home</a></td>
+<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td>
+<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
+<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
+<td align="center"><a href="../../../../../more/index.htm">More</a></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="use_cases.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="boost_functiontypes.about_tag_types"></a><a class="link" href="about_tag_types.html" title="About Tag Types">About Tag Types</a>
+</h2></div></div></div>
+<p>
+ Boost.FunctionTypes uses tag types to encode properties that are not types
+ per se, such as calling convention or whether a function is variadic or cv-
+ qualified.
+ </p>
+<p>
+ These tags can be used to determine whether one property of a type has a particular
+ value.
+ </p>
+<pre class="programlisting"><span class="identifier">is_function</span><span class="special"><</span><span class="keyword">int</span><span class="special">(...),</span> <span class="identifier">variadic</span><span class="special">>::</span><span class="identifier">value</span> <span class="comment">// == true
+</span><span class="identifier">is_function</span><span class="special"><</span><span class="keyword">int</span><span class="special">()</span> <span class="special">,</span> <span class="identifier">variadic</span><span class="special">>::</span><span class="identifier">value</span> <span class="comment">// == false
+</span></pre>
+<p>
+ A compound property tag describes a combination of possible values of different
+ properties. The type <code class="literal">components<F></code>, where <code class="literal">F</code>
+ is a callable builtin type, is a compound property tag that describes <code class="literal">F</code>.
+ The <code class="literal">tag</code> class template can be used to combine property tags.
+ </p>
+<pre class="programlisting"><span class="identifier">tag</span><span class="special"><</span><span class="identifier">non_const</span><span class="special">,</span><span class="identifier">default_cc</span><span class="special">></span> <span class="comment">// combination of two properties
+</span></pre>
+<p>
+ When several values for the same property are specified in <code class="literal">tag</code>'s
+ argument list, only the rightmost one is used; others are ignored.
+ </p>
+<pre class="programlisting"><span class="identifier">tag</span><span class="special"><</span><span class="identifier">components</span><span class="special"><</span><span class="identifier">F</span><span class="special">>,</span> <span class="identifier">default_cc</span><span class="special">></span> <span class="comment">// overrides F's calling convention property
+</span></pre>
+<p>
+ When compound property tag is specified to analyse a type, all of its component
+ properties must match.
+ </p>
+<pre class="programlisting"><span class="identifier">is_member_function_pointer</span><span class="special"><</span> <span class="identifier">F</span><span class="special">,</span> <span class="identifier">tag</span><span class="special"><</span><span class="identifier">const_qualified</span><span class="special">,</span><span class="identifier">default_cc</span><span class="special">></span> <span class="special">>::</span><span class="identifier">value</span>
+<span class="comment">// true for
+</span><span class="comment">// F = void(a_class::*)() const
+</span><span class="comment">// false for
+</span><span class="comment">// F = void(a_class::*)()
+</span><span class="comment">// F = void(__fastcall a_class::*)() const
+</span></pre>
+<p>
+ Default values are selected for properties not specified by the tag in the
+ context of type synthesis.
+ </p>
+<pre class="programlisting"><span class="comment">// given S = mpl::vector<int,a_class const &>
+</span>
+<span class="identifier">member_function_pointer</span><span class="special"><</span><span class="identifier">S</span><span class="special">>::</span><span class="identifier">type</span> <span class="comment">// is int (a_class::*)() const
+</span><span class="comment">// note: the cv-qualification is picked based on the class type,
+</span><span class="comment">// a nonvariadic signature and the default calling convention
+</span><span class="comment">// are used
+</span>
+<span class="identifier">member_function_pointer</span><span class="special"><</span><span class="identifier">S</span><span class="special">,</span><span class="identifier">non_const</span><span class="special">>::</span><span class="identifier">type</span> <span class="comment">// is int (a_class::*)()
+</span><span class="comment">// no const qualification, as explicitly specified by the tag type
+</span></pre>
+</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 © 2004-2007 Tobias
+ Schwinger<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="use_cases.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>
diff --git a/doc/html/boost_functiontypes/acknowledgements.html b/doc/html/boost_functiontypes/acknowledgements.html
new file mode 100644
index 0000000..02e951e
--- /dev/null
+++ b/doc/html/boost_functiontypes/acknowledgements.html
@@ -0,0 +1,94 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Acknowledgements</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. Boost.FunctionTypes 2.5">
+<link rel="up" href="../index.html" title="Chapter 1. Boost.FunctionTypes 2.5">
+<link rel="prev" href="rationale.html" title="Rationale">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
+<td align="center"><a href="../../../../../index.html">Home</a></td>
+<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td>
+<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
+<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
+<td align="center"><a href="../../../../../more/index.htm">More</a></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="rationale.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="boost_functiontypes.acknowledgements"></a><a class="link" href="acknowledgements.html" title="Acknowledgements">Acknowledgements</a>
+</h2></div></div></div>
+<p>
+ Thanks go to the following people for supporting the development of this library
+ in one or the other way:
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem">
+ David Abrahams
+ </li>
+<li class="listitem">
+ Tom Brinkman
+ </li>
+<li class="listitem">
+ Aleksey Gurtovoy
+ </li>
+<li class="listitem">
+ Jody Hagins
+ </li>
+<li class="listitem">
+ Hartmut Kaiser
+ </li>
+<li class="listitem">
+ Andy Little
+ </li>
+<li class="listitem">
+ John Maddock
+ </li>
+<li class="listitem">
+ Paul Mensonides
+ </li>
+<li class="listitem">
+ Alexander Nasonov
+ </li>
+<li class="listitem">
+ Richard Smith
+ </li>
+<li class="listitem">
+ Rob Stewart
+ </li>
+<li class="listitem">
+ Jonathan Turkanis
+ </li>
+<li class="listitem">
+ Pavel Vozenilek
+ </li>
+<li class="listitem">
+ Steven Watanabe
+ </li>
+<li class="listitem">
+ K. Noel Belcourt
+ </li>
+</ul></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 © 2004-2007 Tobias
+ Schwinger<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="rationale.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>
diff --git a/doc/html/boost_functiontypes/introduction.html b/doc/html/boost_functiontypes/introduction.html
new file mode 100644
index 0000000..ed7318a
--- /dev/null
+++ b/doc/html/boost_functiontypes/introduction.html
@@ -0,0 +1,92 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Introduction</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. Boost.FunctionTypes 2.5">
+<link rel="up" href="../index.html" title="Chapter 1. Boost.FunctionTypes 2.5">
+<link rel="prev" href="../index.html" title="Chapter 1. Boost.FunctionTypes 2.5">
+<link rel="next" href="use_cases.html" title="Use Cases">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
+<td align="center"><a href="../../../../../index.html">Home</a></td>
+<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td>
+<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
+<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
+<td align="center"><a href="../../../../../more/index.htm">More</a></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="use_cases.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="boost_functiontypes.introduction"></a><a class="link" href="introduction.html" title="Introduction">Introduction</a>
+</h2></div></div></div>
+<p>
+ Boost.FunctionTypes provides functionality to classify, decompose and synthesize
+ function, function pointer, function reference and pointer to member types.
+ </p>
+<p>
+ We collectively refer to these types as <span class="emphasis"><em>callable builtin</em></span>
+ types.
+ </p>
+<p>
+ In particular, the library can be used to:
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem">
+ test whether a type is a specific callable, builtin type,
+ </li>
+<li class="listitem">
+ extract all component properties from callable, builtin types, and
+ </li>
+<li class="listitem">
+ create callable, builtin types from specified properties.
+ </li>
+</ul></div>
+<p>
+ The library is designed to work well with other Boost libraries and uses well-accepted
+ concepts introduced by Boost and TR1.
+ </p>
+<p>
+ Templates that encapsulate boolean or numeric properties define a static member
+ constant called <code class="literal">value</code>.
+ </p>
+<pre class="programlisting"><a class="link" href="reference/classification.html#boost_functiontypes.reference.classification.is_function_pointer" title="is_function_pointer">is_function_pointer</a><span class="special"><</span> <span class="keyword">bool</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="comment">// == true
+</span>
+<a class="link" href="reference/decomposition.html#boost_functiontypes.reference.decomposition.function_arity" title="function_arity">function_arity</a><span class="special"><</span> <span class="keyword">bool</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="comment">// == 1
+</span></pre>
+<p>
+ Templates that encapsulate properties that are single types contain a type
+ member called <code class="literal">type</code>.
+ </p>
+<pre class="programlisting"><a class="link" href="reference/synthesis.html#boost_functiontypes.reference.synthesis.function_type" title="function_type">function_type</a><span class="special"><</span> <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">bool</span><span class="special">,</span><span class="keyword">int</span><span class="special">></span> <span class="special">>::</span><span class="identifier">type</span> <span class="comment">// is bool(int)
+</span>
+<a class="link" href="reference/decomposition.html#boost_functiontypes.reference.decomposition.result_type" title="result_type">result_type</a><span class="special"><</span> <span class="keyword">bool</span><span class="special">(&)(</span><span class="keyword">int</span><span class="special">)</span> <span class="special">>::</span><span class="identifier">type</span> <span class="comment">// is bool
+</span></pre>
+<p>
+ Templates that encapsulate properties that are type lists model an MPL-compatible
+ type sequence.
+ </p>
+<pre class="programlisting"><a class="link" href="reference/decomposition.html#boost_functiontypes.reference.decomposition.parameter_types" title="parameter_types">parameter_types</a><span class="special"><</span> <span class="keyword">bool</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> <span class="special">></span> <span class="comment">// models an MPL sequence
+</span></pre>
+</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 © 2004-2007 Tobias
+ Schwinger<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
+ </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="use_cases.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
diff --git a/doc/html/boost_functiontypes/rationale.html b/doc/html/boost_functiontypes/rationale.html
new file mode 100644
index 0000000..adc9dec
--- /dev/null
+++ b/doc/html/boost_functiontypes/rationale.html
@@ -0,0 +1,152 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Rationale</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. Boost.FunctionTypes 2.5">
+<link rel="up" href="../index.html" title="Chapter 1. Boost.FunctionTypes 2.5">
+<link rel="prev" href="reference/macros.html" title="Macros">
+<link rel="next" href="acknowledgements.html" title="Acknowledgements">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
+<td align="center"><a href="../../../../../index.html">Home</a></td>
+<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td>
+<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
+<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
+<td align="center"><a href="../../../../../more/index.htm">More</a></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="reference/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="acknowledgements.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="boost_functiontypes.rationale"></a><a class="link" href="rationale.html" title="Rationale">Rationale</a>
+</h2></div></div></div>
+<a name="boost_functiontypes.rationale.error_handling_rationale"></a><h4>
+<a name="boost_functiontypes.rationale.error_handling_rationale-heading"></a>
+ <a class="link" href="rationale.html#boost_functiontypes.rationale.error_handling_rationale">Error
+ handling rationale</a>
+ </h4>
+<p>
+ The library does not define the required members of class templates in case
+ of an error. This technique causes the compiler to stop displaying diagnostics
+ in client code, at the point where the error actually is, instead of tracing
+ template instantiations into the implementation of the library.
+ </p>
+<p>
+ The library's components have limited error conditions, so problematic input
+ can be spotted easily.
+ </p>
+<a name="boost_functiontypes.rationale.why_mpl_sequences_"></a><h4>
+<a name="boost_functiontypes.rationale.why_mpl_sequences_-heading"></a>
+ <a class="link" href="rationale.html#boost_functiontypes.rationale.why_mpl_sequences_">Why MPL Sequences?</a>
+ </h4>
+<p>
+ MPL provides algorithms on Sequences, so transformations (such as turning by-value
+ parameter types into const references for optimized forwarding or computing
+ a signature to specialize <a href="../../../../function/index.html" target="_top"><code class="literal">boost::function</code></a>
+ after applying <a href="../../../../bind/index.html" target="_top"><code class="literal">boost::bind</code></a>)
+ can be expressed more easily. The MPL Sequence concept is compatible with several
+ other Boost libraries (most importantly <a href="../../../../fusion/index.html" target="_top">Fusion</a>),
+ so another reason is interoperability.
+ </p>
+<a name="boost_functiontypes.rationale.pointer_to_member_object_types"></a><h4>
+<a name="boost_functiontypes.rationale.pointer_to_member_object_types-heading"></a>
+ <a class="link" href="rationale.html#boost_functiontypes.rationale.pointer_to_member_object_types">Pointer
+ to member object types</a>
+ </h4>
+<p>
+ Despite their syntax, pointer to member object types can be seen as dereferencing
+ functionals.
+ </p>
+<a name="boost_functiontypes.rationale.the_classtransform_template_parameter"></a><h4>
+<a name="boost_functiontypes.rationale.the_classtransform_template_parameter-heading"></a>
+ <a class="link" href="rationale.html#boost_functiontypes.rationale.the_classtransform_template_parameter">The
+ ClassTransform template parameter</a>
+ </h4>
+<p>
+ <code class="literal">This</code>-pointer, <code class="literal">this</code>-reference or just
+ the object (or maybe even a smart pointer to the object) plus adjustments of
+ cv-qualification - all these cases have their place, somewhere and there is
+ no single best answer.
+ </p>
+<p>
+ Special treatment of the class type within the sequence can significantly complicate
+ client code. A custom <code class="literal">ClassTransform</code> argument allows the
+ client to adjust the class type before the sequence is formed and then treat
+ all parameters uniformly.
+ </p>
+<a name="boost_functiontypes.rationale.why_tag_types_"></a><h4>
+<a name="boost_functiontypes.rationale.why_tag_types_-heading"></a>
+ <a class="link" href="rationale.html#boost_functiontypes.rationale.why_tag_types_">Why tag types?</a>
+ </h4>
+<p>
+ Let's consider the alternatives.
+ </p>
+<p>
+ The first one is just using more templates so every property has to be asked
+ for explicitly. This approach results in more complicated client code if more
+ than one propery has to be checked and in a exponentially larger library interface.
+ </p>
+<p>
+ The second alternative is having the client pass in bit patterns via non-type
+ template parameters. The logic has to be performed by the client and there
+ are much more error conditions. Further, class templates with non-type template
+ parameters do not work within MPL lambda expressions and can cause problems
+ with older compilers.
+ </p>
+<a name="boost_functiontypes.rationale.is_it_safe_to_have_the_synthesis_templates_take_a_callable__builtin_type_or_an_mpl_sequence_as_the_first_template_argument_"></a><h4>
+<a name="boost_functiontypes.rationale.is_it_safe_to_have_the_synthesis_templates_take_a_callable__builtin_type_or_an_mpl_sequence_as_the_first_template_argument_-heading"></a>
+ <a class="link" href="rationale.html#boost_functiontypes.rationale.is_it_safe_to_have_the_synthesis_templates_take_a_callable__builtin_type_or_an_mpl_sequence_as_the_first_template_argument_">Is
+ it safe to have the synthesis templates take a callable builtin type or an
+ MPL sequence as the first template argument?</a>
+ </h4>
+<p>
+ Yes, but it isn't immediately obvious as the set of possible MPL sequences
+ isn't inherently disjoint from the set of callable builtin types.
+ </p>
+<p>
+ However, any attempt to make a builtin type work as an MPL sequence is a bad
+ idea, because builtin types are accessible before the headers that make the
+ type a sequence have been included, which can easily violate the ODR.
+ </p>
+<a name="boost_functiontypes.rationale.why_does_the_hidden__literal_this__literal__parameter_count_for_the__function_arity_of_member_functions_"></a><h4>
+<a name="boost_functiontypes.rationale.why_does_the_hidden__literal_this__literal__parameter_count_for_the__function_arity_of_member_functions_-heading"></a>
+ <a class="link" href="rationale.html#boost_functiontypes.rationale.why_does_the_hidden__literal_this__literal__parameter_count_for_the__function_arity_of_member_functions_">Why
+ does the hidden <code class="literal">this</code> parameter count for the function arity
+ of member functions?</a>
+ </h4>
+<p>
+ It was found preferable that the following condition holds:
+ </p>
+<pre class="programlisting"><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">size</span><span class="special"><</span> <a class="link" href="reference/decomposition.html#boost_functiontypes.reference.decomposition.parameter_types" title="parameter_types">parameter_types</a><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> <a class="link" href="reference/decomposition.html#boost_functiontypes.reference.decomposition.function_arity" title="function_arity">function_arity</a><span class="special"><</span><span class="identifier">T</span><span class="special">>::</span><span class="identifier">value</span>
+</pre>
+<a name="boost_functiontypes.rationale.why_ignore_top_level_cv_qualifiers_on_pointers_"></a><h4>
+<a name="boost_functiontypes.rationale.why_ignore_top_level_cv_qualifiers_on_pointers_-heading"></a>
+ <a class="link" href="rationale.html#boost_functiontypes.rationale.why_ignore_top_level_cv_qualifiers_on_pointers_">Why
+ ignore top-level cv-qualifiers on pointers?</a>
+ </h4>
+<p>
+ A cv-qualified pointer is still a pointer. It usually doesn't matter and even
+ if it does, it's a job for <a href="../../../../type_traits/index.html" target="_top">Boost.TypeTraits</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 © 2004-2007 Tobias
+ Schwinger<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="reference/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="acknowledgements.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
diff --git a/doc/html/boost_functiontypes/reference.html b/doc/html/boost_functiontypes/reference.html
new file mode 100644
index 0000000..238d606
--- /dev/null
+++ b/doc/html/boost_functiontypes/reference.html
@@ -0,0 +1,54 @@
+<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. Boost.FunctionTypes 2.5">
+<link rel="up" href="../index.html" title="Chapter 1. Boost.FunctionTypes 2.5">
+<link rel="prev" href="about_tag_types.html" title="About Tag Types">
+<link rel="next" href="reference/classification.html" title="Class templates for type classification">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
+<td align="center"><a href="../../../../../index.html">Home</a></td>
+<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td>
+<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
+<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
+<td align="center"><a href="../../../../../more/index.htm">More</a></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="about_tag_types.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/classification.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="boost_functiontypes.reference"></a><a class="link" href="reference.html" title="Reference">Reference</a>
+</h2></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="reference/classification.html">Class templates
+ for type classification</a></span></dt>
+<dt><span class="section"><a href="reference/decomposition.html">Class templates
+ for type decomposition</a></span></dt>
+<dt><span class="section"><a href="reference/synthesis.html">Class templates
+ for type synthesis</a></span></dt>
+<dt><span class="section"><a href="reference/tag_types.html">Tag Types</a></span></dt>
+<dt><span class="section"><a href="reference/macros.html">Macros</a></span></dt>
+</dl></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 © 2004-2007 Tobias
+ Schwinger<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="about_tag_types.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/classification.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
diff --git a/doc/html/boost_functiontypes/reference/classification.html b/doc/html/boost_functiontypes/reference/classification.html
new file mode 100644
index 0000000..bb20af5
--- /dev/null
+++ b/doc/html/boost_functiontypes/reference/classification.html
@@ -0,0 +1,371 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Class templates for type classification</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. Boost.FunctionTypes 2.5">
+<link rel="up" href="../reference.html" title="Reference">
+<link rel="prev" href="../reference.html" title="Reference">
+<link rel="next" href="decomposition.html" title="Class templates for type decomposition">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
+<td align="center"><a href="../../../../../../index.html">Home</a></td>
+<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
+<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
+<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
+<td align="center"><a href="../../../../../../more/index.htm">More</a></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"><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="decomposition.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="boost_functiontypes.reference.classification"></a><a class="link" href="classification.html" title="Class templates for type classification">Class templates
+ for type classification</a>
+</h3></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="classification.html#boost_functiontypes.reference.classification.is_function">is_function</a></span></dt>
+<dt><span class="section"><a href="classification.html#boost_functiontypes.reference.classification.is_function_pointer">is_function_pointer</a></span></dt>
+<dt><span class="section"><a href="classification.html#boost_functiontypes.reference.classification.is_function_reference">is_function_reference</a></span></dt>
+<dt><span class="section"><a href="classification.html#boost_functiontypes.reference.classification.is_member_pointer">is_member_pointer</a></span></dt>
+<dt><span class="section"><a href="classification.html#boost_functiontypes.reference.classification.is_member_object_pointer">is_member_object_pointer</a></span></dt>
+<dt><span class="section"><a href="classification.html#boost_functiontypes.reference.classification.is_member_function_pointer">is_member_function_pointer</a></span></dt>
+<dt><span class="section"><a href="classification.html#boost_functiontypes.reference.classification.is_callable_builtin">is_callable_builtin</a></span></dt>
+<dt><span class="section"><a href="classification.html#boost_functiontypes.reference.classification.is_nonmember_callable_builtin">is_nonmember_callable_builtin</a></span></dt>
+</dl></div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.classification.is_function"></a><a class="link" href="classification.html#boost_functiontypes.reference.classification.is_function" title="is_function">is_function</a>
+</h4></div></div></div>
+<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">typename</span> <span class="identifier">Tag</span> <span class="special">=</span> <a class="link" href="tag_types.html#boost_functiontypes.reference.tag_types.null_tag" title="null_tag">null_tag</a><span class="special">></span>
+<span class="keyword">struct</span> <span class="identifier">is_function</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">is_function</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term"><code class="literal">T</code></span></dt>
+<dd><p>
+ Type to analyze
+ </p></dd>
+<dt><span class="term"><code class="literal">Tag</code></span></dt>
+<dd><p>
+ Further properties required for a positive result
+ </p></dd>
+<dt><span class="term"><code class="literal">is_function<T,Tag></code></span></dt>
+<dd><p>
+ Predicate value as <a href="../../../../../mpl/index.html" target="_top">MPL</a>
+ - <a href="../../../../../mpl/doc/refmanual/integral-constant.html" target="_top">Integral
+ Constant</a>
+ </p></dd>
+<dt><span class="term"><code class="literal">is_function<T,Tag>::value</code></span></dt>
+<dd><p>
+ Constant boolean value
+ </p></dd>
+</dl>
+</div>
+<p>
+ Determines whether a given type is a function, possibly with additional
+ properties as specified by a property tag.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.classification.is_function_pointer"></a><a class="link" href="classification.html#boost_functiontypes.reference.classification.is_function_pointer" title="is_function_pointer">is_function_pointer</a>
+</h4></div></div></div>
+<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">typename</span> <span class="identifier">Tag</span> <span class="special">=</span> <a class="link" href="tag_types.html#boost_functiontypes.reference.tag_types.null_tag" title="null_tag">null_tag</a><span class="special">></span>
+<span class="keyword">struct</span> <span class="identifier">is_function_pointer</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">is_function_pointer</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term"><code class="literal">T</code></span></dt>
+<dd><p>
+ Type to analyze
+ </p></dd>
+<dt><span class="term"><code class="literal">Tag</code></span></dt>
+<dd><p>
+ Further properties required for a positive result
+ </p></dd>
+<dt><span class="term"><code class="literal">is_function_pointer<T,Tag></code></span></dt>
+<dd><p>
+ Predicate value <a href="../../../../../mpl/index.html" target="_top">MPL</a>
+ - <a href="../../../../../mpl/doc/refmanual/integral-constant.html" target="_top">Integral
+ Constant</a>
+ </p></dd>
+<dt><span class="term"><code class="literal">is_function_pointer<T,Tag>::value</code></span></dt>
+<dd><p>
+ Constant boolean value
+ </p></dd>
+</dl>
+</div>
+<p>
+ Determines whether a given type is a function pointer, possibly with additional
+ properties as specified by a property tag.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.classification.is_function_reference"></a><a class="link" href="classification.html#boost_functiontypes.reference.classification.is_function_reference" title="is_function_reference">is_function_reference</a>
+</h4></div></div></div>
+<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">typename</span> <span class="identifier">Tag</span> <span class="special">=</span> <a class="link" href="tag_types.html#boost_functiontypes.reference.tag_types.null_tag" title="null_tag">null_tag</a><span class="special">></span>
+<span class="keyword">struct</span> <span class="identifier">is_function_reference</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">is_function_reference</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term"><code class="literal">T</code></span></dt>
+<dd><p>
+ Type to analyze
+ </p></dd>
+<dt><span class="term"><code class="literal">Tag</code></span></dt>
+<dd><p>
+ Further properties required for a positive result
+ </p></dd>
+<dt><span class="term"><code class="literal">is_function_reference<T,Tag></code></span></dt>
+<dd><p>
+ Predicate value <a href="../../../../../mpl/index.html" target="_top">MPL</a>
+ - <a href="../../../../../mpl/doc/refmanual/integral-constant.html" target="_top">Integral
+ Constant</a>
+ </p></dd>
+<dt><span class="term"><code class="literal">is_function_reference<T,Tag>::value</code></span></dt>
+<dd><p>
+ Constant boolean value
+ </p></dd>
+</dl>
+</div>
+<p>
+ Determines whether a given type is a function reference, possibly with
+ additional properties as specified by a property tag.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.classification.is_member_pointer"></a><a class="link" href="classification.html#boost_functiontypes.reference.classification.is_member_pointer" title="is_member_pointer">is_member_pointer</a>
+</h4></div></div></div>
+<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">typename</span> <span class="identifier">Tag</span> <span class="special">=</span> <a class="link" href="tag_types.html#boost_functiontypes.reference.tag_types.null_tag" title="null_tag">null_tag</a><span class="special">></span>
+<span class="keyword">struct</span> <span class="identifier">is_member_pointer</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">is_member_pointer</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term"><code class="literal">T</code></span></dt>
+<dd><p>
+ Type to analyze
+ </p></dd>
+<dt><span class="term"><code class="literal">Tag</code></span></dt>
+<dd><p>
+ Further properties required for a positive result
+ </p></dd>
+<dt><span class="term"><code class="literal">is_member_pointer<T,Tag></code></span></dt>
+<dd><p>
+ Predicate value <a href="../../../../../mpl/index.html" target="_top">MPL</a>
+ - <a href="../../../../../mpl/doc/refmanual/integral-constant.html" target="_top">Integral
+ Constant</a>
+ </p></dd>
+<dt><span class="term"><code class="literal">is_member_pointer<T,Tag>::value</code></span></dt>
+<dd><p>
+ Constant boolean value
+ </p></dd>
+</dl>
+</div>
+<p>
+ Determines whether a given type is a pointer to member (object or function)
+ type, possibly with additional properties as specified by a property tag.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.classification.is_member_object_pointer"></a><a class="link" href="classification.html#boost_functiontypes.reference.classification.is_member_object_pointer" title="is_member_object_pointer">is_member_object_pointer</a>
+</h4></div></div></div>
+<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">is_member_object_pointer</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">is_member_object_pointer</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term"><code class="literal">T</code></span></dt>
+<dd><p>
+ Type to analyze
+ </p></dd>
+<dt><span class="term"><code class="literal">is_member_object_pointer<T></code></span></dt>
+<dd><p>
+ Predicate value <a href="../../../../../mpl/index.html" target="_top">MPL</a>
+ - <a href="../../../../../mpl/doc/refmanual/integral-constant.html" target="_top">Integral
+ Constant</a>
+ </p></dd>
+<dt><span class="term"><code class="literal">is_member_object_pointer<T>::value</code></span></dt>
+<dd><p>
+ Constant boolean value
+ </p></dd>
+</dl>
+</div>
+<p>
+ Determines whether a given type is a pointer to member object type.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.classification.is_member_function_pointer"></a><a class="link" href="classification.html#boost_functiontypes.reference.classification.is_member_function_pointer" title="is_member_function_pointer">is_member_function_pointer</a>
+</h4></div></div></div>
+<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">typename</span> <span class="identifier">Tag</span> <span class="special">=</span> <a class="link" href="tag_types.html#boost_functiontypes.reference.tag_types.null_tag" title="null_tag">null_tag</a><span class="special">></span>
+<span class="keyword">struct</span> <span class="identifier">is_member_function_pointer</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">is_member_function_pointer</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term"><code class="literal">T</code></span></dt>
+<dd><p>
+ Type to analyze
+ </p></dd>
+<dt><span class="term"><code class="literal">Tag</code></span></dt>
+<dd><p>
+ Further properties required for a positive result
+ </p></dd>
+<dt><span class="term"><code class="literal">is_member_function_pointer<T,Tag></code></span></dt>
+<dd><p>
+ Predicate value <a href="../../../../../mpl/index.html" target="_top">MPL</a>
+ - <a href="../../../../../mpl/doc/refmanual/integral-constant.html" target="_top">Integral
+ Constant</a>
+ </p></dd>
+<dt><span class="term"><code class="literal">is_member_function_pointer<T,Tag>::value</code></span></dt>
+<dd><p>
+ Constant boolean value
+ </p></dd>
+</dl>
+</div>
+<p>
+ Determines whether a given type is a member function pointer, possibly
+ with additional properties as specified by a property tag.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.classification.is_callable_builtin"></a><a class="link" href="classification.html#boost_functiontypes.reference.classification.is_callable_builtin" title="is_callable_builtin">is_callable_builtin</a>
+</h4></div></div></div>
+<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">typename</span> <span class="identifier">Tag</span> <span class="special">=</span> <a class="link" href="tag_types.html#boost_functiontypes.reference.tag_types.null_tag" title="null_tag">null_tag</a><span class="special">></span>
+<span class="keyword">struct</span> <span class="identifier">is_callable_builtin</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">is_callable_builtin</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term"><code class="literal">T</code></span></dt>
+<dd><p>
+ Type to analyze
+ </p></dd>
+<dt><span class="term"><code class="literal">Tag</code></span></dt>
+<dd><p>
+ Further properties required for a positive result
+ </p></dd>
+<dt><span class="term"><code class="literal">is_callable_builtin<T,Tag></code></span></dt>
+<dd><p>
+ Predicate value as <a href="../../../../../mpl/index.html" target="_top">MPL</a>
+ - <a href="../../../../../mpl/doc/refmanual/integral-constant.html" target="_top">Integral
+ Constant</a>
+ </p></dd>
+<dt><span class="term"><code class="literal">is_callable_builtin<T,Tag>::value</code></span></dt>
+<dd><p>
+ Constant boolean value
+ </p></dd>
+</dl>
+</div>
+<p>
+ Determines whether a given type is a callable builtin, possibly with additional
+ properties as specified by a property tag.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.classification.is_nonmember_callable_builtin"></a><a class="link" href="classification.html#boost_functiontypes.reference.classification.is_nonmember_callable_builtin" title="is_nonmember_callable_builtin">is_nonmember_callable_builtin</a>
+</h4></div></div></div>
+<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">typename</span> <span class="identifier">Tag</span> <span class="special">=</span> <a class="link" href="tag_types.html#boost_functiontypes.reference.tag_types.null_tag" title="null_tag">null_tag</a><span class="special">></span>
+<span class="keyword">struct</span> <span class="identifier">is_nonmember_callable_builtin</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">is_nonmember_callable_builtin</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term"><code class="literal">T</code></span></dt>
+<dd><p>
+ Type to analyze
+ </p></dd>
+<dt><span class="term"><code class="literal">Tag</code></span></dt>
+<dd><p>
+ Further properties required for a positive result
+ </p></dd>
+<dt><span class="term"><code class="literal">is_nonmember_callable_builtin<T,Tag></code></span></dt>
+<dd><p>
+ Predicate value as <a href="../../../../../mpl/index.html" target="_top">MPL</a>
+ - <a href="../../../../../mpl/doc/refmanual/integral-constant.html" target="_top">Integral
+ Constant</a>
+ </p></dd>
+<dt><span class="term"><code class="literal">is_nonmember_callable_builtin<T,Tag>::value</code></span></dt>
+<dd><p>
+ Constant boolean value
+ </p></dd>
+</dl>
+</div>
+<p>
+ Determines whether a given type is a callable builtin that is not a member
+ function pointer, possibly with additional properties as specified by a
+ property tag.
+ </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 © 2004-2007 Tobias
+ Schwinger<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
+ </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"><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="decomposition.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
diff --git a/doc/html/boost_functiontypes/reference/decomposition.html b/doc/html/boost_functiontypes/reference/decomposition.html
new file mode 100644
index 0000000..9b57cb7
--- /dev/null
+++ b/doc/html/boost_functiontypes/reference/decomposition.html
@@ -0,0 +1,218 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Class templates for type decomposition</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. Boost.FunctionTypes 2.5">
+<link rel="up" href="../reference.html" title="Reference">
+<link rel="prev" href="classification.html" title="Class templates for type classification">
+<link rel="next" href="synthesis.html" title="Class templates for type synthesis">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
+<td align="center"><a href="../../../../../../index.html">Home</a></td>
+<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
+<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
+<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
+<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="classification.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.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="synthesis.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="boost_functiontypes.reference.decomposition"></a><a class="link" href="decomposition.html" title="Class templates for type decomposition">Class templates
+ for type decomposition</a>
+</h3></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="decomposition.html#boost_functiontypes.reference.decomposition.result_type">result_type</a></span></dt>
+<dt><span class="section"><a href="decomposition.html#boost_functiontypes.reference.decomposition.parameter_types">parameter_types</a></span></dt>
+<dt><span class="section"><a href="decomposition.html#boost_functiontypes.reference.decomposition.function_arity">function_arity</a></span></dt>
+<dt><span class="section"><a href="decomposition.html#boost_functiontypes.reference.decomposition.components">components</a></span></dt>
+</dl></div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.decomposition.result_type"></a><a class="link" href="decomposition.html#boost_functiontypes.reference.decomposition.result_type" title="result_type">result_type</a>
+</h4></div></div></div>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span>
+<span class="keyword">struct</span> <span class="identifier">result_type</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">result_type</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term"><code class="literal">F</code></span></dt>
+<dd><p>
+ Type to analyze
+ </p></dd>
+<dt><span class="term"><code class="literal">result_type<F>::type</code></span></dt>
+<dd><p>
+ Result type of <code class="literal">F</code>
+ </p></dd>
+</dl>
+</div>
+<p>
+ Extracts the result type of a callable, builtin type.
+ </p>
+<p>
+ If <code class="literal">F</code> is no callable, builtin type, any attempt to access
+ the <code class="literal">type</code> member results in a compile error.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.decomposition.parameter_types"></a><a class="link" href="decomposition.html#boost_functiontypes.reference.decomposition.parameter_types" title="parameter_types">parameter_types</a>
+</h4></div></div></div>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">ClassTransform</span> <span class="special">=</span> <span class="identifier">add_reference</span><span class="special"><</span><span class="identifier">_</span><span class="special">></span> <span class="special">></span>
+<span class="keyword">struct</span> <span class="identifier">parameter_types</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">parameter_types</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term"><code class="literal">F</code></span></dt>
+<dd><p>
+ Type to analyze
+ </p></dd>
+<dt><span class="term"><code class="literal">ClassTransform</code></span></dt>
+<dd><p>
+ <a href="../../../../../mpl/index.html" target="_top">MPL</a> - <a href="../../../../../mpl/doc/refmanual/lambda-expression.html" target="_top">Lambda
+ Expression</a> to transform the class type if <code class="literal">F</code>
+ is a member function pointer
+ </p></dd>
+<dt><span class="term"><code class="literal">parameter_types<F,ClassTransform></code></span></dt>
+<dd><p>
+ <a href="../../../../../mpl/index.html" target="_top">MPL</a> - <a href="../../../../../mpl/doc/refmanual/front-extensible-sequence.html" target="_top">Front</a>
+ / <a href="../../../../../mpl/doc/refmanual/back-extensible-sequence.html" target="_top">Back
+ </a><a href="../../../../../mpl/doc/refmanual/extensible-sequence.html" target="_top">Extensible
+ </a><a href="../../../../../mpl/doc/refmanual/random-access-sequence.html" target="_top">Random
+ Access Sequence</a> of parameter types
+ </p></dd>
+</dl>
+</div>
+<p>
+ Extracts the parameter types of a callable, builtin type.
+ </p>
+<p>
+ If <code class="literal">F</code> is no callable, builtin type, any attempt to access
+ the sequence results in a compile error.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.decomposition.function_arity"></a><a class="link" href="decomposition.html#boost_functiontypes.reference.decomposition.function_arity" title="function_arity">function_arity</a>
+</h4></div></div></div>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span>
+<span class="keyword">struct</span> <span class="identifier">function_arity</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">function_arity</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term"><code class="literal">F</code></span></dt>
+<dd><p>
+ Callable builtin type
+ </p></dd>
+<dt><span class="term"><code class="literal">function_arity<F></code></span></dt>
+<dd><p>
+ Function arity as <a href="../../../../../mpl/index.html" target="_top">MPL</a>
+ - <a href="../../../../../mpl/doc/refmanual/integral-constant.html" target="_top">Integral
+ Constant</a>
+ </p></dd>
+<dt><span class="term"><code class="literal">function_arity<F>::value</code></span></dt>
+<dd><p>
+ Constant value of the function arity
+ </p></dd>
+</dl>
+</div>
+<p>
+ Extracts the function arity, that is the number of parameters. The hidden
+ <code class="literal">this</code> of member function pointers counts, in other words
+ the arity value is always greater than or equal to one if <code class="literal">F</code>
+ is a member function pointer.
+ </p>
+<p>
+ If <code class="literal">F</code> is no callable, builtin type, any attempt to access
+ the value results in a compile error.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.decomposition.components"></a><a class="link" href="decomposition.html#boost_functiontypes.reference.decomposition.components" title="components">components</a>
+</h4></div></div></div>
+<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">class</span> <span class="identifier">ClassTransform</span> <span class="special">=</span> <span class="identifier">add_reference</span><span class="special"><</span><span class="identifier">_</span><span class="special">></span> <span class="special">></span>
+<span class="keyword">struct</span> <span class="identifier">components</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">components</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term"><code class="literal">T</code></span></dt>
+<dd><p>
+ Type to analyze
+ </p></dd>
+<dt><span class="term"><code class="literal">ClassTransform</code></span></dt>
+<dd><p>
+ <a href="../../../../../mpl/index.html" target="_top">MPL</a> - <a href="../../../../../mpl/doc/refmanual/lambda-expression.html" target="_top">Lambda
+ Expression</a> to transform the class type if <code class="literal">T</code>
+ is a member function pointer
+ </p></dd>
+<dt><span class="term"><code class="literal">components<T,ClassTransform></code></span></dt>
+<dd><p>
+ <a href="../../../../../mpl/index.html" target="_top">MPL</a> - <a href="../../../../../mpl/doc/refmanual/front-extensible-sequence.html" target="_top">Front</a>
+ / <a href="../../../../../mpl/doc/refmanual/back-extensible-sequence.html" target="_top">Back
+ </a><a href="../../../../../mpl/doc/refmanual/extensible-sequence.html" target="_top">Extensible
+ </a><a href="../../../../../mpl/doc/refmanual/random-access-sequence.html" target="_top">Random
+ Access Sequence</a> of all component types and property tag
+ </p></dd>
+<dt><span class="term"><code class="literal">components<T,ClassTransform>::types</code></span></dt>
+<dd><p>
+ Decorated MPL Sequence, exposed for optimization
+ </p></dd>
+</dl>
+</div>
+<p>
+ Extracts all properties of a callable builtin type, that is the result
+ type, followed by the parameter types (including the type of <code class="literal">this</code>
+ for member function pointers).
+ </p>
+<p>
+ If <code class="literal">T</code> is no callable builtin type, the component types
+ are an empty sequence and the Tag's meaning is equivalent to the <code class="literal"><a class="link" href="tag_types.html#boost_functiontypes.reference.tag_types.null_tag" title="null_tag">null_tag</a></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 © 2004-2007 Tobias
+ Schwinger<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="classification.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.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="synthesis.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
diff --git a/doc/html/boost_functiontypes/reference/macros.html b/doc/html/boost_functiontypes/reference/macros.html
new file mode 100644
index 0000000..563a651
--- /dev/null
+++ b/doc/html/boost_functiontypes/reference/macros.html
@@ -0,0 +1,226 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>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. Boost.FunctionTypes 2.5">
+<link rel="up" href="../reference.html" title="Reference">
+<link rel="prev" href="tag_types.html" title="Tag Types">
+<link rel="next" href="../rationale.html" title="Rationale">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
+<td align="center"><a href="../../../../../../index.html">Home</a></td>
+<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
+<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
+<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
+<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="tag_types.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.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="../rationale.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="boost_functiontypes.reference.macros"></a><a class="link" href="macros.html" title="Macros">Macros</a>
+</h3></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="macros.html#boost_functiontypes.reference.macros.BOOST_FT_MAX_ARITY">BOOST_FT_MAX_ARITY</a></span></dt>
+<dt><span class="section"><a href="macros.html#boost_functiontypes.reference.macros.BOOST_FT_CC_NAMES">BOOST_FT_CC_NAMES</a></span></dt>
+<dt><span class="section"><a href="macros.html#boost_functiontypes.reference.macros.BOOST_FT_CC">BOOST_FT_CC_*</a></span></dt>
+<dt><span class="section"><a href="macros.html#boost_functiontypes.reference.macros.BOOST_FT_COMMON_X86_CCs">BOOST_FT_COMMON_X86_CCs</a></span></dt>
+<dt><span class="section"><a href="macros.html#boost_functiontypes.reference.macros.BOOST_FT_SYNTAX">BOOST_FT_SYNTAX</a></span></dt>
+<dt><span class="section"><a href="macros.html#boost_functiontypes.reference.macros.BOOST_FT_NULLARY_PARAM">BOOST_FT_NULLARY_PARAM</a></span></dt>
+<dt><span class="section"><a href="macros.html#boost_functiontypes.reference.macros.BOOST_FT_NO_CV_FUNC_SUPPORT">BOOST_FT_NO_CV_FUNC_SUPPORT</a></span></dt>
+<dt><span class="section"><a href="macros.html#boost_functiontypes.reference.macros.BOOST_FT_PREPROCESSING_MODE">BOOST_FT_PREPROCESSING_MODE</a></span></dt>
+<dt><span class="section"><a href="macros.html#boost_functiontypes.reference.macros.BOOST_FT_CC_PREPROCESSING">BOOST_FT_CC_PREPROCESSING</a></span></dt>
+</dl></div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.macros.BOOST_FT_MAX_ARITY"></a><a class="link" href="macros.html#boost_functiontypes.reference.macros.BOOST_FT_MAX_ARITY" title="BOOST_FT_MAX_ARITY">BOOST_FT_MAX_ARITY</a>
+</h4></div></div></div>
+<p>
+ Expands to a numeric value that describes the maximum function arity supported
+ by the library.
+ </p>
+<p>
+ Defaults to 20 if not explicitly defined by the user before inclusion of
+ the first library header.
+ </p>
+</div>
+<p>
+ <span class="bold"><strong>The following macros do not need to be defined, unless
+ to configure the library to work with a compiler and/or calling convention
+ not covered by the auto-detection mechanism in <code class="literal">boost/function_types/config/compiler.hpp</code>.</strong></span>
+ </p>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.macros.BOOST_FT_CC_NAMES"></a><a class="link" href="macros.html#boost_functiontypes.reference.macros.BOOST_FT_CC_NAMES" title="BOOST_FT_CC_NAMES">BOOST_FT_CC_NAMES</a>
+</h4></div></div></div>
+<p>
+ Expands to a <a href="../../../../../preprocessor/doc/data/sequences.html" target="_top">sequence</a>
+ of ternary <a href="../../../../../preprocessor/doc/data/tuples.html" target="_top">tuples</a>
+ (these data types are defined in the <a href="../../../../../preprocessor/doc/index.html" target="_top">documentation
+ of the Boost Preprocessor library</a>). Each sequence element describes
+ one calling convention specifier. The first element in each tuple is the
+ macro suffix for <a class="link" href="macros.html#boost_functiontypes.reference.macros.BOOST_FT_CC" title="BOOST_FT_CC_*"><code class="literal">BOOST_FT_CC_*</code></a>,
+ the second element is the name of the tag that describes the calling convention
+ and the third is the name of the specifier. The specifier is allowed to
+ be an empty string, so the third tuple element is either <a href="../../../../../preprocessor/doc/ref/empty.html" target="_top"><code class="literal">BOOST_PP_EMPTY</code></a>
+ or <a href="../../../../../preprocessor/doc/ref/identity.html" target="_top"><code class="literal">BOOST_PP_IDENTITY</code></a><code class="literal">(<span class="emphasis"><em>name</em></span>)</code>.
+ </p>
+<p>
+ Define this macro to extend the set of possible names for custom calling
+ conventions. The macro expands to nothing by default.
+ </p>
+<p>
+ The following names are predefined by the library and must not occur in
+ the definition of <code class="literal">BOOST_FT_CC_NAMES</code>:
+ </p>
+<pre class="programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_FT_BUILTIN_CC_NAMES</span> <span class="special">\</span>
+ <span class="special">((</span> <span class="identifier">IMPLICIT</span> <span class="special">,</span> <span class="identifier">implicit_cc</span> <span class="special">,</span> <span class="identifier">BOOST_PP_EMPTY</span> <span class="special">))\</span>
+ <span class="special">((</span> <span class="identifier">CDECL</span> <span class="special">,</span> <span class="identifier">cdecl_cc</span> <span class="special">,</span> <span class="identifier">BOOST_PP_IDENTITY</span><span class="special">(</span><span class="identifier">__cdecl</span> <span class="special">)</span> <span class="special">))\</span>
+ <span class="special">((</span> <span class="identifier">STDCALL</span> <span class="special">,</span> <span class="identifier">stdcall_cc</span> <span class="special">,</span> <span class="identifier">BOOST_PP_IDENTITY</span><span class="special">(</span><span class="identifier">__stdcall</span> <span class="special">)</span> <span class="special">))\</span>
+ <span class="special">((</span> <span class="identifier">PASCAL</span> <span class="special">,</span> <span class="identifier">pascal_cc</span> <span class="special">,</span> <span class="identifier">BOOST_PP_IDENTITY</span><span class="special">(</span><span class="identifier">pascal</span> <span class="special">)</span> <span class="special">))\</span>
+ <span class="special">((</span> <span class="identifier">FASTCALL</span> <span class="special">,</span> <span class="identifier">fastcall_cc</span> <span class="special">,</span> <span class="identifier">BOOST_PP_IDENTITY</span><span class="special">(</span><span class="identifier">__fastcall</span><span class="special">)</span> <span class="special">))\</span>
+ <span class="special">((</span> <span class="identifier">CLRCALL</span> <span class="special">,</span> <span class="identifier">clrcall_cc</span> <span class="special">,</span> <span class="identifier">BOOST_PP_IDENTITY</span><span class="special">(</span><span class="identifier">__clrcall</span> <span class="special">)</span> <span class="special">))\</span>
+ <span class="special">((</span> <span class="identifier">THISCALL</span> <span class="special">,</span> <span class="identifier">thiscall_cc</span> <span class="special">,</span> <span class="identifier">BOOST_PP_IDENTITY</span><span class="special">(</span><span class="identifier">__thiscall</span><span class="special">)</span> <span class="special">))\</span>
+ <span class="special">((</span> <span class="identifier">IMPLICIT_THISCALL</span> <span class="special">,</span> <span class="identifier">thiscall_cc</span> <span class="special">,</span> <span class="identifier">BOOST_PP_EMPTY</span> <span class="special">))</span>
+<span class="comment">// Don't get confused by the last line, here (thiscall can't be specified
+</span><span class="comment">// explicitly prior to MSVC 8).
+</span></pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.macros.BOOST_FT_CC"></a><a class="link" href="macros.html#boost_functiontypes.reference.macros.BOOST_FT_CC" title="BOOST_FT_CC_*">BOOST_FT_CC_*</a>
+</h4></div></div></div>
+<p>
+ Enables a specific calling convention. * denotes the macro suffix, as defined
+ by <a class="link" href="macros.html#boost_functiontypes.reference.macros.BOOST_FT_CC_NAMES" title="BOOST_FT_CC_NAMES"><code class="literal">BOOST_FT_CC_NAMES</code></a>
+ or <a class="link" href="macros.html#boost_functiontypes.reference.macros.BOOST_FT_CC_NAMES" title="BOOST_FT_CC_NAMES"><code class="literal">BOOST_FT_BUILTIN_CC_NAMES</code></a>.
+ </p>
+<p>
+ The macro expands to a list of restrictions, separated by the <code class="literal">|</code>
+ character. Possible items are:
+ </p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc">
+<li class="listitem">
+ callable_builtin
+ </li>
+<li class="listitem">
+ member
+ </li>
+<li class="listitem">
+ non_member
+ </li>
+<li class="listitem">
+ variadic
+ </li>
+<li class="listitem">
+ non_variadic
+ </li>
+</ul></div>
+<p>
+ If no such macro is defined for a particular calling convention, it is
+ disabled. Example:
+ </p>
+<pre class="programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_FT_CC_STDCALL</span> <span class="identifier">non_variadic</span><span class="special">|</span><span class="identifier">callable_builtin</span>
+<span class="comment">// enables stdcall calling convention for all non-variadic,
+</span><span class="comment">// callable, builtin types
+</span></pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.macros.BOOST_FT_COMMON_X86_CCs"></a><a class="link" href="macros.html#boost_functiontypes.reference.macros.BOOST_FT_COMMON_X86_CCs" title="BOOST_FT_COMMON_X86_CCs">BOOST_FT_COMMON_X86_CCs</a>
+</h4></div></div></div>
+<p>
+ Defining this macro causes the following macros to be defined, if not defined
+ already:
+ </p>
+<pre class="programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_FT_CC_CDECL</span> <span class="identifier">BOOST_FT_COMMON_X86_CCs</span>
+<span class="preprocessor">#define</span> <span class="identifier">BOOST_FT_CC_STDCALL</span> <span class="identifier">non_variadic</span><span class="special">|</span><span class="identifier">BOOST_FT_COMMON_X86_CCs</span>
+<span class="preprocessor">#define</span> <span class="identifier">BOOST_FT_CC_FASTCALL</span> <span class="identifier">non_variadic</span><span class="special">|</span><span class="identifier">BOOST_FT_COMMON_X86_CCs</span>
+</pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.macros.BOOST_FT_SYNTAX"></a><a class="link" href="macros.html#boost_functiontypes.reference.macros.BOOST_FT_SYNTAX" title="BOOST_FT_SYNTAX">BOOST_FT_SYNTAX</a>
+</h4></div></div></div>
+<p>
+ This macro allows to change the syntax of callable builtin types. It is
+ useful to handle the compiler specific placement of the calling convention
+ specifier.
+ </p>
+<p>
+ The default definition is as follows:
+ </p>
+<pre class="programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_FT_SYNTAX</span><span class="special">(</span><span class="identifier">result</span><span class="special">,</span><span class="identifier">lparen</span><span class="special">,</span><span class="identifier">cc_spec</span><span class="special">,</span><span class="identifier">type_mod</span><span class="special">,</span><span class="identifier">name</span><span class="special">,</span><span class="identifier">rparen</span><span class="special">)</span> <span class="special">\</span>
+ <span class="identifier">result</span><span class="special">()</span> <span class="identifier">lparen</span><span class="special">()</span> <span class="identifier">cc_spec</span><span class="special">()</span> <span class="identifier">type_mod</span><span class="special">()</span> <span class="identifier">name</span><span class="special">()</span> <span class="identifier">rparen</span><span class="special">()</span>
+</pre>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.macros.BOOST_FT_NULLARY_PARAM"></a><a class="link" href="macros.html#boost_functiontypes.reference.macros.BOOST_FT_NULLARY_PARAM" title="BOOST_FT_NULLARY_PARAM">BOOST_FT_NULLARY_PARAM</a>
+</h4></div></div></div>
+<p>
+ Set to <code class="literal">void</code> for compilers that insist on a <code class="literal">void</code>
+ parameter for nullary function types, empty by default.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.macros.BOOST_FT_NO_CV_FUNC_SUPPORT"></a><a class="link" href="macros.html#boost_functiontypes.reference.macros.BOOST_FT_NO_CV_FUNC_SUPPORT" title="BOOST_FT_NO_CV_FUNC_SUPPORT">BOOST_FT_NO_CV_FUNC_SUPPORT</a>
+</h4></div></div></div>
+<p>
+ Disables support for cv-qualified function types. Cv-qualified function
+ types are illegal by the current standard version, but there is a pending
+ defect report on that issue. It defaults to <code class="literal">1</code> until
+ the standard changes, setting this macro to <code class="literal">0</code> may not
+ work.
+ </p>
+</div>
+<p>
+ <span class="bold"><strong>The following macros are useful for testing when changing
+ the source code of the library.</strong></span>
+ </p>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.macros.BOOST_FT_PREPROCESSING_MODE"></a><a class="link" href="macros.html#boost_functiontypes.reference.macros.BOOST_FT_PREPROCESSING_MODE" title="BOOST_FT_PREPROCESSING_MODE">BOOST_FT_PREPROCESSING_MODE</a>
+</h4></div></div></div>
+<p>
+ Makes the compiler preprocess as much as possible of the library code (rather
+ than loading already-preprocessed header files) if defined.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.macros.BOOST_FT_CC_PREPROCESSING"></a><a class="link" href="macros.html#boost_functiontypes.reference.macros.BOOST_FT_CC_PREPROCESSING" title="BOOST_FT_CC_PREPROCESSING">BOOST_FT_CC_PREPROCESSING</a>
+</h4></div></div></div>
+<p>
+ Makes the compiler preprocess the loop over possible names for custom calling
+ conventions (rather than loading an already-preprocessed header file) if
+ defined.
+ </p>
+<p>
+ This macro is defined automatically if <a class="link" href="macros.html#boost_functiontypes.reference.macros.BOOST_FT_CC_NAMES" title="BOOST_FT_CC_NAMES"><code class="literal">BOOST_FT_CC_NAMES</code></a>
+ has been defined.
+ </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 © 2004-2007 Tobias
+ Schwinger<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="tag_types.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.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="../rationale.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
diff --git a/doc/html/boost_functiontypes/reference/synthesis.html b/doc/html/boost_functiontypes/reference/synthesis.html
new file mode 100644
index 0000000..ae914f7
--- /dev/null
+++ b/doc/html/boost_functiontypes/reference/synthesis.html
@@ -0,0 +1,213 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Class templates for type synthesis</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. Boost.FunctionTypes 2.5">
+<link rel="up" href="../reference.html" title="Reference">
+<link rel="prev" href="decomposition.html" title="Class templates for type decomposition">
+<link rel="next" href="tag_types.html" title="Tag Types">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
+<td align="center"><a href="../../../../../../index.html">Home</a></td>
+<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
+<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
+<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
+<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="decomposition.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.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="tag_types.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="boost_functiontypes.reference.synthesis"></a><a class="link" href="synthesis.html" title="Class templates for type synthesis">Class templates
+ for type synthesis</a>
+</h3></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="synthesis.html#boost_functiontypes.reference.synthesis.function_type">function_type</a></span></dt>
+<dt><span class="section"><a href="synthesis.html#boost_functiontypes.reference.synthesis.function_pointer">function_pointer</a></span></dt>
+<dt><span class="section"><a href="synthesis.html#boost_functiontypes.reference.synthesis.function_reference">function_reference</a></span></dt>
+<dt><span class="section"><a href="synthesis.html#boost_functiontypes.reference.synthesis.member_function_pointer">member_function_pointer</a></span></dt>
+</dl></div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.synthesis.function_type"></a><a class="link" href="synthesis.html#boost_functiontypes.reference.synthesis.function_type" title="function_type">function_type</a>
+</h4></div></div></div>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Types</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Tag</span> <span class="special">=</span> <a class="link" href="tag_types.html#boost_functiontypes.reference.tag_types.null_tag" title="null_tag">null_tag</a><span class="special">></span>
+<span class="keyword">struct</span> <span class="identifier">function_type</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">function_type</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term"><code class="literal">Types</code></span></dt>
+<dd><p>
+ Component types in form of an <a href="../../../../../mpl/index.html" target="_top">MPL</a>
+ - <a href="../../../../../mpl/doc/refmanual/forward-sequence.html" target="_top">Forward
+ Sequence</a> or another callable, builtin type
+ </p></dd>
+<dt><span class="term"><code class="literal">Tag</code></span></dt>
+<dd><p>
+ Further properties
+ </p></dd>
+<dt><span class="term"><code class="literal">function_type<Types,Tag>::type</code></span></dt>
+<dd><p>
+ Synthesized type
+ </p></dd>
+</dl>
+</div>
+<p>
+ Synthesizes a function type from given properties.
+ </p>
+<p>
+ If the template parameters do not describe a valid type, any attempt to
+ access the <code class="literal">type</code> member will result in a compile error.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.synthesis.function_pointer"></a><a class="link" href="synthesis.html#boost_functiontypes.reference.synthesis.function_pointer" title="function_pointer">function_pointer</a>
+</h4></div></div></div>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Types</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Tag</span> <span class="special">=</span> <a class="link" href="tag_types.html#boost_functiontypes.reference.tag_types.null_tag" title="null_tag">null_tag</a><span class="special">></span>
+<span class="keyword">struct</span> <span class="identifier">function_pointer</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">function_pointer</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term"><code class="literal">Types</code></span></dt>
+<dd><p>
+ Component types in form of an <a href="../../../../../mpl/index.html" target="_top">MPL</a>
+ - <a href="../../../../../mpl/doc/refmanual/forward-sequence.html" target="_top">Forward
+ Sequence</a> or another callable, builtin type
+ </p></dd>
+<dt><span class="term"><code class="literal">Tag</code></span></dt>
+<dd><p>
+ Further properties
+ </p></dd>
+<dt><span class="term"><code class="literal">function_pointer<Types,Tag>::type</code></span></dt>
+<dd><p>
+ Synthesized type
+ </p></dd>
+</dl>
+</div>
+<p>
+ Synthesizes a function pointer type from given properties.
+ </p>
+<p>
+ If the template parameters do not describe a valid type, any attempt to
+ access the <code class="literal">type</code> member will result in a compile error.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.synthesis.function_reference"></a><a class="link" href="synthesis.html#boost_functiontypes.reference.synthesis.function_reference" title="function_reference">function_reference</a>
+</h4></div></div></div>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Types</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Tag</span> <span class="special">=</span> <a class="link" href="tag_types.html#boost_functiontypes.reference.tag_types.null_tag" title="null_tag">null_tag</a><span class="special">></span>
+<span class="keyword">struct</span> <span class="identifier">function_reference</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">function_reference</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term"><code class="literal">Types</code></span></dt>
+<dd><p>
+ Component types in form of an <a href="../../../../../mpl/index.html" target="_top">MPL</a>
+ - <a href="../../../../../mpl/doc/refmanual/forward-sequence.html" target="_top">Forward
+ Sequence</a> or another callable, builtin type
+ </p></dd>
+<dt><span class="term"><code class="literal">Tag</code></span></dt>
+<dd><p>
+ Further properties
+ </p></dd>
+<dt><span class="term"><code class="literal">function_reference<Types,Tag>::type</code></span></dt>
+<dd><p>
+ Synthesized type
+ </p></dd>
+</dl>
+</div>
+<p>
+ Synthesizes a function reference type from given properties.
+ </p>
+<p>
+ If the template parameters do not describe a valid type, any attempt to
+ access the <code class="literal">type</code> member will result in a compile error.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.synthesis.member_function_pointer"></a><a class="link" href="synthesis.html#boost_functiontypes.reference.synthesis.member_function_pointer" title="member_function_pointer">member_function_pointer</a>
+</h4></div></div></div>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Types</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">Tag</span> <span class="special">=</span> <a class="link" href="tag_types.html#boost_functiontypes.reference.tag_types.null_tag" title="null_tag">null_tag</a><span class="special">></span>
+<span class="keyword">struct</span> <span class="identifier">member_function_pointer</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">member_function_pointer</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term"><code class="literal">Types</code></span></dt>
+<dd><p>
+ Component types in form of an <a href="../../../../../mpl/index.html" target="_top">MPL</a>
+ - <a href="../../../../../mpl/doc/refmanual/forward-sequence.html" target="_top">Forward
+ Sequence</a> or another callable, builtin type
+ </p></dd>
+<dt><span class="term"><code class="literal">Tag</code></span></dt>
+<dd><p>
+ Further properties
+ </p></dd>
+<dt><span class="term"><code class="literal">member_function_pointer<Types,Tag>::type</code></span></dt>
+<dd><p>
+ Synthesized type
+ </p></dd>
+</dl>
+</div>
+<p>
+ Synthesizes a member function pointer type from given properties.
+ </p>
+<p>
+ An optional reference or possibly cv-qualified pointer is removed from
+ the second type in the sequence to determine the the class type. The cv-qualification
+ of the resulting type applies to the member function, unless otherwise
+ explicitly specified by the property tag.
+ </p>
+<p>
+ If the template parameters do not describe a valid type, any attempt to
+ access the <code class="literal">type</code> member will result in a compile error.
+ </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 © 2004-2007 Tobias
+ Schwinger<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="decomposition.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.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="tag_types.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
diff --git a/doc/html/boost_functiontypes/reference/tag_types.html b/doc/html/boost_functiontypes/reference/tag_types.html
new file mode 100644
index 0000000..c213fdb
--- /dev/null
+++ b/doc/html/boost_functiontypes/reference/tag_types.html
@@ -0,0 +1,279 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Tag Types</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. Boost.FunctionTypes 2.5">
+<link rel="up" href="../reference.html" title="Reference">
+<link rel="prev" href="synthesis.html" title="Class templates for type synthesis">
+<link rel="next" href="macros.html" title="Macros">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
+<td align="center"><a href="../../../../../../index.html">Home</a></td>
+<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
+<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
+<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
+<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="synthesis.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.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="macros.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h3 class="title">
+<a name="boost_functiontypes.reference.tag_types"></a><a class="link" href="tag_types.html" title="Tag Types">Tag Types</a>
+</h3></div></div></div>
+<div class="toc"><dl>
+<dt><span class="section"><a href="tag_types.html#boost_functiontypes.reference.tag_types.variadic">variadic</a></span></dt>
+<dt><span class="section"><a href="tag_types.html#boost_functiontypes.reference.tag_types.non_variadic">non_variadic</a></span></dt>
+<dt><span class="section"><a href="tag_types.html#boost_functiontypes.reference.tag_types.default_cc">default_cc</a></span></dt>
+<dt><span class="section"><a href="tag_types.html#boost_functiontypes.reference.tag_types.const_qualified">const_qualified</a></span></dt>
+<dt><span class="section"><a href="tag_types.html#boost_functiontypes.reference.tag_types.non_const">non_const</a></span></dt>
+<dt><span class="section"><a href="tag_types.html#boost_functiontypes.reference.tag_types.volatile_qualified">volatile_qualified</a></span></dt>
+<dt><span class="section"><a href="tag_types.html#boost_functiontypes.reference.tag_types.non_volatile">non_volatile</a></span></dt>
+<dt><span class="section"><a href="tag_types.html#boost_functiontypes.reference.tag_types.non_cv">non_cv</a></span></dt>
+<dt><span class="section"><a href="tag_types.html#boost_functiontypes.reference.tag_types.const_non_volatile">const_non_volatile</a></span></dt>
+<dt><span class="section"><a href="tag_types.html#boost_functiontypes.reference.tag_types.volatile_non_const">volatile_non_const</a></span></dt>
+<dt><span class="section"><a href="tag_types.html#boost_functiontypes.reference.tag_types.cv_qualfied">cv_qualfied</a></span></dt>
+<dt><span class="section"><a href="tag_types.html#boost_functiontypes.reference.tag_types.null_tag">null_tag</a></span></dt>
+<dt><span class="section"><a href="tag_types.html#boost_functiontypes.reference.tag_types.tag">tag</a></span></dt>
+</dl></div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.tag_types.variadic"></a><a class="link" href="tag_types.html#boost_functiontypes.reference.tag_types.variadic" title="variadic">variadic</a>
+</h4></div></div></div>
+<pre class="programlisting"><span class="keyword">typedef</span> <span class="emphasis"><em>unspecified</em></span> <span class="identifier">variadic</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">property_tags</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<p>
+ States that a function type takes a variable number of arguments through
+ an ellipsis parameter (such as <code class="literal">printf</code>).
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.tag_types.non_variadic"></a><a class="link" href="tag_types.html#boost_functiontypes.reference.tag_types.non_variadic" title="non_variadic">non_variadic</a>
+</h4></div></div></div>
+<pre class="programlisting"><span class="keyword">typedef</span> <span class="emphasis"><em>unspecified</em></span> <span class="identifier">non_variadic</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">property_tags</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<p>
+ States that a function type does not have an ellipsis parameter.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.tag_types.default_cc"></a><a class="link" href="tag_types.html#boost_functiontypes.reference.tag_types.default_cc" title="default_cc">default_cc</a>
+</h4></div></div></div>
+<pre class="programlisting"><span class="keyword">typedef</span> <span class="emphasis"><em>unspecified</em></span> <span class="identifier">default_cc</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">property_tags</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<p>
+ States that a function type encodes the default calling convention.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.tag_types.const_qualified"></a><a class="link" href="tag_types.html#boost_functiontypes.reference.tag_types.const_qualified" title="const_qualified">const_qualified</a>
+</h4></div></div></div>
+<pre class="programlisting"><span class="keyword">typedef</span> <span class="emphasis"><em>unspecified</em></span> <span class="identifier">const_qualified</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">property_tags</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<p>
+ States that a function type is const qualified.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.tag_types.non_const"></a><a class="link" href="tag_types.html#boost_functiontypes.reference.tag_types.non_const" title="non_const">non_const</a>
+</h4></div></div></div>
+<pre class="programlisting"><span class="keyword">typedef</span> <span class="emphasis"><em>unspecified</em></span> <span class="identifier">non_const</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">property_tags</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<p>
+ States that a function type is not const qualified.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.tag_types.volatile_qualified"></a><a class="link" href="tag_types.html#boost_functiontypes.reference.tag_types.volatile_qualified" title="volatile_qualified">volatile_qualified</a>
+</h4></div></div></div>
+<pre class="programlisting"><span class="keyword">typedef</span> <span class="emphasis"><em>unspecified</em></span> <span class="identifier">volatile_qualified</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">property_tags</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<p>
+ States that a function type is volatile qualified.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.tag_types.non_volatile"></a><a class="link" href="tag_types.html#boost_functiontypes.reference.tag_types.non_volatile" title="non_volatile">non_volatile</a>
+</h4></div></div></div>
+<pre class="programlisting"><span class="keyword">typedef</span> <span class="emphasis"><em>unspecified</em></span> <span class="identifier">non_volatile</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">property_tags</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<p>
+ States that a function type is not volatile qualified.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.tag_types.non_cv"></a><a class="link" href="tag_types.html#boost_functiontypes.reference.tag_types.non_cv" title="non_cv">non_cv</a>
+</h4></div></div></div>
+<pre class="programlisting"><span class="keyword">typedef</span> <span class="emphasis"><em>unspecified</em></span> <span class="identifier">non_cv</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">property_tags</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<p>
+ States that a function type is neither const nor volatile qualified. Equivalent
+ to <code class="computeroutput"><span class="identifier">__tag</span><span class="special"><</span><span class="identifier">__non_const</span><span class="special">,</span><span class="identifier">__non_volatile</span><span class="special">></span></code>,
+ but involves fewer template instantiations when evaluated.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.tag_types.const_non_volatile"></a><a class="link" href="tag_types.html#boost_functiontypes.reference.tag_types.const_non_volatile" title="const_non_volatile">const_non_volatile</a>
+</h4></div></div></div>
+<pre class="programlisting"><span class="keyword">typedef</span> <span class="emphasis"><em>unspecified</em></span> <span class="identifier">const_non_volatile</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">property_tags</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<p>
+ States that a function type is const but not volatile qualified. Equivalent
+ to <code class="computeroutput"><span class="identifier">__tag</span><span class="special"><</span><span class="identifier">__const_qualified</span><span class="special">,</span><span class="identifier">__non_volatile</span><span class="special">></span></code>,
+ but involves fewer template instantiations when evaluated.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.tag_types.volatile_non_const"></a><a class="link" href="tag_types.html#boost_functiontypes.reference.tag_types.volatile_non_const" title="volatile_non_const">volatile_non_const</a>
+</h4></div></div></div>
+<pre class="programlisting"><span class="keyword">typedef</span> <span class="emphasis"><em>unspecified</em></span> <span class="identifier">volatile_non_const</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">property_tags</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<p>
+ States that a function type is volatile but not const qualified. Equivalent
+ to <code class="computeroutput"><span class="identifier">__tag</span><span class="special"><</span><span class="identifier">__volatile_qualified</span><span class="special">,</span><span class="identifier">__non_const</span><span class="special">></span></code>,
+ but involves fewer template instantiations when evaluated.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.tag_types.cv_qualfied"></a><a class="link" href="tag_types.html#boost_functiontypes.reference.tag_types.cv_qualfied" title="cv_qualfied">cv_qualfied</a>
+</h4></div></div></div>
+<pre class="programlisting"><span class="keyword">typedef</span> <span class="emphasis"><em>unspecified</em></span> <span class="identifier">cv_qualified</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">property_tags</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<p>
+ States that a function type is both const and volatile qualified. Equivalent
+ to <code class="computeroutput"><span class="identifier">__tag</span><span class="special"><</span><span class="identifier">__const_qualified</span><span class="special">,</span><span class="identifier">__volatile_qualified</span><span class="special">></span></code>,
+ but involves fewer template instantiations when evaluated.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.tag_types.null_tag"></a><a class="link" href="tag_types.html#boost_functiontypes.reference.tag_types.null_tag" title="null_tag">null_tag</a>
+</h4></div></div></div>
+<pre class="programlisting"><span class="keyword">typedef</span> <span class="emphasis"><em>unspecified</em></span> <span class="identifier">null_tag</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">property_tags</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<p>
+ States nothing.
+ </p>
+</div>
+<div class="section">
+<div class="titlepage"><div><div><h4 class="title">
+<a name="boost_functiontypes.reference.tag_types.tag"></a><a class="link" href="tag_types.html#boost_functiontypes.reference.tag_types.tag" title="tag">tag</a>
+</h4></div></div></div>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">class</span> <span class="identifier">Tag1</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Tag2</span><span class="special">,</span>
+ <span class="keyword">class</span> <span class="identifier">Tag3</span> <span class="special">=</span> <span class="identifier">null_tag</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Tag4</span> <span class="special">=</span> <span class="identifier">null_tag</span><span class="special">></span>
+<span class="keyword">struct</span> <span class="identifier">tag</span><span class="special">;</span>
+</pre>
+<p>
+ <span class="bold"><strong>Header</strong></span>
+ </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">function_types</span><span class="special">/</span><span class="identifier">property_tags</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
+</pre>
+<div class="variablelist">
+<p class="title"><b></b></p>
+<dl>
+<dt><span class="term"><code class="literal">Tag<span class="emphasis"><em>N</em></span></code></span></dt>
+<dd><p>
+ Property tag
+ </p></dd>
+<dt><span class="term"><code class="literal">tag<Tag1,Tag2...></code></span></dt>
+<dd><p>
+ Compound property tag
+ </p></dd>
+</dl>
+</div>
+<p>
+ Combination of up to four property tags. If the arguments describe different
+ values for the same property the value of the rightmost argument is used.
+ </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 © 2004-2007 Tobias
+ Schwinger<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="synthesis.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../reference.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="macros.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
diff --git a/doc/html/boost_functiontypes/use_cases.html b/doc/html/boost_functiontypes/use_cases.html
new file mode 100644
index 0000000..5ec5477
--- /dev/null
+++ b/doc/html/boost_functiontypes/use_cases.html
@@ -0,0 +1,175 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Use Cases</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. Boost.FunctionTypes 2.5">
+<link rel="up" href="../index.html" title="Chapter 1. Boost.FunctionTypes 2.5">
+<link rel="prev" href="introduction.html" title="Introduction">
+<link rel="next" href="about_tag_types.html" title="About Tag Types">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
+<td align="center"><a href="../../../../../index.html">Home</a></td>
+<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td>
+<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
+<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
+<td align="center"><a href="../../../../../more/index.htm">More</a></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="introduction.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="about_tag_types.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="boost_functiontypes.use_cases"></a><a class="link" href="use_cases.html" title="Use Cases">Use Cases</a>
+</h2></div></div></div>
+<p>
+ Generic libraries that accept callable arguments are common in C++. Accepting
+ a callable argument of builin type often involves a lot of repetitive code
+ because the accepting function is overloaded for different function arities.
+ Further, member functions may have <code class="literal">const</code>/<code class="literal">volatile</code>-qualifiers,
+ a function may take a variable number of (additional, POD-typed) arguments
+ (such as <code class="literal">printf</code>) and several C++ implementations encode
+ a calling convention with each function's type to allow calls across language
+ or (sub-)system boundaries.
+ </p>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">></span>
+<span class="keyword">void</span> <span class="identifier">accept_function</span><span class="special">(</span><span class="identifier">R</span><span class="special">(*</span> <span class="identifier">func</span><span class="special">)());</span>
+
+<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">></span>
+<span class="keyword">void</span> <span class="identifier">accept_function</span><span class="special">(</span><span class="identifier">R</span><span class="special">(&</span> <span class="identifier">func</span><span class="special">)());</span>
+
+<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">C</span><span class="special">></span>
+<span class="keyword">void</span> <span class="identifier">accept_function</span><span class="special">(</span><span class="identifier">R</span><span class="special">(</span><span class="identifier">C</span><span class="special">::*</span> <span class="identifier">func</span><span class="special">)());</span>
+
+<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">C</span><span class="special">></span>
+<span class="keyword">void</span> <span class="identifier">accept_function</span><span class="special">(</span><span class="identifier">R</span><span class="special">(</span><span class="identifier">C</span><span class="special">::*</span> <span class="identifier">func</span><span class="special">)()</span> <span class="keyword">const</span><span class="special">);</span>
+
+<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">C</span><span class="special">></span>
+<span class="keyword">void</span> <span class="identifier">accept_function</span><span class="special">(</span><span class="identifier">R</span><span class="special">(</span><span class="identifier">C</span><span class="special">::*</span> <span class="identifier">func</span><span class="special">)()</span> <span class="keyword">volatile</span><span class="special">);</span>
+
+<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">C</span><span class="special">></span>
+<span class="keyword">void</span> <span class="identifier">accept_function</span><span class="special">(</span><span class="identifier">R</span><span class="special">(</span><span class="identifier">C</span><span class="special">::*</span> <span class="identifier">func</span><span class="special">)()</span> <span class="keyword">const</span> <span class="keyword">volatile</span><span class="special">);</span>
+
+<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">></span>
+<span class="keyword">void</span> <span class="identifier">accept_function</span><span class="special">(</span><span class="identifier">R</span><span class="special">(*</span> <span class="identifier">func</span><span class="special">)(...));</span>
+
+<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">></span>
+<span class="keyword">void</span> <span class="identifier">accept_function</span><span class="special">(</span><span class="identifier">R</span><span class="special">(&</span> <span class="identifier">func</span><span class="special">)(...));</span>
+
+<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">C</span><span class="special">></span>
+<span class="keyword">void</span> <span class="identifier">accept_function</span><span class="special">(</span><span class="identifier">R</span><span class="special">(</span><span class="identifier">C</span><span class="special">::*</span> <span class="identifier">func</span><span class="special">)(...));</span>
+
+<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">C</span><span class="special">></span>
+<span class="keyword">void</span> <span class="identifier">accept_function</span><span class="special">(</span><span class="identifier">R</span><span class="special">(</span><span class="identifier">C</span><span class="special">::*</span> <span class="identifier">func</span><span class="special">)(...)</span> <span class="keyword">const</span><span class="special">);</span>
+
+<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">C</span><span class="special">></span>
+<span class="keyword">void</span> <span class="identifier">accept_function</span><span class="special">(</span><span class="identifier">R</span><span class="special">(</span><span class="identifier">C</span><span class="special">::*</span> <span class="identifier">func</span><span class="special">)(...)</span> <span class="keyword">volatile</span><span class="special">);</span>
+
+<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">C</span><span class="special">></span>
+<span class="keyword">void</span> <span class="identifier">accept_function</span><span class="special">(</span><span class="identifier">R</span><span class="special">(</span><span class="identifier">C</span><span class="special">::*</span> <span class="identifier">func</span><span class="special">)(...)</span> <span class="keyword">const</span> <span class="keyword">volatile</span><span class="special">);</span>
+
+<span class="comment">// ...
+</span>
+<span class="comment">// needs to be repeated for every additional function parameter
+</span><span class="comment">// times the number of possible calling conventions
+</span></pre>
+<p>
+ The "overloading approach" obviously does not scale well: There might
+ be several functions that accept callable arguments in one library and client
+ code might end up using several libraries that use this pattern. On the developer
+ side, library developers spend their time solving the same problem, working
+ around the same portability issues, and apply similar optimizations to keep
+ the compilation time down.
+ </p>
+<p>
+ Using Boost.FunctionTypes it is possible to write a single function template
+ instead:
+ </p>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">F</span><span class="special">></span>
+<span class="keyword">void</span> <span class="identifier">accept_function</span><span class="special">(</span><span class="identifier">F</span> <span class="identifier">f</span><span class="special">)</span>
+<span class="special">{</span>
+ <span class="comment">// ... use Boost.FunctionTypes to analyse F
+</span><span class="special">}</span>
+</pre>
+<p>
+ The combination with a tuples library that provides an invoker component, such
+ as <a href="../../../../fusion/index.html" target="_top">Boost.Fusion</a>, allows to
+ build flexible callback facilities that are entirely free of repetitive code
+ as shown by the <a href="../../../../function_types/example/interpreter.hpp" target="_top">interpreter
+ example</a>.
+ </p>
+<p>
+ When taking the address of an overloaded function or function template, the
+ type of the function must be known from the context the expression is used
+ in. The code below shows three examples for choosing the <code class="literal">float(float)</code>
+ overload of <code class="literal">std::abs</code>.
+ </p>
+<pre class="programlisting"><span class="keyword">float</span> <span class="special">(*</span><span class="identifier">ptr_absf</span><span class="special">)(</span><span class="keyword">float</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">abs</span><span class="special">;</span>
+
+
+<span class="keyword">void</span> <span class="identifier">foo</span><span class="special">(</span><span class="keyword">float</span><span class="special">(*</span><span class="identifier">func</span><span class="special">)(</span><span class="keyword">float</span><span class="special">));</span>
+
+<span class="keyword">void</span> <span class="identifier">bar</span><span class="special">()</span>
+<span class="special">{</span>
+ <span class="identifier">foo</span><span class="special">(&</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">abs</span><span class="special">);</span>
+<span class="special">}</span>
+
+
+<span class="identifier">std</span><span class="special">::</span><span class="identifier">transform</span><span class="special">(</span><span class="identifier">b</span><span class="special">,</span> <span class="identifier">e</span><span class="special">,</span> <span class="identifier">o</span><span class="special">,</span> <span class="keyword">static_cast</span><span class="special"><</span><span class="keyword">float</span><span class="special">(*)(</span><span class="keyword">float</span><span class="special">)>(&</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">abs</span><span class="special">));</span>
+</pre>
+<p>
+ The library's type synthesis capabilities can be used to automate overload
+ selection and instantiation of function templates. Given an overloaded function
+ template
+ </p>
+<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">T0</span><span class="special">></span>
+<span class="identifier">R</span> <span class="identifier">overloaded</span><span class="special">(</span><span class="identifier">T0</span><span class="special">);</span>
+
+<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">T0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">T1</span><span class="special">></span>
+<span class="identifier">R</span> <span class="identifier">overloaded</span><span class="special">(</span><span class="identifier">T0</span><span class="special">,</span><span class="identifier">T1</span><span class="special">);</span>
+
+<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">R</span><span class="special">.</span> <span class="keyword">typename</span> <span class="identifier">T0</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">T1</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">T2</span><span class="special">></span>
+<span class="identifier">R</span> <span class="identifier">overloaded</span><span class="special">(</span><span class="identifier">T0</span><span class="special">,</span><span class="identifier">T1</span><span class="special">,</span><span class="identifier">T2</span><span class="special">);</span>
+</pre>
+<p>
+ we can pick any of the three overloads and instantiate the template with template
+ arguments from a type sequence in a single expression:
+ </p>
+<pre class="programlisting"><span class="keyword">static_cast</span><span class="special"><</span><a class="link" href="reference/synthesis.html#boost_functiontypes.reference.synthesis.function_pointer" title="function_pointer">function_pointer</a><span class="special"><</span><span class="identifier">Seq</span><span class="special">>::</span><span class="identifier">type</span><span class="special">>(&</span> <span class="identifier">overloaded</span><span class="special">)</span>
+</pre>
+<p>
+ This technique can be occasionally more flexible than template argument deduction
+ from a function call because the exact types from the sequence are used to
+ specialize the template (including possibly cv-qualified reference types and
+ the result type). It is applied twice in the <a href="../../../../function_types/example/interface.hpp" target="_top">interface
+ example</a>.
+ </p>
+<p>
+ Another interersting property of callable, builtin types is that they can be
+ valid types for non-type template parameters. This way, a function can be pinpointed
+ at compile time, allowing the compiler to eliminate the call by inlining. The
+ <a href="../../../../function_types/example/fast_mem_fn.hpp" target="_top">fast_mem_fn example</a>
+ exploits this characteristic and implements a potentially inlining version
+ of <a href="../../../../bind/mem_fn.html" target="_top">boost::mem_fn</a> limited to
+ member functions that are known at compile time.
+ </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 © 2004-2007 Tobias
+ Schwinger<p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
+ </p>
+</div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav">
+<a accesskey="p" href="introduction.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="about_tag_types.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
+</div>
+</body>
+</html>
diff --git a/doc/html/index.html b/doc/html/index.html
new file mode 100644
index 0000000..670c9df
--- /dev/null
+++ b/doc/html/index.html
@@ -0,0 +1,56 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
+<title>Chapter 1. Boost.FunctionTypes 2.5</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. Boost.FunctionTypes 2.5">
+<link rel="next" href="boost_functiontypes/introduction.html" title="Introduction">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table cellpadding="2" width="100%"><tr>
+<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td>
+<td align="center"><a href="../../../../index.html">Home</a></td>
+<td align="center"><a href="../../../../libs/libraries.htm">Libraries</a></td>
+<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
+<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
+<td align="center"><a href="../../../../more/index.htm">More</a></td>
+</tr></table>
+<hr>
+<div class="spirit-nav"><a accesskey="n" href="boost_functiontypes/introduction.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="boost_functiontypes"></a>Chapter 1. Boost.FunctionTypes 2.5</h2></div>
+<div><div class="author"><h3 class="author">
+<span class="firstname">Tobias</span> <span class="surname">Schwinger</span>
+</h3></div></div>
+<div><p class="copyright">Copyright © 2004-2007 Tobias
+ Schwinger</p></div>
+<div><div class="legalnotice">
+<a name="id768638"></a><p>
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
+ </p>
+</div></div>
+</div></div>
+<div class="toc">
+<p><b>Table of Contents</b></p>
+<dl>
+<dt><span class="section"><a href="boost_functiontypes/introduction.html">Introduction</a></span></dt>
+<dt><span class="section"><a href="boost_functiontypes/use_cases.html">Use Cases</a></span></dt>
+<dt><span class="section"><a href="boost_functiontypes/about_tag_types.html">About Tag Types</a></span></dt>
+<dt><span class="section"><a href="boost_functiontypes/reference.html">Reference</a></span></dt>
+<dt><span class="section"><a href="boost_functiontypes/rationale.html">Rationale</a></span></dt>
+<dt><span class="section"><a href="boost_functiontypes/acknowledgements.html">Acknowledgements</a></span></dt>
+</dl>
+</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: April 09, 2008 at 18:26:31 +0100</small></p></td>
+<td align="right"><div class="copyright-footer"></div></td>
+</tr></table>
+<hr>
+<div class="spirit-nav"><a accesskey="n" href="boost_functiontypes/introduction.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a></div>
+</body>
+</html>
diff --git a/example/Jamfile b/example/Jamfile
new file mode 100644
index 0000000..08ab43d
--- /dev/null
+++ b/example/Jamfile
@@ -0,0 +1,20 @@
+
+# (C) Copyright Tobias Schwinger
+#
+# Use, modification and distribution are subject to the Boost Software License,
+# Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+#-------------------------------------------------------------------------------
+
+exe interpreter_example : interpreter_example.cpp ;
+
+exe result_of_example : result_of_example.cpp ;
+
+exe interface_example : interface_example.cpp ;
+
+exe fast_mem_fn_example : fast_mem_fn_example.cpp
+ : <include>. ; # needed for Boost.PP file iteration with some compilers
+
+exe macro_type_args_example : macro_type_args_example.cpp ;
+
+
diff --git a/example/detail/param_type.hpp b/example/detail/param_type.hpp
new file mode 100644
index 0000000..7c0fd5f
--- /dev/null
+++ b/example/detail/param_type.hpp
@@ -0,0 +1,71 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// Metafunction to compute optimal parameter type for argument forwarding.
+
+// This header is not an FT example in itself -- it's used by some of them to
+// optimize argument forwarding.
+//
+// For more details see 'fast_mem_fn.hpp' in this directory or the documentation
+// of the CallTraits utility [1].
+//
+//
+// References
+// ==========
+//
+// [1] http://www.boost.org/libs/utility/call_traits.htm
+
+#ifndef BOOST_UTILITY_PARAM_TYPE_HPP_INCLUDED
+#define BOOST_UTILITY_PARAM_TYPE_HPP_INCLUDED
+
+#include <boost/config.hpp>
+
+#include <boost/type_traits/add_const.hpp>
+#include <boost/type_traits/add_reference.hpp>
+
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/identity.hpp>
+
+#include <boost/mpl/aux_/lambda_support.hpp>
+// #include <boost/type_traits/detail/template_arity_spec.hpp>
+
+// namespace boost
+namespace example
+{
+ namespace mpl = boost::mpl;
+
+ // namespace utility
+ // {
+ namespace param_type_detail
+ {
+ template<typename T>
+ struct by_ref_cond
+ {
+ typedef by_ref_cond type;
+ BOOST_STATIC_CONSTANT(bool,value = sizeof(void*) < sizeof(T));
+ };
+
+ template<typename T>
+ struct add_ref_to_const
+ : boost::add_reference< typename boost::add_const<T>::type >
+ { };
+ }
+
+ template<typename T>
+ struct param_type
+ : mpl::eval_if< param_type_detail::by_ref_cond<T>
+ , param_type_detail::add_ref_to_const<T>, mpl::identity<T> >
+ {
+ BOOST_MPL_AUX_LAMBDA_SUPPORT(1,param_type,(T))
+ };
+ // }
+ // BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(1,utility::param_type)
+}
+
+#endif
+
diff --git a/example/fast_mem_fn.hpp b/example/fast_mem_fn.hpp
new file mode 100644
index 0000000..2587c18
--- /dev/null
+++ b/example/fast_mem_fn.hpp
@@ -0,0 +1,248 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+//
+// This example implements a very efficient, generic member function wrapper.
+//
+//
+// Detailed description
+// ====================
+//
+// For most platforms C++ runs on (maybe all hardware platforms, as opposed to
+// virtual machines) there are indirect calls that take more time to execute
+// than direct ones. Further calling a function usually takes more time than
+// inlining it at the call site.
+//
+// A direct call is a machine instruction that calls a subroutine at a known
+// address encoded in the instruction itself. C++ compilers usually emit one of
+// these instructions for each function call to a nonvirtual function (a call to
+// a virtual function requires either two direct calls or one indirect call).
+// An indirect call is a machine instruction that calls a subroutine at an
+// address known at runtime. C++ compilers usually emit at least one of these
+// instructions for a call through a callable builtin variable.
+//
+// It is possible to use callable scalars as non-type template arguments. This
+// way the compiler knows which function we want to call when generating the
+// code for the call site, so it may inline (if it decides to do so) or use a
+// direct call instead of being forced to use a slow, indirect call.
+//
+// We define a functor class template that encodes the function to call in its
+// type via a non-type template argument. Its (inline declared) overloaded
+// function call operator calls the function through that non-type template
+// argument. In the best case we end up inlining the callee directly at the
+// point of the call.
+//
+// Decomposition of the wrapped member function's type is needed in order to
+// implement argument forwarding (just using a templated call operator we would
+// encounter what is known as "the forwarding problem" [Dimov1]). Further we
+// can eliminate unecessary copies for each by-value parameter by using a
+// reference to its const qualified type for the corresponding parameter of the
+// wrapper's function call operator.
+//
+// Finally we provide a macro that does have similar semantics to the function
+// template mem_fn of the Bind [2] library.
+// We can't use a function template and use a macro instead, because we use a
+// member function pointer that is a compile time constant. So we first have to
+// deduce the type and create a template that accepts this type as a non-type
+// template argument, which is passed in in a second step. The macro hides this
+// lengthy expression from the user.
+//
+//
+// Limitations
+// ===========
+//
+// The "this-argument" must be specified as a reference.
+//
+//
+// Bibliography
+// ============
+//
+// [Dimov1] Dimov, P., Hinnant H., Abrahams, D. The Forwarding Problem
+// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1385.htm
+//
+// [Dimov2] Dimov, P. Documentation of boost::mem_fn
+// http://www.boost.org/libs/bind/mem_fn.html
+
+#ifndef BOOST_EXAMPLE_FAST_MEM_FN_HPP_INCLUDED
+#ifndef BOOST_PP_IS_ITERATING
+
+
+#include <boost/function_types/result_type.hpp>
+#include <boost/function_types/function_arity.hpp>
+#include <boost/function_types/parameter_types.hpp>
+#include <boost/function_types/is_member_function_pointer.hpp>
+
+#include <boost/mpl/transform_view.hpp>
+#include <boost/mpl/begin.hpp>
+#include <boost/mpl/next.hpp>
+#include <boost/mpl/deref.hpp>
+
+#include <boost/utility/enable_if.hpp>
+
+#include "detail/param_type.hpp"
+
+namespace example
+{
+
+ namespace ft = boost::function_types;
+ namespace mpl = boost::mpl;
+ using namespace mpl::placeholders;
+
+ // the functor class template
+ template< typename MFPT, MFPT MemberFunction
+ , size_t Arity = ::example::ft::function_arity<MFPT>::value
+ >
+ struct fast_mem_fn;
+
+ // ------- ---- --- -- - - - -
+
+ // deduce type and capture compile time value
+ #define BOOST_EXAMPLE_FAST_MEM_FN(mfp) \
+ ::example::make_fast_mem_fn(mfp).make_fast_mem_fn<mfp>()
+
+ template<typename MFPT>
+ struct fast_mem_fn_maker
+ {
+ template<MFPT Callee>
+ fast_mem_fn<MFPT,Callee> make_fast_mem_fn()
+ {
+ return fast_mem_fn<MFPT,Callee>();
+ }
+ };
+
+ template<typename MFPT>
+ typename boost::enable_if<boost::is_member_function_pointer<MFPT>,
+ fast_mem_fn_maker<MFPT> >::type
+ make_fast_mem_fn(MFPT)
+ {
+ return fast_mem_fn_maker<MFPT>();
+ }
+
+
+ // ------- ---- --- -- - - - -
+
+ namespace detail
+ {
+ // by-value forwarding optimization
+ template<typename T>
+ struct parameter_types
+ : mpl::transform_view<ft::parameter_types<T>,param_type<_> >
+ { };
+ }
+
+ // ------- ---- --- -- - - - -
+
+ template< typename MFPT, MFPT MemberFunction >
+ struct fast_mem_fn<MFPT, MemberFunction, 1>
+ {
+ // decompose the result and the parameter types (public for introspection)
+ typedef typename ft::result_type<MFPT>::type result_type;
+ typedef detail::parameter_types<MFPT> parameter_types;
+ private:
+ // iterate the parameter types
+ typedef typename mpl::begin<parameter_types>::type i0;
+ public:
+ // forwarding function call operator
+ result_type operator()( typename mpl::deref<i0>::type a0) const
+ {
+ return (a0.*MemberFunction)();
+ };
+ };
+
+ template< typename MFPT, MFPT MemberFunction >
+ struct fast_mem_fn<MFPT, MemberFunction, 2>
+ {
+ // decompose the result and the parameter types (public for introspection)
+ typedef typename ft::result_type<MFPT>::type result_type;
+ typedef detail::parameter_types<MFPT> parameter_types;
+ private:
+ // iterate the parameter types
+ typedef typename mpl::begin<parameter_types>::type i0;
+ typedef typename mpl::next<i0>::type i1;
+ public:
+ // forwarding function call operator
+ result_type operator()( typename mpl::deref<i0>::type a0
+ , typename mpl::deref<i1>::type a1) const
+ {
+ return (a0.*MemberFunction)(a1);
+ };
+ };
+
+ template< typename MFPT, MFPT MemberFunction >
+ struct fast_mem_fn<MFPT, MemberFunction, 3>
+ {
+ // decompose the result and the parameter types (public for introspection)
+ typedef typename ft::result_type<MFPT>::type result_type;
+ typedef detail::parameter_types<MFPT> parameter_types;
+ private:
+ // iterate the parameter types
+ typedef typename mpl::begin<parameter_types>::type i0;
+ typedef typename mpl::next<i0>::type i1;
+ typedef typename mpl::next<i1>::type i2;
+ public:
+ // forwarding function call operator
+ result_type operator()( typename mpl::deref<i0>::type a0
+ , typename mpl::deref<i1>::type a1
+ , typename mpl::deref<i2>::type a2) const
+ {
+ return (a0.*MemberFunction)(a1,a2);
+ };
+ };
+
+ // ...
+}
+
+// ------- ---- --- -- - - - -
+
+// preprocessor-based code generator to continue the repetitive part, above
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/arithmetic/inc.hpp>
+#include <boost/preprocessor/iteration/iterate.hpp>
+#include <boost/preprocessor/iteration/local.hpp>
+#include <boost/preprocessor/repetition/enum_shifted_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+
+namespace example
+{
+ #if BOOST_FT_MAX_ARITY >= 4
+ # define BOOST_PP_FILENAME_1 "fast_mem_fn.hpp"
+ # define BOOST_PP_ITERATION_LIMITS (4,BOOST_FT_MAX_ARITY)
+ # include BOOST_PP_ITERATE()
+ #endif
+}
+
+#define BOOST_EXAMPLE_FAST_MEM_FN_HPP_INCLUDED
+#else
+
+ #define N BOOST_PP_FRAME_ITERATION(1)
+ template< typename MFPT, MFPT MemberFunction >
+ struct fast_mem_fn<MFPT, MemberFunction, N >
+ {
+ // decompose the result and the parameter types (public for introspection)
+ typedef typename ft::result_type<MFPT>::type result_type;
+ typedef detail::parameter_types<MFPT> parameter_types;
+ private:
+ // iterate the parameter types
+ typedef typename mpl::begin<parameter_types>::type i0;
+ #define BOOST_PP_LOCAL_LIMITS (0,N-2)
+ #define BOOST_PP_LOCAL_MACRO(j) \
+ typedef typename mpl::next< i ## j >::type BOOST_PP_CAT(i,BOOST_PP_INC(j)) ;
+ #include BOOST_PP_LOCAL_ITERATE()
+ public:
+ // forwarding function call operator
+ result_type operator()(
+ BOOST_PP_ENUM_BINARY_PARAMS(N, typename mpl::deref<i,>::type a) ) const
+ {
+ return (a0.*MemberFunction)(BOOST_PP_ENUM_SHIFTED_PARAMS(N,a));
+ };
+ };
+ #undef N
+
+#endif
+#endif
+
diff --git a/example/fast_mem_fn_example.cpp b/example/fast_mem_fn_example.cpp
new file mode 100644
index 0000000..381ee14
--- /dev/null
+++ b/example/fast_mem_fn_example.cpp
@@ -0,0 +1,122 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+// See fast_mem_fn.hpp in this directory for details.
+
+#include <vector>
+#include <cassert>
+#include <iostream>
+#include <algorithm>
+#include <functional>
+
+#include <boost/timer.hpp>
+#include <boost/mem_fn.hpp>
+
+#include "fast_mem_fn.hpp"
+
+// test class that holds a single integer with getter function
+class test
+{
+ int val_id;
+public:
+
+ explicit test(int id)
+ : val_id(id)
+ { }
+
+ int id() const
+ { return val_id; }
+
+};
+
+// STL style comparator that applies the CriterionExtractor function to both
+// operands and compares the results with Comparator
+template<typename CriterionExtractor, typename Comparator>
+class test_compare
+{
+ CriterionExtractor fnc_criterion;
+ Comparator fnc_compare;
+public:
+
+ explicit test_compare(CriterionExtractor criterion, Comparator compare)
+ : fnc_criterion(criterion)
+ , fnc_compare(compare)
+ { }
+
+ template<typename T>
+ inline bool operator()(T const & lhs, T const & rhs) const
+ {
+ return fnc_compare(fnc_criterion(lhs),fnc_criterion(rhs));
+ }
+};
+
+// helper function to construct an instance of the test_compare comparator.
+template<typename CriterionExtractor, typename Comparator>
+test_compare<CriterionExtractor,Comparator>
+make_test_compare(CriterionExtractor criterion, Comparator compare)
+{
+ return test_compare<CriterionExtractor,Comparator>(criterion,compare);
+}
+
+// the test case: sort N test objects by id
+//
+// the objects are in ascending order before the test run and in descending
+// order after it
+
+static const unsigned N = 2000000;
+
+typedef std::vector<test> test_vector;
+
+
+void setup_test(test_vector & v)
+{
+ v.clear();
+ v.reserve(N);
+ for (unsigned i = 0; i < N; ++i)
+ v.push_back(test(i));
+}
+
+template<typename F> void do_test(test_vector & v, F criterion)
+{
+ std::sort(v.begin(),v.end(),make_test_compare(criterion,std::greater<int>()));
+ assert(v.begin()->id() == N-1);
+}
+
+
+// compare performance with boost::mem_fn
+int main()
+{
+ test_vector v;
+ boost::timer t;
+ double time1, time2;
+
+ std::cout <<
+ "Test case: sorting " << N << " objects.\n\n"
+ "Criterion accessor called with | elasped seconds\n"
+ "-------------------------------|----------------" << std::endl;
+
+ setup_test(v);
+ t.restart();
+#if !BOOST_WORKAROUND(BOOST_MSVC, < 1400)
+ do_test(v, BOOST_EXAMPLE_FAST_MEM_FN(& test::id));
+#else // MSVC<8 does not like the implementation of the deduction macro:
+ do_test(v, ::example::fast_mem_fn< int (test::*)() const, & test::id >());
+#endif
+ time1 = t.elapsed();
+ std::cout << "fast_mem_fn | " << time1 << std::endl;
+
+ setup_test(v);
+ t.restart();
+ do_test(v, boost::mem_fn(& test::id));
+ time2 = t.elapsed();
+ std::cout << "mem_fn | " << time2 << std::endl;
+
+ std::cout << '\n' << (time2/time1-1)*100 << "% speedup" << std::endl;
+
+ return 0;
+}
+
diff --git a/example/interface.hpp b/example/interface.hpp
new file mode 100644
index 0000000..cadf740
--- /dev/null
+++ b/example/interface.hpp
@@ -0,0 +1,361 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+//
+// This example implements interfaces.
+//
+// Detailed description
+// ====================
+//
+// An interface is a collection of member function prototypes that may be
+// implemented by classes. Objects of classes that implement the interface can
+// then be assigned to an interface variable through which the interface's
+// functions can be called.
+//
+// Interfaces are a feature of the Java programming language [Gosling] and the
+// most obvious way to model interfaces in C++ is (multiple) inheritance.
+// Using inheritance for this purpose, however, is neither the most efficient
+// nor the most flexible solution, because:
+//
+// - all functions must be virtual,
+//
+// => a function that calls another function of the interface must do so
+// via virtual dispatch (as opposed to inlining)
+// => a class can not implement an interface's (overloaded) function via
+// a function template
+//
+// - inhertitance is intrusive
+//
+// => object size increases
+// => client's are always polymorphic
+// => dependencies cause tighter coupling
+//
+// Fortunately it is possible to eliminate all the drawbacks mentioned above
+// based on an alternative implementation proposed by David Abrahams.
+// We'll add some detail to the original scheme (see [Abrahams]) such as
+// support for overloaded and const qualified functions.
+// The implementation in this example uses Boost.FunctionTypes to shift
+// metaprogramming code from the preprocessor into templates, to reduce
+// preprocessing time and increase maintainability.
+//
+//
+// Limitations
+// ===========
+//
+// There is no lifetime management as implemented by the Boost candidate
+// Interfaces library (see [Turkanis]).
+//
+// This example does not compile with Visual C++. Template argument deduction
+// from the result of the address-of operator does not work properly with this
+// compiler. It is possible to partially work around the problem, but it isn't
+// done here for the sake of readability.
+//
+//
+// Bibliography
+// ============
+//
+// [Gosling] Gosling, J., Joy, B., Steele, G. The Java Language Specification
+// http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html
+//
+// [Abrahams] Abrahams, D. Proposal: interfaces, Post to newsgroup comp.std.c++
+// http://groups.google.com/group/comp.std.c++/msg/85af30a61bf677e4
+//
+// [Turkanis] Turkanis, J., Diggins, C. Boost candidate Interfaces library
+// http://www.kangaroologic.com/interfaces/libs/interfaces/doc/index.html
+
+#include <cstddef>
+
+#include <boost/function_types/function_pointer.hpp>
+#include <boost/function_types/member_function_pointer.hpp>
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+
+#include <boost/utility/addressof.hpp>
+
+#include <boost/mpl/at.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/joint_view.hpp>
+#include <boost/mpl/single_view.hpp>
+#include <boost/mpl/transform_view.hpp>
+
+#include <boost/preprocessor/seq/seq.hpp>
+#include <boost/preprocessor/seq/enum.hpp>
+#include <boost/preprocessor/seq/elem.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/arithmetic/dec.hpp>
+#include <boost/preprocessor/arithmetic/inc.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+#include <boost/preprocessor/facilities/identity.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/iteration/local.hpp>
+#include <boost/preprocessor/repetition/enum.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#include <boost/preprocessor/repetition/enum_trailing_params.hpp>
+
+#include "detail/param_type.hpp"
+
+namespace example
+{
+ namespace ft = boost::function_types;
+ namespace mpl = boost::mpl;
+ using namespace mpl::placeholders;
+
+ // join a single type and an MPL-sequence
+ // in some ways similar to mpl::push_front (but mpl::push_front requires
+ // an MPL Extensible Sequence and this template does not)
+ template<typename T, typename Seq>
+ struct concat_view
+ : mpl::joint_view<mpl::single_view<T>, Seq>
+ { };
+
+ // metafunction returning a function pointer type for a vtable entry
+ template<typename Inf>
+ struct vtable_entry
+ : ft::function_pointer
+ < concat_view< typename Inf::result, mpl::transform_view<
+ typename Inf::params, param_type<_> > > >
+ { };
+
+ // the expression '& member<MetaInfo,Tag>::wrap<& Class::Function> ' in an
+ // assignment context binds the member function Function of Class with the
+ // properties described by MetaInfo and Tag to the corresponding vtable
+ // entry
+ template<typename Inf, typename Tag>
+ struct member
+ {
+ typedef typename ft::member_function_pointer
+ < concat_view<typename Inf::result,typename Inf::params>,Tag
+ >::type
+ mem_func_ptr;
+
+ typedef typename mpl::at_c<typename Inf::params,0>::type context;
+
+ template<mem_func_ptr MemFuncPtr>
+ static typename Inf::result wrap(void* c)
+ {
+ return (reinterpret_cast<context*>(c)->*MemFuncPtr)();
+ }
+ template<mem_func_ptr MemFuncPtr, typename T0>
+ static typename Inf::result wrap(void* c, T0 a0)
+ {
+ return (reinterpret_cast<context*>(c)->*MemFuncPtr)(a0);
+ }
+ template<mem_func_ptr MemFuncPtr, typename T0, typename T1>
+ static typename Inf::result wrap(void* c, T0 a0, T1 a1)
+ {
+ return (reinterpret_cast<context*>(c)->*MemFuncPtr)(a0,a1);
+ }
+ // continue with the preprocessor (the scheme should be clear, by now)
+ #define BOOST_PP_LOCAL_MACRO(n) \
+ template<mem_func_ptr MemFuncPtr, BOOST_PP_ENUM_PARAMS(n,typename T)> \
+ static typename Inf::result wrap(void* c, \
+ BOOST_PP_ENUM_BINARY_PARAMS(n,T,a)) \
+ { \
+ return (reinterpret_cast<context*>(c)->*MemFuncPtr)( \
+ BOOST_PP_ENUM_PARAMS(n,a) ); \
+ }
+ #define BOOST_PP_LOCAL_LIMITS (3,BOOST_FT_MAX_ARITY-1)
+ #include BOOST_PP_LOCAL_ITERATE()
+ };
+
+ // extract a parameter by index
+ template<typename Inf, std::size_t Index>
+ struct param
+ : param_type< typename mpl::at_c< typename Inf::params,Index>::type >
+ { };
+}
+
+// the interface definition on the client's side
+#define BOOST_EXAMPLE_INTERFACE(name,def) \
+ class name \
+ { \
+ struct vtable \
+ { \
+ BOOST_EXAMPLE_INTERFACE__MEMBERS(def,VTABLE) \
+ }; \
+ \
+ vtable const * ptr_vtable; \
+ void * ptr_that; \
+ \
+ template<class T> struct vtable_holder \
+ { \
+ static vtable const val_vtable; \
+ }; \
+ \
+ public: \
+ \
+ template<class T> \
+ inline name (T & that) \
+ : ptr_vtable(& vtable_holder<T>::val_vtable) \
+ , ptr_that(boost::addressof(that)) \
+ { } \
+ \
+ BOOST_EXAMPLE_INTERFACE__MEMBERS(def,FUNCTION) \
+ }; \
+ \
+ template<typename T> \
+ name ::vtable const name ::vtable_holder<T>::val_vtable \
+ = { BOOST_EXAMPLE_INTERFACE__MEMBERS(def,INIT_VTABLE) }
+
+
+#ifdef BOOST_PP_NIL // never defined -- a comment with syntax highlighting
+
+BOOST_EXAMPLE_INTERFACE( interface_x,
+ (( a_func, (void)(int), const_qualified ))
+ (( another_func, (int), non_const ))
+);
+
+// expands to:
+class interface_x
+{
+ struct vtable
+ {
+ // meta information for first function
+ template<typename T = void*> struct inf0
+ {
+ typedef void result;
+ typedef ::boost::mpl::vector< T, int > params;
+ };
+ // function pointer with void* context pointer and parameters optimized
+ // for forwarding
+ ::example::vtable_entry<inf0<> >::type func0;
+
+ // second function
+ template<typename T = void*> struct inf1
+ {
+ typedef int result;
+ typedef ::boost::mpl::vector< T > params;
+ };
+ ::example::vtable_entry<inf1<> >::type func1;
+ };
+
+ // data members
+ vtable const * ptr_vtable;
+ void * ptr_that;
+
+ // this template is instantiated for every class T this interface is created
+ // from, causing the compiler to emit an initialized vtable for this type
+ // (see aggregate assignment, below)
+ template<class T> struct vtable_holder
+ {
+ static vtable const val_vtable;
+ };
+
+public:
+
+ // converting ctor, creates an interface from an arbitrary class
+ template<class T>
+ inline interface_x (T & that)
+ : ptr_vtable(& vtable_holder<T>::val_vtable)
+ , ptr_that(boost::addressof(that))
+ { }
+
+ // the member functions from the interface definition, parameters are
+ // optimized for forwarding
+
+ inline vtable::inf0<> ::result a_func (
+ ::example::param<vtable::inf0<>,1>::type p0) const
+ {
+ return ptr_vtable-> func0(ptr_that , p0);
+ }
+
+ inline vtable::inf1<> ::result another_func ()
+ {
+ return ptr_vtable-> func1(ptr_that );
+ }
+};
+
+template<typename T>
+interface_x ::vtable const interface_x ::vtable_holder<T>::val_vtable =
+{
+ // instantiate function templates that wrap member function pointers (which
+ // are known at compile time) by taking their addresses in assignment to
+ // function pointer context
+ & ::example::member< vtable::inf0<T>, ::example::ft:: const_qualified >
+ ::template wrap < &T:: a_func >
+, & ::example::member< vtable::inf1<T>, ::example::ft:: non_const >
+ ::template wrap < &T:: another_func >
+};
+#endif
+
+// preprocessing code details
+
+// iterate all of the interface's members and invoke a macro (prefixed with
+// BOOST_EXAMPLE_INTERFACE_)
+#define BOOST_EXAMPLE_INTERFACE__MEMBERS(seq,macro) \
+ BOOST_PP_REPEAT(BOOST_PP_SEQ_SIZE(seq), \
+ BOOST_EXAMPLE_INTERFACE__ ## macro,seq)
+
+// extract signature sequence from entry
+#define BOOST_EXAMPLE_INTERFACE__VTABLE(z,i,seq) \
+ BOOST_EXAMPLE_INTERFACE__VTABLE_I(z,i, \
+ BOOST_PP_TUPLE_ELEM(3,1,BOOST_PP_SEQ_ELEM(i,seq)))
+
+// split the signature sequence result/params and insert T at the beginning of
+// the params part
+#define BOOST_EXAMPLE_INTERFACE__VTABLE_I(z,i,seq) \
+ BOOST_EXAMPLE_INTERFACE__VTABLE_II(z,i, \
+ BOOST_PP_SEQ_HEAD(seq),(T)BOOST_PP_SEQ_TAIL(seq))
+
+// emit the meta information structure and function pointer declaration
+#define BOOST_EXAMPLE_INTERFACE__VTABLE_II(z,i,result_type,param_types) \
+ template<typename T = void*> \
+ struct BOOST_PP_CAT(inf,i) \
+ { \
+ typedef result_type result; \
+ typedef ::boost::mpl::vector< BOOST_PP_SEQ_ENUM(param_types) > params; \
+ }; \
+ ::example::vtable_entry<BOOST_PP_CAT(inf,i)<> >::type BOOST_PP_CAT(func,i);
+
+// extract tuple entry from sequence and precalculate the name of the function
+// pointer variable
+#define BOOST_EXAMPLE_INTERFACE__INIT_VTABLE(z,i,seq) \
+ BOOST_EXAMPLE_INTERFACE__INIT_VTABLE_I(i,seq,BOOST_PP_CAT(func,i), \
+ BOOST_PP_SEQ_ELEM(i,seq))
+
+// emit a function pointer expression that encapsulates the corresponding
+// member function of T
+#define BOOST_EXAMPLE_INTERFACE__INIT_VTABLE_I(i,seq,func,desc) \
+ BOOST_PP_COMMA_IF(i) & ::example::member< BOOST_PP_CAT(vtable::inf,i)<T>, \
+ ::example::ft:: BOOST_PP_TUPLE_ELEM(3,2,desc) >::template wrap \
+ < &T:: BOOST_PP_TUPLE_ELEM(3,0,desc) >
+
+// extract tuple entry from sequence
+#define BOOST_EXAMPLE_INTERFACE__FUNCTION(z,i,seq) \
+ BOOST_EXAMPLE_INTERFACE__FUNCTION_I(z,i,BOOST_PP_SEQ_ELEM(i,seq))
+
+// precalculate function name, arity, name of meta info structure and cv-
+// qualifiers
+#define BOOST_EXAMPLE_INTERFACE__FUNCTION_I(z,i,desc) \
+ BOOST_EXAMPLE_INTERFACE__FUNCTION_II(z,i, \
+ BOOST_PP_TUPLE_ELEM(3,0,desc), \
+ BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(3,1,desc))), \
+ BOOST_PP_CAT(vtable::inf,i)<>, \
+ BOOST_PP_CAT(BOOST_EXAMPLE_INTERFACE___,BOOST_PP_TUPLE_ELEM(3,2,desc)) \
+ )
+
+// emit the definition for a member function of the interface
+#define BOOST_EXAMPLE_INTERFACE__FUNCTION_II(z,i,name,arity,types,cv) \
+ inline types ::result name \
+ (BOOST_PP_ENUM_ ## z (arity,BOOST_EXAMPLE_INTERFACE__PARAM,types)) cv() \
+ { \
+ return ptr_vtable-> BOOST_PP_CAT(func,i)(ptr_that \
+ BOOST_PP_ENUM_TRAILING_PARAMS_Z(z,arity,p)); \
+ }
+
+// emit a parameter of the function definition
+#define BOOST_EXAMPLE_INTERFACE__PARAM(z,j,types) \
+ ::example::param<types,BOOST_PP_INC(j)>::type BOOST_PP_CAT(p,j)
+
+// helper macros to map 'const_qualified' to 'const' an 'non_const' to ''
+#define BOOST_EXAMPLE_INTERFACE___const_qualified BOOST_PP_IDENTITY(const)
+#define BOOST_EXAMPLE_INTERFACE___non_const BOOST_PP_EMPTY
+
+
diff --git a/example/interface_example.cpp b/example/interface_example.cpp
new file mode 100644
index 0000000..6b7f8d9
--- /dev/null
+++ b/example/interface_example.cpp
@@ -0,0 +1,80 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+// See interface.hpp in this directory for details.
+
+#include <iostream>
+#include <typeinfo>
+
+#include "interface.hpp"
+
+
+BOOST_EXAMPLE_INTERFACE( interface_x,
+ (( a_func, (void)(int) , const_qualified ))
+ (( a_func, (void)(long), const_qualified ))
+ (( another_func, (int) , non_const ))
+);
+
+
+// two classes that implement interface_x
+
+struct a_class
+{
+ void a_func(int v) const
+ {
+ std::cout << "a_class::void a_func(int v = " << v << ")" << std::endl;
+ }
+
+ void a_func(long v) const
+ {
+ std::cout << "a_class::void a_func(long v = " << v << ")" << std::endl;
+ }
+
+ int another_func()
+ {
+ std::cout << "a_class::another_func() = 3" << std::endl;
+ return 3;
+ }
+};
+
+struct another_class
+{
+ // note: overloaded a_func implemented as a function template
+ template<typename T>
+ void a_func(T v) const
+ {
+ std::cout <<
+ "another_class::void a_func(T v = " << v << ")"
+ " [ T = " << typeid(T).name() << " ]" << std::endl;
+ }
+
+ int another_func()
+ {
+ std::cout << "another_class::another_func() = 5" << std::endl;
+ return 5;
+ }
+};
+
+
+// both classes above can be assigned to the interface variable and their
+// member functions can be called through it
+int main()
+{
+ a_class x;
+ another_class y;
+
+ interface_x i(x);
+ i.a_func(12);
+ i.a_func(77L);
+ i.another_func();
+
+ i = y;
+ i.a_func(13);
+ i.a_func(21L);
+ i.another_func();
+}
+
diff --git a/example/interpreter.hpp b/example/interpreter.hpp
new file mode 100644
index 0000000..72cd78b
--- /dev/null
+++ b/example/interpreter.hpp
@@ -0,0 +1,189 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+//
+// This example implements a simple batch-style interpreter that is capable of
+// calling functions previously registered with it. The parameter types of the
+// functions are used to control the parsing of the input.
+//
+// Implementation description
+// ==========================
+//
+// When a function is registered, an 'invoker' template is instantiated with
+// the function's type. The 'invoker' fetches a value from the 'token_parser'
+// for each parameter of the function into a tuple and finally invokes the the
+// function with these values as arguments. The invoker's entrypoint, which
+// is a function of the callable builtin that describes the function to call and
+// a reference to the 'token_parser', is partially bound to the registered
+// function and put into a map so it can be found by name during parsing.
+
+#include <map>
+#include <string>
+#include <stdexcept>
+
+#include <boost/token_iterator.hpp>
+#include <boost/token_functions.hpp>
+
+#include <boost/lexical_cast.hpp>
+
+#include <boost/bind.hpp>
+#include <boost/function.hpp>
+
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+
+#include <boost/fusion/include/push_back.hpp>
+#include <boost/fusion/include/cons.hpp>
+#include <boost/fusion/include/invoke.hpp>
+
+#include <boost/mpl/begin.hpp>
+#include <boost/mpl/end.hpp>
+#include <boost/mpl/next.hpp>
+#include <boost/mpl/deref.hpp>
+
+#include <boost/utility/enable_if.hpp>
+
+#include <boost/function_types/is_nonmember_callable_builtin.hpp>
+#include <boost/function_types/parameter_types.hpp>
+
+namespace example
+{
+ namespace fusion = boost::fusion;
+ namespace ft = boost::function_types;
+ namespace mpl = boost::mpl;
+
+ class interpreter
+ {
+ class token_parser;
+ typedef boost::function<void(token_parser &)> invoker_function;
+ typedef std::map<std::string, invoker_function> dictionary;
+
+ dictionary map_invokers;
+ public:
+ // Registers a function with the interpreter.
+ template<typename Function>
+ typename boost::enable_if< ft::is_nonmember_callable_builtin<Function>
+ >::type register_function(std::string const & name, Function f);
+
+ // Parse input for functions to call.
+ void parse_input(std::string const & text) const;
+
+ private:
+ template< typename Function
+ , class From = typename mpl::begin< ft::parameter_types<Function> >::type
+ , class To = typename mpl::end< ft::parameter_types<Function> >::type
+ >
+ struct invoker;
+ };
+
+ class interpreter::token_parser
+ {
+ typedef boost::token_iterator_generator<
+ boost::char_separator<char> >::type token_iterator;
+
+ token_iterator itr_at, itr_to;
+ public:
+
+ token_parser(token_iterator from, token_iterator to)
+ : itr_at(from), itr_to(to)
+ { }
+
+ private:
+ template<typename T>
+ struct remove_cv_ref
+ : boost::remove_cv< typename boost::remove_reference<T>::type >
+ { };
+ public:
+ // Returns a token of given type.
+ // We just apply boost::lexical_cast to whitespace separated string tokens
+ // for simplicity.
+ template<typename RequestedType>
+ typename remove_cv_ref<RequestedType>::type get()
+ {
+ if (! this->has_more_tokens())
+ throw std::runtime_error("unexpected end of input");
+
+ try
+ {
+ typedef typename remove_cv_ref<RequestedType>::type result_type;
+ result_type result = boost::lexical_cast
+ <typename remove_cv_ref<result_type>::type>(*this->itr_at);
+ ++this->itr_at;
+ return result;
+ }
+
+ catch (boost::bad_lexical_cast &)
+ { throw std::runtime_error("invalid argument: " + *this->itr_at); }
+ }
+
+ // Any more tokens?
+ bool has_more_tokens() const { return this->itr_at != this->itr_to; }
+ };
+
+ template<typename Function, class From, class To>
+ struct interpreter::invoker
+ {
+ // add an argument to a Fusion cons-list for each parameter type
+ template<typename Args>
+ static inline
+ void apply(Function func, token_parser & parser, Args const & args)
+ {
+ typedef typename mpl::deref<From>::type arg_type;
+ typedef typename mpl::next<From>::type next_iter_type;
+
+ interpreter::invoker<Function, next_iter_type, To>::apply
+ ( func, parser, fusion::push_back(args, parser.get<arg_type>()) );
+ }
+ };
+
+ template<typename Function, class To>
+ struct interpreter::invoker<Function,To,To>
+ {
+ // the argument list is complete, now call the function
+ template<typename Args>
+ static inline
+ void apply(Function func, token_parser &, Args const & args)
+ {
+ fusion::invoke(func,args);
+ }
+ };
+
+ template<typename Function>
+ typename boost::enable_if< ft::is_nonmember_callable_builtin<Function> >::type
+ interpreter::register_function(std::string const & name, Function f)
+ {
+ // instantiate and store the invoker by name
+ this->map_invokers[name] = boost::bind(
+ & invoker<Function>::template apply<fusion::nil>, f,_1,fusion::nil() );
+ }
+
+
+ void interpreter::parse_input(std::string const & text) const
+ {
+ boost::char_separator<char> s(" \t\n\r");
+
+ token_parser parser
+ ( boost::make_token_iterator<std::string>(text.begin(), text.end(), s)
+ , boost::make_token_iterator<std::string>(text.end() , text.end(), s) );
+
+ while (parser.has_more_tokens())
+ {
+ // read function name
+ std::string func_name = parser.get<std::string>();
+
+ // look up function
+ dictionary::const_iterator entry = map_invokers.find( func_name );
+ if (entry == map_invokers.end())
+ throw std::runtime_error("unknown function: " + func_name);
+
+ // call the invoker which controls argument parsing
+ entry->second(parser);
+ }
+ }
+
+}
+
diff --git a/example/interpreter_example.cpp b/example/interpreter_example.cpp
new file mode 100644
index 0000000..9e6118b
--- /dev/null
+++ b/example/interpreter_example.cpp
@@ -0,0 +1,56 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <string>
+#include <iostream>
+#include <stdexcept>
+
+#include "interpreter.hpp"
+
+void echo(std::string const & s)
+{
+ std::cout << s << std::endl;
+}
+
+void add(int a, int b)
+{
+ std::cout << a + b << std::endl;
+}
+
+void repeat(std::string const & s, int n)
+{
+ while (--n >= 0) std::cout << s;
+ std::cout << std::endl;
+}
+
+int main()
+{
+ example::interpreter interpreter;
+
+ interpreter.register_function("echo", & echo);
+ interpreter.register_function("add", & add);
+ interpreter.register_function("repeat", & repeat);
+
+ std::string line = "nonempty";
+ while (! line.empty())
+ {
+ std::cout << std::endl << "] ", std::getline(std::cin,line);
+
+ try
+ {
+ interpreter.parse_input(line);
+ }
+ catch (std::runtime_error &error)
+ {
+ std::cerr << error.what() << std::endl;
+ }
+ }
+
+ return 0;
+}
+
diff --git a/example/macro_type_args.hpp b/example/macro_type_args.hpp
new file mode 100644
index 0000000..3500524
--- /dev/null
+++ b/example/macro_type_args.hpp
@@ -0,0 +1,73 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+//
+// This example implements a utility to accept a type expression, that may
+// contain commas to a macro.
+//
+//
+// Detailed description
+// ====================
+//
+// Accepting a type as macro argument can cause problems if the type expression
+// contains commas:
+//
+// #define MY_MACRO(a_type)
+// ...
+// MY_MACRO(std::map<int,int>) // ERROR (wrong number of macro arguments)
+//
+// This problem can be solved by pasing using a parenthesized type
+//
+// MY_MACRO((std::map<int,int>) // OK
+//
+// but then there is no way to remove the parentheses in the macro argument
+// with the preprocessor.
+// We can, however, form a pointer to a function with a single argument (the
+// parentheses become part of the type) and extract the argument with template
+// metaprogramming:
+//
+// // Inside the macro definition
+//
+// typename mpl::front< parameter_types<void(*)a_type> >::type
+//
+// This code snippet does not read too expressive so we use another macro
+// to encapsulate the solution:
+//
+// // Inside the macro definition
+//
+// BOOST_EXAMPLE_MACRO_TYPE_ARGUMENT(a_type)
+//
+// As a generalization of this technique we can accept a comma-separated list of
+// types. Omitting the mpl::front invocation gives us an MPL-sequence.
+//
+//
+// Limitations
+// ===========
+//
+// - only works for types that are valid function arguments
+//
+// Acknowledgments
+// ===============
+//
+// Thanks go to Dave Abrahams for letting me know this technique.
+
+#ifndef BOOST_EXAMPLE_MACRO_TYPE_ARGUMENT_HPP_INCLUDED
+#define BOOST_EXAMPLE_MACRO_TYPE_ARGUMENT_HPP_INCLUDED
+
+#include <boost/function_types/parameter_types.hpp>
+#include <boost/mpl/front.hpp>
+
+#define BOOST_EXAMPLE_MACRO_TYPE_ARGUMENT(parenthesized_type) \
+ boost::mpl::front< \
+ BOOST_EXAMPLE_MACRO_TYPE_LIST_ARGUMENT(parenthesized_type) >::type
+
+#define BOOST_EXAMPLE_MACRO_TYPE_LIST_ARGUMENT(parenthesized_types) \
+ ::boost::function_types::parameter_types< void(*) parenthesized_types >
+
+
+#endif
+
diff --git a/example/macro_type_args_example.cpp b/example/macro_type_args_example.cpp
new file mode 100644
index 0000000..9f83883
--- /dev/null
+++ b/example/macro_type_args_example.cpp
@@ -0,0 +1,71 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+// See macro_type_arugment.hpp in this directory for details.
+
+#include <string>
+#include <typeinfo>
+#include <iostream>
+
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/deref.hpp>
+
+#include "macro_type_args.hpp"
+
+
+#define TYPE_NAME(parenthesized_type) \
+ typeid(BOOST_EXAMPLE_MACRO_TYPE_ARGUMENT(parenthesized_type)).name()
+
+namespace example
+{
+ namespace mpl = boost::mpl;
+
+ template<class Curr, class End>
+ struct mpl_seq_to_string_impl
+ {
+ static std::string get(std::string const & prev)
+ {
+ typedef typename mpl::next<Curr>::type next_pos;
+ typedef typename mpl::deref<Curr>::type type;
+
+ return mpl_seq_to_string_impl<next_pos,End>::get(
+ prev + (prev.empty()? '\0' : ',') + typeid(type).name() );
+ }
+ };
+ template<class End>
+ struct mpl_seq_to_string_impl<End, End>
+ {
+ static std::string get(std::string const & prev)
+ {
+ return prev;
+ }
+ };
+
+ template<class Seq>
+ std::string mpl_seq_to_string()
+ {
+ typedef typename mpl::begin<Seq>::type begin;
+ typedef typename mpl::end<Seq>::type end;
+
+ return mpl_seq_to_string_impl<begin, end>::get("");
+ }
+
+}
+
+#define TYPE_NAMES(parenthesized_types) \
+ ::example::mpl_seq_to_string< \
+ BOOST_EXAMPLE_MACRO_TYPE_LIST_ARGUMENT(parenthesized_types) >()
+
+int main()
+{
+ std::cout << TYPE_NAME((int)) << std::endl;
+
+ std::cout << TYPE_NAMES((int,char)) << std::endl;
+ std::cout << TYPE_NAMES((int,char,long)) << std::endl;
+
+}
+
diff --git a/example/result_of.hpp b/example/result_of.hpp
new file mode 100644
index 0000000..7c3341a
--- /dev/null
+++ b/example/result_of.hpp
@@ -0,0 +1,86 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+//
+// Reimplementation of the Boost result_of utility (see [Gregor01] and
+// [Gregor02]).
+//
+//
+// Detailed description
+// ====================
+//
+// This example implements the functionality of the Boost result_of utility.
+// Because of FunctionTypes we get away without repetitive code and the Boost
+// Preprocessor library.
+//
+//
+// Bibliography
+// ============
+//
+// [Gregor01] Gregor, D. The Boost result_of utility
+// http://www.boost.org/libs/utility
+//
+// [Gregor02] Gregor, D. A uniform method for computing function object return
+// types (revision 1)
+// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1454.html
+
+#include <boost/function_types/result_type.hpp>
+#include <boost/function_types/is_callable_builtin.hpp>
+
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/has_xxx.hpp>
+
+namespace example
+{
+ namespace ft = boost::function_types;
+ namespace mpl = boost::mpl;
+
+ template<typename F> struct result_of;
+
+ namespace detail
+ {
+ BOOST_MPL_HAS_XXX_TRAIT_DEF(result_type)
+
+ template<typename F>
+ struct result_type_member
+ {
+ typedef typename F::result_type type;
+ };
+
+ template<typename F, typename Desc>
+ struct result_member_template
+ {
+ typedef typename F::template result<Desc>::type type;
+ };
+
+#if !BOOST_WORKAROUND(__BORLANDC__,BOOST_TESTED_AT(0x564))
+ template<typename F>
+ struct result_member_template< F, F(void) >
+ {
+ typedef void type;
+ };
+#endif
+
+ template<typename F, typename Desc>
+ struct result_of_impl
+ : mpl::eval_if
+ < ft::is_callable_builtin<F>
+ , ft::result_type<F>
+ , mpl::eval_if
+ < has_result_type<F>
+ , result_type_member<F>
+ , result_member_template<F,Desc>
+ > >
+ { };
+ }
+
+ template<typename Desc>
+ struct result_of
+ : detail::result_of_impl< typename ft::result_type<Desc>::type, Desc >
+ { };
+}
+
diff --git a/example/result_of_example.cpp b/example/result_of_example.cpp
new file mode 100644
index 0000000..a8fe2d2
--- /dev/null
+++ b/example/result_of_example.cpp
@@ -0,0 +1,59 @@
+
+// (C) Copyright Douglas Gregor 2003-2004.
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+// This file is a modified copy of the original Boost.ResultOf test-suite.
+// See result_of.hpp in this directory for details.
+
+
+#include "result_of.hpp"
+
+#include <utility>
+#include <boost/static_assert.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+struct int_result_type { typedef int result_type; };
+
+struct int_result_of
+{
+ template<typename F> struct result { typedef int type; };
+};
+
+struct int_result_type_and_float_result_of
+{
+ typedef int result_type;
+ template<typename F> struct result { typedef float type; };
+};
+
+struct X {};
+
+int main()
+{
+ using namespace boost;
+ namespace e = example;
+
+ typedef int (*func_ptr)(float, double);
+ typedef int (&func_ref)(float, double);
+ typedef int (X::*mem_func_ptr)(float);
+ typedef int (X::*mem_func_ptr_c)(float) const;
+ typedef int (X::*mem_func_ptr_v)(float) volatile;
+ typedef int (X::*mem_func_ptr_cv)(float) const volatile;
+
+ BOOST_STATIC_ASSERT((is_same<e::result_of<int_result_type(float)>::type, int>::value));
+ BOOST_STATIC_ASSERT((is_same<e::result_of<int_result_of(double)>::type, int>::value));
+ BOOST_STATIC_ASSERT((is_same<e::result_of<int_result_of(void)>::type, void>::value));
+ BOOST_STATIC_ASSERT((is_same<e::result_of<const int_result_of(double)>::type, int>::value));
+ BOOST_STATIC_ASSERT((is_same<e::result_of<volatile int_result_of(void)>::type, void>::value));
+ BOOST_STATIC_ASSERT((is_same<e::result_of<int_result_type_and_float_result_of(char)>::type, int>::value));
+ BOOST_STATIC_ASSERT((is_same<e::result_of<func_ptr(char, float)>::type, int>::value));
+ BOOST_STATIC_ASSERT((is_same<e::result_of<func_ref(char, float)>::type, int>::value));
+ BOOST_STATIC_ASSERT((is_same<e::result_of<mem_func_ptr(X,char)>::type, int>::value));
+ BOOST_STATIC_ASSERT((is_same<e::result_of<mem_func_ptr_c(X,char)>::type, int>::value));
+ BOOST_STATIC_ASSERT((is_same<e::result_of<mem_func_ptr_v(X,char)>::type, int>::value));
+ BOOST_STATIC_ASSERT((is_same<e::result_of<mem_func_ptr_cv(X,char)>::type, int>::value));
+ return 0;
+}
diff --git a/include/boost/function_types/components.hpp b/include/boost/function_types/components.hpp
new file mode 100644
index 0000000..6f22098
--- /dev/null
+++ b/include/boost/function_types/components.hpp
@@ -0,0 +1,424 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_COMPONENTS_HPP_INCLUDED
+#define BOOST_FT_COMPONENTS_HPP_INCLUDED
+
+#include <cstddef>
+
+#include <boost/config.hpp>
+
+#include <boost/detail/workaround.hpp>
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+#include <boost/type_traits/integral_constant.hpp>
+
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/integral_c.hpp>
+#include <boost/mpl/vector/vector0.hpp>
+
+#if BOOST_WORKAROUND(__BORLANDC__, <= 0x565)
+# include <boost/type_traits/remove_cv.hpp>
+
+# include <boost/mpl/identity.hpp>
+# include <boost/mpl/bitand.hpp>
+# include <boost/mpl/vector/vector10.hpp>
+# include <boost/mpl/front.hpp>
+# include <boost/mpl/begin.hpp>
+# include <boost/mpl/advance.hpp>
+# include <boost/mpl/iterator_range.hpp>
+# include <boost/mpl/joint_view.hpp>
+# include <boost/mpl/equal_to.hpp>
+# include <boost/mpl/copy.hpp>
+# include <boost/mpl/front_inserter.hpp>
+
+# include <boost/function_types/detail/classifier.hpp>
+#endif
+
+#ifndef BOOST_FT_NO_CV_FUNC_SUPPORT
+# include <boost/mpl/remove.hpp>
+#endif
+
+#include <boost/function_types/config/config.hpp>
+
+# if BOOST_FT_MAX_ARITY < 10
+# include <boost/mpl/vector/vector10.hpp>
+# elif BOOST_FT_MAX_ARITY < 20
+# include <boost/mpl/vector/vector20.hpp>
+# elif BOOST_FT_MAX_ARITY < 30
+# include <boost/mpl/vector/vector30.hpp>
+# elif BOOST_FT_MAX_ARITY < 40
+# include <boost/mpl/vector/vector40.hpp>
+# elif BOOST_FT_MAX_ARITY < 50
+# include <boost/mpl/vector/vector50.hpp>
+# endif
+
+#include <boost/function_types/detail/class_transform.hpp>
+#include <boost/function_types/property_tags.hpp>
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+namespace boost
+{
+ namespace function_types
+ {
+
+ using mpl::placeholders::_;
+
+ template< typename T, typename ClassTypeTransform = add_reference<_> >
+ struct components;
+
+ namespace detail
+ {
+ template<typename T, typename L> struct components_impl;
+#if BOOST_WORKAROUND(__BORLANDC__, <= 0x565)
+ template<typename T, typename OrigT, typename L> struct components_bcc;
+#endif
+ }
+
+ template<typename T, typename ClassTypeTransform>
+ struct components
+#if !BOOST_WORKAROUND(__BORLANDC__, <= 0x565)
+ : detail::components_impl<T, ClassTypeTransform>
+#else
+ : detail::components_bcc<typename remove_cv<T>::type,T,
+ ClassTypeTransform>
+#endif
+ {
+ typedef components<T,ClassTypeTransform> type;
+
+ BOOST_MPL_AUX_LAMBDA_SUPPORT(2,components,(T,ClassTypeTransform))
+ };
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ namespace detail {
+
+ struct components_mpl_sequence_tag;
+
+ struct components_non_func_base
+ {
+ typedef mpl::vector0<> types;
+ typedef void function_arity;
+
+ typedef detail::constant<0> bits;
+ typedef detail::constant<0> mask;
+
+ typedef components_mpl_sequence_tag tag;
+ };
+
+ template
+ < typename Components
+ , typename IfTagged
+ , typename ThenTag
+ , typename DefaultBase = components_non_func_base
+ >
+ struct retagged_if
+ : mpl::if_
+ < detail::represents_impl<Components, IfTagged>
+ , detail::changed_tag<Components,IfTagged,ThenTag>
+ , DefaultBase
+ >::type
+ { };
+
+ // We detect plain function types and function references as function
+ // pointers by recursive instantiation of components_impl.
+ // The third specialization of components_impl makes sure the recursion
+ // terminates (when adding pointers).
+ template<typename T, typename L>
+ struct components_impl
+ : detail::retagged_if
+ < detail::components_impl<T*,L>
+ , pointer_tag, /* --> */ function_tag >
+ { };
+ template<typename T, typename L>
+ struct components_impl<T&, L>
+ : detail::retagged_if
+ < detail::components_impl<T*,L>
+ , pointer_tag, /* --> */ reference_tag >
+ { };
+
+#if !BOOST_FT_NO_CV_FUNC_SUPPORT
+ // Retry the type with a member pointer attached to detect cv functions
+ class a_class;
+
+ template<typename Base, typename T, typename L>
+ struct cv_func_base
+ : detail::retagged_if<Base,member_pointer_tag,function_tag>
+ {
+ typedef typename
+ mpl::remove
+ < typename Base::types
+ , typename detail::class_transform<a_class,L>::type>::type
+ types;
+ };
+
+ template<typename T, typename L>
+ struct components_impl<T*, L>
+ : mpl::if_
+ < detail::represents_impl< detail::components_impl<T a_class::*, L>
+ , member_pointer_tag >
+ , detail::cv_func_base< detail::components_impl<T a_class::*, L>, T, L>
+ , components_non_func_base
+ >::type
+ { };
+
+ template<typename T, typename L>
+ struct components_impl<T a_class::*, L>
+ : components_non_func_base
+ { };
+#else
+ template<typename T, typename L>
+ struct components_impl<T*, L>
+ : components_non_func_base
+ { };
+#endif
+
+ template<typename T, typename L>
+ struct components_impl<T* const, L>
+ : components_impl<T*,L>
+ { };
+
+ template<typename T, typename L>
+ struct components_impl<T* volatile, L>
+ : components_impl<T*,L>
+ { };
+
+ template<typename T, typename L>
+ struct components_impl<T* const volatile, L>
+ : components_impl<T*,L>
+ { };
+
+ template<typename T, typename L>
+ struct components_impl<T const, L>
+ : components_impl<T,L>
+ { };
+
+ template<typename T, typename L>
+ struct components_impl<T volatile, L>
+ : components_impl<T,L>
+ { };
+
+ template<typename T, typename L>
+ struct components_impl<T const volatile, L>
+ : components_impl<T,L>
+ { };
+
+
+ template<typename T, class C>
+ struct member_obj_ptr_result
+ { typedef T & type; };
+
+ template<typename T, class C>
+ struct member_obj_ptr_result<T, C const>
+ { typedef T const & type; };
+
+ template<typename T, class C>
+ struct member_obj_ptr_result<T, C volatile>
+ { typedef T volatile & type; };
+
+ template<typename T, class C>
+ struct member_obj_ptr_result<T, C const volatile>
+ { typedef T const volatile & type; };
+
+ template<typename T, class C>
+ struct member_obj_ptr_result<T &, C>
+ { typedef T & type; };
+
+ template<typename T, class C>
+ struct member_obj_ptr_result<T &, C const>
+ { typedef T & type; };
+
+ template<typename T, class C>
+ struct member_obj_ptr_result<T &, C volatile>
+ { typedef T & type; };
+
+ template<typename T, class C>
+ struct member_obj_ptr_result<T &, C const volatile>
+ { typedef T & type; };
+
+ template<typename T, class C, typename L>
+ struct member_obj_ptr_components
+ : member_object_pointer_base
+ {
+ typedef function_types::components<T C::*, L> type;
+ typedef components_mpl_sequence_tag tag;
+
+ typedef mpl::integral_c<std::size_t,1> function_arity;
+
+ typedef mpl::vector2< typename detail::member_obj_ptr_result<T,C>::type,
+ typename detail::class_transform<C,L>::type > types;
+ };
+
+#if !BOOST_WORKAROUND(__BORLANDC__, <= 0x565)
+# define BOOST_FT_variations BOOST_FT_pointer|BOOST_FT_member_pointer
+
+ template<typename T, class C, typename L>
+ struct components_impl<T C::*, L>
+ : member_obj_ptr_components<T,C,L>
+ { };
+
+#else
+# define BOOST_FT_variations BOOST_FT_pointer
+
+ // This workaround removes the member pointer from the type to allow
+ // detection of member function pointers with BCC.
+ template<typename T, typename C, typename L>
+ struct components_impl<T C::*, L>
+ : detail::retagged_if
+ < detail::components_impl<typename boost::remove_cv<T>::type *, L>
+ , pointer_tag, /* --> */ member_function_pointer_tag
+ , member_obj_ptr_components<T,C,L> >
+ { };
+
+ // BCC lets us test the cv-qualification of a function type by template
+ // partial specialization - so we use this bug feature to find out the
+ // member function's cv-qualification (unfortunately there are some
+ // invisible modifiers that impose some limitations on these types even if
+ // we remove the qualifiers, So we cannot exploit the same bug to make the
+ // library work for cv-qualified function types).
+ template<typename T> struct encode_cv
+ { typedef char (& type)[1]; BOOST_STATIC_CONSTANT(std::size_t, value = 1); };
+ template<typename T> struct encode_cv<T const *>
+ { typedef char (& type)[2]; BOOST_STATIC_CONSTANT(std::size_t, value = 2); };
+ template<typename T> struct encode_cv<T volatile *>
+ { typedef char (& type)[3]; BOOST_STATIC_CONSTANT(std::size_t, value = 3); };
+ template<typename T> struct encode_cv<T const volatile *>
+ { typedef char (& type)[4]; BOOST_STATIC_CONSTANT(std::size_t, value = 4); };
+
+ // For member function pointers we have to use a function template (partial
+ // template specialization for a member pointer drops the cv qualification
+ // of the function type).
+ template<typename T, typename C>
+ typename encode_cv<T *>::type mfp_cv_tester(T C::*);
+
+ template<typename T> struct encode_mfp_cv
+ {
+ BOOST_STATIC_CONSTANT(std::size_t, value =
+ sizeof(detail::mfp_cv_tester((T)0L)));
+ };
+
+ // Associate bits with the CV codes above.
+ template<std::size_t> struct cv_tag_mfp_impl;
+
+ template<typename T> struct cv_tag_mfp
+ : detail::cv_tag_mfp_impl
+ < ::boost::function_types::detail::encode_mfp_cv<T>::value >
+ { };
+
+ template<> struct cv_tag_mfp_impl<1> : non_cv { };
+ template<> struct cv_tag_mfp_impl<2> : const_non_volatile { };
+ template<> struct cv_tag_mfp_impl<3> : volatile_non_const { };
+ template<> struct cv_tag_mfp_impl<4> : cv_qualified { };
+
+ // Metafunction to decode the cv code and apply it to a type.
+ // We add a pointer, because otherwise cv-qualifiers won't stick (another bug).
+ template<typename T, std::size_t CV> struct decode_cv;
+
+ template<typename T> struct decode_cv<T,1> : mpl::identity<T *> {};
+ template<typename T> struct decode_cv<T,2> : mpl::identity<T const *> {};
+ template<typename T> struct decode_cv<T,3> : mpl::identity<T volatile *> {};
+ template<typename T> struct decode_cv<T,4>
+ : mpl::identity<T const volatile *> {};
+
+ // The class type transformation comes after adding cv-qualifiers. We have
+ // wrap it to remove the pointer added in decode_cv_impl.
+ template<typename T, typename L> struct bcc_class_transform_impl;
+ template<typename T, typename L> struct bcc_class_transform_impl<T *, L>
+ : class_transform<T,L>
+ { };
+
+ template<typename T, typename D, typename L> struct bcc_class_transform
+ : bcc_class_transform_impl
+ < typename decode_cv
+ < T
+ , ::boost::function_types::detail::encode_mfp_cv<D>::value
+ >::type
+ , L
+ >
+ { };
+
+ // After extracting the member pointee from the type the class type is still
+ // in the type (somewhere -- you won't see with RTTI, that is) and that type
+ // is flagged unusable and *not* identical to the nonmember function type.
+ // We can, however, decompose this type via components_impl but surprisingly
+ // a pointer to the const qualified class type pops up again as the first
+ // parameter type.
+ // We have to replace this type with the properly cv-qualified and
+ // transformed class type, integrate the cv qualification into the bits.
+ template<typename Base, typename MFP, typename OrigT, typename L>
+ struct mfp_components;
+
+
+ template<typename Base, typename T, typename C, typename OrigT, typename L>
+ struct mfp_components<Base,T C::*,OrigT,L>
+ {
+ private:
+ typedef typename mpl::front<typename Base::types>::type result_type;
+ typedef typename detail::bcc_class_transform<C,OrigT,L>::type class_type;
+
+ typedef mpl::vector2<result_type, class_type> result_and_class_type;
+
+ typedef typename
+ mpl::advance
+ < typename mpl::begin<typename Base::types>::type
+ , typename mpl::if_
+ < mpl::equal_to< typename detail::classifier<OrigT>::function_arity
+ , typename Base::function_arity >
+ , mpl::integral_c<int,2> , mpl::integral_c<int,1>
+ >::type
+ >::type
+ from;
+ typedef typename mpl::end<typename Base::types>::type to;
+
+ typedef mpl::iterator_range<from,to> param_types;
+
+ typedef mpl::joint_view< result_and_class_type, param_types> types_view;
+ public:
+
+ typedef typename
+ mpl::reverse_copy<types_view, mpl::front_inserter< mpl::vector0<> > >::type
+ types;
+
+ typedef typename
+ function_types::tag< Base, detail::cv_tag_mfp<OrigT> >::bits
+ bits;
+
+ typedef typename Base::mask mask;
+
+ typedef typename detail::classifier<OrigT>::function_arity function_arity;
+
+ typedef components_mpl_sequence_tag tag;
+ };
+
+ // Now put it all together: detect cv-qualification of function types and do
+ // the weird transformations above for member function pointers.
+ template<typename T, typename OrigT, typename L>
+ struct components_bcc
+ : mpl::if_
+ < detail::represents_impl< detail::components_impl<T,L>
+ , member_function_pointer_tag>
+ , detail::mfp_components<detail::components_impl<T,L>,T,OrigT,L>
+ , detail::components_impl<T,L>
+ >::type
+ { };
+
+#endif // end of BORLAND WORKAROUND
+
+#define BOOST_FT_al_path boost/function_types/detail/components_impl
+#include <boost/function_types/detail/pp_loop.hpp>
+
+ } } // namespace function_types::detail
+
+} // namespace ::boost
+
+#include <boost/function_types/detail/components_as_mpl_sequence.hpp>
+#include <boost/function_types/detail/retag_default_cc.hpp>
+
+#endif
+
diff --git a/include/boost/function_types/config/cc_names.hpp b/include/boost/function_types/config/cc_names.hpp
new file mode 100644
index 0000000..ab69d64
--- /dev/null
+++ b/include/boost/function_types/config/cc_names.hpp
@@ -0,0 +1,31 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_CONFIG_CC_NAMES_HPP_INCLUDED
+#define BOOST_FT_CONFIG_CC_NAMES_HPP_INCLUDED
+
+#define BOOST_FT_BUILTIN_CC_NAMES \
+ (( IMPLICIT , implicit_cc , BOOST_PP_EMPTY ))\
+ (( CDECL , cdecl_cc , BOOST_PP_IDENTITY(__cdecl ) ))\
+ (( STDCALL , stdcall_cc , BOOST_PP_IDENTITY(__stdcall ) ))\
+ (( PASCAL , pascal_cc , BOOST_PP_IDENTITY(pascal ) ))\
+ (( FASTCALL , fastcall_cc , BOOST_PP_IDENTITY(__fastcall) ))\
+ (( CLRCALL , clrcall_cc , BOOST_PP_IDENTITY(__clrcall ) ))\
+ (( THISCALL , thiscall_cc , BOOST_PP_IDENTITY(__thiscall) ))\
+ (( IMPLICIT_THISCALL , thiscall_cc , BOOST_PP_EMPTY ))
+
+// append user-defined cc names to builtin ones
+#ifdef BOOST_FT_CC_NAMES
+# define BOOST_FT_CC_NAMES_SEQ BOOST_FT_BUILTIN_CC_NAMES BOOST_FT_CC_NAMES
+# define BOOST_FT_CC_PREPROCESSING 1
+#else
+# define BOOST_FT_CC_NAMES_SEQ BOOST_FT_BUILTIN_CC_NAMES
+#endif
+
+#endif
+
diff --git a/include/boost/function_types/config/compiler.hpp b/include/boost/function_types/config/compiler.hpp
new file mode 100644
index 0000000..151c856
--- /dev/null
+++ b/include/boost/function_types/config/compiler.hpp
@@ -0,0 +1,116 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_CONFIG_COMPILER_HPP_INCLUDED
+#define BOOST_FT_CONFIG_COMPILER_HPP_INCLUDED
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+
+#if defined(BOOST_MSVC)
+
+# if BOOST_MSVC < 1310
+# error "unsupported compiler version"
+# endif
+
+# ifdef BOOST_FT_AUTODETECT_CALLING_CONVENTIONS
+
+ // enable clrcall calling covention (call to .NET managed code) when
+ // compiling with /clr
+# if BOOST_MSVC >= 1400 && defined(__cplusplus_cli)
+# ifndef BOOST_FT_CC_CLRCALL
+# define BOOST_FT_CC_CLRCALL callable_builtin
+# endif
+# endif
+
+ // Intel x86 architecture specific calling conventions
+# ifdef _M_IX86
+# define BOOST_FT_COMMON_X86_CCs callable_builtin
+# if BOOST_MSVC < 1400
+ // version 7.1 is missing a keyword to specify the thiscall cc ...
+# ifndef BOOST_FT_CC_IMPLICIT_THISCALL
+# define BOOST_FT_CC_IMPLICIT_THISCALL non_variadic|member|callable_builtin
+# ifndef BOOST_FT_CONFIG_OK
+# pragma message("INFO| /Gd /Gr /Gz will compiler options will cause")
+# pragma message("INFO| a compile error.")
+# pragma message("INFO| Reconfigure Boost.FunctionTypes in this case.")
+# pragma message("INFO| This message can be suppressed by defining")
+# pragma message("INFO| BOOST_FT_CONFIG_OK.")
+# endif
+# endif
+# else
+ // ...introduced in version 8
+# ifndef BOOST_FT_CC_THISCALL
+# define BOOST_FT_CC_THISCALL non_variadic|member|callable_builtin
+# endif
+# endif
+# endif
+# endif
+
+#elif defined(__GNUC__) && !defined(BOOST_INTEL_LINUX)
+
+# if __GNUC__ < 3
+# error "unsupported compiler version"
+# endif
+
+# ifdef BOOST_FT_AUTODETECT_CALLING_CONVENTIONS
+
+# if defined(__i386__)
+# // see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20439
+# // see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29328
+# if BOOST_WORKAROUND(__GNUC__,BOOST_TESTED_AT(4))
+# ifndef BOOST_FT_CC_IMPLICIT
+# define BOOST_FT_CC_IMPLICIT member|callable_builtin
+# endif
+# define BOOST_FT_COMMON_X86_CCs non_member|callable_builtin
+# else
+# define BOOST_FT_COMMON_X86_CCs callable_builtin
+# endif
+# else
+# ifndef BOOST_FT_CC_IMPLICIT
+# define BOOST_FT_CC_IMPLICIT callable_builtin
+# endif
+# endif
+# endif
+
+# if (defined(BOOST_FT_CC_CDECL) || defined(BOOST_FT_COMMON_X86_CCs)) \
+ && !defined(__cdecl)
+# define __cdecl __attribute__((__cdecl__))
+# endif
+# if (defined(BOOST_FT_CC_STDCALL) || defined(BOOST_FT_COMMON_X86_CCs)) \
+ && !defined(__stdcall)
+# define __stdcall __attribute__((__stdcall__))
+# endif
+# if (defined(BOOST_FT_CC_FASTCALL) || defined(BOOST_FT_COMMON_X86_CCs)) \
+ && !defined(__fastcall)
+# define __fastcall __attribute__((__fastcall__))
+# endif
+
+#elif defined(__BORLANDC__)
+
+# if __BORLANDC__ < 0x550
+# error "unsupported compiler version"
+# elif __BORLANDC__ > 0x565
+# pragma message("WARNING: library untested with this compiler version")
+# endif
+
+# ifdef BOOST_FT_AUTODETECT_CALLING_CONVENTIONS
+# define BOOST_FT_COMMON_X86_CCs callable_builtin
+# endif
+
+ // syntactic specialities of cc specifier
+# define BOOST_FT_SYNTAX(result,lparen,cc_spec,type_mod,name,rparen) \
+ result() cc_spec() lparen() type_mod() name() rparen()
+#else
+ // only enable default calling convention
+# define BOOST_FT_CC_IMPLICIT callable_builtin
+#endif
+
+
+#endif
+
diff --git a/include/boost/function_types/config/config.hpp b/include/boost/function_types/config/config.hpp
new file mode 100644
index 0000000..7ec8e1e
--- /dev/null
+++ b/include/boost/function_types/config/config.hpp
@@ -0,0 +1,59 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_CONFIG_HPP_INCLUDED
+#define BOOST_FT_CONFIG_HPP_INCLUDED
+
+#include <boost/function_types/config/compiler.hpp>
+#include <boost/function_types/config/cc_names.hpp>
+
+// maximum allowed arity
+#ifndef BOOST_FT_MAX_ARITY
+#define BOOST_FT_MAX_ARITY 20
+#endif
+
+// the most common calling conventions for x86 architecture can be enabled at
+// once in the compiler config
+#ifdef BOOST_FT_COMMON_X86_CCs
+# ifndef BOOST_FT_CC_CDECL
+# define BOOST_FT_CC_CDECL BOOST_FT_COMMON_X86_CCs
+# endif
+# ifndef BOOST_FT_CC_STDCALL
+# define BOOST_FT_CC_STDCALL non_variadic|BOOST_FT_COMMON_X86_CCs
+# endif
+# ifndef BOOST_FT_CC_FASTCALL
+# define BOOST_FT_CC_FASTCALL non_variadic|BOOST_FT_COMMON_X86_CCs
+# endif
+#endif
+
+// where to place the cc specifier (the common way)
+#ifndef BOOST_FT_SYNTAX
+# define BOOST_FT_SYNTAX(result,lparen,cc_spec,type_mod,name,rparen) \
+ result() lparen() cc_spec() type_mod() name() rparen()
+#endif
+
+// param for nullary functions
+// set to "void" for compilers that require nullary functions to read
+// "R (void)" in template partial specialization
+#ifndef BOOST_FT_NULLARY_PARAM
+#define BOOST_FT_NULLARY_PARAM
+#endif
+
+// there is a pending defect report on cv qualified function types, so support
+// for these types is disabled, unless for compilers where it's known to work
+#ifndef BOOST_FT_NO_CV_FUNC_SUPPORT
+#define BOOST_FT_NO_CV_FUNC_SUPPORT 1
+#endif
+
+// full preprocessing implies preprocessing of the ccs
+#if defined(BOOST_FT_PREPROCESSING_MODE) && !defined(BOOST_FT_CC_PREPROCESSING)
+# define BOOST_FT_CC_PREPROCESSING 1
+#endif
+
+#endif
+
diff --git a/include/boost/function_types/detail/class_transform.hpp b/include/boost/function_types/detail/class_transform.hpp
new file mode 100644
index 0000000..27b97b3
--- /dev/null
+++ b/include/boost/function_types/detail/class_transform.hpp
@@ -0,0 +1,60 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_DETAIL_CLASS_TRANSFORM_HPP_INCLUDED
+#define BOOST_FT_DETAIL_CLASS_TRANSFORM_HPP_INCLUDED
+
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/always.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/placeholders.hpp>
+
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/add_pointer.hpp>
+#include <boost/type_traits/add_reference.hpp>
+
+namespace boost { namespace function_types { namespace detail {
+
+using mpl::placeholders::_;
+
+// Transformation metafunction for the class type of member function pointers.
+template<typename T, typename L>
+struct class_transform
+{ typedef typename mpl::apply1<L,T>::type type; };
+
+
+// We can short-circuit the mechanism implemented in the primary template for
+// the most common lambda expression and save both the "un-lambdaing" and the
+// type traits invocation (we know that T can only be a class type).
+
+template<typename T> struct class_transform< T, mpl::identity<_> >
+{ typedef T type; };
+
+template<typename T> struct class_transform< T, add_reference<_> >
+{ typedef T & type; };
+
+template<typename T> struct class_transform< T, add_pointer<_> >
+{ typedef T * type; };
+
+template<typename T> struct class_transform< T, remove_cv<_> >
+{ typedef typename boost::remove_cv<T>::type type; };
+
+template<typename T> struct class_transform< T, add_reference< remove_cv<_> > >
+{ typedef typename boost::remove_cv<T>::type & type; };
+
+template<typename T> struct class_transform< T, add_pointer< remove_cv<_> > >
+{ typedef typename boost::remove_cv<T>::type * type; };
+
+template<typename T, typename U> struct class_transform< T, mpl::always<U> >
+{ typedef U type; };
+
+
+} } } // namespace ::boost::function_types::detail
+
+#endif
+
diff --git a/include/boost/function_types/detail/classifier.hpp b/include/boost/function_types/detail/classifier.hpp
new file mode 100644
index 0000000..b5c5e71
--- /dev/null
+++ b/include/boost/function_types/detail/classifier.hpp
@@ -0,0 +1,87 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_DETAIL_CLASSIFIER_HPP_INCLUDED
+#define BOOST_FT_DETAIL_CLASSIFIER_HPP_INCLUDED
+
+#include <boost/type.hpp>
+#include <boost/config.hpp>
+#include <boost/type_traits/is_reference.hpp>
+#include <boost/type_traits/add_reference.hpp>
+
+#include <boost/function_types/config/config.hpp>
+#include <boost/function_types/property_tags.hpp>
+
+namespace boost { namespace function_types { namespace detail {
+
+template<typename T> struct classifier;
+
+template<std::size_t S> struct char_array { typedef char (&type)[S]; };
+
+template<bits_t Flags, bits_t CCID, std::size_t Arity> struct encode_charr
+{
+ typedef typename char_array<
+ ::boost::function_types::detail::encode_charr_impl<Flags,CCID,Arity>::value
+ >::type type;
+};
+
+#if defined(BOOST_MSVC) || (defined(__BORLANDC__) && !defined(BOOST_DISABLE_WIN32))
+# define BOOST_FT_DECL __cdecl
+#else
+# define BOOST_FT_DECL /**/
+#endif
+
+char BOOST_FT_DECL classifier_impl(...);
+
+#define BOOST_FT_variations BOOST_FT_function|BOOST_FT_pointer|\
+ BOOST_FT_member_pointer
+
+#define BOOST_FT_type_function(cc,name) BOOST_FT_SYNTAX( \
+ R BOOST_PP_EMPTY,BOOST_PP_LPAREN,cc,* BOOST_PP_EMPTY,name,BOOST_PP_RPAREN)
+
+#define BOOST_FT_type_function_pointer(cc,name) BOOST_FT_SYNTAX( \
+ R BOOST_PP_EMPTY,BOOST_PP_LPAREN,cc,** BOOST_PP_EMPTY,name,BOOST_PP_RPAREN)
+
+#define BOOST_FT_type_member_function_pointer(cc,name) BOOST_FT_SYNTAX( \
+ R BOOST_PP_EMPTY,BOOST_PP_LPAREN,cc,T0::** BOOST_PP_EMPTY,name,BOOST_PP_RPAREN)
+
+#define BOOST_FT_al_path boost/function_types/detail/classifier_impl
+#include <boost/function_types/detail/pp_loop.hpp>
+
+template<typename T> struct classifier_bits
+{
+ static typename boost::add_reference<T>::type tester;
+
+ BOOST_STATIC_CONSTANT(bits_t,value = (bits_t)sizeof(
+ boost::function_types::detail::classifier_impl(& tester)
+ )-1);
+};
+
+template<typename T> struct classifier
+{
+ typedef detail::constant<
+ ::boost::function_types::detail::decode_bits<
+ ::boost::function_types::detail::classifier_bits<T>::value
+ >::tag_bits >
+ bits;
+
+ typedef detail::full_mask mask;
+
+ typedef detail::constant<
+ ::boost::function_types::detail::decode_bits<
+ ::boost::function_types::detail::classifier_bits<T>::value
+ >::arity >
+ function_arity;
+};
+
+
+
+} } } // namespace ::boost::function_types::detail
+
+#endif
+
diff --git a/include/boost/function_types/detail/classifier_impl/arity10_0.hpp b/include/boost/function_types/detail/classifier_impl/arity10_0.hpp
new file mode 100644
index 0000000..e27f3c2
--- /dev/null
+++ b/include/boost/function_types/detail/classifier_impl/arity10_0.hpp
@@ -0,0 +1,55 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+template< typename R >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,0> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (BOOST_FT_nullary_param BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,1> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,2> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,3> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,4> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,5> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,6> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,7> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,8> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,9> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,10> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 BOOST_FT_ell) BOOST_FT_cv);
+
diff --git a/include/boost/function_types/detail/classifier_impl/arity10_1.hpp b/include/boost/function_types/detail/classifier_impl/arity10_1.hpp
new file mode 100644
index 0000000..cca8027
--- /dev/null
+++ b/include/boost/function_types/detail/classifier_impl/arity10_1.hpp
@@ -0,0 +1,52 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+template< typename R , typename T0 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,1> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) ( BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,2> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,3> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,4> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,5> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,6> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,7> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,8> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,9> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,10> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 BOOST_FT_ell) BOOST_FT_cv);
+
diff --git a/include/boost/function_types/detail/classifier_impl/arity20_0.hpp b/include/boost/function_types/detail/classifier_impl/arity20_0.hpp
new file mode 100644
index 0000000..f7a2516
--- /dev/null
+++ b/include/boost/function_types/detail/classifier_impl/arity20_0.hpp
@@ -0,0 +1,53 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+# include <boost/function_types/detail/classifier_impl/arity10_0.hpp>
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,11> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,12> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,13> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,14> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,15> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,16> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,17> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,18> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,19> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,20> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 BOOST_FT_ell) BOOST_FT_cv);
+
diff --git a/include/boost/function_types/detail/classifier_impl/arity20_1.hpp b/include/boost/function_types/detail/classifier_impl/arity20_1.hpp
new file mode 100644
index 0000000..1cee2ba
--- /dev/null
+++ b/include/boost/function_types/detail/classifier_impl/arity20_1.hpp
@@ -0,0 +1,53 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+# include <boost/function_types/detail/classifier_impl/arity10_1.hpp>
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,11> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,12> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,13> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,14> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,15> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,16> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,17> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,18> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,19> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,20> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 BOOST_FT_ell) BOOST_FT_cv);
+
diff --git a/include/boost/function_types/detail/classifier_impl/arity30_0.hpp b/include/boost/function_types/detail/classifier_impl/arity30_0.hpp
new file mode 100644
index 0000000..6bc60f8
--- /dev/null
+++ b/include/boost/function_types/detail/classifier_impl/arity30_0.hpp
@@ -0,0 +1,53 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+# include <boost/function_types/detail/classifier_impl/arity20_0.hpp>
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,21> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,22> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,23> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,24> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,25> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,26> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,27> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,28> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,29> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,30> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 BOOST_FT_ell) BOOST_FT_cv);
+
diff --git a/include/boost/function_types/detail/classifier_impl/arity30_1.hpp b/include/boost/function_types/detail/classifier_impl/arity30_1.hpp
new file mode 100644
index 0000000..743c263
--- /dev/null
+++ b/include/boost/function_types/detail/classifier_impl/arity30_1.hpp
@@ -0,0 +1,53 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+# include <boost/function_types/detail/classifier_impl/arity20_1.hpp>
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,21> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,22> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,23> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,24> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,25> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,26> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,27> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,28> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,29> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,30> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 BOOST_FT_ell) BOOST_FT_cv);
+
diff --git a/include/boost/function_types/detail/classifier_impl/arity40_0.hpp b/include/boost/function_types/detail/classifier_impl/arity40_0.hpp
new file mode 100644
index 0000000..161ac17
--- /dev/null
+++ b/include/boost/function_types/detail/classifier_impl/arity40_0.hpp
@@ -0,0 +1,53 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+# include <boost/function_types/detail/classifier_impl/arity30_0.hpp>
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,31> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,32> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,33> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,34> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,35> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,36> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,37> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,38> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,39> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,40> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 BOOST_FT_ell) BOOST_FT_cv);
+
diff --git a/include/boost/function_types/detail/classifier_impl/arity40_1.hpp b/include/boost/function_types/detail/classifier_impl/arity40_1.hpp
new file mode 100644
index 0000000..e3a9988
--- /dev/null
+++ b/include/boost/function_types/detail/classifier_impl/arity40_1.hpp
@@ -0,0 +1,53 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+# include <boost/function_types/detail/classifier_impl/arity30_1.hpp>
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,31> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,32> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,33> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,34> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,35> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,36> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,37> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,38> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,39> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,40> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 BOOST_FT_ell) BOOST_FT_cv);
+
diff --git a/include/boost/function_types/detail/classifier_impl/arity50_0.hpp b/include/boost/function_types/detail/classifier_impl/arity50_0.hpp
new file mode 100644
index 0000000..d05719a
--- /dev/null
+++ b/include/boost/function_types/detail/classifier_impl/arity50_0.hpp
@@ -0,0 +1,53 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+# include <boost/function_types/detail/classifier_impl/arity40_0.hpp>
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,41> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,42> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,43> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,44> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,45> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,46> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 , typename T46 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,47> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 , typename T46 , typename T47 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,48> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 , typename T46 , typename T47 , typename T48 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,49> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 , T48 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 , typename T46 , typename T47 , typename T48 , typename T49 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,50> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 , T48 , T49 BOOST_FT_ell) BOOST_FT_cv);
+
diff --git a/include/boost/function_types/detail/classifier_impl/arity50_1.hpp b/include/boost/function_types/detail/classifier_impl/arity50_1.hpp
new file mode 100644
index 0000000..944eaba
--- /dev/null
+++ b/include/boost/function_types/detail/classifier_impl/arity50_1.hpp
@@ -0,0 +1,52 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+# include <boost/function_types/detail/classifier_impl/arity40_1.hpp>
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,41> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,42> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,43> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,44> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,45> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,46> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 , typename T46 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,47> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 , typename T46 , typename T47 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,48> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 , typename T46 , typename T47 , typename T48 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,49> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 , T48 BOOST_FT_ell) BOOST_FT_cv);
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 , typename T46 , typename T47 , typename T48 , typename T49 >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,50> ::type
+classifier_impl(BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 , T48 , T49 BOOST_FT_ell) BOOST_FT_cv);
diff --git a/include/boost/function_types/detail/classifier_impl/master.hpp b/include/boost/function_types/detail/classifier_impl/master.hpp
new file mode 100644
index 0000000..00b722e
--- /dev/null
+++ b/include/boost/function_types/detail/classifier_impl/master.hpp
@@ -0,0 +1,33 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+#if BOOST_FT_ARITY_LOOP_PREFIX
+
+# ifndef BOOST_FT_DETAIL_CLASSIFIER_IMPL_MASTER_HPP_INCLUDED
+# define BOOST_FT_DETAIL_CLASSIFIER_IMPL_MASTER_HPP_INCLUDED
+# include <boost/preprocessor/facilities/identity.hpp>
+# endif
+
+# define BOOST_FT_type_name
+
+#elif BOOST_FT_ARITY_LOOP_IS_ITERATING
+
+template< BOOST_FT_tplargs(BOOST_PP_IDENTITY(typename)) >
+typename encode_charr<BOOST_FT_flags,BOOST_FT_cc_id,BOOST_FT_arity>::type
+classifier_impl(BOOST_FT_type);
+
+#elif BOOST_FT_ARITY_LOOP_SUFFIX
+
+# undef BOOST_FT_type_name
+
+#else
+# error "attempt to use arity loop master file without loop"
+#endif
+
diff --git a/include/boost/function_types/detail/components_as_mpl_sequence.hpp b/include/boost/function_types/detail/components_as_mpl_sequence.hpp
new file mode 100644
index 0000000..637b1b5
--- /dev/null
+++ b/include/boost/function_types/detail/components_as_mpl_sequence.hpp
@@ -0,0 +1,138 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_DETAIL_COMPONENTS_AS_MPL_SEQUENCE_HPP_INCLUDED
+#define BOOST_FT_DETAIL_COMPONENTS_AS_MPL_SEQUENCE_HPP_INCLUDED
+
+#include <boost/mpl/size_fwd.hpp>
+#include <boost/mpl/empty_fwd.hpp>
+#include <boost/mpl/front_fwd.hpp>
+#include <boost/mpl/back_fwd.hpp>
+#include <boost/mpl/at_fwd.hpp>
+#include <boost/mpl/begin_end_fwd.hpp>
+#include <boost/mpl/clear_fwd.hpp>
+#include <boost/mpl/push_front_fwd.hpp>
+#include <boost/mpl/pop_front_fwd.hpp>
+#include <boost/mpl/push_back_fwd.hpp>
+#include <boost/mpl/pop_back_fwd.hpp>
+
+namespace boost { namespace mpl {
+
+template<> struct size_impl
+< function_types::detail::components_mpl_sequence_tag >
+{
+ template< typename S > struct apply
+ : mpl::size <typename S::types>
+ { };
+};
+template<> struct empty_impl
+< function_types::detail::components_mpl_sequence_tag >
+{
+ template< typename S > struct apply
+ : mpl::empty <typename S::types>
+ { };
+};
+template<> struct front_impl
+< function_types::detail::components_mpl_sequence_tag >
+{
+ template< typename S > struct apply
+ : mpl::front <typename S::types>
+ { };
+};
+template<> struct back_impl
+< function_types::detail::components_mpl_sequence_tag >
+{
+ template< typename S > struct apply
+ : mpl::back <typename S::types>
+ { };
+};
+template<> struct at_impl
+< function_types::detail::components_mpl_sequence_tag >
+{
+ template< typename S, typename N > struct apply
+ : mpl::at <typename S::types, N >
+ { };
+};
+template<> struct begin_impl
+< function_types::detail::components_mpl_sequence_tag >
+{
+ template< typename S > struct apply
+ : mpl::begin <typename S::types>
+ { };
+};
+template<> struct end_impl
+< function_types::detail::components_mpl_sequence_tag >
+{
+ template< typename S > struct apply
+ : mpl::end <typename S::types>
+ { };
+};
+template<> struct clear_impl
+< function_types::detail::components_mpl_sequence_tag >
+{
+ template< typename S >
+ struct apply
+ : S
+ {
+ typedef apply type;
+ typedef typename mpl::clear< typename S::types >::type types;
+ };
+};
+template<>
+struct push_front_impl
+< function_types::detail::components_mpl_sequence_tag >
+{
+ template< typename S, typename T >
+ struct apply
+ : S
+ {
+ typedef apply type;
+ typedef typename mpl::push_front< typename S::types, T >::type types;
+ };
+};
+template<>
+struct pop_front_impl
+< function_types::detail::components_mpl_sequence_tag >
+{
+ template< typename S >
+ struct apply
+ : S
+ {
+ typedef apply type;
+ typedef typename mpl::pop_front< typename S::types >::type types;
+ };
+};
+template<>
+struct push_back_impl
+< function_types::detail::components_mpl_sequence_tag >
+{
+ template< typename S, typename T >
+ struct apply
+ : S
+ {
+ typedef apply type;
+ typedef typename mpl::push_back< typename S::types, T >::type types;
+ };
+};
+template<>
+struct pop_back_impl
+< function_types::detail::components_mpl_sequence_tag >
+{
+ template< typename S >
+ struct apply
+ : S
+ {
+ typedef apply type;
+ typedef typename mpl::pop_back< typename S::types >::type types;
+ };
+};
+
+} } // namespace ::boost::mpl
+
+#endif
+
diff --git a/include/boost/function_types/detail/components_impl/arity10_0.hpp b/include/boost/function_types/detail/components_impl/arity10_0.hpp
new file mode 100644
index 0000000..f96c6a9
--- /dev/null
+++ b/include/boost/function_types/detail/components_impl/arity10_0.hpp
@@ -0,0 +1,132 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+template< typename R, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (BOOST_FT_nullary_param BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (BOOST_FT_nullary_param BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,0> function_arity;
+typedef mpl::vector1< R BOOST_FT_nullary_param > types;
+};
+template< typename R , typename T0, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,1> function_arity;
+typedef mpl::vector2< R , T0 > types;
+};
+template< typename R , typename T0 , typename T1, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,2> function_arity;
+typedef mpl::vector3< R , T0 , T1 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,3> function_arity;
+typedef mpl::vector4< R , T0 , T1 , T2 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,4> function_arity;
+typedef mpl::vector5< R , T0 , T1 , T2 , T3 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,5> function_arity;
+typedef mpl::vector6< R , T0 , T1 , T2 , T3 , T4 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,6> function_arity;
+typedef mpl::vector7< R , T0 , T1 , T2 , T3 , T4 , T5 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,7> function_arity;
+typedef mpl::vector8< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,8> function_arity;
+typedef mpl::vector9< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,9> function_arity;
+typedef mpl::vector10< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,10> function_arity;
+typedef mpl::vector11< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 > types;
+};
+
diff --git a/include/boost/function_types/detail/components_impl/arity10_1.hpp b/include/boost/function_types/detail/components_impl/arity10_1.hpp
new file mode 100644
index 0000000..1b06a97
--- /dev/null
+++ b/include/boost/function_types/detail/components_impl/arity10_1.hpp
@@ -0,0 +1,122 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+template< typename R , typename T0, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) ( BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) ( BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,1> function_arity;
+typedef mpl::vector2< R, typename class_transform<T0 BOOST_FT_cv, L> ::type > types;
+};
+template< typename R , typename T0 , typename T1, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,2> function_arity;
+typedef mpl::vector3< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,3> function_arity;
+typedef mpl::vector4< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,4> function_arity;
+typedef mpl::vector5< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,5> function_arity;
+typedef mpl::vector6< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,6> function_arity;
+typedef mpl::vector7< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,7> function_arity;
+typedef mpl::vector8< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,8> function_arity;
+typedef mpl::vector9< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,9> function_arity;
+typedef mpl::vector10< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,10> function_arity;
+typedef mpl::vector11< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 > types;
+};
+
diff --git a/include/boost/function_types/detail/components_impl/arity20_0.hpp b/include/boost/function_types/detail/components_impl/arity20_0.hpp
new file mode 100644
index 0000000..f6b2ca8
--- /dev/null
+++ b/include/boost/function_types/detail/components_impl/arity20_0.hpp
@@ -0,0 +1,123 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+# include <boost/function_types/detail/components_impl/arity10_0.hpp>
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,11> function_arity;
+typedef mpl::vector12< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,12> function_arity;
+typedef mpl::vector13< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,13> function_arity;
+typedef mpl::vector14< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,14> function_arity;
+typedef mpl::vector15< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,15> function_arity;
+typedef mpl::vector16< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,16> function_arity;
+typedef mpl::vector17< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,17> function_arity;
+typedef mpl::vector18< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,18> function_arity;
+typedef mpl::vector19< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,19> function_arity;
+typedef mpl::vector20< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,20> function_arity;
+typedef mpl::vector21< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 > types;
+};
+
diff --git a/include/boost/function_types/detail/components_impl/arity20_1.hpp b/include/boost/function_types/detail/components_impl/arity20_1.hpp
new file mode 100644
index 0000000..1688e6b
--- /dev/null
+++ b/include/boost/function_types/detail/components_impl/arity20_1.hpp
@@ -0,0 +1,123 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+# include <boost/function_types/detail/components_impl/arity10_1.hpp>
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,11> function_arity;
+typedef mpl::vector12< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,12> function_arity;
+typedef mpl::vector13< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,13> function_arity;
+typedef mpl::vector14< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,14> function_arity;
+typedef mpl::vector15< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,15> function_arity;
+typedef mpl::vector16< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,16> function_arity;
+typedef mpl::vector17< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,17> function_arity;
+typedef mpl::vector18< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,18> function_arity;
+typedef mpl::vector19< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,19> function_arity;
+typedef mpl::vector20< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,20> function_arity;
+typedef mpl::vector21< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 > types;
+};
+
diff --git a/include/boost/function_types/detail/components_impl/arity30_0.hpp b/include/boost/function_types/detail/components_impl/arity30_0.hpp
new file mode 100644
index 0000000..e85eb3a
--- /dev/null
+++ b/include/boost/function_types/detail/components_impl/arity30_0.hpp
@@ -0,0 +1,123 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+# include <boost/function_types/detail/components_impl/arity20_0.hpp>
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,21> function_arity;
+typedef mpl::vector22< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,22> function_arity;
+typedef mpl::vector23< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,23> function_arity;
+typedef mpl::vector24< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,24> function_arity;
+typedef mpl::vector25< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,25> function_arity;
+typedef mpl::vector26< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,26> function_arity;
+typedef mpl::vector27< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,27> function_arity;
+typedef mpl::vector28< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,28> function_arity;
+typedef mpl::vector29< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,29> function_arity;
+typedef mpl::vector30< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,30> function_arity;
+typedef mpl::vector31< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 > types;
+};
+
diff --git a/include/boost/function_types/detail/components_impl/arity30_1.hpp b/include/boost/function_types/detail/components_impl/arity30_1.hpp
new file mode 100644
index 0000000..290d21e
--- /dev/null
+++ b/include/boost/function_types/detail/components_impl/arity30_1.hpp
@@ -0,0 +1,123 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+# include <boost/function_types/detail/components_impl/arity20_1.hpp>
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,21> function_arity;
+typedef mpl::vector22< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,22> function_arity;
+typedef mpl::vector23< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,23> function_arity;
+typedef mpl::vector24< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,24> function_arity;
+typedef mpl::vector25< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,25> function_arity;
+typedef mpl::vector26< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,26> function_arity;
+typedef mpl::vector27< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,27> function_arity;
+typedef mpl::vector28< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,28> function_arity;
+typedef mpl::vector29< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,29> function_arity;
+typedef mpl::vector30< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,30> function_arity;
+typedef mpl::vector31< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 > types;
+};
+
diff --git a/include/boost/function_types/detail/components_impl/arity40_0.hpp b/include/boost/function_types/detail/components_impl/arity40_0.hpp
new file mode 100644
index 0000000..f1a2410
--- /dev/null
+++ b/include/boost/function_types/detail/components_impl/arity40_0.hpp
@@ -0,0 +1,123 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+# include <boost/function_types/detail/components_impl/arity30_0.hpp>
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,31> function_arity;
+typedef mpl::vector32< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,32> function_arity;
+typedef mpl::vector33< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,33> function_arity;
+typedef mpl::vector34< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,34> function_arity;
+typedef mpl::vector35< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,35> function_arity;
+typedef mpl::vector36< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,36> function_arity;
+typedef mpl::vector37< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,37> function_arity;
+typedef mpl::vector38< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,38> function_arity;
+typedef mpl::vector39< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,39> function_arity;
+typedef mpl::vector40< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,40> function_arity;
+typedef mpl::vector41< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 > types;
+};
+
diff --git a/include/boost/function_types/detail/components_impl/arity40_1.hpp b/include/boost/function_types/detail/components_impl/arity40_1.hpp
new file mode 100644
index 0000000..e1741cb
--- /dev/null
+++ b/include/boost/function_types/detail/components_impl/arity40_1.hpp
@@ -0,0 +1,123 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+# include <boost/function_types/detail/components_impl/arity30_1.hpp>
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,31> function_arity;
+typedef mpl::vector32< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,32> function_arity;
+typedef mpl::vector33< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,33> function_arity;
+typedef mpl::vector34< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,34> function_arity;
+typedef mpl::vector35< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,35> function_arity;
+typedef mpl::vector36< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,36> function_arity;
+typedef mpl::vector37< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,37> function_arity;
+typedef mpl::vector38< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,38> function_arity;
+typedef mpl::vector39< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,39> function_arity;
+typedef mpl::vector40< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,40> function_arity;
+typedef mpl::vector41< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 > types;
+};
+
diff --git a/include/boost/function_types/detail/components_impl/arity50_0.hpp b/include/boost/function_types/detail/components_impl/arity50_0.hpp
new file mode 100644
index 0000000..693a05d
--- /dev/null
+++ b/include/boost/function_types/detail/components_impl/arity50_0.hpp
@@ -0,0 +1,123 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+# include <boost/function_types/detail/components_impl/arity40_0.hpp>
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,41> function_arity;
+typedef mpl::vector42< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,42> function_arity;
+typedef mpl::vector43< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,43> function_arity;
+typedef mpl::vector44< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,44> function_arity;
+typedef mpl::vector45< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,45> function_arity;
+typedef mpl::vector46< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,46> function_arity;
+typedef mpl::vector47< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 , typename T46, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,47> function_arity;
+typedef mpl::vector48< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 , typename T46 , typename T47, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,48> function_arity;
+typedef mpl::vector49< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 , typename T46 , typename T47 , typename T48, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 , T48 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 , T48 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,49> function_arity;
+typedef mpl::vector50< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 , T48 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 , typename T46 , typename T47 , typename T48 , typename T49, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 , T48 , T49 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 , T48 , T49 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,50> function_arity;
+typedef mpl::vector51< R , T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 , T48 , T49 > types;
+};
+
diff --git a/include/boost/function_types/detail/components_impl/arity50_1.hpp b/include/boost/function_types/detail/components_impl/arity50_1.hpp
new file mode 100644
index 0000000..9bc1616
--- /dev/null
+++ b/include/boost/function_types/detail/components_impl/arity50_1.hpp
@@ -0,0 +1,123 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+# include <boost/function_types/detail/components_impl/arity40_1.hpp>
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,41> function_arity;
+typedef mpl::vector42< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,42> function_arity;
+typedef mpl::vector43< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,43> function_arity;
+typedef mpl::vector44< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,44> function_arity;
+typedef mpl::vector45< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,45> function_arity;
+typedef mpl::vector46< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,46> function_arity;
+typedef mpl::vector47< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 , typename T46, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,47> function_arity;
+typedef mpl::vector48< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 , typename T46 , typename T47, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,48> function_arity;
+typedef mpl::vector49< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 , typename T46 , typename T47 , typename T48, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 , T48 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 , T48 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,49> function_arity;
+typedef mpl::vector50< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 , T48 > types;
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 , typename T46 , typename T47 , typename T48 , typename T49, typename L>
+struct components_impl<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 , T48 , T49 BOOST_FT_ell) BOOST_FT_cv, L>
+{
+typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+typedef constant<BOOST_FT_full_mask> mask;
+typedef function_types::components<BOOST_FT_syntax(BOOST_FT_cc, BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 , T48 , T49 BOOST_FT_ell) BOOST_FT_cv, L> type;
+typedef components_mpl_sequence_tag tag;
+typedef mpl::integral_c<std::size_t,50> function_arity;
+typedef mpl::vector51< R, typename class_transform<T0 BOOST_FT_cv, L> ::type , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 , T48 , T49 > types;
+};
+
diff --git a/include/boost/function_types/detail/components_impl/master.hpp b/include/boost/function_types/detail/components_impl/master.hpp
new file mode 100644
index 0000000..cd83726
--- /dev/null
+++ b/include/boost/function_types/detail/components_impl/master.hpp
@@ -0,0 +1,61 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+#if BOOST_FT_ARITY_LOOP_PREFIX
+
+# ifndef BOOST_FT_DETAIL_COMPONENTS_IMPL_MASTER_HPP_INCLUDED
+# define BOOST_FT_DETAIL_COMPONENTS_IMPL_MASTER_HPP_INCLUDED
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/facilities/empty.hpp>
+# include <boost/preprocessor/facilities/identity.hpp>
+# include <boost/preprocessor/arithmetic/dec.hpp>
+# include <boost/preprocessor/punctuation/comma_if.hpp>
+# endif
+
+# define BOOST_FT_type_name
+
+# if !BOOST_FT_mfp
+
+# define BOOST_FT_types \
+ R BOOST_PP_COMMA_IF(BOOST_FT_arity) BOOST_FT_params(BOOST_PP_EMPTY)
+# else
+
+# define BOOST_FT_types \
+ R, typename class_transform<T0 BOOST_FT_cv, L>::type \
+ BOOST_PP_COMMA_IF(BOOST_PP_DEC(BOOST_FT_arity)) \
+ BOOST_FT_params(BOOST_PP_EMPTY)
+
+# endif
+
+#elif BOOST_FT_ARITY_LOOP_IS_ITERATING
+
+template< BOOST_FT_tplargs(BOOST_PP_IDENTITY(typename)), typename L>
+struct components_impl<BOOST_FT_type, L>
+{
+ typedef encode_bits<BOOST_FT_flags,BOOST_FT_cc_id> bits;
+ typedef constant<BOOST_FT_full_mask> mask;
+
+ typedef function_types::components<BOOST_FT_type, L> type;
+ typedef components_mpl_sequence_tag tag;
+
+ typedef mpl::integral_c<std::size_t,BOOST_FT_arity> function_arity;
+
+ typedef BOOST_PP_CAT(mpl::vector,BOOST_FT_n)< BOOST_FT_types > types;
+};
+
+#elif BOOST_FT_ARITY_LOOP_SUFFIX
+
+# undef BOOST_FT_types
+# undef BOOST_FT_type_name
+
+#else
+# error "attempt to use arity loop master file without loop"
+#endif
+
diff --git a/include/boost/function_types/detail/cv_traits.hpp b/include/boost/function_types/detail/cv_traits.hpp
new file mode 100644
index 0000000..4e15fa4
--- /dev/null
+++ b/include/boost/function_types/detail/cv_traits.hpp
@@ -0,0 +1,132 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_DETAIL_CV_TRAITS_HPP_INCLUDED
+#define BOOST_FT_DETAIL_CV_TRAITS_HPP_INCLUDED
+
+#include <cstddef>
+#include <boost/detail/workaround.hpp>
+
+#if BOOST_WORKAROUND(__BORLANDC__, <= 0x582)
+# include <boost/type_traits/remove_cv.hpp>
+# include <boost/type_traits/remove_pointer.hpp>
+# include <boost/type_traits/remove_reference.hpp>
+#endif
+
+#include <boost/function_types/property_tags.hpp>
+
+namespace boost { namespace function_types { namespace detail {
+
+#if !BOOST_WORKAROUND(__BORLANDC__, <= 0x582)
+
+template<typename T> struct cv_traits
+{ typedef non_cv tag; typedef T type; };
+template<typename T> struct cv_traits<T &>
+{ typedef non_cv tag; typedef T type; };
+template<typename T> struct cv_traits<T *>
+{ typedef non_cv tag; typedef T type; };
+template<typename T> struct cv_traits<T * const>
+{ typedef non_cv tag; typedef T type; };
+template<typename T> struct cv_traits<T * volatile>
+{ typedef non_cv tag; typedef T type; };
+template<typename T> struct cv_traits<T * const volatile>
+{ typedef non_cv tag; typedef T type; };
+
+template<typename T> struct cv_traits<T const>
+{ typedef const_non_volatile tag; typedef T type; };
+template<typename T> struct cv_traits<T const &>
+{ typedef const_non_volatile tag; typedef T type; };
+template<typename T> struct cv_traits<T const *>
+{ typedef const_non_volatile tag; typedef T type; };
+template<typename T> struct cv_traits<T const * const>
+{ typedef const_non_volatile tag; typedef T type; };
+template<typename T> struct cv_traits<T const * volatile>
+{ typedef const_non_volatile tag; typedef T type; };
+template<typename T> struct cv_traits<T const * const volatile>
+{ typedef const_non_volatile tag; typedef T type; };
+
+template<typename T> struct cv_traits<T volatile>
+{ typedef volatile_non_const tag; typedef T type; };
+template<typename T> struct cv_traits<T volatile &>
+{ typedef volatile_non_const tag; typedef T type; };
+template<typename T> struct cv_traits<T volatile *>
+{ typedef volatile_non_const tag; typedef T type; };
+template<typename T> struct cv_traits<T volatile * const>
+{ typedef volatile_non_const tag; typedef T type; };
+template<typename T> struct cv_traits<T volatile * volatile>
+{ typedef volatile_non_const tag; typedef T type; };
+template<typename T> struct cv_traits<T volatile * const volatile>
+{ typedef volatile_non_const tag; typedef T type; };
+
+template<typename T> struct cv_traits<T const volatile>
+{ typedef cv_qualified tag; typedef T type; };
+template<typename T> struct cv_traits<T const volatile &>
+{ typedef cv_qualified tag; typedef T type; };
+template<typename T> struct cv_traits<T const volatile *>
+{ typedef cv_qualified tag; typedef T type; };
+template<typename T> struct cv_traits<T const volatile * const>
+{ typedef cv_qualified tag; typedef T type; };
+template<typename T> struct cv_traits<T const volatile * volatile>
+{ typedef cv_qualified tag; typedef T type; };
+template<typename T> struct cv_traits<T const volatile * const volatile>
+{ typedef cv_qualified tag; typedef T type; };
+
+#else
+template<std::size_t> struct cv_tag_impl;
+
+template<> struct cv_tag_impl<1> { typedef non_cv type;};
+template<> struct cv_tag_impl<2> { typedef const_non_volatile type; };
+template<> struct cv_tag_impl<3> { typedef volatile_non_const type; };
+template<> struct cv_tag_impl<4> { typedef cv_qualified type; };
+
+typedef char (& case_1)[1];
+typedef char (& case_2)[2];
+typedef char (& case_3)[3];
+typedef char (& case_4)[4];
+
+template<typename T> case_1 switch_cv(T *);
+template<typename T> case_2 switch_cv(T const *);
+template<typename T> case_3 switch_cv(T volatile *);
+template<typename T> case_4 switch_cv(T const volatile *);
+
+template<typename T> T * ref_to_ptr(T &);
+template<typename T> T const * ref_to_ptr(T const &);
+template<typename T> T volatile * ref_to_ptr(T volatile &);
+template<typename T> T const volatile * ref_to_ptr(T const volatile &);
+
+template<typename T> T * ref_to_ptr(T * const volatile &);
+
+template<typename T>
+struct cv_code
+{
+ static T _t;
+ BOOST_STATIC_CONSTANT(std::size_t, value =
+ sizeof(::boost::function_types::detail::switch_cv(
+ ::boost::function_types::detail::ref_to_ptr(_t) ) ));
+};
+
+template<typename T> struct cv_traits
+{
+ typedef typename boost::function_types::detail::cv_tag_impl<
+ ::boost::function_types::detail::cv_code<T>::value >::type
+ tag;
+
+ // may require Boost.TypeTraits broken compiler specializations
+ // to work
+ typedef typename boost::remove_cv<
+ typename boost::remove_pointer<
+ typename boost::remove_reference<T>::type
+ >::type
+ >::type type;
+};
+#endif
+
+} } } // namespace boost::function_types::detail
+
+#endif
+
diff --git a/include/boost/function_types/detail/encoding/aliases_def.hpp b/include/boost/function_types/detail/encoding/aliases_def.hpp
new file mode 100644
index 0000000..4d48331
--- /dev/null
+++ b/include/boost/function_types/detail/encoding/aliases_def.hpp
@@ -0,0 +1,16 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusions
+
+#define callable_builtin BOOST_FT_callable_builtin
+#define member BOOST_FT_member_pointer
+#define non_member BOOST_FT_non_member
+#define variadic BOOST_FT_variadic
+#define non_variadic BOOST_FT_non_variadic
+
diff --git a/include/boost/function_types/detail/encoding/aliases_undef.hpp b/include/boost/function_types/detail/encoding/aliases_undef.hpp
new file mode 100644
index 0000000..1d4e577
--- /dev/null
+++ b/include/boost/function_types/detail/encoding/aliases_undef.hpp
@@ -0,0 +1,16 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusions
+
+#undef callable_builtin
+#undef member
+#undef non_member
+#undef variadic
+#undef non_variadic
+
diff --git a/include/boost/function_types/detail/encoding/def.hpp b/include/boost/function_types/detail/encoding/def.hpp
new file mode 100644
index 0000000..08074fb
--- /dev/null
+++ b/include/boost/function_types/detail/encoding/def.hpp
@@ -0,0 +1,51 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusions
+
+// Type encoding:
+//
+// bit 0: callable builtin
+// bit 1: non member
+// bit 2: naked function
+// bit 3: pointer
+// bit 4: reference
+// bit 5: member pointer
+// bit 6: member function pointer
+// bit 7: member object pointer
+
+#define BOOST_FT_type_mask 0x000000ff // 1111 1111
+#define BOOST_FT_callable_builtin 0x00000001 // 0000 0001
+#define BOOST_FT_non_member 0x00000002 // 0000 0010
+#define BOOST_FT_function 0x00000007 // 0000 0111
+#define BOOST_FT_pointer 0x0000000b // 0000 1011
+#define BOOST_FT_reference 0x00000013 // 0001 0011
+#define BOOST_FT_non_member_callable_builtin 0x00000003 // 0000 0011
+#define BOOST_FT_member_pointer 0x00000020 // 0010 0000
+#define BOOST_FT_member_function_pointer 0x00000061 // 0110 0001
+#define BOOST_FT_member_object_pointer 0x000000a3 // 1010 0001
+#define BOOST_FT_member_object_pointer_flags 0x000002a3
+
+#define BOOST_FT_variadic 0x00000100
+#define BOOST_FT_non_variadic 0x00000200
+#define BOOST_FT_variadic_mask 0x00000300
+
+#define BOOST_FT_const 0x00000400
+#define BOOST_FT_volatile 0x00000800
+
+#define BOOST_FT_default_cc 0x00008000
+#define BOOST_FT_cc_mask 0x00ff8000
+
+#define BOOST_FT_kind_mask 0x000000fc
+
+#define BOOST_FT_flags_mask 0x00000fff
+#define BOOST_FT_full_mask 0x00ff0fff
+
+#define BOOST_FT_arity_shift 24
+#define BOOST_FT_arity_mask 0x7f000000
+
diff --git a/include/boost/function_types/detail/encoding/undef.hpp b/include/boost/function_types/detail/encoding/undef.hpp
new file mode 100644
index 0000000..1920d6f
--- /dev/null
+++ b/include/boost/function_types/detail/encoding/undef.hpp
@@ -0,0 +1,38 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+#undef BOOST_FT_type_mask
+#undef BOOST_FT_kind_mask
+#undef BOOST_FT_callable_builtin
+#undef BOOST_FT_non_member
+#undef BOOST_FT_function
+#undef BOOST_FT_pointer
+#undef BOOST_FT_reference
+#undef BOOST_FT_non_member_callable_builtin
+#undef BOOST_FT_member_pointer
+#undef BOOST_FT_member_function_pointer
+#undef BOOST_FT_member_object_pointer
+#undef BOOST_FT_member_object_pointer_flags
+
+#undef BOOST_FT_variadic
+#undef BOOST_FT_non_variadic
+#undef BOOST_FT_variadic_mask
+
+#undef BOOST_FT_const
+#undef BOOST_FT_volatile
+
+#undef BOOST_FT_default_cc
+#undef BOOST_FT_cc_mask
+
+#undef BOOST_FT_flags_mask
+#undef BOOST_FT_full_mask
+
+#undef BOOST_FT_arity_mask
+
diff --git a/include/boost/function_types/detail/pp_arity_loop.hpp b/include/boost/function_types/detail/pp_arity_loop.hpp
new file mode 100644
index 0000000..b6dbff5
--- /dev/null
+++ b/include/boost/function_types/detail/pp_arity_loop.hpp
@@ -0,0 +1,149 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+#ifndef BOOST_FT_PREPROCESSING_MODE
+// input: BOOST_FT_mfp 0 or 1 <=> member function pointer?
+// input: BOOST_FT_type_name BOOST_FT_type --> "R (* ..._type_name)()" (pass2)
+#endif
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+#ifdef __WAVE__
+# pragma wave option(preserve: 0)
+#endif
+
+#ifndef BOOST_FT_ARITY_LOOP_IS_ITERATING
+
+# define BOOST_FT_AL_PREPROCESSED \
+ BOOST_FT_AL_FILE(BOOST_FT_al_path,BOOST_FT_FROM_ARITY,BOOST_FT_mfp)
+
+# define BOOST_FT_AL_FILE(base_path,max_arity,mfp) \
+ BOOST_FT_AL_FILE_I(base_path,max_arity,mfp)
+# define BOOST_FT_AL_FILE_I(base_path,max_arity,mfp) \
+ <base_path/arity ## max_arity ## _ ## mfp.hpp>
+
+# if !defined(BOOST_FT_PREPROCESSING_MODE)
+
+# if BOOST_FT_MAX_ARITY < 10
+# define BOOST_FT_FROM_ARITY 0
+# elif BOOST_FT_MAX_ARITY < 20
+# define BOOST_FT_FROM_ARITY 10
+# elif BOOST_FT_MAX_ARITY < 30
+# define BOOST_FT_FROM_ARITY 20
+# elif BOOST_FT_MAX_ARITY < 40
+# define BOOST_FT_FROM_ARITY 30
+# endif
+
+# if BOOST_FT_FROM_ARITY
+# include BOOST_FT_AL_PREPROCESSED
+# endif
+
+# elif !defined(BOOST_FT_FROM_ARITY) // single pass preprocessing
+# define BOOST_FT_FROM_ARITY 0
+
+# elif BOOST_FT_FROM_ARITY > 0 // arity20 includes arity10
+BOOST_PP_EXPAND(#) include BOOST_FT_AL_PREPROCESSED
+# endif
+
+# undef BOOST_FT_AL_PREPROCESSED
+
+# undef BOOST_FT_AL_FILE
+# undef BOOST_FT_AL_FILE_I
+
+# if BOOST_FT_MAX_ARITY > BOOST_FT_FROM_ARITY
+
+# ifndef BOOST_FT_DETAIL_ARITY_LOOP_HPP_INCLUDED
+# define BOOST_FT_DETAIL_ARITY_LOOP_HPP_INCLUDED
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/tuple/eat.hpp>
+# include <boost/preprocessor/control/if.hpp>
+# include <boost/preprocessor/arithmetic/inc.hpp>
+# include <boost/preprocessor/facilities/empty.hpp>
+# include <boost/preprocessor/facilities/expand.hpp>
+# include <boost/preprocessor/iteration/iterate.hpp>
+# include <boost/preprocessor/repetition/enum_params.hpp>
+# include <boost/preprocessor/repetition/enum_shifted_params.hpp>
+# include <boost/preprocessor/repetition/enum_trailing_params.hpp>
+# endif
+
+# define BOOST_FT_AL_INCLUDE_FILE <BOOST_FT_al_path/master.hpp>
+
+# define BOOST_FT_ARITY_LOOP_PREFIX 1
+# include BOOST_FT_AL_INCLUDE_FILE
+# undef BOOST_FT_ARITY_LOOP_PREFIX
+
+# if !BOOST_PP_IS_ITERATING
+# define BOOST_PP_FILENAME_1 BOOST_FT_AL_INCLUDE_FILE
+# elif BOOST_PP_ITERATION_DEPTH() == 1
+# define BOOST_PP_FILENAME_2 BOOST_FT_AL_INCLUDE_FILE
+# else
+# error "loops nested too deeply"
+# endif
+
+# define BOOST_FT_arity BOOST_PP_ITERATION()
+# define BOOST_FT_n BOOST_PP_INC(BOOST_FT_arity)
+
+# define BOOST_FT_type \
+ BOOST_FT_syntax(BOOST_FT_cc,BOOST_FT_type_name BOOST_PP_EMPTY)\
+ (BOOST_FT_params(BOOST_PP_EMPTY) BOOST_FT_ell) BOOST_FT_cv
+
+# define BOOST_FT_tplargs(prefx) \
+ prefx() R BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_FT_arity,prefx() T)
+
+# if !BOOST_FT_mfp
+
+# define BOOST_FT_params(prefx) \
+ BOOST_PP_IF(BOOST_FT_arity,BOOST_PP_ENUM_PARAMS, \
+ BOOST_FT_nullary_param BOOST_PP_TUPLE_EAT(2))( \
+ BOOST_FT_arity,prefx() T)
+# else
+
+# define BOOST_FT_params(prefx) \
+ BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_FT_arity,prefx() T)
+
+# endif
+
+# if !BOOST_FT_FROM_ARITY
+# define BOOST_PP_ITERATION_LIMITS (BOOST_FT_mfp, BOOST_FT_MAX_ARITY)
+# else
+# define BOOST_PP_ITERATION_LIMITS \
+ (BOOST_FT_FROM_ARITY+1, BOOST_FT_MAX_ARITY)
+# endif
+
+# define BOOST_FT_ARITY_LOOP_IS_ITERATING 1
+# include BOOST_PP_ITERATE()
+# undef BOOST_FT_ARITY_LOOP_IS_ITERATING
+
+# undef BOOST_FT_arity
+# undef BOOST_FT_params
+# undef BOOST_FT_tplargs
+# undef BOOST_FT_type
+
+# define BOOST_FT_ARITY_LOOP_SUFFIX 1
+# include BOOST_FT_AL_INCLUDE_FILE
+# undef BOOST_FT_ARITY_LOOP_SUFFIX
+
+# undef BOOST_FT_AL_INCLUDE_FILE
+# endif
+
+# undef BOOST_FT_FROM_ARITY
+
+#else
+# error "attempt to nest arity loops"
+#endif
+
diff --git a/include/boost/function_types/detail/pp_cc_loop/master.hpp b/include/boost/function_types/detail/pp_cc_loop/master.hpp
new file mode 100644
index 0000000..60e958c
--- /dev/null
+++ b/include/boost/function_types/detail/pp_cc_loop/master.hpp
@@ -0,0 +1,136 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusions
+
+#ifdef __WAVE__
+// this file has been generated from the master.hpp file in the same directory
+# pragma wave option(preserve: 0)
+#endif
+
+
+#if !BOOST_PP_IS_ITERATING
+
+# ifndef BOOST_FT_DETAIL_CC_LOOP_MASTER_HPP_INCLUDED
+# define BOOST_FT_DETAIL_CC_LOOP_MASTER_HPP_INCLUDED
+# include <boost/function_types/config/cc_names.hpp>
+
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/seq/size.hpp>
+# include <boost/preprocessor/seq/elem.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/preprocessor/iteration/iterate.hpp>
+# include <boost/preprocessor/facilities/expand.hpp>
+# include <boost/preprocessor/arithmetic/inc.hpp>
+# endif
+
+# include <boost/function_types/detail/encoding/def.hpp>
+# include <boost/function_types/detail/encoding/aliases_def.hpp>
+
+# define BOOST_PP_FILENAME_1 \
+ <boost/function_types/detail/pp_cc_loop/master.hpp>
+# define BOOST_PP_ITERATION_LIMITS \
+ (0,BOOST_PP_SEQ_SIZE(BOOST_FT_CC_NAMES_SEQ)-1)
+# include BOOST_PP_ITERATE()
+# if !defined(BOOST_FT_config_valid) && BOOST_FT_CC_PREPROCESSING
+# define BOOST_FT_cc_id 1
+# define BOOST_FT_cc_name implicit_cc
+# define BOOST_FT_cc BOOST_PP_EMPTY
+# define BOOST_FT_cond callable_builtin
+# include BOOST_FT_cc_file
+# undef BOOST_FT_cond
+# undef BOOST_FT_cc_name
+# undef BOOST_FT_cc
+# undef BOOST_FT_cc_id
+# elif !defined(BOOST_FT_config_valid) // and generating preprocessed file
+BOOST_PP_EXPAND(#) ifndef BOOST_FT_config_valid
+BOOST_PP_EXPAND(#) define BOOST_FT_cc_id 1
+BOOST_PP_EXPAND(#) define BOOST_FT_cc_name implicit_cc
+BOOST_PP_EXPAND(#) define BOOST_FT_cc BOOST_PP_EMPTY
+BOOST_PP_EXPAND(#) define BOOST_FT_cond callable_builtin
+#define _()
+BOOST_PP_EXPAND(#) include BOOST_FT_cc_file
+#undef _
+BOOST_PP_EXPAND(#) undef BOOST_FT_cond
+BOOST_PP_EXPAND(#) undef BOOST_FT_cc_name
+BOOST_PP_EXPAND(#) undef BOOST_FT_cc
+BOOST_PP_EXPAND(#) undef BOOST_FT_cc_id
+BOOST_PP_EXPAND(#) else
+BOOST_PP_EXPAND(#) undef BOOST_FT_config_valid
+BOOST_PP_EXPAND(#) endif
+
+# else
+# undef BOOST_FT_config_valid
+# endif
+
+# include <boost/function_types/detail/encoding/aliases_undef.hpp>
+# include <boost/function_types/detail/encoding/undef.hpp>
+
+#elif BOOST_FT_CC_PREPROCESSING
+
+# define BOOST_FT_cc_id BOOST_PP_INC(BOOST_PP_FRAME_ITERATION(1))
+# define BOOST_FT_cc_inf \
+ BOOST_PP_SEQ_ELEM(BOOST_PP_FRAME_ITERATION(1),BOOST_FT_CC_NAMES_SEQ)
+
+# define BOOST_FT_cc_pp_name BOOST_PP_TUPLE_ELEM(3,0,BOOST_FT_cc_inf)
+# define BOOST_FT_cc_name BOOST_PP_TUPLE_ELEM(3,1,BOOST_FT_cc_inf)
+# define BOOST_FT_cc BOOST_PP_TUPLE_ELEM(3,2,BOOST_FT_cc_inf)
+
+# define BOOST_FT_cond BOOST_PP_CAT(BOOST_FT_CC_,BOOST_FT_cc_pp_name)
+
+# if BOOST_FT_cond
+# define BOOST_FT_config_valid 1
+# include BOOST_FT_cc_file
+# endif
+
+# undef BOOST_FT_cond
+
+# undef BOOST_FT_cc_pp_name
+# undef BOOST_FT_cc_name
+# undef BOOST_FT_cc
+
+# undef BOOST_FT_cc_id
+# undef BOOST_FT_cc_inf
+
+#else // if generating preprocessed file
+BOOST_PP_EXPAND(#) define BOOST_FT_cc_id BOOST_PP_INC(BOOST_PP_ITERATION())
+
+# define BOOST_FT_cc_inf \
+ BOOST_PP_SEQ_ELEM(BOOST_PP_ITERATION(),BOOST_FT_CC_NAMES_SEQ)
+
+# define BOOST_FT_cc_pp_name BOOST_PP_TUPLE_ELEM(3,0,BOOST_FT_cc_inf)
+
+# define BOOST_FT_CC_DEF(name,index) \
+ name BOOST_PP_TUPLE_ELEM(3,index,BOOST_FT_cc_inf)
+BOOST_PP_EXPAND(#) define BOOST_FT_CC_DEF(BOOST_FT_cc_name,1)
+BOOST_PP_EXPAND(#) define BOOST_FT_CC_DEF(BOOST_FT_cc,2)
+# undef BOOST_FT_CC_DEF
+
+# define BOOST_FT_cc_cond_v BOOST_PP_CAT(BOOST_FT_CC_,BOOST_FT_cc_pp_name)
+BOOST_PP_EXPAND(#) define BOOST_FT_cond BOOST_FT_cc_cond_v
+# undef BOOST_FT_cc_cond_v
+
+# undef BOOST_FT_cc_pp_name
+# undef BOOST_FT_cc_inf
+
+BOOST_PP_EXPAND(#) if BOOST_FT_cond
+BOOST_PP_EXPAND(#) define BOOST_FT_config_valid 1
+#define _()
+BOOST_PP_EXPAND(#) include BOOST_FT_cc_file
+#undef _
+BOOST_PP_EXPAND(#) endif
+
+BOOST_PP_EXPAND(#) undef BOOST_FT_cond
+
+BOOST_PP_EXPAND(#) undef BOOST_FT_cc_name
+BOOST_PP_EXPAND(#) undef BOOST_FT_cc
+
+BOOST_PP_EXPAND(#) undef BOOST_FT_cc_id
+
+#endif
+
diff --git a/include/boost/function_types/detail/pp_cc_loop/preprocessed.hpp b/include/boost/function_types/detail/pp_cc_loop/preprocessed.hpp
new file mode 100644
index 0000000..da4079c
--- /dev/null
+++ b/include/boost/function_types/detail/pp_cc_loop/preprocessed.hpp
@@ -0,0 +1,120 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusions
+
+// this file has been generated from the master.hpp file in the same directory
+# define BOOST_FT_cc_id 1
+# define BOOST_FT_cc_name implicit_cc
+# define BOOST_FT_cc BOOST_PP_EMPTY
+# define BOOST_FT_cond BOOST_FT_CC_IMPLICIT
+# if BOOST_FT_cond
+# define BOOST_FT_config_valid 1
+# include BOOST_FT_cc_file
+# endif
+# undef BOOST_FT_cond
+# undef BOOST_FT_cc_name
+# undef BOOST_FT_cc
+# undef BOOST_FT_cc_id
+# define BOOST_FT_cc_id 2
+# define BOOST_FT_cc_name cdecl_cc
+# define BOOST_FT_cc BOOST_PP_IDENTITY(__cdecl )
+# define BOOST_FT_cond BOOST_FT_CC_CDECL
+# if BOOST_FT_cond
+# define BOOST_FT_config_valid 1
+# include BOOST_FT_cc_file
+# endif
+# undef BOOST_FT_cond
+# undef BOOST_FT_cc_name
+# undef BOOST_FT_cc
+# undef BOOST_FT_cc_id
+# define BOOST_FT_cc_id 3
+# define BOOST_FT_cc_name stdcall_cc
+# define BOOST_FT_cc BOOST_PP_IDENTITY(__stdcall )
+# define BOOST_FT_cond BOOST_FT_CC_STDCALL
+# if BOOST_FT_cond
+# define BOOST_FT_config_valid 1
+# include BOOST_FT_cc_file
+# endif
+# undef BOOST_FT_cond
+# undef BOOST_FT_cc_name
+# undef BOOST_FT_cc
+# undef BOOST_FT_cc_id
+# define BOOST_FT_cc_id 4
+# define BOOST_FT_cc_name pascal_cc
+# define BOOST_FT_cc BOOST_PP_IDENTITY(pascal )
+# define BOOST_FT_cond BOOST_FT_CC_PASCAL
+# if BOOST_FT_cond
+# define BOOST_FT_config_valid 1
+# include BOOST_FT_cc_file
+# endif
+# undef BOOST_FT_cond
+# undef BOOST_FT_cc_name
+# undef BOOST_FT_cc
+# undef BOOST_FT_cc_id
+# define BOOST_FT_cc_id 5
+# define BOOST_FT_cc_name fastcall_cc
+# define BOOST_FT_cc BOOST_PP_IDENTITY(__fastcall)
+# define BOOST_FT_cond BOOST_FT_CC_FASTCALL
+# if BOOST_FT_cond
+# define BOOST_FT_config_valid 1
+# include BOOST_FT_cc_file
+# endif
+# undef BOOST_FT_cond
+# undef BOOST_FT_cc_name
+# undef BOOST_FT_cc
+# undef BOOST_FT_cc_id
+# define BOOST_FT_cc_id 6
+# define BOOST_FT_cc_name clrcall_cc
+# define BOOST_FT_cc BOOST_PP_IDENTITY(__clrcall )
+# define BOOST_FT_cond BOOST_FT_CC_CLRCALL
+# if BOOST_FT_cond
+# define BOOST_FT_config_valid 1
+# include BOOST_FT_cc_file
+# endif
+# undef BOOST_FT_cond
+# undef BOOST_FT_cc_name
+# undef BOOST_FT_cc
+# undef BOOST_FT_cc_id
+# define BOOST_FT_cc_id 7
+# define BOOST_FT_cc_name thiscall_cc
+# define BOOST_FT_cc BOOST_PP_IDENTITY(__thiscall)
+# define BOOST_FT_cond BOOST_FT_CC_THISCALL
+# if BOOST_FT_cond
+# define BOOST_FT_config_valid 1
+# include BOOST_FT_cc_file
+# endif
+# undef BOOST_FT_cond
+# undef BOOST_FT_cc_name
+# undef BOOST_FT_cc
+# undef BOOST_FT_cc_id
+# define BOOST_FT_cc_id 8
+# define BOOST_FT_cc_name thiscall_cc
+# define BOOST_FT_cc BOOST_PP_EMPTY
+# define BOOST_FT_cond BOOST_FT_CC_IMPLICIT_THISCALL
+# if BOOST_FT_cond
+# define BOOST_FT_config_valid 1
+# include BOOST_FT_cc_file
+# endif
+# undef BOOST_FT_cond
+# undef BOOST_FT_cc_name
+# undef BOOST_FT_cc
+# undef BOOST_FT_cc_id
+# ifndef BOOST_FT_config_valid
+# define BOOST_FT_cc_id 1
+# define BOOST_FT_cc_name implicit_cc
+# define BOOST_FT_cc BOOST_PP_EMPTY
+# define BOOST_FT_cond 0x00000001
+# include BOOST_FT_cc_file
+# undef BOOST_FT_cond
+# undef BOOST_FT_cc_name
+# undef BOOST_FT_cc
+# undef BOOST_FT_cc_id
+# else
+# undef BOOST_FT_config_valid
+# endif
diff --git a/include/boost/function_types/detail/pp_loop.hpp b/include/boost/function_types/detail/pp_loop.hpp
new file mode 100644
index 0000000..7d8c347
--- /dev/null
+++ b/include/boost/function_types/detail/pp_loop.hpp
@@ -0,0 +1,80 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusions
+
+#ifndef BOOST_FT_DETAIL_PP_LOOP_HPP_INCLUDED
+#define BOOST_FT_DETAIL_PP_LOOP_HPP_INCLUDED
+# include <boost/preprocessor/facilities/expand.hpp>
+# include <boost/preprocessor/facilities/empty.hpp>
+# include <boost/preprocessor/punctuation/paren.hpp>
+#endif
+
+#include <boost/function_types/detail/encoding/def.hpp>
+#include <boost/function_types/detail/encoding/aliases_def.hpp>
+
+#if defined(BOOST_FT_PREPROCESSING_MODE)
+# define BOOST_FT_loop <boost/function_types/detail/pp_cc_loop/master.hpp>
+#else
+# define BOOST_FT_loop \
+ <boost/function_types/detail/pp_cc_loop/preprocessed.hpp>
+#endif
+
+#if defined(BOOST_FT_al_path)
+
+# define BOOST_FT_cc_file \
+ <boost/function_types/detail/pp_variate_loop/preprocessed.hpp>
+# define BOOST_FT_variate_file \
+ <boost/function_types/detail/pp_arity_loop.hpp>
+
+# ifndef BOOST_FT_type_function
+# define BOOST_FT_type_function(cc,name) BOOST_FT_SYNTAX( \
+ R BOOST_PP_EMPTY,BOOST_PP_EMPTY,cc,BOOST_PP_EMPTY,name,BOOST_PP_EMPTY)
+# endif
+# ifndef BOOST_FT_type_function_pointer
+# define BOOST_FT_type_function_pointer(cc,name) BOOST_FT_SYNTAX( \
+ R BOOST_PP_EMPTY,BOOST_PP_LPAREN,cc,* BOOST_PP_EMPTY,name,BOOST_PP_RPAREN)
+# endif
+# ifndef BOOST_FT_type_function_reference
+# define BOOST_FT_type_function_reference(cc,name) BOOST_FT_SYNTAX( \
+ R BOOST_PP_EMPTY,BOOST_PP_LPAREN,cc,& BOOST_PP_EMPTY,name,BOOST_PP_RPAREN)
+# endif
+# ifndef BOOST_FT_type_member_function_pointer
+# define BOOST_FT_type_member_function_pointer(cc,name) BOOST_FT_SYNTAX( \
+ R BOOST_PP_EMPTY,BOOST_PP_LPAREN,cc,T0::* BOOST_PP_EMPTY,name,BOOST_PP_RPAREN)
+# endif
+
+# include BOOST_FT_loop
+
+# undef BOOST_FT_type_function
+# undef BOOST_FT_type_function_pointer
+# undef BOOST_FT_type_function_reference
+# undef BOOST_FT_type_member_function_pointer
+
+# undef BOOST_FT_variations
+# undef BOOST_FT_variate_file
+# undef BOOST_FT_cc_file
+# undef BOOST_FT_al_path
+
+#elif defined(BOOST_FT_cc_file)
+
+# include BOOST_FT_loop
+# undef BOOST_FT_cc_file
+
+#else
+
+# error "argument missing"
+
+#endif
+
+#undef BOOST_FT_loop
+
+#include <boost/function_types/detail/encoding/aliases_undef.hpp>
+#include <boost/function_types/detail/encoding/undef.hpp>
+
+
diff --git a/include/boost/function_types/detail/pp_retag_default_cc/master.hpp b/include/boost/function_types/detail/pp_retag_default_cc/master.hpp
new file mode 100644
index 0000000..865efce
--- /dev/null
+++ b/include/boost/function_types/detail/pp_retag_default_cc/master.hpp
@@ -0,0 +1,103 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is guarded externally
+
+#ifdef __WAVE__
+// this file has been generated from the master.hpp file in the same directory
+# pragma wave option(preserve: 0)
+#endif
+
+#if !defined(BOOST_PP_VALUE)
+# include <boost/preprocessor/slot/slot.hpp>
+# include <boost/preprocessor/iteration/self.hpp>
+
+# include <boost/function_types/detail/encoding/def.hpp>
+# include <boost/function_types/detail/encoding/aliases_def.hpp>
+
+namespace boost { namespace function_types {
+
+namespace detail
+{
+ template<class Tag, class RefTag> struct selector_bits
+ {
+# define BOOST_PP_VALUE non_member|member|non_variadic|variadic
+# include BOOST_PP_ASSIGN_SLOT(1)
+
+ BOOST_STATIC_CONSTANT(bits_t, value = (
+ (::boost::function_types::detail::bits<Tag>::value & BOOST_FT_default_cc)
+ | (::boost::function_types::detail::bits<RefTag>::value & BOOST_PP_SLOT(1))
+ ));
+ };
+
+ template<bits_t SelectorBits> struct default_cc_tag;
+
+ template<class Tag, class RefTag> struct retag_default_cc
+ : detail::compound_tag
+ < Tag, detail::default_cc_tag<
+ ::boost::function_types::detail::selector_bits<Tag,RefTag>::value > >
+ { };
+
+ template<bits_t SelectorBits> struct default_cc_tag
+ {
+ typedef null_tag::bits bits;
+ typedef null_tag::mask mask;
+ };
+
+ class test_class;
+ typedef constant<BOOST_FT_cc_mask> cc_mask_constant;
+
+# define BOOST_FT_self \
+ <boost/function_types/detail/pp_retag_default_cc/master.hpp>
+
+# define default_cc_ BOOST_FT_default_cc
+
+# define BOOST_PP_VALUE default_cc_|non_member|non_variadic
+# define BOOST_FT_tester void (*tester)()
+# define BOOST_PP_INDIRECT_SELF BOOST_FT_self
+# include BOOST_PP_INCLUDE_SELF()
+
+# define BOOST_PP_VALUE default_cc_|non_member|variadic
+# define BOOST_FT_tester void (*tester)(...)
+# define BOOST_PP_INDIRECT_SELF BOOST_FT_self
+# include BOOST_PP_INCLUDE_SELF()
+
+# define BOOST_PP_VALUE default_cc_|member|non_variadic
+# define BOOST_FT_tester void (test_class::*tester)()
+# define BOOST_PP_INDIRECT_SELF BOOST_FT_self
+# include BOOST_PP_INCLUDE_SELF()
+
+# define BOOST_PP_VALUE default_cc_|member|variadic
+# define BOOST_FT_tester void (test_class::*tester)(...)
+# define BOOST_PP_INDIRECT_SELF BOOST_FT_self
+# include BOOST_PP_INCLUDE_SELF()
+
+# undef default_cc_
+
+# undef BOOST_FT_self
+
+} } } // namespace ::boost::function_types::detail
+
+# include <boost/function_types/detail/encoding/aliases_undef.hpp>
+# include <boost/function_types/detail/encoding/undef.hpp>
+
+#else // if defined(BOOST_PP_VALUE)
+
+# include BOOST_PP_ASSIGN_SLOT(1)
+
+ template<> struct default_cc_tag<BOOST_PP_SLOT(1)>
+ {
+ typedef BOOST_FT_tester;
+ typedef mpl::bitand_<components<tester>::bits,cc_mask_constant> bits;
+ typedef cc_mask_constant mask;
+ };
+
+# undef BOOST_FT_tester
+
+#endif
+
diff --git a/include/boost/function_types/detail/pp_retag_default_cc/preprocessed.hpp b/include/boost/function_types/detail/pp_retag_default_cc/preprocessed.hpp
new file mode 100644
index 0000000..72666d0
--- /dev/null
+++ b/include/boost/function_types/detail/pp_retag_default_cc/preprocessed.hpp
@@ -0,0 +1,59 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is guarded externally
+
+// this file has been generated from the master.hpp file in the same directory
+namespace boost { namespace function_types {
+namespace detail
+{
+template<class Tag, class RefTag> struct selector_bits
+{
+BOOST_STATIC_CONSTANT(bits_t, value = (
+(::boost::function_types::detail::bits<Tag> ::value & 0x00008000)
+| (::boost::function_types::detail::bits<RefTag> ::value & 802)
+));
+};
+template<bits_t SelectorBits> struct default_cc_tag;
+template<class Tag, class RefTag> struct retag_default_cc
+: detail::compound_tag
+< Tag, detail::default_cc_tag<
+::boost::function_types::detail::selector_bits<Tag,RefTag> ::value > >
+{ };
+template<bits_t SelectorBits> struct default_cc_tag
+{
+typedef null_tag::bits bits;
+typedef null_tag::mask mask;
+};
+class test_class;
+typedef constant<0x00ff8000> cc_mask_constant;
+template< > struct default_cc_tag<33282>
+{
+typedef void ( *tester)();
+typedef mpl::bitand_<components<tester> ::bits,cc_mask_constant> bits;
+typedef cc_mask_constant mask;
+};
+template< > struct default_cc_tag<33026>
+{
+typedef void ( *tester)( ... );
+typedef mpl::bitand_<components<tester> ::bits,cc_mask_constant> bits;
+typedef cc_mask_constant mask;
+};
+template< > struct default_cc_tag<33312>
+{
+typedef void (test_class:: *tester)();
+typedef mpl::bitand_<components<tester> ::bits,cc_mask_constant> bits;
+typedef cc_mask_constant mask;
+};
+template< > struct default_cc_tag<33056>
+{
+typedef void (test_class:: *tester)( ... );
+typedef mpl::bitand_<components<tester> ::bits,cc_mask_constant> bits;
+typedef cc_mask_constant mask;
+};
+} } }
diff --git a/include/boost/function_types/detail/pp_tags/cc_tag.hpp b/include/boost/function_types/detail/pp_tags/cc_tag.hpp
new file mode 100644
index 0000000..81f1d89
--- /dev/null
+++ b/include/boost/function_types/detail/pp_tags/cc_tag.hpp
@@ -0,0 +1,17 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusions
+
+ struct BOOST_FT_cc_name
+ {
+ typedef detail::encode_bits<0,BOOST_FT_cc_id> bits;
+ typedef detail::constant<BOOST_FT_cc_mask> mask;
+ };
+
+
diff --git a/include/boost/function_types/detail/pp_tags/master.hpp b/include/boost/function_types/detail/pp_tags/master.hpp
new file mode 100644
index 0000000..9cce212
--- /dev/null
+++ b/include/boost/function_types/detail/pp_tags/master.hpp
@@ -0,0 +1,126 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is guarded externally
+
+#ifdef __WAVE__
+// this file has been generated from the master.hpp file in the same directory
+# pragma wave option(preserve: 0)
+#endif
+
+#if !defined(BOOST_FT_PREPROCESSING_MODE) || defined(BOOST_FT_CONFIG_HPP_INCLUDED)
+# error "this file used with two-pass preprocessing, only"
+#endif
+
+#include <boost/preprocessor/slot/slot.hpp>
+#include <boost/function_types/detail/encoding/def.hpp>
+
+namespace boost { namespace function_types {
+
+typedef detail::property_tag<BOOST_FT_non_variadic,BOOST_FT_variadic_mask> non_variadic;
+typedef detail::property_tag<BOOST_FT_variadic,BOOST_FT_variadic_mask> variadic;
+
+typedef detail::property_tag<0,BOOST_FT_const> non_const;
+typedef detail::property_tag<BOOST_FT_const,BOOST_FT_const> const_qualified;
+
+typedef detail::property_tag<0,BOOST_FT_volatile> non_volatile;
+typedef detail::property_tag<BOOST_FT_volatile,BOOST_FT_volatile> volatile_qualified;
+
+typedef detail::property_tag<BOOST_FT_default_cc,BOOST_FT_cc_mask> default_cc;
+
+#define BOOST_PP_VALUE BOOST_FT_const|BOOST_FT_volatile
+#include BOOST_PP_ASSIGN_SLOT(1)
+
+typedef detail::property_tag<0 , BOOST_PP_SLOT(1)> non_cv;
+typedef detail::property_tag<BOOST_FT_const , BOOST_PP_SLOT(1)> const_non_volatile;
+typedef detail::property_tag<BOOST_FT_volatile, BOOST_PP_SLOT(1)> volatile_non_const;
+typedef detail::property_tag<BOOST_PP_SLOT(1) , BOOST_PP_SLOT(1)> cv_qualified;
+
+namespace detail {
+
+ typedef constant<BOOST_FT_full_mask> full_mask;
+
+ template <bits_t Flags, bits_t CCID> struct encode_bits_impl
+ {
+ BOOST_STATIC_CONSTANT( bits_t, value =
+ Flags | (BOOST_FT_default_cc * CCID) << 1 );
+ };
+
+ template <bits_t Flags, bits_t CCID, std::size_t Arity>
+ struct encode_charr_impl
+ {
+ BOOST_STATIC_CONSTANT(std::size_t, value = (std::size_t)(1+
+ Flags | (BOOST_FT_default_cc * CCID) << 1 | Arity << BOOST_FT_arity_shift
+ ));
+ };
+
+ template <bits_t Bits> struct decode_bits
+ {
+ BOOST_STATIC_CONSTANT(bits_t, flags = Bits & BOOST_FT_flags_mask);
+
+ BOOST_STATIC_CONSTANT(bits_t, cc_id =
+ ( (Bits & BOOST_FT_full_mask) / BOOST_FT_default_cc) >> 1
+ );
+
+ BOOST_STATIC_CONSTANT(bits_t, tag_bits = (Bits & BOOST_FT_full_mask));
+
+ BOOST_STATIC_CONSTANT(std::size_t, arity = (std::size_t)
+ (Bits >> BOOST_FT_arity_shift)
+ );
+ };
+
+ template <bits_t LHS_bits, bits_t LHS_mask, bits_t RHS_bits, bits_t RHS_mask>
+ struct tag_ice
+ {
+ BOOST_STATIC_CONSTANT(bool, match =
+ RHS_bits == (LHS_bits & RHS_mask & (RHS_bits |~BOOST_FT_type_mask))
+ );
+
+ BOOST_STATIC_CONSTANT(bits_t, combined_bits =
+ (LHS_bits & ~RHS_mask) | RHS_bits
+ );
+
+ BOOST_STATIC_CONSTANT(bits_t, combined_mask =
+ LHS_mask | RHS_mask
+ );
+
+ BOOST_STATIC_CONSTANT(bits_t, extracted_bits =
+ LHS_bits & RHS_mask
+ );
+
+ };
+
+#define BOOST_FT_mask BOOST_FT_type_mask
+ typedef property_tag<BOOST_FT_callable_builtin,BOOST_FT_mask> callable_builtin_tag;
+ typedef property_tag<BOOST_FT_non_member_callable_builtin,BOOST_FT_mask> nonmember_callable_builtin_tag;
+ typedef property_tag<BOOST_FT_function,BOOST_FT_mask> function_tag;
+ typedef property_tag<BOOST_FT_reference,BOOST_FT_mask> reference_tag;
+ typedef property_tag<BOOST_FT_pointer,BOOST_FT_mask> pointer_tag;
+ typedef property_tag<BOOST_FT_member_function_pointer,BOOST_FT_mask> member_function_pointer_tag;
+ typedef property_tag<BOOST_FT_member_object_pointer,BOOST_FT_mask> member_object_pointer_tag;
+ typedef property_tag<BOOST_FT_member_object_pointer_flags,BOOST_FT_full_mask> member_object_pointer_base;
+ typedef property_tag<BOOST_FT_member_pointer,BOOST_FT_mask> member_pointer_tag;
+#undef BOOST_FT_mask
+
+#define BOOST_PP_VALUE BOOST_FT_function|BOOST_FT_non_variadic|BOOST_FT_default_cc
+#include BOOST_PP_ASSIGN_SLOT(1)
+#define BOOST_PP_VALUE BOOST_FT_type_mask|BOOST_FT_variadic_mask|BOOST_FT_cc_mask
+#include BOOST_PP_ASSIGN_SLOT(2)
+
+ typedef property_tag< BOOST_PP_SLOT(1) , BOOST_PP_SLOT(2) > nv_dcc_func;
+
+#define BOOST_PP_VALUE \
+ BOOST_FT_member_function_pointer|BOOST_FT_non_variadic|BOOST_FT_default_cc
+#include BOOST_PP_ASSIGN_SLOT(1)
+
+ typedef property_tag< BOOST_PP_SLOT(1) , BOOST_PP_SLOT(2) > nv_dcc_mfp;
+
+} // namespace detail
+
+} } // namespace ::boost::function_types
+
diff --git a/include/boost/function_types/detail/pp_tags/preprocessed.hpp b/include/boost/function_types/detail/pp_tags/preprocessed.hpp
new file mode 100644
index 0000000..823c3cc
--- /dev/null
+++ b/include/boost/function_types/detail/pp_tags/preprocessed.hpp
@@ -0,0 +1,77 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is guarded externally
+
+// this file has been generated from the master.hpp file in the same directory
+namespace boost { namespace function_types {
+typedef detail::property_tag<0x00000200,0x00000300> non_variadic;
+typedef detail::property_tag<0x00000100,0x00000300> variadic;
+typedef detail::property_tag<0,0x00000400> non_const;
+typedef detail::property_tag<0x00000400,0x00000400> const_qualified;
+typedef detail::property_tag<0,0x00000800> non_volatile;
+typedef detail::property_tag<0x00000800,0x00000800> volatile_qualified;
+typedef detail::property_tag<0x00008000,0x00ff8000> default_cc;
+typedef detail::property_tag<0 , 3072> non_cv;
+typedef detail::property_tag<0x00000400 , 3072> const_non_volatile;
+typedef detail::property_tag<0x00000800, 3072> volatile_non_const;
+typedef detail::property_tag<3072 , 3072> cv_qualified;
+namespace detail {
+typedef constant<0x00ff0fff> full_mask;
+template <bits_t Flags, bits_t CCID> struct encode_bits_impl
+{
+BOOST_STATIC_CONSTANT( bits_t, value =
+Flags | (0x00008000 * CCID) << 1 );
+};
+template <bits_t Flags, bits_t CCID, std::size_t Arity>
+struct encode_charr_impl
+{
+BOOST_STATIC_CONSTANT(std::size_t, value = (std::size_t)(1+
+Flags | (0x00008000 * CCID) << 1 | Arity << 24
+));
+};
+template <bits_t Bits> struct decode_bits
+{
+BOOST_STATIC_CONSTANT(bits_t, flags = Bits & 0x00000fff);
+BOOST_STATIC_CONSTANT(bits_t, cc_id =
+( (Bits & 0x00ff0fff) / 0x00008000) >> 1
+);
+BOOST_STATIC_CONSTANT(bits_t, tag_bits = (Bits & 0x00ff0fff));
+BOOST_STATIC_CONSTANT(std::size_t, arity = (std::size_t)
+(Bits >> 24)
+);
+};
+template <bits_t LHS_bits, bits_t LHS_mask, bits_t RHS_bits, bits_t RHS_mask>
+struct tag_ice
+{
+BOOST_STATIC_CONSTANT(bool, match =
+RHS_bits == (LHS_bits & RHS_mask & (RHS_bits | ~0x000000ff))
+);
+BOOST_STATIC_CONSTANT(bits_t, combined_bits =
+(LHS_bits & ~RHS_mask) | RHS_bits
+);
+BOOST_STATIC_CONSTANT(bits_t, combined_mask =
+LHS_mask | RHS_mask
+);
+BOOST_STATIC_CONSTANT(bits_t, extracted_bits =
+LHS_bits & RHS_mask
+);
+};
+typedef property_tag<0x00000001,0x000000ff> callable_builtin_tag;
+typedef property_tag<0x00000003,0x000000ff> nonmember_callable_builtin_tag;
+typedef property_tag<0x00000007,0x000000ff> function_tag;
+typedef property_tag<0x00000013,0x000000ff> reference_tag;
+typedef property_tag<0x0000000b,0x000000ff> pointer_tag;
+typedef property_tag<0x00000061,0x000000ff> member_function_pointer_tag;
+typedef property_tag<0x000000a3,0x000000ff> member_object_pointer_tag;
+typedef property_tag<0x000002a3,0x00ff0fff> member_object_pointer_base;
+typedef property_tag<0x00000020,0x000000ff> member_pointer_tag;
+typedef property_tag< 33287 , 16745471 > nv_dcc_func;
+typedef property_tag< 33377 , 16745471 > nv_dcc_mfp;
+}
+} }
diff --git a/include/boost/function_types/detail/pp_variate_loop/master.hpp b/include/boost/function_types/detail/pp_variate_loop/master.hpp
new file mode 100644
index 0000000..5026342
--- /dev/null
+++ b/include/boost/function_types/detail/pp_variate_loop/master.hpp
@@ -0,0 +1,152 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifdef __WAVE__
+// this file has been generated from the master.hpp file in the same directory
+# pragma wave option(preserve: 0)
+#endif
+
+#if !defined(BOOST_FT_PREPROCESSING_MODE)
+# error "this file is only for two-pass preprocessing"
+#endif
+
+#if !defined(BOOST_PP_VALUE)
+# include <boost/preprocessor/slot/slot.hpp>
+# include <boost/preprocessor/facilities/empty.hpp>
+# include <boost/preprocessor/facilities/expand.hpp>
+# include <boost/function_types/detail/encoding/def.hpp>
+
+BOOST_PP_EXPAND(#) define BOOST_FT_mfp 0
+BOOST_PP_EXPAND(#) define BOOST_FT_syntax BOOST_FT_type_function
+
+# define BOOST_PP_VALUE \
+ BOOST_FT_function|BOOST_FT_non_variadic
+# include __FILE__
+# define BOOST_PP_VALUE \
+ BOOST_FT_function|BOOST_FT_variadic
+# include __FILE__
+
+BOOST_PP_EXPAND(#) if !BOOST_FT_NO_CV_FUNC_SUPPORT
+# define BOOST_PP_VALUE \
+ BOOST_FT_function|BOOST_FT_non_variadic|BOOST_FT_const
+# include __FILE__
+# define BOOST_PP_VALUE \
+ BOOST_FT_function|BOOST_FT_variadic|BOOST_FT_const
+# include __FILE__
+# define BOOST_PP_VALUE \
+ BOOST_FT_function|BOOST_FT_non_variadic|BOOST_FT_volatile
+# include __FILE__
+# define BOOST_PP_VALUE \
+ BOOST_FT_function|BOOST_FT_variadic|BOOST_FT_volatile
+# include __FILE__
+# define BOOST_PP_VALUE \
+ BOOST_FT_function|BOOST_FT_non_variadic|BOOST_FT_const|BOOST_FT_volatile
+# include __FILE__
+# define BOOST_PP_VALUE \
+ BOOST_FT_function|BOOST_FT_variadic|BOOST_FT_const|BOOST_FT_volatile
+# include __FILE__
+BOOST_PP_EXPAND(#) endif
+
+
+BOOST_PP_EXPAND(#) undef BOOST_FT_syntax
+BOOST_PP_EXPAND(#) define BOOST_FT_syntax BOOST_FT_type_function_pointer
+
+# define BOOST_PP_VALUE \
+ BOOST_FT_pointer|BOOST_FT_non_variadic
+# include __FILE__
+# define BOOST_PP_VALUE \
+ BOOST_FT_pointer|BOOST_FT_variadic
+# include __FILE__
+
+BOOST_PP_EXPAND(#) undef BOOST_FT_syntax
+BOOST_PP_EXPAND(#) define BOOST_FT_syntax BOOST_FT_type_function_reference
+
+# define BOOST_PP_VALUE \
+ BOOST_FT_reference|BOOST_FT_non_variadic
+# include __FILE__
+# define BOOST_PP_VALUE \
+ BOOST_FT_reference|BOOST_FT_variadic
+# include __FILE__
+
+BOOST_PP_EXPAND(#) undef BOOST_FT_syntax
+BOOST_PP_EXPAND(#) undef BOOST_FT_mfp
+
+BOOST_PP_EXPAND(#) define BOOST_FT_mfp 1
+BOOST_PP_EXPAND(#) define BOOST_FT_syntax BOOST_FT_type_member_function_pointer
+
+# define BOOST_PP_VALUE \
+ BOOST_FT_member_function_pointer|BOOST_FT_non_variadic
+# include __FILE__
+# define BOOST_PP_VALUE \
+ BOOST_FT_member_function_pointer|BOOST_FT_variadic
+# include __FILE__
+# define BOOST_PP_VALUE \
+ BOOST_FT_member_function_pointer|BOOST_FT_non_variadic|BOOST_FT_const
+# include __FILE__
+# define BOOST_PP_VALUE \
+ BOOST_FT_member_function_pointer|BOOST_FT_variadic|BOOST_FT_const
+# include __FILE__
+# define BOOST_PP_VALUE \
+ BOOST_FT_member_function_pointer|BOOST_FT_non_variadic|BOOST_FT_volatile
+# include __FILE__
+# define BOOST_PP_VALUE \
+ BOOST_FT_member_function_pointer|BOOST_FT_variadic|BOOST_FT_volatile
+# include __FILE__
+# define BOOST_PP_VALUE \
+ BOOST_FT_member_function_pointer|BOOST_FT_non_variadic|BOOST_FT_const|BOOST_FT_volatile
+# include __FILE__
+# define BOOST_PP_VALUE \
+ BOOST_FT_member_function_pointer|BOOST_FT_variadic|BOOST_FT_const|BOOST_FT_volatile
+# include __FILE__
+
+BOOST_PP_EXPAND(#) undef BOOST_FT_syntax
+BOOST_PP_EXPAND(#) undef BOOST_FT_mfp
+
+# include <boost/function_types/detail/encoding/undef.hpp>
+#else
+
+# include BOOST_PP_ASSIGN_SLOT(1)
+
+# define BOOST_PP_VALUE BOOST_PP_SLOT(1) & BOOST_FT_kind_mask
+# include BOOST_PP_ASSIGN_SLOT(2)
+
+BOOST_PP_EXPAND(#) if !!(BOOST_PP_SLOT(2) & (BOOST_FT_variations))
+BOOST_PP_EXPAND(#) if (BOOST_PP_SLOT(1) & (BOOST_FT_cond)) == (BOOST_FT_cond)
+
+# if ( BOOST_PP_SLOT(1) & (BOOST_FT_variadic) )
+BOOST_PP_EXPAND(#) define BOOST_FT_ell ...
+BOOST_PP_EXPAND(#) define BOOST_FT_nullary_param
+# else
+BOOST_PP_EXPAND(#) define BOOST_FT_ell
+BOOST_PP_EXPAND(#) define BOOST_FT_nullary_param BOOST_FT_NULLARY_PARAM
+# endif
+
+# if !( BOOST_PP_SLOT(1) & (BOOST_FT_volatile) )
+# if !( BOOST_PP_SLOT(1) & (BOOST_FT_const) )
+BOOST_PP_EXPAND(#) define BOOST_FT_cv
+# else
+BOOST_PP_EXPAND(#) define BOOST_FT_cv const
+# endif
+# else
+# if !( BOOST_PP_SLOT(1) & (BOOST_FT_const) )
+BOOST_PP_EXPAND(#) define BOOST_FT_cv volatile
+# else
+BOOST_PP_EXPAND(#) define BOOST_FT_cv const volatile
+# endif
+# endif
+BOOST_PP_EXPAND(#) define BOOST_FT_flags BOOST_PP_SLOT(1)
+BOOST_PP_EXPAND(#) include BOOST_FT_variate_file
+
+BOOST_PP_EXPAND(#) undef BOOST_FT_cv
+BOOST_PP_EXPAND(#) undef BOOST_FT_ell
+BOOST_PP_EXPAND(#) undef BOOST_FT_nullary_param
+BOOST_PP_EXPAND(#) undef BOOST_FT_flags
+BOOST_PP_EXPAND(#) endif
+BOOST_PP_EXPAND(#) endif
+#endif
+
diff --git a/include/boost/function_types/detail/pp_variate_loop/preprocessed.hpp b/include/boost/function_types/detail/pp_variate_loop/preprocessed.hpp
new file mode 100644
index 0000000..7e7c4f9
--- /dev/null
+++ b/include/boost/function_types/detail/pp_variate_loop/preprocessed.hpp
@@ -0,0 +1,283 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// this file has been generated from the master.hpp file in the same directory
+# define BOOST_FT_mfp 0
+# define BOOST_FT_syntax BOOST_FT_type_function
+# if ! ! (4 & (BOOST_FT_variations))
+# if (519 & (BOOST_FT_cond)) == (BOOST_FT_cond)
+# define BOOST_FT_ell
+# define BOOST_FT_nullary_param BOOST_FT_NULLARY_PARAM
+# define BOOST_FT_cv
+# define BOOST_FT_flags 519
+# include BOOST_FT_variate_file
+# undef BOOST_FT_cv
+# undef BOOST_FT_ell
+# undef BOOST_FT_nullary_param
+# undef BOOST_FT_flags
+# endif
+# endif
+# if ! ! (4 & (BOOST_FT_variations))
+# if (263 & (BOOST_FT_cond)) == (BOOST_FT_cond)
+# define BOOST_FT_ell ...
+# define BOOST_FT_nullary_param
+# define BOOST_FT_cv
+# define BOOST_FT_flags 263
+# include BOOST_FT_variate_file
+# undef BOOST_FT_cv
+# undef BOOST_FT_ell
+# undef BOOST_FT_nullary_param
+# undef BOOST_FT_flags
+# endif
+# endif
+# if !BOOST_FT_NO_CV_FUNC_SUPPORT
+# if ! ! (4 & (BOOST_FT_variations))
+# if (1543 & (BOOST_FT_cond)) == (BOOST_FT_cond)
+# define BOOST_FT_ell
+# define BOOST_FT_nullary_param BOOST_FT_NULLARY_PARAM
+# define BOOST_FT_cv const
+# define BOOST_FT_flags 1543
+# include BOOST_FT_variate_file
+# undef BOOST_FT_cv
+# undef BOOST_FT_ell
+# undef BOOST_FT_nullary_param
+# undef BOOST_FT_flags
+# endif
+# endif
+# if ! ! (4 & (BOOST_FT_variations))
+# if (1287 & (BOOST_FT_cond)) == (BOOST_FT_cond)
+# define BOOST_FT_ell ...
+# define BOOST_FT_nullary_param
+# define BOOST_FT_cv const
+# define BOOST_FT_flags 1287
+# include BOOST_FT_variate_file
+# undef BOOST_FT_cv
+# undef BOOST_FT_ell
+# undef BOOST_FT_nullary_param
+# undef BOOST_FT_flags
+# endif
+# endif
+# if ! ! (4 & (BOOST_FT_variations))
+# if (2567 & (BOOST_FT_cond)) == (BOOST_FT_cond)
+# define BOOST_FT_ell
+# define BOOST_FT_nullary_param BOOST_FT_NULLARY_PARAM
+# define BOOST_FT_cv volatile
+# define BOOST_FT_flags 2567
+# include BOOST_FT_variate_file
+# undef BOOST_FT_cv
+# undef BOOST_FT_ell
+# undef BOOST_FT_nullary_param
+# undef BOOST_FT_flags
+# endif
+# endif
+# if ! ! (4 & (BOOST_FT_variations))
+# if (2311 & (BOOST_FT_cond)) == (BOOST_FT_cond)
+# define BOOST_FT_ell ...
+# define BOOST_FT_nullary_param
+# define BOOST_FT_cv volatile
+# define BOOST_FT_flags 2311
+# include BOOST_FT_variate_file
+# undef BOOST_FT_cv
+# undef BOOST_FT_ell
+# undef BOOST_FT_nullary_param
+# undef BOOST_FT_flags
+# endif
+# endif
+# if ! ! (4 & (BOOST_FT_variations))
+# if (3591 & (BOOST_FT_cond)) == (BOOST_FT_cond)
+# define BOOST_FT_ell
+# define BOOST_FT_nullary_param BOOST_FT_NULLARY_PARAM
+# define BOOST_FT_cv const volatile
+# define BOOST_FT_flags 3591
+# include BOOST_FT_variate_file
+# undef BOOST_FT_cv
+# undef BOOST_FT_ell
+# undef BOOST_FT_nullary_param
+# undef BOOST_FT_flags
+# endif
+# endif
+# if ! ! (4 & (BOOST_FT_variations))
+# if (3335 & (BOOST_FT_cond)) == (BOOST_FT_cond)
+# define BOOST_FT_ell ...
+# define BOOST_FT_nullary_param
+# define BOOST_FT_cv const volatile
+# define BOOST_FT_flags 3335
+# include BOOST_FT_variate_file
+# undef BOOST_FT_cv
+# undef BOOST_FT_ell
+# undef BOOST_FT_nullary_param
+# undef BOOST_FT_flags
+# endif
+# endif
+# endif
+# undef BOOST_FT_syntax
+# define BOOST_FT_syntax BOOST_FT_type_function_pointer
+# if ! ! (8 & (BOOST_FT_variations))
+# if (523 & (BOOST_FT_cond)) == (BOOST_FT_cond)
+# define BOOST_FT_ell
+# define BOOST_FT_nullary_param BOOST_FT_NULLARY_PARAM
+# define BOOST_FT_cv
+# define BOOST_FT_flags 523
+# include BOOST_FT_variate_file
+# undef BOOST_FT_cv
+# undef BOOST_FT_ell
+# undef BOOST_FT_nullary_param
+# undef BOOST_FT_flags
+# endif
+# endif
+# if ! ! (8 & (BOOST_FT_variations))
+# if (267 & (BOOST_FT_cond)) == (BOOST_FT_cond)
+# define BOOST_FT_ell ...
+# define BOOST_FT_nullary_param
+# define BOOST_FT_cv
+# define BOOST_FT_flags 267
+# include BOOST_FT_variate_file
+# undef BOOST_FT_cv
+# undef BOOST_FT_ell
+# undef BOOST_FT_nullary_param
+# undef BOOST_FT_flags
+# endif
+# endif
+# undef BOOST_FT_syntax
+# define BOOST_FT_syntax BOOST_FT_type_function_reference
+# if ! ! (16 & (BOOST_FT_variations))
+# if (531 & (BOOST_FT_cond)) == (BOOST_FT_cond)
+# define BOOST_FT_ell
+# define BOOST_FT_nullary_param BOOST_FT_NULLARY_PARAM
+# define BOOST_FT_cv
+# define BOOST_FT_flags 531
+# include BOOST_FT_variate_file
+# undef BOOST_FT_cv
+# undef BOOST_FT_ell
+# undef BOOST_FT_nullary_param
+# undef BOOST_FT_flags
+# endif
+# endif
+# if ! ! (16 & (BOOST_FT_variations))
+# if (275 & (BOOST_FT_cond)) == (BOOST_FT_cond)
+# define BOOST_FT_ell ...
+# define BOOST_FT_nullary_param
+# define BOOST_FT_cv
+# define BOOST_FT_flags 275
+# include BOOST_FT_variate_file
+# undef BOOST_FT_cv
+# undef BOOST_FT_ell
+# undef BOOST_FT_nullary_param
+# undef BOOST_FT_flags
+# endif
+# endif
+# undef BOOST_FT_syntax
+# undef BOOST_FT_mfp
+# define BOOST_FT_mfp 1
+# define BOOST_FT_syntax BOOST_FT_type_member_function_pointer
+# if ! ! (96 & (BOOST_FT_variations))
+# if (609 & (BOOST_FT_cond)) == (BOOST_FT_cond)
+# define BOOST_FT_ell
+# define BOOST_FT_nullary_param BOOST_FT_NULLARY_PARAM
+# define BOOST_FT_cv
+# define BOOST_FT_flags 609
+# include BOOST_FT_variate_file
+# undef BOOST_FT_cv
+# undef BOOST_FT_ell
+# undef BOOST_FT_nullary_param
+# undef BOOST_FT_flags
+# endif
+# endif
+# if ! ! (96 & (BOOST_FT_variations))
+# if (353 & (BOOST_FT_cond)) == (BOOST_FT_cond)
+# define BOOST_FT_ell ...
+# define BOOST_FT_nullary_param
+# define BOOST_FT_cv
+# define BOOST_FT_flags 353
+# include BOOST_FT_variate_file
+# undef BOOST_FT_cv
+# undef BOOST_FT_ell
+# undef BOOST_FT_nullary_param
+# undef BOOST_FT_flags
+# endif
+# endif
+# if ! ! (96 & (BOOST_FT_variations))
+# if (1633 & (BOOST_FT_cond)) == (BOOST_FT_cond)
+# define BOOST_FT_ell
+# define BOOST_FT_nullary_param BOOST_FT_NULLARY_PARAM
+# define BOOST_FT_cv const
+# define BOOST_FT_flags 1633
+# include BOOST_FT_variate_file
+# undef BOOST_FT_cv
+# undef BOOST_FT_ell
+# undef BOOST_FT_nullary_param
+# undef BOOST_FT_flags
+# endif
+# endif
+# if ! ! (96 & (BOOST_FT_variations))
+# if (1377 & (BOOST_FT_cond)) == (BOOST_FT_cond)
+# define BOOST_FT_ell ...
+# define BOOST_FT_nullary_param
+# define BOOST_FT_cv const
+# define BOOST_FT_flags 1377
+# include BOOST_FT_variate_file
+# undef BOOST_FT_cv
+# undef BOOST_FT_ell
+# undef BOOST_FT_nullary_param
+# undef BOOST_FT_flags
+# endif
+# endif
+# if ! ! (96 & (BOOST_FT_variations))
+# if (2657 & (BOOST_FT_cond)) == (BOOST_FT_cond)
+# define BOOST_FT_ell
+# define BOOST_FT_nullary_param BOOST_FT_NULLARY_PARAM
+# define BOOST_FT_cv volatile
+# define BOOST_FT_flags 2657
+# include BOOST_FT_variate_file
+# undef BOOST_FT_cv
+# undef BOOST_FT_ell
+# undef BOOST_FT_nullary_param
+# undef BOOST_FT_flags
+# endif
+# endif
+# if ! ! (96 & (BOOST_FT_variations))
+# if (2401 & (BOOST_FT_cond)) == (BOOST_FT_cond)
+# define BOOST_FT_ell ...
+# define BOOST_FT_nullary_param
+# define BOOST_FT_cv volatile
+# define BOOST_FT_flags 2401
+# include BOOST_FT_variate_file
+# undef BOOST_FT_cv
+# undef BOOST_FT_ell
+# undef BOOST_FT_nullary_param
+# undef BOOST_FT_flags
+# endif
+# endif
+# if ! ! (96 & (BOOST_FT_variations))
+# if (3681 & (BOOST_FT_cond)) == (BOOST_FT_cond)
+# define BOOST_FT_ell
+# define BOOST_FT_nullary_param BOOST_FT_NULLARY_PARAM
+# define BOOST_FT_cv const volatile
+# define BOOST_FT_flags 3681
+# include BOOST_FT_variate_file
+# undef BOOST_FT_cv
+# undef BOOST_FT_ell
+# undef BOOST_FT_nullary_param
+# undef BOOST_FT_flags
+# endif
+# endif
+# if ! ! (96 & (BOOST_FT_variations))
+# if (3425 & (BOOST_FT_cond)) == (BOOST_FT_cond)
+# define BOOST_FT_ell ...
+# define BOOST_FT_nullary_param
+# define BOOST_FT_cv const volatile
+# define BOOST_FT_flags 3425
+# include BOOST_FT_variate_file
+# undef BOOST_FT_cv
+# undef BOOST_FT_ell
+# undef BOOST_FT_nullary_param
+# undef BOOST_FT_flags
+# endif
+# endif
+# undef BOOST_FT_syntax
+# undef BOOST_FT_mfp
diff --git a/include/boost/function_types/detail/retag_default_cc.hpp b/include/boost/function_types/detail/retag_default_cc.hpp
new file mode 100644
index 0000000..c8926f6
--- /dev/null
+++ b/include/boost/function_types/detail/retag_default_cc.hpp
@@ -0,0 +1,23 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_DETAIL_RETAG_DEFAULT_CC_HPP_INCLUDED
+#define BOOST_FT_DETAIL_RETAG_DEFAULT_CC_HPP_INCLUDED
+
+#include <boost/mpl/bitand.hpp>
+
+#include <boost/function_types/components.hpp>
+
+#if defined(BOOST_FT_PREPROCESSING_MODE)
+# include <boost/function_types/detail/pp_retag_default_cc/master.hpp>
+#else
+# include <boost/function_types/detail/pp_retag_default_cc/preprocessed.hpp>
+#endif
+
+#endif
+
diff --git a/include/boost/function_types/detail/synthesize.hpp b/include/boost/function_types/detail/synthesize.hpp
new file mode 100644
index 0000000..0b15cbb
--- /dev/null
+++ b/include/boost/function_types/detail/synthesize.hpp
@@ -0,0 +1,79 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_DETAIL_SYNTHESIZE_HPP_INCLUDED
+#define BOOST_FT_DETAIL_SYNTHESIZE_HPP_INCLUDED
+
+#include <cstddef>
+
+#include <boost/mpl/at.hpp>
+#include <boost/mpl/size.hpp>
+
+#include <boost/function_types/config/config.hpp>
+#include <boost/function_types/property_tags.hpp>
+#include <boost/function_types/detail/cv_traits.hpp>
+#include <boost/function_types/detail/retag_default_cc.hpp>
+
+namespace boost { namespace function_types { namespace detail {
+
+template<bits_t Flags, bits_t CCID, std::size_t Size>
+struct synthesize_impl_o
+{
+ template<typename Seq> struct synthesize_impl_i { };
+};
+
+template<typename Seq, bits_t Bits>
+struct synthesize_impl
+ : detail::synthesize_impl_o
+ < ::boost::function_types::detail::decode_bits<Bits>::flags
+ , ::boost::function_types::detail::decode_bits<Bits>::cc_id
+ , ::boost::mpl::size<Seq>::value
+ >
+ ::template synthesize_impl_i<Seq>
+{ };
+
+template<typename Seq, typename Tag>
+struct synthesize_func
+ : detail::synthesize_impl
+ < Seq
+ , ::boost::function_types::detail::bits
+ < detail::retag_default_cc
+ < function_types::tag<nv_dcc_func, Tag> >
+ >::value
+ >
+{ };
+
+template<typename Seq, typename Tag>
+struct synthesize_mfp
+ : detail::synthesize_impl
+ < Seq
+ , ::boost::function_types::detail::bits
+ < detail::retag_default_cc
+ < function_types::tag
+ < typename detail::cv_traits< typename mpl::at_c<Seq,1>::type >::tag
+ , nv_dcc_mfp, Tag
+ > >
+ >::value
+ >
+{ };
+
+template<typename S, typename R = typename mpl::at_c<S,0>::type,
+ typename C = typename mpl::at_c<S,1>::type>
+struct synthesize_mop
+{
+ typedef R C::* type;
+};
+
+#define BOOST_FT_variations BOOST_FT_function|BOOST_FT_member_pointer
+#define BOOST_FT_al_path boost/function_types/detail/synthesize_impl
+#include <boost/function_types/detail/pp_loop.hpp>
+
+} } } // namespace ::boost::function_types::detail
+
+#endif
+
diff --git a/include/boost/function_types/detail/synthesize_impl/arity10_0.hpp b/include/boost/function_types/detail/synthesize_impl/arity10_0.hpp
new file mode 100644
index 0000000..ad22e50
--- /dev/null
+++ b/include/boost/function_types/detail/synthesize_impl/arity10_0.hpp
@@ -0,0 +1,334 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+# define BOOST_FT_make_type(flags,cc,arity) BOOST_FT_make_type_impl(flags,cc,arity)
+# define BOOST_FT_make_type_impl(flags,cc,arity) make_type_ ## flags ## _ ## cc ## _ ## arity
+template< typename R >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,0)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (BOOST_FT_nullary_param BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 1 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,0)
+< typename mpl::deref< iter_0 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,1)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 2 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,1)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,2)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 3 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,2)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,3)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 4 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,3)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,4)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 5 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,4)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,5)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 6 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,5)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,6)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 7 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,6)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,7)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 8 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,7)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,8)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 9 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,8)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,9)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 10 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,9)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,10)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 11 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,10)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+> ::type type;
+};
+};
+# undef BOOST_FT_make_type
+# undef BOOST_FT_make_type_impl
+
diff --git a/include/boost/function_types/detail/synthesize_impl/arity10_1.hpp b/include/boost/function_types/detail/synthesize_impl/arity10_1.hpp
new file mode 100644
index 0000000..bbd5963
--- /dev/null
+++ b/include/boost/function_types/detail/synthesize_impl/arity10_1.hpp
@@ -0,0 +1,326 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+# define BOOST_FT_make_type(flags,cc,arity) BOOST_FT_make_type_impl(flags,cc,arity)
+# define BOOST_FT_make_type_impl(flags,cc,arity) make_type_ ## flags ## _ ## cc ## _ ## arity
+template< typename R , typename T0 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,1)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) ( BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 2 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,1)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,2)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 3 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,2)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,3)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 4 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,3)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,4)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 5 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,4)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,5)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 6 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,5)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,6)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 7 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,6)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,7)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 8 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,7)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,8)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 9 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,8)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,9)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 10 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,9)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,10)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 11 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,10)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+> ::type type;
+};
+};
+# undef BOOST_FT_make_type
+# undef BOOST_FT_make_type_impl
+
diff --git a/include/boost/function_types/detail/synthesize_impl/arity20_0.hpp b/include/boost/function_types/detail/synthesize_impl/arity20_0.hpp
new file mode 100644
index 0000000..cb62e69
--- /dev/null
+++ b/include/boost/function_types/detail/synthesize_impl/arity20_0.hpp
@@ -0,0 +1,517 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+# include <boost/function_types/detail/synthesize_impl/arity10_0.hpp>
+# define BOOST_FT_make_type(flags,cc,arity) BOOST_FT_make_type_impl(flags,cc,arity)
+# define BOOST_FT_make_type_impl(flags,cc,arity) make_type_ ## flags ## _ ## cc ## _ ## arity
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,11)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 12 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,11)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,12)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 13 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,12)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,13)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 14 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,13)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,14)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 15 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,14)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,15)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 16 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,15)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,16)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 17 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,16)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,17)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 18 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,17)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,18)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 19 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,18)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,19)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 20 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,19)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,20)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 21 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,20)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+> ::type type;
+};
+};
+# undef BOOST_FT_make_type
+# undef BOOST_FT_make_type_impl
+
diff --git a/include/boost/function_types/detail/synthesize_impl/arity20_1.hpp b/include/boost/function_types/detail/synthesize_impl/arity20_1.hpp
new file mode 100644
index 0000000..1c5e1e7
--- /dev/null
+++ b/include/boost/function_types/detail/synthesize_impl/arity20_1.hpp
@@ -0,0 +1,527 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+# include <boost/function_types/detail/synthesize_impl/arity10_1.hpp>
+# define BOOST_FT_make_type(flags,cc,arity) BOOST_FT_make_type_impl(flags,cc,arity)
+# define BOOST_FT_make_type_impl(flags,cc,arity) make_type_ ## flags ## _ ## cc ## _ ## arity
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,11)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 12 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,11)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,12)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 13 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,12)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,13)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 14 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,13)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,14)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 15 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,14)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,15)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 16 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,15)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,16)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 17 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,16)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,17)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 18 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,17)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,18)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 19 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,18)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,19)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 20 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,19)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,20)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 21 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,20)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+> ::type type;
+};
+};
+# undef BOOST_FT_make_type
+# undef BOOST_FT_make_type_impl
+
diff --git a/include/boost/function_types/detail/synthesize_impl/arity30_0.hpp b/include/boost/function_types/detail/synthesize_impl/arity30_0.hpp
new file mode 100644
index 0000000..63a64f0
--- /dev/null
+++ b/include/boost/function_types/detail/synthesize_impl/arity30_0.hpp
@@ -0,0 +1,717 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+# include <boost/function_types/detail/synthesize_impl/arity20_0.hpp>
+# define BOOST_FT_make_type(flags,cc,arity) BOOST_FT_make_type_impl(flags,cc,arity)
+# define BOOST_FT_make_type_impl(flags,cc,arity) make_type_ ## flags ## _ ## cc ## _ ## arity
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,21)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 22 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,21)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,22)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 23 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,22)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,23)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 24 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,23)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,24)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 25 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,24)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,25)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 26 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,25)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,26)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 27 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,26)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,27)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 28 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,27)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,28)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 29 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,28)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,29)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 30 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,29)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,30)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 31 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,30)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+> ::type type;
+};
+};
+# undef BOOST_FT_make_type
+# undef BOOST_FT_make_type_impl
+
diff --git a/include/boost/function_types/detail/synthesize_impl/arity30_1.hpp b/include/boost/function_types/detail/synthesize_impl/arity30_1.hpp
new file mode 100644
index 0000000..6cba73e
--- /dev/null
+++ b/include/boost/function_types/detail/synthesize_impl/arity30_1.hpp
@@ -0,0 +1,727 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+# include <boost/function_types/detail/synthesize_impl/arity20_1.hpp>
+# define BOOST_FT_make_type(flags,cc,arity) BOOST_FT_make_type_impl(flags,cc,arity)
+# define BOOST_FT_make_type_impl(flags,cc,arity) make_type_ ## flags ## _ ## cc ## _ ## arity
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,21)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 22 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,21)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,22)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 23 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,22)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,23)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 24 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,23)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,24)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 25 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,24)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,25)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 26 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,25)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,26)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 27 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,26)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,27)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 28 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,27)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,28)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 29 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,28)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,29)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 30 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,29)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,30)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 31 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,30)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+> ::type type;
+};
+};
+# undef BOOST_FT_make_type
+# undef BOOST_FT_make_type_impl
+
diff --git a/include/boost/function_types/detail/synthesize_impl/arity40_0.hpp b/include/boost/function_types/detail/synthesize_impl/arity40_0.hpp
new file mode 100644
index 0000000..b065757
--- /dev/null
+++ b/include/boost/function_types/detail/synthesize_impl/arity40_0.hpp
@@ -0,0 +1,917 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+# include <boost/function_types/detail/synthesize_impl/arity30_0.hpp>
+# define BOOST_FT_make_type(flags,cc,arity) BOOST_FT_make_type_impl(flags,cc,arity)
+# define BOOST_FT_make_type_impl(flags,cc,arity) make_type_ ## flags ## _ ## cc ## _ ## arity
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,31)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 32 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,31)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,32)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 33 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,32)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,33)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 34 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,33)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,34)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 35 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,34)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,35)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 36 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,35)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,36)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 37 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,36)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,37)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 38 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,37)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,38)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 39 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+typedef typename mpl::next< iter_37 > ::type iter_38;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,38)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+, typename mpl::deref< iter_38 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,39)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 40 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+typedef typename mpl::next< iter_37 > ::type iter_38;
+typedef typename mpl::next< iter_38 > ::type iter_39;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,39)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+, typename mpl::deref< iter_38 > ::type
+, typename mpl::deref< iter_39 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,40)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 41 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+typedef typename mpl::next< iter_37 > ::type iter_38;
+typedef typename mpl::next< iter_38 > ::type iter_39;
+typedef typename mpl::next< iter_39 > ::type iter_40;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,40)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+, typename mpl::deref< iter_38 > ::type
+, typename mpl::deref< iter_39 > ::type
+, typename mpl::deref< iter_40 > ::type
+> ::type type;
+};
+};
+# undef BOOST_FT_make_type
+# undef BOOST_FT_make_type_impl
+
diff --git a/include/boost/function_types/detail/synthesize_impl/arity40_1.hpp b/include/boost/function_types/detail/synthesize_impl/arity40_1.hpp
new file mode 100644
index 0000000..c9f2194
--- /dev/null
+++ b/include/boost/function_types/detail/synthesize_impl/arity40_1.hpp
@@ -0,0 +1,927 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+# include <boost/function_types/detail/synthesize_impl/arity30_1.hpp>
+# define BOOST_FT_make_type(flags,cc,arity) BOOST_FT_make_type_impl(flags,cc,arity)
+# define BOOST_FT_make_type_impl(flags,cc,arity) make_type_ ## flags ## _ ## cc ## _ ## arity
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,31)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 32 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,31)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,32)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 33 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,32)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,33)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 34 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,33)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,34)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 35 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,34)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,35)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 36 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,35)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,36)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 37 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,36)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,37)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 38 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,37)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,38)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 39 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+typedef typename mpl::next< iter_37 > ::type iter_38;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,38)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+, typename mpl::deref< iter_38 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,39)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 40 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+typedef typename mpl::next< iter_37 > ::type iter_38;
+typedef typename mpl::next< iter_38 > ::type iter_39;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,39)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+, typename mpl::deref< iter_38 > ::type
+, typename mpl::deref< iter_39 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,40)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 41 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+typedef typename mpl::next< iter_37 > ::type iter_38;
+typedef typename mpl::next< iter_38 > ::type iter_39;
+typedef typename mpl::next< iter_39 > ::type iter_40;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,40)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+, typename mpl::deref< iter_38 > ::type
+, typename mpl::deref< iter_39 > ::type
+, typename mpl::deref< iter_40 > ::type
+> ::type type;
+};
+};
+# undef BOOST_FT_make_type
+# undef BOOST_FT_make_type_impl
+
diff --git a/include/boost/function_types/detail/synthesize_impl/arity50_0.hpp b/include/boost/function_types/detail/synthesize_impl/arity50_0.hpp
new file mode 100644
index 0000000..b1ad7b1
--- /dev/null
+++ b/include/boost/function_types/detail/synthesize_impl/arity50_0.hpp
@@ -0,0 +1,1117 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+# include <boost/function_types/detail/synthesize_impl/arity40_0.hpp>
+# define BOOST_FT_make_type(flags,cc,arity) BOOST_FT_make_type_impl(flags,cc,arity)
+# define BOOST_FT_make_type_impl(flags,cc,arity) make_type_ ## flags ## _ ## cc ## _ ## arity
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,41)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 42 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+typedef typename mpl::next< iter_37 > ::type iter_38;
+typedef typename mpl::next< iter_38 > ::type iter_39;
+typedef typename mpl::next< iter_39 > ::type iter_40;
+typedef typename mpl::next< iter_40 > ::type iter_41;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,41)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+, typename mpl::deref< iter_38 > ::type
+, typename mpl::deref< iter_39 > ::type
+, typename mpl::deref< iter_40 > ::type
+, typename mpl::deref< iter_41 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,42)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 43 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+typedef typename mpl::next< iter_37 > ::type iter_38;
+typedef typename mpl::next< iter_38 > ::type iter_39;
+typedef typename mpl::next< iter_39 > ::type iter_40;
+typedef typename mpl::next< iter_40 > ::type iter_41;
+typedef typename mpl::next< iter_41 > ::type iter_42;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,42)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+, typename mpl::deref< iter_38 > ::type
+, typename mpl::deref< iter_39 > ::type
+, typename mpl::deref< iter_40 > ::type
+, typename mpl::deref< iter_41 > ::type
+, typename mpl::deref< iter_42 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,43)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 44 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+typedef typename mpl::next< iter_37 > ::type iter_38;
+typedef typename mpl::next< iter_38 > ::type iter_39;
+typedef typename mpl::next< iter_39 > ::type iter_40;
+typedef typename mpl::next< iter_40 > ::type iter_41;
+typedef typename mpl::next< iter_41 > ::type iter_42;
+typedef typename mpl::next< iter_42 > ::type iter_43;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,43)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+, typename mpl::deref< iter_38 > ::type
+, typename mpl::deref< iter_39 > ::type
+, typename mpl::deref< iter_40 > ::type
+, typename mpl::deref< iter_41 > ::type
+, typename mpl::deref< iter_42 > ::type
+, typename mpl::deref< iter_43 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,44)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 45 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+typedef typename mpl::next< iter_37 > ::type iter_38;
+typedef typename mpl::next< iter_38 > ::type iter_39;
+typedef typename mpl::next< iter_39 > ::type iter_40;
+typedef typename mpl::next< iter_40 > ::type iter_41;
+typedef typename mpl::next< iter_41 > ::type iter_42;
+typedef typename mpl::next< iter_42 > ::type iter_43;
+typedef typename mpl::next< iter_43 > ::type iter_44;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,44)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+, typename mpl::deref< iter_38 > ::type
+, typename mpl::deref< iter_39 > ::type
+, typename mpl::deref< iter_40 > ::type
+, typename mpl::deref< iter_41 > ::type
+, typename mpl::deref< iter_42 > ::type
+, typename mpl::deref< iter_43 > ::type
+, typename mpl::deref< iter_44 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,45)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 46 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+typedef typename mpl::next< iter_37 > ::type iter_38;
+typedef typename mpl::next< iter_38 > ::type iter_39;
+typedef typename mpl::next< iter_39 > ::type iter_40;
+typedef typename mpl::next< iter_40 > ::type iter_41;
+typedef typename mpl::next< iter_41 > ::type iter_42;
+typedef typename mpl::next< iter_42 > ::type iter_43;
+typedef typename mpl::next< iter_43 > ::type iter_44;
+typedef typename mpl::next< iter_44 > ::type iter_45;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,45)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+, typename mpl::deref< iter_38 > ::type
+, typename mpl::deref< iter_39 > ::type
+, typename mpl::deref< iter_40 > ::type
+, typename mpl::deref< iter_41 > ::type
+, typename mpl::deref< iter_42 > ::type
+, typename mpl::deref< iter_43 > ::type
+, typename mpl::deref< iter_44 > ::type
+, typename mpl::deref< iter_45 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,46)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 47 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+typedef typename mpl::next< iter_37 > ::type iter_38;
+typedef typename mpl::next< iter_38 > ::type iter_39;
+typedef typename mpl::next< iter_39 > ::type iter_40;
+typedef typename mpl::next< iter_40 > ::type iter_41;
+typedef typename mpl::next< iter_41 > ::type iter_42;
+typedef typename mpl::next< iter_42 > ::type iter_43;
+typedef typename mpl::next< iter_43 > ::type iter_44;
+typedef typename mpl::next< iter_44 > ::type iter_45;
+typedef typename mpl::next< iter_45 > ::type iter_46;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,46)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+, typename mpl::deref< iter_38 > ::type
+, typename mpl::deref< iter_39 > ::type
+, typename mpl::deref< iter_40 > ::type
+, typename mpl::deref< iter_41 > ::type
+, typename mpl::deref< iter_42 > ::type
+, typename mpl::deref< iter_43 > ::type
+, typename mpl::deref< iter_44 > ::type
+, typename mpl::deref< iter_45 > ::type
+, typename mpl::deref< iter_46 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 , typename T46 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,47)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 48 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+typedef typename mpl::next< iter_37 > ::type iter_38;
+typedef typename mpl::next< iter_38 > ::type iter_39;
+typedef typename mpl::next< iter_39 > ::type iter_40;
+typedef typename mpl::next< iter_40 > ::type iter_41;
+typedef typename mpl::next< iter_41 > ::type iter_42;
+typedef typename mpl::next< iter_42 > ::type iter_43;
+typedef typename mpl::next< iter_43 > ::type iter_44;
+typedef typename mpl::next< iter_44 > ::type iter_45;
+typedef typename mpl::next< iter_45 > ::type iter_46;
+typedef typename mpl::next< iter_46 > ::type iter_47;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,47)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+, typename mpl::deref< iter_38 > ::type
+, typename mpl::deref< iter_39 > ::type
+, typename mpl::deref< iter_40 > ::type
+, typename mpl::deref< iter_41 > ::type
+, typename mpl::deref< iter_42 > ::type
+, typename mpl::deref< iter_43 > ::type
+, typename mpl::deref< iter_44 > ::type
+, typename mpl::deref< iter_45 > ::type
+, typename mpl::deref< iter_46 > ::type
+, typename mpl::deref< iter_47 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 , typename T46 , typename T47 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,48)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 49 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+typedef typename mpl::next< iter_37 > ::type iter_38;
+typedef typename mpl::next< iter_38 > ::type iter_39;
+typedef typename mpl::next< iter_39 > ::type iter_40;
+typedef typename mpl::next< iter_40 > ::type iter_41;
+typedef typename mpl::next< iter_41 > ::type iter_42;
+typedef typename mpl::next< iter_42 > ::type iter_43;
+typedef typename mpl::next< iter_43 > ::type iter_44;
+typedef typename mpl::next< iter_44 > ::type iter_45;
+typedef typename mpl::next< iter_45 > ::type iter_46;
+typedef typename mpl::next< iter_46 > ::type iter_47;
+typedef typename mpl::next< iter_47 > ::type iter_48;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,48)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+, typename mpl::deref< iter_38 > ::type
+, typename mpl::deref< iter_39 > ::type
+, typename mpl::deref< iter_40 > ::type
+, typename mpl::deref< iter_41 > ::type
+, typename mpl::deref< iter_42 > ::type
+, typename mpl::deref< iter_43 > ::type
+, typename mpl::deref< iter_44 > ::type
+, typename mpl::deref< iter_45 > ::type
+, typename mpl::deref< iter_46 > ::type
+, typename mpl::deref< iter_47 > ::type
+, typename mpl::deref< iter_48 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 , typename T46 , typename T47 , typename T48 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,49)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 , T48 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 50 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+typedef typename mpl::next< iter_37 > ::type iter_38;
+typedef typename mpl::next< iter_38 > ::type iter_39;
+typedef typename mpl::next< iter_39 > ::type iter_40;
+typedef typename mpl::next< iter_40 > ::type iter_41;
+typedef typename mpl::next< iter_41 > ::type iter_42;
+typedef typename mpl::next< iter_42 > ::type iter_43;
+typedef typename mpl::next< iter_43 > ::type iter_44;
+typedef typename mpl::next< iter_44 > ::type iter_45;
+typedef typename mpl::next< iter_45 > ::type iter_46;
+typedef typename mpl::next< iter_46 > ::type iter_47;
+typedef typename mpl::next< iter_47 > ::type iter_48;
+typedef typename mpl::next< iter_48 > ::type iter_49;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,49)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+, typename mpl::deref< iter_38 > ::type
+, typename mpl::deref< iter_39 > ::type
+, typename mpl::deref< iter_40 > ::type
+, typename mpl::deref< iter_41 > ::type
+, typename mpl::deref< iter_42 > ::type
+, typename mpl::deref< iter_43 > ::type
+, typename mpl::deref< iter_44 > ::type
+, typename mpl::deref< iter_45 > ::type
+, typename mpl::deref< iter_46 > ::type
+, typename mpl::deref< iter_47 > ::type
+, typename mpl::deref< iter_48 > ::type
+, typename mpl::deref< iter_49 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 , typename T46 , typename T47 , typename T48 , typename T49 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,50)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 , T48 , T49 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 51 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+typedef typename mpl::next< iter_37 > ::type iter_38;
+typedef typename mpl::next< iter_38 > ::type iter_39;
+typedef typename mpl::next< iter_39 > ::type iter_40;
+typedef typename mpl::next< iter_40 > ::type iter_41;
+typedef typename mpl::next< iter_41 > ::type iter_42;
+typedef typename mpl::next< iter_42 > ::type iter_43;
+typedef typename mpl::next< iter_43 > ::type iter_44;
+typedef typename mpl::next< iter_44 > ::type iter_45;
+typedef typename mpl::next< iter_45 > ::type iter_46;
+typedef typename mpl::next< iter_46 > ::type iter_47;
+typedef typename mpl::next< iter_47 > ::type iter_48;
+typedef typename mpl::next< iter_48 > ::type iter_49;
+typedef typename mpl::next< iter_49 > ::type iter_50;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,50)
+< typename mpl::deref< iter_0 > ::type
+, typename mpl::deref< iter_1 > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+, typename mpl::deref< iter_38 > ::type
+, typename mpl::deref< iter_39 > ::type
+, typename mpl::deref< iter_40 > ::type
+, typename mpl::deref< iter_41 > ::type
+, typename mpl::deref< iter_42 > ::type
+, typename mpl::deref< iter_43 > ::type
+, typename mpl::deref< iter_44 > ::type
+, typename mpl::deref< iter_45 > ::type
+, typename mpl::deref< iter_46 > ::type
+, typename mpl::deref< iter_47 > ::type
+, typename mpl::deref< iter_48 > ::type
+, typename mpl::deref< iter_49 > ::type
+, typename mpl::deref< iter_50 > ::type
+> ::type type;
+};
+};
+# undef BOOST_FT_make_type
+# undef BOOST_FT_make_type_impl
+
diff --git a/include/boost/function_types/detail/synthesize_impl/arity50_1.hpp b/include/boost/function_types/detail/synthesize_impl/arity50_1.hpp
new file mode 100644
index 0000000..2915c41
--- /dev/null
+++ b/include/boost/function_types/detail/synthesize_impl/arity50_1.hpp
@@ -0,0 +1,1127 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+// input: BOOST_FT_syntax type macro to use
+// input: BOOST_FT_cc empty or cc specifier
+// input: BOOST_FT_ell empty or "..."
+// input: BOOST_FT_cv empty or cv qualifiers
+// input: BOOST_FT_flags single decimal integer encoding the flags
+// output: BOOST_FT_n number of component types (arity+1)
+// output: BOOST_FT_arity current arity
+// output: BOOST_FT_type macro that expands to the type
+// output: BOOST_FT_tplargs(p) template arguments with given prefix
+// output: BOOST_FT_params(p) parameters with given prefix
+
+# include <boost/function_types/detail/synthesize_impl/arity40_1.hpp>
+# define BOOST_FT_make_type(flags,cc,arity) BOOST_FT_make_type_impl(flags,cc,arity)
+# define BOOST_FT_make_type_impl(flags,cc,arity) make_type_ ## flags ## _ ## cc ## _ ## arity
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,41)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 42 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+typedef typename mpl::next< iter_37 > ::type iter_38;
+typedef typename mpl::next< iter_38 > ::type iter_39;
+typedef typename mpl::next< iter_39 > ::type iter_40;
+typedef typename mpl::next< iter_40 > ::type iter_41;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,41)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+, typename mpl::deref< iter_38 > ::type
+, typename mpl::deref< iter_39 > ::type
+, typename mpl::deref< iter_40 > ::type
+, typename mpl::deref< iter_41 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,42)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 43 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+typedef typename mpl::next< iter_37 > ::type iter_38;
+typedef typename mpl::next< iter_38 > ::type iter_39;
+typedef typename mpl::next< iter_39 > ::type iter_40;
+typedef typename mpl::next< iter_40 > ::type iter_41;
+typedef typename mpl::next< iter_41 > ::type iter_42;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,42)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+, typename mpl::deref< iter_38 > ::type
+, typename mpl::deref< iter_39 > ::type
+, typename mpl::deref< iter_40 > ::type
+, typename mpl::deref< iter_41 > ::type
+, typename mpl::deref< iter_42 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,43)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 44 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+typedef typename mpl::next< iter_37 > ::type iter_38;
+typedef typename mpl::next< iter_38 > ::type iter_39;
+typedef typename mpl::next< iter_39 > ::type iter_40;
+typedef typename mpl::next< iter_40 > ::type iter_41;
+typedef typename mpl::next< iter_41 > ::type iter_42;
+typedef typename mpl::next< iter_42 > ::type iter_43;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,43)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+, typename mpl::deref< iter_38 > ::type
+, typename mpl::deref< iter_39 > ::type
+, typename mpl::deref< iter_40 > ::type
+, typename mpl::deref< iter_41 > ::type
+, typename mpl::deref< iter_42 > ::type
+, typename mpl::deref< iter_43 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,44)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 45 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+typedef typename mpl::next< iter_37 > ::type iter_38;
+typedef typename mpl::next< iter_38 > ::type iter_39;
+typedef typename mpl::next< iter_39 > ::type iter_40;
+typedef typename mpl::next< iter_40 > ::type iter_41;
+typedef typename mpl::next< iter_41 > ::type iter_42;
+typedef typename mpl::next< iter_42 > ::type iter_43;
+typedef typename mpl::next< iter_43 > ::type iter_44;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,44)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+, typename mpl::deref< iter_38 > ::type
+, typename mpl::deref< iter_39 > ::type
+, typename mpl::deref< iter_40 > ::type
+, typename mpl::deref< iter_41 > ::type
+, typename mpl::deref< iter_42 > ::type
+, typename mpl::deref< iter_43 > ::type
+, typename mpl::deref< iter_44 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,45)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 46 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+typedef typename mpl::next< iter_37 > ::type iter_38;
+typedef typename mpl::next< iter_38 > ::type iter_39;
+typedef typename mpl::next< iter_39 > ::type iter_40;
+typedef typename mpl::next< iter_40 > ::type iter_41;
+typedef typename mpl::next< iter_41 > ::type iter_42;
+typedef typename mpl::next< iter_42 > ::type iter_43;
+typedef typename mpl::next< iter_43 > ::type iter_44;
+typedef typename mpl::next< iter_44 > ::type iter_45;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,45)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+, typename mpl::deref< iter_38 > ::type
+, typename mpl::deref< iter_39 > ::type
+, typename mpl::deref< iter_40 > ::type
+, typename mpl::deref< iter_41 > ::type
+, typename mpl::deref< iter_42 > ::type
+, typename mpl::deref< iter_43 > ::type
+, typename mpl::deref< iter_44 > ::type
+, typename mpl::deref< iter_45 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,46)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 47 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+typedef typename mpl::next< iter_37 > ::type iter_38;
+typedef typename mpl::next< iter_38 > ::type iter_39;
+typedef typename mpl::next< iter_39 > ::type iter_40;
+typedef typename mpl::next< iter_40 > ::type iter_41;
+typedef typename mpl::next< iter_41 > ::type iter_42;
+typedef typename mpl::next< iter_42 > ::type iter_43;
+typedef typename mpl::next< iter_43 > ::type iter_44;
+typedef typename mpl::next< iter_44 > ::type iter_45;
+typedef typename mpl::next< iter_45 > ::type iter_46;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,46)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+, typename mpl::deref< iter_38 > ::type
+, typename mpl::deref< iter_39 > ::type
+, typename mpl::deref< iter_40 > ::type
+, typename mpl::deref< iter_41 > ::type
+, typename mpl::deref< iter_42 > ::type
+, typename mpl::deref< iter_43 > ::type
+, typename mpl::deref< iter_44 > ::type
+, typename mpl::deref< iter_45 > ::type
+, typename mpl::deref< iter_46 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 , typename T46 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,47)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 48 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+typedef typename mpl::next< iter_37 > ::type iter_38;
+typedef typename mpl::next< iter_38 > ::type iter_39;
+typedef typename mpl::next< iter_39 > ::type iter_40;
+typedef typename mpl::next< iter_40 > ::type iter_41;
+typedef typename mpl::next< iter_41 > ::type iter_42;
+typedef typename mpl::next< iter_42 > ::type iter_43;
+typedef typename mpl::next< iter_43 > ::type iter_44;
+typedef typename mpl::next< iter_44 > ::type iter_45;
+typedef typename mpl::next< iter_45 > ::type iter_46;
+typedef typename mpl::next< iter_46 > ::type iter_47;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,47)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+, typename mpl::deref< iter_38 > ::type
+, typename mpl::deref< iter_39 > ::type
+, typename mpl::deref< iter_40 > ::type
+, typename mpl::deref< iter_41 > ::type
+, typename mpl::deref< iter_42 > ::type
+, typename mpl::deref< iter_43 > ::type
+, typename mpl::deref< iter_44 > ::type
+, typename mpl::deref< iter_45 > ::type
+, typename mpl::deref< iter_46 > ::type
+, typename mpl::deref< iter_47 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 , typename T46 , typename T47 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,48)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 49 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+typedef typename mpl::next< iter_37 > ::type iter_38;
+typedef typename mpl::next< iter_38 > ::type iter_39;
+typedef typename mpl::next< iter_39 > ::type iter_40;
+typedef typename mpl::next< iter_40 > ::type iter_41;
+typedef typename mpl::next< iter_41 > ::type iter_42;
+typedef typename mpl::next< iter_42 > ::type iter_43;
+typedef typename mpl::next< iter_43 > ::type iter_44;
+typedef typename mpl::next< iter_44 > ::type iter_45;
+typedef typename mpl::next< iter_45 > ::type iter_46;
+typedef typename mpl::next< iter_46 > ::type iter_47;
+typedef typename mpl::next< iter_47 > ::type iter_48;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,48)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+, typename mpl::deref< iter_38 > ::type
+, typename mpl::deref< iter_39 > ::type
+, typename mpl::deref< iter_40 > ::type
+, typename mpl::deref< iter_41 > ::type
+, typename mpl::deref< iter_42 > ::type
+, typename mpl::deref< iter_43 > ::type
+, typename mpl::deref< iter_44 > ::type
+, typename mpl::deref< iter_45 > ::type
+, typename mpl::deref< iter_46 > ::type
+, typename mpl::deref< iter_47 > ::type
+, typename mpl::deref< iter_48 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 , typename T46 , typename T47 , typename T48 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,49)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 , T48 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 50 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+typedef typename mpl::next< iter_37 > ::type iter_38;
+typedef typename mpl::next< iter_38 > ::type iter_39;
+typedef typename mpl::next< iter_39 > ::type iter_40;
+typedef typename mpl::next< iter_40 > ::type iter_41;
+typedef typename mpl::next< iter_41 > ::type iter_42;
+typedef typename mpl::next< iter_42 > ::type iter_43;
+typedef typename mpl::next< iter_43 > ::type iter_44;
+typedef typename mpl::next< iter_44 > ::type iter_45;
+typedef typename mpl::next< iter_45 > ::type iter_46;
+typedef typename mpl::next< iter_46 > ::type iter_47;
+typedef typename mpl::next< iter_47 > ::type iter_48;
+typedef typename mpl::next< iter_48 > ::type iter_49;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,49)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+, typename mpl::deref< iter_38 > ::type
+, typename mpl::deref< iter_39 > ::type
+, typename mpl::deref< iter_40 > ::type
+, typename mpl::deref< iter_41 > ::type
+, typename mpl::deref< iter_42 > ::type
+, typename mpl::deref< iter_43 > ::type
+, typename mpl::deref< iter_44 > ::type
+, typename mpl::deref< iter_45 > ::type
+, typename mpl::deref< iter_46 > ::type
+, typename mpl::deref< iter_47 > ::type
+, typename mpl::deref< iter_48 > ::type
+, typename mpl::deref< iter_49 > ::type
+> ::type type;
+};
+};
+template< typename R , typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 , typename T46 , typename T47 , typename T48 , typename T49 >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,50)
+{
+typedef BOOST_FT_syntax(BOOST_FT_cc,type BOOST_PP_EMPTY) (T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 , T48 , T49 BOOST_FT_ell) BOOST_FT_cv ;
+};
+template< >
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, 51 >
+{
+template<typename S> struct synthesize_impl_i
+{
+private:
+typedef typename mpl::begin<S> ::type iter_0;
+typedef typename mpl::next< iter_0 > ::type iter_1;
+typedef typename mpl::next< iter_1 > ::type iter_2;
+typedef typename mpl::next< iter_2 > ::type iter_3;
+typedef typename mpl::next< iter_3 > ::type iter_4;
+typedef typename mpl::next< iter_4 > ::type iter_5;
+typedef typename mpl::next< iter_5 > ::type iter_6;
+typedef typename mpl::next< iter_6 > ::type iter_7;
+typedef typename mpl::next< iter_7 > ::type iter_8;
+typedef typename mpl::next< iter_8 > ::type iter_9;
+typedef typename mpl::next< iter_9 > ::type iter_10;
+typedef typename mpl::next< iter_10 > ::type iter_11;
+typedef typename mpl::next< iter_11 > ::type iter_12;
+typedef typename mpl::next< iter_12 > ::type iter_13;
+typedef typename mpl::next< iter_13 > ::type iter_14;
+typedef typename mpl::next< iter_14 > ::type iter_15;
+typedef typename mpl::next< iter_15 > ::type iter_16;
+typedef typename mpl::next< iter_16 > ::type iter_17;
+typedef typename mpl::next< iter_17 > ::type iter_18;
+typedef typename mpl::next< iter_18 > ::type iter_19;
+typedef typename mpl::next< iter_19 > ::type iter_20;
+typedef typename mpl::next< iter_20 > ::type iter_21;
+typedef typename mpl::next< iter_21 > ::type iter_22;
+typedef typename mpl::next< iter_22 > ::type iter_23;
+typedef typename mpl::next< iter_23 > ::type iter_24;
+typedef typename mpl::next< iter_24 > ::type iter_25;
+typedef typename mpl::next< iter_25 > ::type iter_26;
+typedef typename mpl::next< iter_26 > ::type iter_27;
+typedef typename mpl::next< iter_27 > ::type iter_28;
+typedef typename mpl::next< iter_28 > ::type iter_29;
+typedef typename mpl::next< iter_29 > ::type iter_30;
+typedef typename mpl::next< iter_30 > ::type iter_31;
+typedef typename mpl::next< iter_31 > ::type iter_32;
+typedef typename mpl::next< iter_32 > ::type iter_33;
+typedef typename mpl::next< iter_33 > ::type iter_34;
+typedef typename mpl::next< iter_34 > ::type iter_35;
+typedef typename mpl::next< iter_35 > ::type iter_36;
+typedef typename mpl::next< iter_36 > ::type iter_37;
+typedef typename mpl::next< iter_37 > ::type iter_38;
+typedef typename mpl::next< iter_38 > ::type iter_39;
+typedef typename mpl::next< iter_39 > ::type iter_40;
+typedef typename mpl::next< iter_40 > ::type iter_41;
+typedef typename mpl::next< iter_41 > ::type iter_42;
+typedef typename mpl::next< iter_42 > ::type iter_43;
+typedef typename mpl::next< iter_43 > ::type iter_44;
+typedef typename mpl::next< iter_44 > ::type iter_45;
+typedef typename mpl::next< iter_45 > ::type iter_46;
+typedef typename mpl::next< iter_46 > ::type iter_47;
+typedef typename mpl::next< iter_47 > ::type iter_48;
+typedef typename mpl::next< iter_48 > ::type iter_49;
+typedef typename mpl::next< iter_49 > ::type iter_50;
+public:
+typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,50)
+< typename mpl::deref< iter_0 > ::type
+, typename detail::cv_traits<
+typename mpl::deref< iter_1 > ::type > ::type
+, typename mpl::deref< iter_2 > ::type
+, typename mpl::deref< iter_3 > ::type
+, typename mpl::deref< iter_4 > ::type
+, typename mpl::deref< iter_5 > ::type
+, typename mpl::deref< iter_6 > ::type
+, typename mpl::deref< iter_7 > ::type
+, typename mpl::deref< iter_8 > ::type
+, typename mpl::deref< iter_9 > ::type
+, typename mpl::deref< iter_10 > ::type
+, typename mpl::deref< iter_11 > ::type
+, typename mpl::deref< iter_12 > ::type
+, typename mpl::deref< iter_13 > ::type
+, typename mpl::deref< iter_14 > ::type
+, typename mpl::deref< iter_15 > ::type
+, typename mpl::deref< iter_16 > ::type
+, typename mpl::deref< iter_17 > ::type
+, typename mpl::deref< iter_18 > ::type
+, typename mpl::deref< iter_19 > ::type
+, typename mpl::deref< iter_20 > ::type
+, typename mpl::deref< iter_21 > ::type
+, typename mpl::deref< iter_22 > ::type
+, typename mpl::deref< iter_23 > ::type
+, typename mpl::deref< iter_24 > ::type
+, typename mpl::deref< iter_25 > ::type
+, typename mpl::deref< iter_26 > ::type
+, typename mpl::deref< iter_27 > ::type
+, typename mpl::deref< iter_28 > ::type
+, typename mpl::deref< iter_29 > ::type
+, typename mpl::deref< iter_30 > ::type
+, typename mpl::deref< iter_31 > ::type
+, typename mpl::deref< iter_32 > ::type
+, typename mpl::deref< iter_33 > ::type
+, typename mpl::deref< iter_34 > ::type
+, typename mpl::deref< iter_35 > ::type
+, typename mpl::deref< iter_36 > ::type
+, typename mpl::deref< iter_37 > ::type
+, typename mpl::deref< iter_38 > ::type
+, typename mpl::deref< iter_39 > ::type
+, typename mpl::deref< iter_40 > ::type
+, typename mpl::deref< iter_41 > ::type
+, typename mpl::deref< iter_42 > ::type
+, typename mpl::deref< iter_43 > ::type
+, typename mpl::deref< iter_44 > ::type
+, typename mpl::deref< iter_45 > ::type
+, typename mpl::deref< iter_46 > ::type
+, typename mpl::deref< iter_47 > ::type
+, typename mpl::deref< iter_48 > ::type
+, typename mpl::deref< iter_49 > ::type
+, typename mpl::deref< iter_50 > ::type
+> ::type type;
+};
+};
+# undef BOOST_FT_make_type
+# undef BOOST_FT_make_type_impl
+
diff --git a/include/boost/function_types/detail/synthesize_impl/master.hpp b/include/boost/function_types/detail/synthesize_impl/master.hpp
new file mode 100644
index 0000000..49d38ef
--- /dev/null
+++ b/include/boost/function_types/detail/synthesize_impl/master.hpp
@@ -0,0 +1,87 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+// no include guards, this file is intended for multiple inclusion
+
+#if BOOST_FT_ARITY_LOOP_PREFIX
+
+# ifndef BOOST_FT_DETAIL_SYNTHESIZE_IMPL_MASTER_HPP_INCLUDED
+# define BOOST_FT_DETAIL_SYNTHESIZE_IMPL_MASTER_HPP_INCLUDED
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/arithmetic/dec.hpp>
+# include <boost/preprocessor/iteration/local.hpp>
+# include <boost/preprocessor/facilities/empty.hpp>
+# include <boost/preprocessor/facilities/identity.hpp>
+# endif
+
+# define BOOST_FT_type_name type
+
+# ifdef BOOST_FT_flags
+# define BOOST_FT_make_type(flags,cc,arity) BOOST_FT_make_type_impl(flags,cc,arity)
+# define BOOST_FT_make_type_impl(flags,cc,arity) make_type_ ## flags ## _ ## cc ## _ ## arity
+# else
+BOOST_PP_EXPAND(#) define BOOST_FT_make_type(flags,cc,arity) BOOST_FT_make_type_impl(flags,cc,arity)
+BOOST_PP_EXPAND(#) define BOOST_FT_make_type_impl(flags,cc,arity) make_type_ ## flags ## _ ## cc ## _ ## arity
+# endif
+
+# define BOOST_FT_iter(i) BOOST_PP_CAT(iter_,i)
+
+#elif BOOST_FT_ARITY_LOOP_IS_ITERATING
+
+template< BOOST_FT_tplargs(BOOST_PP_IDENTITY(typename)) >
+struct BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,BOOST_FT_arity)
+{
+ typedef BOOST_FT_type ;
+};
+
+template<>
+struct synthesize_impl_o< BOOST_FT_flags, BOOST_FT_cc_id, BOOST_FT_n >
+{
+ template<typename S> struct synthesize_impl_i
+ {
+ private:
+ typedef typename mpl::begin<S>::type BOOST_FT_iter(0);
+# if BOOST_FT_n > 1
+# define BOOST_PP_LOCAL_MACRO(i) typedef typename mpl::next< \
+ BOOST_FT_iter(BOOST_PP_DEC(i)) >::type BOOST_FT_iter(i);
+# define BOOST_PP_LOCAL_LIMITS (1,BOOST_FT_n-1)
+# include BOOST_PP_LOCAL_ITERATE()
+# endif
+ public:
+ typedef typename detail::BOOST_FT_make_type(BOOST_FT_flags,BOOST_FT_cc_id,BOOST_FT_arity)
+ < typename mpl::deref< BOOST_FT_iter(0) >::type
+# if BOOST_FT_mfp
+ , typename detail::cv_traits<
+ typename mpl::deref< BOOST_FT_iter(1) >::type >::type
+# endif
+# if BOOST_FT_n > (BOOST_FT_mfp+1)
+# define BOOST_PP_LOCAL_LIMITS (BOOST_FT_mfp+1,BOOST_FT_n-1)
+# define BOOST_PP_LOCAL_MACRO(i) \
+ , typename mpl::deref< BOOST_FT_iter(i) >::type
+# include BOOST_PP_LOCAL_ITERATE()
+# endif
+ >::type type;
+ };
+};
+
+#elif BOOST_FT_ARITY_LOOP_SUFFIX
+
+# ifdef BOOST_FT_flags
+# undef BOOST_FT_make_type
+# undef BOOST_FT_make_type_impl
+# else
+BOOST_PP_EXPAND(#) undef BOOST_FT_make_type
+BOOST_PP_EXPAND(#) undef BOOST_FT_make_type_impl
+# endif
+# undef BOOST_FT_iter
+# undef BOOST_FT_type_name
+
+#else
+# error "attempt to use arity loop master file without loop"
+#endif
+
diff --git a/include/boost/function_types/detail/to_sequence.hpp b/include/boost/function_types/detail/to_sequence.hpp
new file mode 100644
index 0000000..54854db
--- /dev/null
+++ b/include/boost/function_types/detail/to_sequence.hpp
@@ -0,0 +1,45 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_DETAIL_TO_SEQUENCE_HPP_INCLUDED
+#define BOOST_FT_DETAIL_TO_SEQUENCE_HPP_INCLUDED
+
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/is_sequence.hpp>
+#include <boost/mpl/placeholders.hpp>
+#include <boost/type_traits/add_reference.hpp>
+
+#include <boost/function_types/is_callable_builtin.hpp>
+
+namespace boost { namespace function_types { namespace detail {
+
+// wrap first arguments in components, if callable builtin type
+template<typename T>
+struct to_sequence
+{
+ typedef typename
+ mpl::eval_if
+ < is_callable_builtin<T>
+ , to_sequence< components<T> >
+ , mpl::identity< T >
+ >::type
+ type;
+};
+
+// reduce template instantiations, if possible
+template<typename T, typename U>
+struct to_sequence< components<T,U> >
+{
+ typedef typename components<T,U>::types type;
+};
+
+} } } // namespace ::boost::function_types::detail
+
+#endif
+
diff --git a/include/boost/function_types/function_arity.hpp b/include/boost/function_types/function_arity.hpp
new file mode 100644
index 0000000..a81001b
--- /dev/null
+++ b/include/boost/function_types/function_arity.hpp
@@ -0,0 +1,36 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_FUNCTION_ARITY_HPP_INCLUDED
+#define BOOST_FT_FUNCTION_ARITY_HPP_INCLUDED
+
+#include <boost/blank.hpp>
+#include <boost/mpl/if.hpp>
+
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+#include <boost/function_types/is_callable_builtin.hpp>
+#include <boost/function_types/components.hpp>
+
+namespace boost
+{
+ namespace function_types
+ {
+ template<typename T> struct function_arity
+ : mpl::if_
+ < function_types::is_callable_builtin<T>
+ , typename components<T>::function_arity, boost::blank
+ >::type
+ {
+ BOOST_MPL_AUX_LAMBDA_SUPPORT(1,function_arity,(T))
+ };
+ }
+}
+
+#endif
+
diff --git a/include/boost/function_types/function_pointer.hpp b/include/boost/function_types/function_pointer.hpp
new file mode 100644
index 0000000..cb13918
--- /dev/null
+++ b/include/boost/function_types/function_pointer.hpp
@@ -0,0 +1,30 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_FUNCTION_POINTER_HPP_INCLUDED
+#define BOOST_FT_FUNCTION_POINTER_HPP_INCLUDED
+
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+#include <boost/function_types/function_type.hpp>
+
+namespace boost
+{
+ namespace function_types
+ {
+ template<typename Types, typename Tag = null_tag> struct function_pointer
+ {
+ typedef typename function_types::function_type<Types,Tag>::type * type;
+
+ BOOST_MPL_AUX_LAMBDA_SUPPORT(2,function_pointer,(Types,Tag))
+ };
+ }
+}
+
+#endif
+
diff --git a/include/boost/function_types/function_reference.hpp b/include/boost/function_types/function_reference.hpp
new file mode 100644
index 0000000..3eceae0
--- /dev/null
+++ b/include/boost/function_types/function_reference.hpp
@@ -0,0 +1,30 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_FUNCTION_REFERENCE_HPP_INCLUDED
+#define BOOST_FT_FUNCTION_REFERENCE_HPP_INCLUDED
+
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+#include <boost/function_types/function_type.hpp>
+
+namespace boost
+{
+ namespace function_types
+ {
+ template<typename Types, typename Tag = null_tag> struct function_reference
+ {
+ typedef typename function_types::function_type<Types,Tag>::type & type;
+
+ BOOST_MPL_AUX_LAMBDA_SUPPORT(2,function_reference,(Types,Tag))
+ };
+ }
+}
+
+#endif
+
diff --git a/include/boost/function_types/function_type.hpp b/include/boost/function_types/function_type.hpp
new file mode 100644
index 0000000..afe3654
--- /dev/null
+++ b/include/boost/function_types/function_type.hpp
@@ -0,0 +1,28 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_FUNCTION_TYPE_HPP_INCLUDED
+#define BOOST_FT_FUNCTION_TYPE_HPP_INCLUDED
+
+#include <boost/function_types/detail/synthesize.hpp>
+#include <boost/function_types/detail/to_sequence.hpp>
+
+namespace boost
+{
+ namespace function_types
+ {
+ template<typename Types, typename Tag = null_tag> struct function_type
+ : detail::synthesize_func<typename detail::to_sequence<Types>::type, Tag>
+ {
+ BOOST_MPL_AUX_LAMBDA_SUPPORT(2,function_type,(Types,Tag))
+ };
+ }
+}
+
+#endif
+
diff --git a/include/boost/function_types/is_callable_builtin.hpp b/include/boost/function_types/is_callable_builtin.hpp
new file mode 100644
index 0000000..3b826ea
--- /dev/null
+++ b/include/boost/function_types/is_callable_builtin.hpp
@@ -0,0 +1,33 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_IS_CALLABLE_BUILTIN_HPP_INCLUDED
+#define BOOST_FT_IS_CALLABLE_BUILTIN_HPP_INCLUDED
+
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+#include <boost/function_types/components.hpp>
+
+namespace boost
+{
+ namespace function_types
+ {
+ template< typename T, typename Tag = null_tag >
+ struct is_callable_builtin
+ : function_types::represents
+ < function_types::components<T>
+ , function_types::tag<Tag, detail::callable_builtin_tag>
+ >
+ {
+ BOOST_MPL_AUX_LAMBDA_SUPPORT(2,is_callable_builtin,(T,Tag))
+ };
+ }
+}
+
+#endif
+
diff --git a/include/boost/function_types/is_function.hpp b/include/boost/function_types/is_function.hpp
new file mode 100644
index 0000000..09f75b1
--- /dev/null
+++ b/include/boost/function_types/is_function.hpp
@@ -0,0 +1,32 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_IS_FUNCTION_HPP_INCLUDED
+#define BOOST_FT_IS_FUNCTION_HPP_INCLUDED
+
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+#include <boost/function_types/components.hpp>
+
+namespace boost
+{
+ namespace function_types
+ {
+ template< typename T, typename Tag = null_tag >
+ struct is_function
+ : function_types::represents
+ < function_types::components<T>
+ , function_types::tag<Tag ,detail::function_tag>
+ >
+ {
+ BOOST_MPL_AUX_LAMBDA_SUPPORT(2,is_function,(T,Tag))
+ };
+ }
+}
+
+#endif
+
diff --git a/include/boost/function_types/is_function_pointer.hpp b/include/boost/function_types/is_function_pointer.hpp
new file mode 100644
index 0000000..67a0402
--- /dev/null
+++ b/include/boost/function_types/is_function_pointer.hpp
@@ -0,0 +1,32 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_IS_FUNCTION_POINTER_HPP_INCLUDED
+#define BOOST_FT_IS_FUNCTION_POINTER_HPP_INCLUDED
+
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+#include <boost/function_types/components.hpp>
+
+namespace boost
+{
+ namespace function_types
+ {
+ template< typename T, typename Tag = null_tag >
+ struct is_function_pointer
+ : function_types::represents
+ < function_types::components<T>
+ , function_types::tag<Tag ,detail::pointer_tag>
+ >
+ {
+ BOOST_MPL_AUX_LAMBDA_SUPPORT(2,is_function_pointer,(T,Tag))
+ };
+ }
+}
+
+#endif
diff --git a/include/boost/function_types/is_function_reference.hpp b/include/boost/function_types/is_function_reference.hpp
new file mode 100644
index 0000000..6bf908d
--- /dev/null
+++ b/include/boost/function_types/is_function_reference.hpp
@@ -0,0 +1,32 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_IS_FUNCTION_REFERENCE_HPP_INCLUDED
+#define BOOST_FT_IS_FUNCTION_REFERENCE_HPP_INCLUDED
+
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+#include <boost/function_types/components.hpp>
+
+namespace boost
+{
+ namespace function_types
+ {
+ template< typename T, typename Tag = null_tag >
+ struct is_function_reference
+ : function_types::represents
+ < function_types::components<T>
+ , function_types::tag<Tag ,detail::reference_tag> >
+ {
+ BOOST_MPL_AUX_LAMBDA_SUPPORT(2,is_function_reference,(T,Tag))
+ };
+ }
+}
+
+#endif
+
diff --git a/include/boost/function_types/is_member_function_pointer.hpp b/include/boost/function_types/is_member_function_pointer.hpp
new file mode 100644
index 0000000..ef54765
--- /dev/null
+++ b/include/boost/function_types/is_member_function_pointer.hpp
@@ -0,0 +1,31 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED
+#define BOOST_FT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED
+
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+#include <boost/function_types/components.hpp>
+
+namespace boost
+{
+ namespace function_types
+ {
+ template< typename T, typename Tag = null_tag >
+ struct is_member_function_pointer
+ : function_types::represents
+ < function_types::components<T>
+ , function_types::tag<Tag ,detail::member_function_pointer_tag> >
+ {
+ BOOST_MPL_AUX_LAMBDA_SUPPORT(2,is_member_function_pointer,(T,Tag))
+ };
+ }
+}
+#endif
+
diff --git a/include/boost/function_types/is_member_object_pointer.hpp b/include/boost/function_types/is_member_object_pointer.hpp
new file mode 100644
index 0000000..10bc89a
--- /dev/null
+++ b/include/boost/function_types/is_member_object_pointer.hpp
@@ -0,0 +1,32 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_IS_MEMBER_OBJECT_POINTER_HPP_INCLUDED
+#define BOOST_FT_IS_MEMBER_OBJECT_POINTER_HPP_INCLUDED
+
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+#include <boost/function_types/components.hpp>
+
+namespace boost
+{
+ namespace function_types
+ {
+ template< typename T >
+ struct is_member_object_pointer
+ : function_types::detail::represents_impl
+ < function_types::components<T>
+ , detail::member_object_pointer_tag >
+ {
+ BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_member_object_pointer,(T))
+ };
+ }
+}
+
+#endif
+
diff --git a/include/boost/function_types/is_member_pointer.hpp b/include/boost/function_types/is_member_pointer.hpp
new file mode 100644
index 0000000..db1da29
--- /dev/null
+++ b/include/boost/function_types/is_member_pointer.hpp
@@ -0,0 +1,32 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_IS_MEMBER_POINTER_HPP_INCLUDED
+#define BOOST_FT_IS_MEMBER_POINTER_HPP_INCLUDED
+
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+#include <boost/function_types/components.hpp>
+
+namespace boost
+{
+ namespace function_types
+ {
+ template< typename T, typename Tag = null_tag >
+ struct is_member_pointer
+ : function_types::represents
+ < function_types::components<T>
+ , function_types::tag<Tag ,detail::member_pointer_tag>
+ >
+ {
+ BOOST_MPL_AUX_LAMBDA_SUPPORT(2,is_member_pointer,(T,Tag))
+ };
+ }
+}
+
+#endif
+
diff --git a/include/boost/function_types/is_nonmember_callable_builtin.hpp b/include/boost/function_types/is_nonmember_callable_builtin.hpp
new file mode 100644
index 0000000..6105285
--- /dev/null
+++ b/include/boost/function_types/is_nonmember_callable_builtin.hpp
@@ -0,0 +1,33 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_IS_NONMEMBER_CALLABLE_BUILTIN_HPP_INCLUDED
+#define BOOST_FT_IS_NONMEMBER_CALLABLE_BUILTIN_HPP_INCLUDED
+
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+#include <boost/function_types/components.hpp>
+
+namespace boost
+{
+ namespace function_types
+ {
+ template< typename T, typename Tag = null_tag >
+ struct is_nonmember_callable_builtin
+ : function_types::represents
+ < function_types::components<T>
+ , function_types::tag<Tag,detail::nonmember_callable_builtin_tag>
+ >
+ {
+ BOOST_MPL_AUX_LAMBDA_SUPPORT(2,is_nonmember_callable_builtin,(T,Tag))
+ };
+ }
+}
+
+#endif
+
diff --git a/include/boost/function_types/member_function_pointer.hpp b/include/boost/function_types/member_function_pointer.hpp
new file mode 100644
index 0000000..104271f
--- /dev/null
+++ b/include/boost/function_types/member_function_pointer.hpp
@@ -0,0 +1,31 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_MEMBER_FUNCTION_POINTER_HPP_INCLUDED
+#define BOOST_FT_MEMBER_FUNCTION_POINTER_HPP_INCLUDED
+
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+#include <boost/function_types/detail/synthesize.hpp>
+#include <boost/function_types/detail/to_sequence.hpp>
+
+namespace boost
+{
+ namespace function_types
+ {
+ template<typename Types, typename Tag = null_tag>
+ struct member_function_pointer
+ : detail::synthesize_mfp< typename detail::to_sequence<Types>::type, Tag >
+ {
+ BOOST_MPL_AUX_LAMBDA_SUPPORT(2,member_function_pointer,(Types,Tag))
+ };
+ }
+}
+
+#endif
+
diff --git a/include/boost/function_types/member_object_pointer.hpp b/include/boost/function_types/member_object_pointer.hpp
new file mode 100644
index 0000000..1951654
--- /dev/null
+++ b/include/boost/function_types/member_object_pointer.hpp
@@ -0,0 +1,32 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_MEMBER_OBJECT_POINTER_HPP_INCLUDED
+#define BOOST_FT_MEMBER_OBJECT_POINTER_HPP_INCLUDED
+
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+#include <boost/function_types/detail/synthesize.hpp>
+#include <boost/function_types/detail/to_sequence.hpp>
+
+namespace boost
+{
+ namespace function_types
+ {
+ template<typename Types>
+ struct member_object_pointer
+ : detail::synthesize_mop< typename detail::to_sequence<Types>::type >
+ {
+ BOOST_MPL_AUX_LAMBDA_SUPPORT(1,member_object_pointer,(Types))
+ };
+ }
+}
+
+#endif
+
+
diff --git a/include/boost/function_types/parameter_types.hpp b/include/boost/function_types/parameter_types.hpp
new file mode 100644
index 0000000..227ad27
--- /dev/null
+++ b/include/boost/function_types/parameter_types.hpp
@@ -0,0 +1,53 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_PARAMETER_TYPES_HPP_INCLUDED
+#define BOOST_FT_PARAMETER_TYPES_HPP_INCLUDED
+
+#include <boost/blank.hpp>
+#include <boost/mpl/if.hpp>
+
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+#include <boost/mpl/pop_front.hpp>
+
+#include <boost/function_types/is_callable_builtin.hpp>
+#include <boost/function_types/components.hpp>
+
+namespace boost
+{
+ namespace function_types
+ {
+ using mpl::placeholders::_;
+
+ template< typename T, typename ClassTypeTransform = add_reference<_> >
+ struct parameter_types;
+
+ namespace detail
+ {
+ template<typename T, typename ClassTypeTransform>
+ struct parameter_types_impl
+ : mpl::pop_front
+ < typename function_types::components<T,ClassTypeTransform>::types
+ >::type
+ { };
+ }
+
+ template<typename T, typename ClassTypeTransform> struct parameter_types
+ : mpl::if_
+ < function_types::is_callable_builtin<T>
+ , detail::parameter_types_impl<T,ClassTypeTransform>, boost::blank
+ >::type
+ {
+ BOOST_MPL_AUX_LAMBDA_SUPPORT(2,parameter_types,(T,ClassTypeTransform))
+ };
+ }
+}
+
+#endif
+
diff --git a/include/boost/function_types/property_tags.hpp b/include/boost/function_types/property_tags.hpp
new file mode 100644
index 0000000..c2158d3
--- /dev/null
+++ b/include/boost/function_types/property_tags.hpp
@@ -0,0 +1,147 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_DETAIL_TAGS_HPP_INCLUDED
+#define BOOST_FT_DETAIL_TAGS_HPP_INCLUDED
+
+#include <cstddef>
+
+#include <boost/type_traits/integral_constant.hpp>
+#include <boost/mpl/bitxor.hpp>
+
+
+namespace boost { namespace function_types {
+
+namespace detail
+{
+ typedef long bits_t;
+
+ template<bits_t Value> struct constant
+ : boost::integral_constant<bits_t,Value>
+ { };
+
+ template<bits_t Bits, bits_t Mask> struct property_tag
+ {
+ typedef constant<Bits> bits;
+ typedef constant<Mask> mask;
+ };
+
+ template<typename T> struct bits : T::bits { };
+ template<typename T> struct mask : T::mask { };
+
+ // forward declaration, defined in pp_tags
+ template<bits_t Bits, bits_t CCID> struct encode_bits_impl;
+
+ // forward declaration, defined in pp_tags
+ template<bits_t LHS_bits, bits_t LHS_mask,
+ bits_t RHS_bits, bits_t RHS_mask>
+ struct tag_ice;
+
+ // forward declaration, defined in retag_default_cc
+ template<class Tag, class RegTag = Tag> struct retag_default_cc;
+
+ template<bits_t Bits, bits_t CCID> struct encode_bits
+ : constant<
+ ::boost::function_types::detail::encode_bits_impl<Bits,CCID>::value
+ >
+ { };
+
+ template<class LHS, class RHS> struct compound_tag
+ {
+ typedef constant<
+ ::boost::function_types::detail::tag_ice
+ < ::boost::function_types::detail::bits<LHS>::value
+ , ::boost::function_types::detail::mask<LHS>::value
+ , ::boost::function_types::detail::bits<RHS>::value
+ , ::boost::function_types::detail::mask<RHS>::value
+ >::combined_bits
+ > bits;
+
+ typedef constant<
+ ::boost::function_types::detail::tag_ice
+ < ::boost::function_types::detail::bits<LHS>::value
+ , ::boost::function_types::detail::mask<LHS>::value
+ , ::boost::function_types::detail::bits<RHS>::value
+ , ::boost::function_types::detail::mask<RHS>::value
+ >::combined_mask
+ > mask;
+ };
+
+ template <class Base, class PropOld, class PropNew>
+ struct changed_tag
+ : Base
+ {
+ typedef mpl::bitxor_
+ <typename Base::bits, typename PropOld::bits, typename PropNew::bits>
+ bits;
+ };
+
+ template<class Tag, class QueryTag> struct represents_impl
+ : boost::integral_constant<bool,
+ ::boost::function_types::detail::tag_ice
+ < ::boost::function_types::detail::bits<Tag>::value
+ , ::boost::function_types::detail::mask<Tag>::value
+ , ::boost::function_types::detail::bits<QueryTag>::value
+ , ::boost::function_types::detail::mask<QueryTag>::value
+ >::match
+ >
+ { };
+
+} // namespace detail
+
+typedef detail::property_tag<0,0> null_tag;
+
+template<class Tag1, class Tag2, class Tag3 = null_tag, class Tag4 = null_tag>
+struct tag
+ : detail::compound_tag< detail::compound_tag<Tag1,Tag2>,
+ detail::compound_tag<Tag3,Tag4> >
+{ };
+
+template<class Tag1, class Tag2, class Tag3> struct tag<Tag1,Tag2,Tag3,null_tag>
+ : detail::compound_tag<detail::compound_tag<Tag1,Tag2>,Tag3>
+{ };
+template<class Tag1, class Tag2> struct tag<Tag1,Tag2,null_tag,null_tag>
+ : detail::compound_tag<Tag1,Tag2>
+{ };
+template<class Tag1> struct tag<Tag1,null_tag,null_tag,null_tag>
+ : Tag1
+{ };
+
+
+template<class Tag, class QueryTag> struct represents
+ : detail::represents_impl<Tag, detail::retag_default_cc<QueryTag,Tag> >
+{ };
+
+
+template<class Tag, class QueryTag> struct extract
+{
+ typedef detail::constant<
+ ::boost::function_types::detail::tag_ice
+ < ::boost::function_types::detail::bits<Tag>::value
+ , ::boost::function_types::detail::mask<Tag>::value
+ , ::boost::function_types::detail::bits<QueryTag>::value
+ , ::boost::function_types::detail::mask<QueryTag>::value
+ >::extracted_bits
+ > bits;
+
+ typedef detail::constant<
+ ::boost::function_types::detail::mask<QueryTag>::value
+ > mask;
+};
+
+} } // namespace ::boost::function_types
+
+#include <boost/function_types/detail/pp_tags/preprocessed.hpp>
+
+namespace boost { namespace function_types {
+#define BOOST_FT_cc_file <boost/function_types/detail/pp_tags/cc_tag.hpp>
+#include <boost/function_types/detail/pp_loop.hpp>
+} } // namespace boost::function_types
+
+#endif
+
diff --git a/include/boost/function_types/result_type.hpp b/include/boost/function_types/result_type.hpp
new file mode 100644
index 0000000..db642c8
--- /dev/null
+++ b/include/boost/function_types/result_type.hpp
@@ -0,0 +1,48 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#ifndef BOOST_FT_RESULT_TYPE_HPP_INCLUDED
+#define BOOST_FT_RESULT_TYPE_HPP_INCLUDED
+
+#include <boost/blank.hpp>
+#include <boost/mpl/if.hpp>
+
+#include <boost/mpl/aux_/lambda_support.hpp>
+
+#include <boost/mpl/at.hpp>
+
+#include <boost/function_types/is_callable_builtin.hpp>
+#include <boost/function_types/components.hpp>
+
+namespace boost
+{
+ namespace function_types
+ {
+ template< typename T > struct result_type;
+
+ namespace detail
+ {
+ template<typename T> struct result_type_impl
+ : mpl::at_c
+ < typename function_types::components<T>::types, 0 >
+ { };
+ }
+
+ template<typename T> struct result_type
+ : mpl::if_
+ < function_types::is_callable_builtin<T>
+ , detail::result_type_impl<T>, boost::blank
+ >::type
+ {
+ BOOST_MPL_AUX_LAMBDA_SUPPORT(1,result_type,(T))
+ };
+ }
+}
+
+#endif
+
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..ee4ce6e
--- /dev/null
+++ b/index.html
@@ -0,0 +1,14 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+ <meta http-equiv="refresh" content="0; URL=doc/html/index.html">
+ </head>
+ <body>
+ <p>Automatic redirection failed, please go to
+ <a href="doc/html/index.html">doc/html/index.html</a>.</p>
+ <p>Copyright Tobias Schwinger 2005-2007</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 copy at <a href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/LICENSE_1_0.txt</a>).</p>
+ </body>
+</html>
+
diff --git a/meta/libraries.json b/meta/libraries.json
new file mode 100644
index 0000000..44b499e
--- /dev/null
+++ b/meta/libraries.json
@@ -0,0 +1,15 @@
+{
+ "key": "function_types",
+ "name": "Function Types",
+ "authors": [
+ "Tobias Schwinger"
+ ],
+ "description": "Boost.FunctionTypes provides functionality to classify, decompose and synthesize function, function pointer, function reference and pointer to member types.",
+ "category": [
+ "Generic",
+ "Metaprogramming"
+ ],
+ "maintainers": [
+ "Tobias Schwinger <tschwinger -at- isonews2.com>"
+ ]
+}
diff --git a/test/Jamfile b/test/Jamfile
new file mode 100644
index 0000000..e50c813
--- /dev/null
+++ b/test/Jamfile
@@ -0,0 +1,85 @@
+
+# (C) Copyright Tobias Schwinger
+#
+# Use, modification and distribution are subject to the Boost Software License,
+# Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+#-------------------------------------------------------------------------------
+
+import testing ;
+
+{
+ test-suite function_types :
+
+ # Classification
+
+ [ compile classification/is_function.cpp ]
+ [ compile classification/is_function_pointer.cpp ]
+ [ compile classification/is_function_reference.cpp ]
+ [ compile classification/is_member_function_pointer.cpp ]
+ [ compile classification/is_member_object_pointer.cpp ]
+ [ compile classification/is_callable_builtin.cpp ]
+ [ compile classification/is_nonmember_callable_builtin.cpp ]
+ [ compile classification/is_member_pointer.cpp ]
+
+ [ compile classification/is_cv_mem_func_ptr.cpp ]
+ [ compile classification/is_variadic.cpp ]
+ [ compile classification/is_cv_pointer.cpp ]
+ # [ compile classification/is_cv_function.cpp ]
+
+ # Decomposition
+
+ [ compile decomposition/components.cpp ]
+ [ compile decomposition/result_type.cpp ]
+ [ compile decomposition/function_arity.cpp ]
+ [ compile decomposition/parameter_types.cpp ]
+
+ [ compile decomposition/components_seq.cpp ]
+ [ compile decomposition/class_type_transform.cpp ]
+
+ [ compile-fail decomposition/result_type_fail.cpp ]
+ [ compile-fail decomposition/parameter_types_fail.cpp ]
+ [ compile-fail decomposition/function_arity_fail.cpp ]
+
+ # Synthesis
+
+ [ compile synthesis/function_type.cpp ]
+ [ compile synthesis/function_pointer.cpp ]
+ [ compile synthesis/function_reference.cpp ]
+ [ compile synthesis/member_function_pointer.cpp ]
+ [ compile synthesis/member_object_pointer.cpp ]
+
+ [ compile synthesis/transformation.cpp ]
+ [ compile synthesis/mem_func_ptr_cv1.cpp ]
+ [ compile synthesis/mem_func_ptr_cv2.cpp ]
+ [ compile synthesis/mem_func_ptr_cv_ptr_to_this.cpp ]
+ [ compile synthesis/variadic_function_synthesis.cpp ]
+ # [ compile synthesis/cv_function_synthesis.cpp ]
+
+ # Reconfiguration
+
+ [ compile reconfiguration/preprocessing_mode.cpp ]
+ [ compile reconfiguration/partial_arity_preprocessing.cpp ]
+ [ compile reconfiguration/cc_preprocessing.cpp ]
+
+ # Custom calling conventions
+
+ [ compile custom_ccs/nonmember_ccs.cpp : <address-model>64:<build>no ]
+ [ compile custom_ccs/nonmember_ccs_exact.cpp : <address-model>64:<build>no ]
+ [ compile custom_ccs/member_ccs.cpp : <address-model>64:<build>no ]
+ [ compile custom_ccs/member_ccs_exact.cpp : <address-model>64:<build>no ]
+
+ # Code from the examples
+
+ [ compile ../example/interpreter_example.cpp ]
+ [ compile ../example/result_of_example.cpp ]
+ [ compile ../example/interface_example.cpp ]
+ [ compile ../example/fast_mem_fn_example.cpp
+ # needed for Boost.PP file iteration with some compilers
+ : <include>../example
+ ]
+ [ compile ../example/macro_type_args_example.cpp ]
+ ;
+}
+
+
diff --git a/test/classification/is_callable_builtin.cpp b/test/classification/is_callable_builtin.cpp
new file mode 100644
index 0000000..d65f6f3
--- /dev/null
+++ b/test/classification/is_callable_builtin.cpp
@@ -0,0 +1,86 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+#include <boost/function_types/is_callable_builtin.hpp>
+
+namespace ft = boost::function_types;
+
+typedef void func();
+typedef void (*func_ptr)();
+typedef void (&func_ref)();
+class C;
+typedef void (C::*mem_func_ptr)();
+typedef void (C::*c_mem_func_ptr)() const;
+typedef void (C::*v_mem_func_ptr)() volatile;
+typedef void (C::*cv_mem_func_ptr)() const volatile;
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< func >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< func_ptr >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< func_ref >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< c_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< v_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< cv_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< func_ptr* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< mem_func_ptr* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< C >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< int >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< int* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< int** >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< int& >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< int[] >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< int[1] >
+));
+
diff --git a/test/classification/is_cv_function.cpp b/test/classification/is_cv_function.cpp
new file mode 100644
index 0000000..176300c
--- /dev/null
+++ b/test/classification/is_cv_function.cpp
@@ -0,0 +1,142 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+#include <boost/function_types/is_function.hpp>
+
+namespace ft = boost::function_types;
+
+template<typename C, typename T>
+void test_non_cv(T C::*)
+{
+ BOOST_MPL_ASSERT((
+ ft::is_function<T, ft::non_const >
+ ));
+
+ BOOST_MPL_ASSERT((
+ ft::is_function<T, ft::non_volatile >
+ ));
+
+ BOOST_MPL_ASSERT((
+ ft::is_function<T, ft::tag<ft::non_const,ft::non_volatile> >
+ ));
+
+ BOOST_MPL_ASSERT_NOT((
+ ft::is_function<T, ft::const_qualified >
+ ));
+
+ BOOST_MPL_ASSERT_NOT((
+ ft::is_function<T, ft::volatile_qualified >
+ ));
+
+ BOOST_MPL_ASSERT_NOT((
+ ft::is_function<T, ft::tag<ft::const_qualified,ft::volatile_qualified> >
+ ));
+}
+
+template<typename C, typename T>
+void test_c_non_v(T C::*)
+{
+ BOOST_MPL_ASSERT((
+ ft::is_function<T, ft::const_qualified >
+ ));
+
+ BOOST_MPL_ASSERT((
+ ft::is_function<T, ft::non_volatile >
+ ));
+
+ BOOST_MPL_ASSERT((
+ ft::is_function<T, ft::tag<ft::const_qualified,ft::non_volatile> >
+ ));
+
+ BOOST_MPL_ASSERT_NOT((
+ ft::is_function<T, ft::non_const >
+ ));
+
+ BOOST_MPL_ASSERT_NOT((
+ ft::is_function<T, ft::volatile_qualified >
+ ));
+
+ BOOST_MPL_ASSERT_NOT((
+ ft::is_function<T, ft::tag<ft::non_const,ft::volatile_qualified> >
+ ));
+}
+
+template<typename C, typename T>
+void test_v_non_c(T C::*)
+{
+ BOOST_MPL_ASSERT((
+ ft::is_function<T, ft::non_const >
+ ));
+
+ BOOST_MPL_ASSERT((
+ ft::is_function<T, ft::volatile_qualified >
+ ));
+
+ BOOST_MPL_ASSERT((
+ ft::is_function<T, ft::tag<ft::non_const,ft::volatile_qualified> >
+ ));
+
+ BOOST_MPL_ASSERT_NOT((
+ ft::is_function<T, ft::const_qualified >
+ ));
+
+ BOOST_MPL_ASSERT_NOT((
+ ft::is_function<T, ft::non_volatile >
+ ));
+
+ BOOST_MPL_ASSERT_NOT((
+ ft::is_function<T, ft::tag<ft::const_qualified,ft::non_volatile> >
+ ));
+}
+
+template<typename C, typename T>
+void test_cv(T C::*)
+{
+ BOOST_MPL_ASSERT((
+ ft::is_function<T, ft::const_qualified >
+ ));
+
+ BOOST_MPL_ASSERT((
+ ft::is_function<T, ft::volatile_qualified >
+ ));
+
+ BOOST_MPL_ASSERT((
+ ft::is_function<T, ft::tag<ft::const_qualified,ft::volatile_qualified> >
+ ));
+
+ BOOST_MPL_ASSERT_NOT((
+ ft::is_function<T, ft::non_const >
+ ));
+
+ BOOST_MPL_ASSERT_NOT((
+ ft::is_function<T, ft::non_volatile >
+ ));
+
+ BOOST_MPL_ASSERT_NOT((
+ ft::is_function<T, ft::tag<ft::non_const,ft::non_volatile> >
+ ));
+}
+
+
+struct C
+{
+ void non_cv(int) { }
+ void c_non_v(int) const { }
+ void v_non_c(int) volatile { }
+ void cv(int) const volatile { }
+};
+
+void instanitate()
+{
+ test_non_cv(& C::non_cv);
+ test_c_non_v(& C::c_non_v);
+ test_v_non_c(& C::v_non_c);
+ test_cv(& C::cv);
+}
+
diff --git a/test/classification/is_cv_mem_func_ptr.cpp b/test/classification/is_cv_mem_func_ptr.cpp
new file mode 100644
index 0000000..0b75c43
--- /dev/null
+++ b/test/classification/is_cv_mem_func_ptr.cpp
@@ -0,0 +1,150 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+#include <boost/function_types/is_member_function_pointer.hpp>
+
+namespace ft = boost::function_types;
+
+class C;
+typedef void (C::*mem_func_ptr)();
+typedef void (C::*c_mem_func_ptr)() const;
+typedef void (C::*v_mem_func_ptr)() volatile;
+typedef void (C::*cv_mem_func_ptr)() const volatile;
+
+
+BOOST_MPL_ASSERT((
+ ft::is_member_function_pointer< mem_func_ptr, ft::non_const >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_member_function_pointer< mem_func_ptr, ft::non_volatile >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_member_function_pointer< mem_func_ptr,
+ ft::tag<ft::non_const, ft::non_volatile> >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< mem_func_ptr, ft::const_qualified >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< mem_func_ptr, ft::volatile_qualified >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< mem_func_ptr,
+ ft::tag<ft::const_qualified, ft::volatile_qualified> >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< mem_func_ptr,
+ ft::tag<ft::non_const, ft::volatile_qualified> >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< mem_func_ptr,
+ ft::tag<ft::const_qualified, ft::non_volatile> >
+));
+
+//
+
+BOOST_MPL_ASSERT((
+ ft::is_member_function_pointer< c_mem_func_ptr, ft::const_qualified >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_member_function_pointer< c_mem_func_ptr, ft::non_volatile >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< c_mem_func_ptr, ft::non_const >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< c_mem_func_ptr, ft::volatile_qualified >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_member_function_pointer< c_mem_func_ptr,
+ ft::tag<ft::const_qualified, ft::non_volatile> >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< c_mem_func_ptr,
+ ft::tag<ft::non_const, ft::volatile_qualified> >
+));
+
+//
+
+BOOST_MPL_ASSERT((
+ ft::is_member_function_pointer< v_mem_func_ptr, ft::volatile_qualified >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_member_function_pointer< v_mem_func_ptr, ft::non_const >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< v_mem_func_ptr, ft::non_volatile >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< v_mem_func_ptr, ft::const_qualified >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_member_function_pointer< v_mem_func_ptr,
+ ft::tag<ft::non_const, ft::volatile_qualified> >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< v_mem_func_ptr,
+ ft::tag<ft::const_qualified, ft::non_volatile> >
+));
+
+//
+
+BOOST_MPL_ASSERT((
+ ft::is_member_function_pointer< cv_mem_func_ptr, ft::const_qualified >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_member_function_pointer< cv_mem_func_ptr, ft::volatile_qualified >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< cv_mem_func_ptr, ft::non_const >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< cv_mem_func_ptr, ft::non_volatile >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< cv_mem_func_ptr,
+ ft::tag<ft::non_const, ft::non_volatile> >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< cv_mem_func_ptr,
+ ft::tag<ft::const_qualified, ft::non_volatile> >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< cv_mem_func_ptr,
+ ft::tag<ft::non_const, ft::volatile_qualified> >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_member_function_pointer< cv_mem_func_ptr,
+ ft::tag<ft::const_qualified, ft::volatile_qualified> >
+));
+
diff --git a/test/classification/is_cv_pointer.cpp b/test/classification/is_cv_pointer.cpp
new file mode 100644
index 0000000..383052e
--- /dev/null
+++ b/test/classification/is_cv_pointer.cpp
@@ -0,0 +1,50 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+#include <boost/function_types/is_function_pointer.hpp>
+#include <boost/function_types/is_member_function_pointer.hpp>
+
+namespace ft = boost::function_types;
+
+typedef void(* const func_c_ptr)();
+typedef void(* volatile func_v_ptr)();
+typedef void(* const volatile func_cv_ptr)();
+class C;
+typedef void(C::* const mem_func_c_ptr)();
+typedef void(C::* volatile mem_func_v_ptr)();
+typedef void(C::* const volatile mem_func_cv_ptr)();
+
+// note: the pointer has cv-qualifiers, not the function - non_cv tag must match
+
+BOOST_MPL_ASSERT((
+ ft::is_function_pointer< func_c_ptr, ft::non_cv >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_function_pointer< func_v_ptr, ft::non_cv >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_function_pointer< func_cv_ptr, ft::non_cv >
+));
+
+
+BOOST_MPL_ASSERT((
+ ft::is_member_function_pointer< mem_func_c_ptr, ft::non_cv >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_member_function_pointer< mem_func_v_ptr, ft::non_cv >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_member_function_pointer< mem_func_cv_ptr, ft::non_cv >
+));
+
+
diff --git a/test/classification/is_function.cpp b/test/classification/is_function.cpp
new file mode 100644
index 0000000..9c6a357
--- /dev/null
+++ b/test/classification/is_function.cpp
@@ -0,0 +1,87 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+#include <boost/function_types/is_function.hpp>
+
+namespace ft = boost::function_types;
+
+typedef void func();
+typedef void (*func_ptr)();
+typedef void (&func_ref)();
+class C;
+typedef void (C::*mem_func_ptr)();
+typedef void (C::*c_mem_func_ptr)() const;
+typedef void (C::*v_mem_func_ptr)() volatile;
+typedef void (C::*cv_mem_func_ptr)() const volatile;
+
+
+BOOST_MPL_ASSERT((
+ ft::is_function< func >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function< func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function< func_ref >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function< mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function< c_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function< v_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function< cv_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function< func_ptr* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function< mem_func_ptr* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function< C >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function< int >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function< int* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function< int** >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function< int& >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function< int[] >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function< int[1] >
+));
+
diff --git a/test/classification/is_function_pointer.cpp b/test/classification/is_function_pointer.cpp
new file mode 100644
index 0000000..54ef29f
--- /dev/null
+++ b/test/classification/is_function_pointer.cpp
@@ -0,0 +1,87 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+#include <boost/function_types/is_function_pointer.hpp>
+
+namespace ft = boost::function_types;
+
+typedef void func();
+typedef void (*func_ptr)();
+typedef void (&func_ref)();
+class C;
+typedef void (C::*mem_func_ptr)();
+typedef void (C::*c_mem_func_ptr)() const;
+typedef void (C::*v_mem_func_ptr)() volatile;
+typedef void (C::*cv_mem_func_ptr)() const volatile;
+
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_pointer< func >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_function_pointer< func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_pointer< func_ref >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_pointer< mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_pointer< c_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_pointer< v_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_pointer< cv_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_pointer< func_ptr* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_pointer< mem_func_ptr* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_pointer< C >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_pointer< int >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_pointer< int* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_pointer< int** >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_pointer< int& >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_pointer< int[] >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_pointer< int[1] >
+));
+
diff --git a/test/classification/is_function_reference.cpp b/test/classification/is_function_reference.cpp
new file mode 100644
index 0000000..2f8f006
--- /dev/null
+++ b/test/classification/is_function_reference.cpp
@@ -0,0 +1,88 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+#include <boost/function_types/is_function_reference.hpp>
+
+namespace ft = boost::function_types;
+
+typedef void func();
+typedef void (*func_ptr)();
+typedef void (&func_ref)();
+class C;
+typedef void (C::*mem_func_ptr)();
+typedef void (C::*c_mem_func_ptr)() const;
+typedef void (C::*v_mem_func_ptr)() volatile;
+typedef void (C::*cv_mem_func_ptr)() const volatile;
+
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_reference< func >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_reference< func_ptr >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_function_reference< func_ref >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_reference< mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_reference< c_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_reference< v_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_reference< cv_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_reference< func_ptr* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_reference< mem_func_ptr* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_reference< C >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_reference< int >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_reference< int* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_reference< int** >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_reference< int& >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_reference< int[] >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_function_reference< int[1] >
+));
+
+
diff --git a/test/classification/is_member_function_pointer.cpp b/test/classification/is_member_function_pointer.cpp
new file mode 100644
index 0000000..0548c37
--- /dev/null
+++ b/test/classification/is_member_function_pointer.cpp
@@ -0,0 +1,96 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+#include <boost/function_types/is_member_function_pointer.hpp>
+
+namespace ft = boost::function_types;
+
+typedef void func();
+typedef void (*func_ptr)();
+typedef void (&func_ref)();
+class C;
+typedef void (C::*mem_func_ptr)();
+typedef void (C::*c_mem_func_ptr)() const;
+typedef void (C::*v_mem_func_ptr)() volatile;
+typedef void (C::*cv_mem_func_ptr)() const volatile;
+typedef int C::*mem_ptr;
+
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< func >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< func_ref >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_member_function_pointer< mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_member_function_pointer< c_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_member_function_pointer< v_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_member_function_pointer< cv_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< mem_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< func_ptr* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< mem_func_ptr* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< mem_ptr* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< C >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< int >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< int* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< int** >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< int& >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< int[] >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_function_pointer< int[1] >
+));
+
diff --git a/test/classification/is_member_object_pointer.cpp b/test/classification/is_member_object_pointer.cpp
new file mode 100644
index 0000000..8408327
--- /dev/null
+++ b/test/classification/is_member_object_pointer.cpp
@@ -0,0 +1,95 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+#include <boost/function_types/is_member_object_pointer.hpp>
+
+namespace ft = boost::function_types;
+
+typedef void func();
+typedef void (*func_ptr)();
+typedef void (&func_ref)();
+class C;
+typedef void (C::*mem_func_ptr)();
+typedef void (C::*c_mem_func_ptr)() const;
+typedef void (C::*v_mem_func_ptr)() volatile;
+typedef void (C::*cv_mem_func_ptr)() const volatile;
+typedef int C::*mem_ptr;
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_object_pointer< func >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_object_pointer< func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_object_pointer< func_ref >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_object_pointer< mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_object_pointer< c_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_object_pointer< v_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_object_pointer< cv_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_member_object_pointer< mem_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_object_pointer< func_ptr* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_object_pointer< mem_func_ptr* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_object_pointer< mem_ptr* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_object_pointer< C >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_object_pointer< int >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_object_pointer< int* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_object_pointer< int** >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_object_pointer< int& >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_object_pointer< int[] >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_object_pointer< int[1] >
+));
+
diff --git a/test/classification/is_member_pointer.cpp b/test/classification/is_member_pointer.cpp
new file mode 100644
index 0000000..1139027
--- /dev/null
+++ b/test/classification/is_member_pointer.cpp
@@ -0,0 +1,88 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+#include <boost/function_types/is_member_pointer.hpp>
+
+namespace ft = boost::function_types;
+
+typedef void func();
+typedef void (*func_ptr)();
+typedef void (&func_ref)();
+class C;
+typedef void (C::*mem_func_ptr)();
+typedef void (C::*c_mem_func_ptr)() const;
+typedef void (C::*v_mem_func_ptr)() volatile;
+typedef void (C::*cv_mem_func_ptr)() const volatile;
+typedef int C::*mem_ptr;
+
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_pointer< func >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_pointer< func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_pointer< func_ref >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_member_pointer< mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_member_pointer< c_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_member_pointer< v_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_member_pointer< cv_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_member_pointer< mem_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_pointer< func_ptr* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_pointer< mem_func_ptr* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_pointer< mem_ptr* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_pointer< C >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_pointer< int >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_pointer< int* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_pointer< int** >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_member_pointer< int& >
+));
+
diff --git a/test/classification/is_nonmember_callable_builtin.cpp b/test/classification/is_nonmember_callable_builtin.cpp
new file mode 100644
index 0000000..902d6ee
--- /dev/null
+++ b/test/classification/is_nonmember_callable_builtin.cpp
@@ -0,0 +1,87 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+#include <boost/function_types/is_nonmember_callable_builtin.hpp>
+
+namespace ft = boost::function_types;
+
+typedef void func();
+typedef void (*func_ptr)();
+typedef void (&func_ref)();
+class C;
+typedef void (C::*mem_func_ptr)();
+typedef void (C::*c_mem_func_ptr)() const;
+typedef void (C::*v_mem_func_ptr)() volatile;
+typedef void (C::*cv_mem_func_ptr)() const volatile;
+
+
+BOOST_MPL_ASSERT((
+ ft::is_nonmember_callable_builtin< func >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_nonmember_callable_builtin< func_ptr >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_nonmember_callable_builtin< func_ref >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_nonmember_callable_builtin< mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_nonmember_callable_builtin< c_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_nonmember_callable_builtin< v_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_nonmember_callable_builtin< cv_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_nonmember_callable_builtin< func_ptr* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_nonmember_callable_builtin< mem_func_ptr* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_nonmember_callable_builtin< C >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_nonmember_callable_builtin< int >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_nonmember_callable_builtin< int* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_nonmember_callable_builtin< int** >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_nonmember_callable_builtin< int& >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_nonmember_callable_builtin< int[] >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_nonmember_callable_builtin< int[1] >
+));
+
diff --git a/test/classification/is_variadic.cpp b/test/classification/is_variadic.cpp
new file mode 100644
index 0000000..964ea8c
--- /dev/null
+++ b/test/classification/is_variadic.cpp
@@ -0,0 +1,143 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+#include <boost/function_types/is_callable_builtin.hpp>
+
+namespace ft = boost::function_types;
+
+typedef void func(...);
+typedef void nv_func();
+typedef void (*func_ptr)(...);
+typedef void (*nv_func_ptr)();
+typedef void (&func_ref)(...);
+typedef void (&nv_func_ref)();
+class C;
+typedef void (C::*mem_func_ptr)(...);
+typedef void (C::*nv_mem_func_ptr)();
+typedef void (C::*c_mem_func_ptr)(...) const;
+typedef void (C::*v_mem_func_ptr)(...) volatile;
+typedef void (C::*cv_mem_func_ptr)(...) const volatile;
+typedef int C::* mem_ptr;
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< func >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< func, ft::variadic >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< func, ft::non_variadic >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< nv_func >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< nv_func, ft::variadic >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< nv_func, ft::non_variadic >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< func_ptr >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< func_ptr, ft::variadic>
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< func_ptr, ft::non_variadic >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< nv_func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< nv_func_ptr, ft::variadic>
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< nv_func_ptr, ft::non_variadic >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< func_ref >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< mem_func_ptr, ft::variadic >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< mem_func_ptr, ft::non_variadic >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< nv_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< nv_mem_func_ptr, ft::variadic >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< nv_mem_func_ptr, ft::non_variadic >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< c_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< v_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< cv_mem_func_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< func_ptr* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< mem_func_ptr* >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< C, ft::variadic >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< C, ft::non_variadic >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< mem_ptr >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< mem_ptr, ft::variadic >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< mem_ptr, ft::non_variadic >
+));
+
diff --git a/test/custom_ccs/member_ccs.cpp b/test/custom_ccs/member_ccs.cpp
new file mode 100644
index 0000000..11f9392
--- /dev/null
+++ b/test/custom_ccs/member_ccs.cpp
@@ -0,0 +1,50 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#define BOOST_FT_AUTODETECT_CALLING_CONVENTIONS
+
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/function_types/member_function_pointer.hpp>
+#include <boost/function_types/is_callable_builtin.hpp>
+
+#ifndef BOOST_FT_CC_STDCALL
+# error "test not supported with this compiler/platform"
+#endif
+
+namespace ft = boost::function_types;
+namespace mpl = boost::mpl;
+
+typedef ft::stdcall_cc cc;
+
+class C;
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin<
+ ft::member_function_pointer<mpl::vector<int, C &>, cc>::type
+ >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin<
+ ft::member_function_pointer<mpl::vector<int, C const &>, cc>::type
+ >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin<
+ ft::member_function_pointer<mpl::vector<int, C volatile &>, cc>::type
+ >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin<
+ ft::member_function_pointer<mpl::vector<int, C const volatile &>, cc>::type
+ >
+));
+
diff --git a/test/custom_ccs/member_ccs_exact.cpp b/test/custom_ccs/member_ccs_exact.cpp
new file mode 100644
index 0000000..413b133
--- /dev/null
+++ b/test/custom_ccs/member_ccs_exact.cpp
@@ -0,0 +1,71 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#define BOOST_FT_AUTODETECT_CALLING_CONVENTIONS
+
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/function_types/member_function_pointer.hpp>
+#include <boost/function_types/is_callable_builtin.hpp>
+
+#ifndef BOOST_FT_CC_STDCALL
+# error "test not supported with this compiler/platform"
+#endif
+
+namespace ft = boost::function_types;
+namespace mpl = boost::mpl;
+
+typedef ft::stdcall_cc cc;
+typedef ft::default_cc dc;
+
+class C;
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< ft::member_function_pointer<mpl::vector<int, C &>, cc>::type, cc >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< ft::member_function_pointer<mpl::vector<int, C const &>, cc>::type, cc >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< ft::member_function_pointer<mpl::vector<int, C volatile &>, cc>::type, cc >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< ft::member_function_pointer<mpl::vector<int, C const volatile &>, cc>::type, cc >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< ft::member_function_pointer<mpl::vector<int, C &> >::type, dc >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< ft::member_function_pointer<mpl::vector<int, C &>, cc>::type, dc >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< ft::member_function_pointer<mpl::vector<int, C const &>, cc>::type, dc >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< ft::member_function_pointer<mpl::vector<int, C volatile &>, cc>::type, dc >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< ft::member_function_pointer<mpl::vector<int, C const volatile &>, cc>::type, dc >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< ft::member_function_pointer<mpl::vector<int, C &> >::type, cc >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< ft::member_function_pointer<mpl::vector<int, C &>, cc>::type, dc >
+));
+
diff --git a/test/custom_ccs/nonmember_ccs.cpp b/test/custom_ccs/nonmember_ccs.cpp
new file mode 100644
index 0000000..81681ff
--- /dev/null
+++ b/test/custom_ccs/nonmember_ccs.cpp
@@ -0,0 +1,45 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#define BOOST_FT_AUTODETECT_CALLING_CONVENTIONS
+
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/function_types/function_type.hpp>
+#include <boost/function_types/function_pointer.hpp>
+#include <boost/function_types/function_reference.hpp>
+#include <boost/function_types/is_callable_builtin.hpp>
+
+#ifndef BOOST_FT_CC_STDCALL
+# error "test not supported with this compiler/platform"
+#endif
+
+namespace ft = boost::function_types;
+namespace mpl = boost::mpl;
+
+typedef ft::stdcall_cc cc;
+
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin<
+ ft::function_type<mpl::vector<void,int>, cc>::type
+ >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin<
+ ft::function_pointer<mpl::vector<void,int>, cc>::type
+ >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin<
+ ft::function_reference<mpl::vector<void,int>, cc>::type
+ >
+));
+
diff --git a/test/custom_ccs/nonmember_ccs_exact.cpp b/test/custom_ccs/nonmember_ccs_exact.cpp
new file mode 100644
index 0000000..d6db300
--- /dev/null
+++ b/test/custom_ccs/nonmember_ccs_exact.cpp
@@ -0,0 +1,62 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#define BOOST_FT_AUTODETECT_CALLING_CONVENTIONS
+
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/function_types/function_type.hpp>
+#include <boost/function_types/function_pointer.hpp>
+#include <boost/function_types/function_reference.hpp>
+#include <boost/function_types/is_callable_builtin.hpp>
+
+#ifndef BOOST_FT_CC_STDCALL
+# error "test not supported with this compiler/platform"
+#endif
+
+namespace ft = boost::function_types;
+namespace mpl = boost::mpl;
+
+typedef ft::stdcall_cc cc;
+typedef ft::default_cc dc;
+
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< ft::function_type<mpl::vector<void>,cc>::type, cc >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< ft::function_pointer<mpl::vector<void>,cc>::type, cc >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< ft::function_reference<mpl::vector<void>,cc>::type, cc >
+));
+
+BOOST_MPL_ASSERT((
+ ft::is_callable_builtin< ft::function_pointer<mpl::vector<void> >::type, dc >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< ft::function_type<mpl::vector<void>, cc>::type, dc >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< ft::function_pointer<mpl::vector<void>,cc>::type, dc >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< ft::function_reference<mpl::vector<void>,cc>::type, dc >
+));
+
+BOOST_MPL_ASSERT_NOT((
+ ft::is_callable_builtin< ft::function_pointer<mpl::vector<void> >::type, cc >
+));
+
+
+
diff --git a/test/decomposition/class_type_transform.cpp b/test/decomposition/class_type_transform.cpp
new file mode 100644
index 0000000..f007a40
--- /dev/null
+++ b/test/decomposition/class_type_transform.cpp
@@ -0,0 +1,62 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/add_pointer.hpp>
+
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/at.hpp>
+#include <boost/mpl/placeholders.hpp>
+#include <boost/mpl/always.hpp>
+
+#include <boost/function_types/components.hpp>
+#include <boost/function_types/parameter_types.hpp>
+
+using namespace boost;
+namespace ft = function_types;
+using boost::mpl::placeholders::_;
+
+class C;
+typedef C (C::*mem_func_ptr)();
+class X;
+
+BOOST_MPL_ASSERT((
+ is_same< mpl::at_c<
+ ft::components<mem_func_ptr, add_pointer<_> >
+ ,1 >::type, C* >
+));
+BOOST_MPL_ASSERT((
+ is_same< mpl::at_c<
+ ft::components<mem_func_ptr, add_pointer< add_pointer<_> > >
+ ,1 >::type, C** >
+));
+BOOST_MPL_ASSERT((
+ is_same< mpl::at_c<
+ ft::components<mem_func_ptr, mpl::always<X> >
+ ,1 >::type, X >
+));
+
+BOOST_MPL_ASSERT((
+ is_same< mpl::at_c<
+ ft::parameter_types<mem_func_ptr, add_pointer<_> >
+ ,0 >::type, C* >
+));
+BOOST_MPL_ASSERT((
+ is_same< mpl::at_c<
+ ft::parameter_types<mem_func_ptr, add_pointer< add_pointer<_> > >
+ ,0 >::type, C** >
+));
+BOOST_MPL_ASSERT((
+ is_same< mpl::at_c<
+ ft::parameter_types<mem_func_ptr, mpl::always<X> >
+ ,0 >::type, X >
+));
+
+
+
+
diff --git a/test/decomposition/components.cpp b/test/decomposition/components.cpp
new file mode 100644
index 0000000..60cebde
--- /dev/null
+++ b/test/decomposition/components.cpp
@@ -0,0 +1,59 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/equal.hpp>
+
+#include <boost/function_types/components.hpp>
+
+namespace ft = boost::function_types;
+namespace mpl = boost::mpl;
+
+class C;
+typedef C func();
+typedef C (*func_ptr)(int);
+typedef C (&func_ref)(int,int);
+typedef C (C::*mem_func_ptr)();
+typedef C (C::*c_mem_func_ptr)(int) const;
+typedef C (C::*v_mem_func_ptr)(int,int) volatile;
+typedef C (C::*cv_mem_func_ptr)(int,int,int) const volatile;
+typedef int C::* mem_ptr;
+
+BOOST_MPL_ASSERT((
+ mpl::equal< ft::components<func>::types, mpl::vector<C> >
+));
+
+BOOST_MPL_ASSERT((
+ mpl::equal< ft::components<func_ptr>::types, mpl::vector<C,int> >
+));
+
+BOOST_MPL_ASSERT((
+ mpl::equal< ft::components<func_ref>::types, mpl::vector<C,int,int> >
+));
+
+BOOST_MPL_ASSERT((
+ mpl::equal< ft::components<mem_func_ptr>::types, mpl::vector<C,C &> >
+));
+
+BOOST_MPL_ASSERT((
+ mpl::equal< ft::components<c_mem_func_ptr>::types, mpl::vector<C,C const &,int> >
+));
+
+BOOST_MPL_ASSERT((
+ mpl::equal< ft::components<v_mem_func_ptr>::types, mpl::vector<C,C volatile &,int,int> >
+));
+
+BOOST_MPL_ASSERT((
+ mpl::equal< ft::components<cv_mem_func_ptr>::types, mpl::vector<C,C const volatile &,int,int,int> >
+));
+
+BOOST_MPL_ASSERT((
+ mpl::equal< ft::components<mem_ptr>::types, mpl::vector<int &,C&> >
+));
+
diff --git a/test/decomposition/components_seq.cpp b/test/decomposition/components_seq.cpp
new file mode 100644
index 0000000..ad5f590
--- /dev/null
+++ b/test/decomposition/components_seq.cpp
@@ -0,0 +1,75 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/type_traits/is_same.hpp>
+
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/equal.hpp>
+
+#include <boost/mpl/front.hpp>
+#include <boost/mpl/back.hpp>
+#include <boost/mpl/at.hpp>
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/clear.hpp>
+#include <boost/mpl/push_front.hpp>
+#include <boost/mpl/pop_front.hpp>
+#include <boost/mpl/push_back.hpp>
+#include <boost/mpl/pop_back.hpp>
+#include <boost/mpl/size.hpp>
+#include <boost/mpl/empty.hpp>
+
+#include <boost/function_types/components.hpp>
+
+namespace ft = boost::function_types;
+namespace mpl = boost::mpl;
+using boost::is_same;
+
+class C;
+typedef C (C::* mem_func_ptr)(int);
+typedef ft::components<mem_func_ptr> c;
+
+
+// front
+BOOST_MPL_ASSERT(( is_same< ::boost::mpl::front<c>::type, C > ));
+
+// back
+BOOST_MPL_ASSERT(( is_same< ::boost::mpl::back<c>::type, int > ));
+
+// at
+BOOST_MPL_ASSERT(( is_same< ::boost::mpl::at_c<c,0>::type, C > ));
+BOOST_MPL_ASSERT(( is_same< ::boost::mpl::at_c<c,1>::type, C & > ));
+BOOST_MPL_ASSERT(( is_same< ::boost::mpl::at_c<c,2>::type, int > ));
+
+// begin/end
+BOOST_MPL_ASSERT(( mpl::equal< c, mpl::vector<C,C &, int> > ));
+
+
+// clear
+BOOST_MPL_ASSERT(( mpl::equal< mpl::clear<c>, mpl::vector<> > ));
+
+// push_front
+BOOST_MPL_ASSERT(( mpl::equal< mpl::push_front<c,C>::type, mpl::vector<C,C,C &,int> > ));
+
+// pop_front
+BOOST_MPL_ASSERT(( mpl::equal< mpl::pop_front<c>::type, mpl::vector<C &,int> > ));
+
+// push_back
+BOOST_MPL_ASSERT(( mpl::equal< mpl::push_back<c,C>::type, mpl::vector<C,C &,int,C> > ));
+
+// pop_back
+BOOST_MPL_ASSERT(( mpl::equal< mpl::pop_back<c>::type, mpl::vector<C,C &> > ));
+
+
+// size
+BOOST_MPL_ASSERT_RELATION( ::boost::mpl::size<c>::value, ==, 3 );
+
+// empty
+BOOST_MPL_ASSERT_NOT(( mpl::empty<c> ));
+BOOST_MPL_ASSERT(( mpl::empty< mpl::clear<c> > ));
+
diff --git a/test/decomposition/function_arity.cpp b/test/decomposition/function_arity.cpp
new file mode 100644
index 0000000..219c2c6
--- /dev/null
+++ b/test/decomposition/function_arity.cpp
@@ -0,0 +1,31 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+
+#include <boost/function_types/function_arity.hpp>
+
+class C;
+typedef C func();
+typedef C (*func_ptr)(int);
+typedef C (&func_ref)(int,int);
+typedef C (C::*mem_func_ptr)();
+typedef C (C::*c_mem_func_ptr)(int) const;
+typedef C (C::*v_mem_func_ptr)(int,int) volatile;
+typedef C (C::*cv_mem_func_ptr)(int,int,int) const volatile;
+typedef int C::* mem_ptr;
+
+BOOST_MPL_ASSERT_RELATION( ::boost::function_types::function_arity<func>::value, ==, 0 );
+BOOST_MPL_ASSERT_RELATION( ::boost::function_types::function_arity<func_ptr>::value, ==, 1 );
+BOOST_MPL_ASSERT_RELATION( ::boost::function_types::function_arity<func_ref>::value, ==, 2 );
+BOOST_MPL_ASSERT_RELATION( ::boost::function_types::function_arity<mem_func_ptr>::value, ==, 1 );
+BOOST_MPL_ASSERT_RELATION( ::boost::function_types::function_arity<c_mem_func_ptr>::value, ==, 2 );
+BOOST_MPL_ASSERT_RELATION( ::boost::function_types::function_arity<v_mem_func_ptr>::value, ==, 3 );
+BOOST_MPL_ASSERT_RELATION( ::boost::function_types::function_arity<cv_mem_func_ptr>::value, ==, 4 );
+BOOST_MPL_ASSERT_RELATION( ::boost::function_types::function_arity<mem_ptr>::value, ==, 1 );
+
diff --git a/test/decomposition/function_arity_fail.cpp b/test/decomposition/function_arity_fail.cpp
new file mode 100644
index 0000000..39a7c74
--- /dev/null
+++ b/test/decomposition/function_arity_fail.cpp
@@ -0,0 +1,19 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/function_types/function_arity.hpp>
+
+
+namespace ft = boost::function_types;
+
+class C;
+
+typedef ft::function_arity<C>::type error_1;
+typedef ft::function_arity<int>::type error_2;
+typedef ft::function_arity<void>::type error_3;
+
diff --git a/test/decomposition/parameter_types.cpp b/test/decomposition/parameter_types.cpp
new file mode 100644
index 0000000..5feb1a8
--- /dev/null
+++ b/test/decomposition/parameter_types.cpp
@@ -0,0 +1,59 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/equal.hpp>
+
+#include <boost/function_types/parameter_types.hpp>
+
+
+namespace ft = boost::function_types;
+namespace mpl = boost::mpl;
+
+class C;
+typedef C func(C);
+typedef C (*func_ptr)(C,int);
+typedef C (&func_ref)();
+typedef C (C::*mem_func_ptr)(C,int);
+typedef C (C::*c_mem_func_ptr)(C,C) const;
+typedef C (C::*v_mem_func_ptr)(C) volatile;
+typedef C (C::*cv_mem_func_ptr)() const volatile;
+typedef C C::*mem_ptr;
+
+BOOST_MPL_ASSERT((
+ mpl::equal< ft::parameter_types<func>, mpl::vector<C> >
+));
+
+BOOST_MPL_ASSERT((
+ mpl::equal< ft::parameter_types<func_ptr>::type, mpl::vector<C,int> >
+));
+
+BOOST_MPL_ASSERT((
+ mpl::equal< ft::parameter_types<func_ref>, mpl::vector<> >
+));
+
+BOOST_MPL_ASSERT((
+ mpl::equal< ft::parameter_types<mem_func_ptr>, mpl::vector<C &,C,int> >
+));
+
+BOOST_MPL_ASSERT((
+ mpl::equal< ft::parameter_types<c_mem_func_ptr>, mpl::vector<C const &,C,C> >
+));
+
+BOOST_MPL_ASSERT((
+ mpl::equal< ft::parameter_types<v_mem_func_ptr>, mpl::vector<C volatile &,C> >
+));
+
+BOOST_MPL_ASSERT((
+ mpl::equal< ft::parameter_types<cv_mem_func_ptr>, mpl::vector<C const volatile &> >
+));
+
+BOOST_MPL_ASSERT((
+ mpl::equal< ft::parameter_types<mem_ptr>, mpl::vector<C &> >
+));
diff --git a/test/decomposition/parameter_types_fail.cpp b/test/decomposition/parameter_types_fail.cpp
new file mode 100644
index 0000000..d23e891
--- /dev/null
+++ b/test/decomposition/parameter_types_fail.cpp
@@ -0,0 +1,19 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/function_types/parameter_types.hpp>
+
+
+namespace ft = boost::function_types;
+
+class C;
+
+typedef ft::parameter_types<C>::type error_1;
+typedef ft::parameter_types<char>::type error_2;
+typedef ft::parameter_types<void>::type error_3;
+
diff --git a/test/decomposition/result_type.cpp b/test/decomposition/result_type.cpp
new file mode 100644
index 0000000..f55eb85
--- /dev/null
+++ b/test/decomposition/result_type.cpp
@@ -0,0 +1,98 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+#include <boost/function_types/result_type.hpp>
+
+
+namespace ft = boost::function_types;
+
+class C;
+typedef C func();
+typedef C const c_func();
+typedef C (*func_ptr)();
+typedef C const (*c_func_ptr)();
+typedef C (&func_ref)();
+typedef C const (&c_func_ref)();
+typedef C (C::*mem_func_ptr)();
+typedef C const (C::*c_mem_func_ptr)();
+typedef C (C::*mem_func_ptr_c)() const;
+typedef C const (C::*c_mem_func_ptr_c)() const;
+typedef C (C::*mem_func_ptr_v)() volatile;
+typedef C const (C::*c_mem_func_ptr_v)() volatile;
+typedef C (C::*mem_func_ptr_cv)() const volatile;
+typedef C const (C::*c_mem_func_ptr_cv)() const volatile;
+typedef int C::* mem_ptr;
+typedef int const C::* c_mem_ptr;
+
+BOOST_MPL_ASSERT((
+ boost::is_same<ft::result_type<func>::type,C>
+));
+
+BOOST_MPL_ASSERT((
+ boost::is_same<ft::result_type<c_func>::type,C const>
+));
+
+BOOST_MPL_ASSERT((
+ boost::is_same<ft::result_type<func_ptr>::type,C>
+));
+
+BOOST_MPL_ASSERT((
+ boost::is_same<ft::result_type<c_func_ptr>::type,C const>
+));
+
+BOOST_MPL_ASSERT((
+ boost::is_same<ft::result_type<func_ref>::type,C>
+));
+
+BOOST_MPL_ASSERT((
+ boost::is_same<ft::result_type<c_func_ref>::type,C const>
+));
+
+BOOST_MPL_ASSERT((
+ boost::is_same<ft::result_type<mem_func_ptr>::type,C>
+));
+
+BOOST_MPL_ASSERT((
+ boost::is_same<ft::result_type<c_mem_func_ptr>::type,C const>
+));
+
+BOOST_MPL_ASSERT((
+ boost::is_same<ft::result_type<mem_func_ptr_c>::type,C>
+));
+
+BOOST_MPL_ASSERT((
+ boost::is_same<ft::result_type<c_mem_func_ptr_c>::type,C const>
+));
+
+BOOST_MPL_ASSERT((
+ boost::is_same<ft::result_type<mem_func_ptr_v>::type,C>
+));
+
+BOOST_MPL_ASSERT((
+ boost::is_same<ft::result_type<c_mem_func_ptr_v>::type,C const>
+));
+
+BOOST_MPL_ASSERT((
+ boost::is_same<ft::result_type<mem_func_ptr_cv>::type,C>
+));
+
+BOOST_MPL_ASSERT((
+ boost::is_same<ft::result_type<c_mem_func_ptr_cv>::type,C const>
+));
+
+BOOST_MPL_ASSERT((
+ boost::is_same<ft::result_type<mem_ptr>::type,int&>
+));
+
+BOOST_MPL_ASSERT((
+ boost::is_same<ft::result_type<c_mem_ptr>::type,int const&>
+));
+
diff --git a/test/decomposition/result_type_fail.cpp b/test/decomposition/result_type_fail.cpp
new file mode 100644
index 0000000..c701e57
--- /dev/null
+++ b/test/decomposition/result_type_fail.cpp
@@ -0,0 +1,19 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/function_types/result_type.hpp>
+
+
+namespace ft = boost::function_types;
+
+class C;
+
+typedef ft::result_type<C>::type error_1;
+typedef ft::result_type<char>::type error_2;
+typedef ft::result_type<void>::type error_3;
+
diff --git a/test/reconfiguration/cc_preprocessing.cpp b/test/reconfiguration/cc_preprocessing.cpp
new file mode 100644
index 0000000..889645d
--- /dev/null
+++ b/test/reconfiguration/cc_preprocessing.cpp
@@ -0,0 +1,11 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#define BOOST_FT_CC_PREPROCESSING 1
+#include "simple_test.hpp"
+
diff --git a/test/reconfiguration/partial_arity_preprocessing.cpp b/test/reconfiguration/partial_arity_preprocessing.cpp
new file mode 100644
index 0000000..bd58cf9
--- /dev/null
+++ b/test/reconfiguration/partial_arity_preprocessing.cpp
@@ -0,0 +1,11 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#define BOOST_FT_MAX_ARITY 19
+#include "simple_test.hpp"
+
diff --git a/test/reconfiguration/preprocessing_mode.cpp b/test/reconfiguration/preprocessing_mode.cpp
new file mode 100644
index 0000000..d6601c4
--- /dev/null
+++ b/test/reconfiguration/preprocessing_mode.cpp
@@ -0,0 +1,11 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#define BOOST_FT_PREPROCESSING_MODE 1
+#include "simple_test.hpp"
+
diff --git a/test/reconfiguration/simple_test.hpp b/test/reconfiguration/simple_test.hpp
new file mode 100644
index 0000000..5b62a0b
--- /dev/null
+++ b/test/reconfiguration/simple_test.hpp
@@ -0,0 +1,51 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/equal.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+#include <boost/function_types/components.hpp>
+#include <boost/function_types/function_type.hpp>
+#include <boost/function_types/member_function_pointer.hpp>
+
+namespace ft = boost::function_types;
+namespace mpl = boost::mpl;
+
+class C;
+typedef void func(C &);
+typedef int (C::* mem_func_ptr)(int);
+
+typedef ft::components<func> func_components;
+typedef ft::components<mem_func_ptr> mfp_components;
+
+BOOST_MPL_ASSERT((
+ mpl::equal< func_components::types, mpl::vector<void,C &> >
+));
+BOOST_MPL_ASSERT_RELATION(
+ ::func_components::function_arity::value, ==, 1
+);
+
+BOOST_MPL_ASSERT((
+ boost::is_same< ft::function_type< mpl::vector<void,C &> >::type, func >
+));
+
+
+BOOST_MPL_ASSERT((
+ mpl::equal< mfp_components::types, mpl::vector<int,C &,int> >
+));
+BOOST_MPL_ASSERT_RELATION(
+ ::mfp_components::function_arity::value, ==, 2
+);
+
+BOOST_MPL_ASSERT((
+ boost::is_same< ft::member_function_pointer< mpl::vector<int,C &,int> >::type, mem_func_ptr >
+));
+
+
diff --git a/test/synthesis/cv_function_synthesis.cpp b/test/synthesis/cv_function_synthesis.cpp
new file mode 100644
index 0000000..b80e854
--- /dev/null
+++ b/test/synthesis/cv_function_synthesis.cpp
@@ -0,0 +1,249 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+#include <boost/function_types/function_type.hpp>
+
+namespace ft = boost::function_types;
+namespace mpl = boost::mpl;
+
+template<typename C, typename T>
+void test_non_cv(T C::*)
+{
+ BOOST_MPL_ASSERT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>,
+ ft::tag<ft::non_const,ft::non_volatile> >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>, ft::non_const >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>, ft::non_volatile >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int> >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>,
+ ft::tag<ft::const_qualified,ft::non_volatile> >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>, ft::const_qualified >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>,
+ ft::tag<ft::non_const,ft::volatile_qualified> >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT_NOT((
+ boost::is_same<
+ ft::function_type< mpl::vector<void,int>, ft::volatile_qualified >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>,
+ ft::tag<ft::const_qualified,ft::volatile_qualified> >::type
+ , T
+ >));
+}
+
+template<typename C, typename T>
+void test_c_non_v(T C::*)
+{
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>,
+ ft::tag<ft::non_const,ft::non_volatile> >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>, ft::non_const >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>, ft::non_volatile >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int> >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>,
+ ft::tag<ft::const_qualified,ft::non_volatile> >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>, ft::const_qualified >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>,
+ ft::tag<ft::non_const,ft::volatile_qualified> >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT_NOT((
+ boost::is_same<
+ ft::function_type< mpl::vector<void,int>, ft::volatile_qualified >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>,
+ ft::tag<ft::const_qualified,ft::volatile_qualified> >::type
+ , T
+ >));
+}
+
+template<typename C, typename T>
+void test_v_non_c(T C::*)
+{
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>,
+ ft::tag<ft::non_const,ft::non_volatile> >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>, ft::non_const >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>, ft::non_volatile >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int> >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>,
+ ft::tag<ft::const_qualified,ft::non_volatile> >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>, ft::const_qualified >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>,
+ ft::tag<ft::non_const,ft::volatile_qualified> >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT((
+ boost::is_same<
+ ft::function_type< mpl::vector<void,int>, ft::volatile_qualified >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>,
+ ft::tag<ft::const_qualified,ft::volatile_qualified> >::type
+ , T
+ >));
+}
+
+template<typename C, typename T>
+void test_cv(T C::*)
+{
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>,
+ ft::tag<ft::non_const,ft::non_volatile> >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>, ft::non_const >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>, ft::non_volatile >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int> >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>,
+ ft::tag<ft::const_qualified,ft::non_volatile> >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>, ft::const_qualified >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT_NOT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>,
+ ft::tag<ft::non_const,ft::volatile_qualified> >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT_NOT((
+ boost::is_same<
+ ft::function_type< mpl::vector<void,int>, ft::volatile_qualified >::type
+ , T
+ >));
+
+ BOOST_MPL_ASSERT(( boost::is_same<
+ ft::function_type< mpl::vector<void,int>,
+ ft::tag<ft::const_qualified,ft::volatile_qualified> >::type
+ , T
+ >));
+}
+
+
+struct C
+{
+ void non_cv(int) { }
+ void c_non_v(int) const { }
+ void v_non_c(int) volatile { }
+ void cv(int) const volatile { }
+};
+
+void instanitate()
+{
+ test_non_cv(& C::non_cv);
+ test_c_non_v(& C::c_non_v);
+ test_v_non_c(& C::v_non_c);
+ test_cv(& C::cv);
+}
+
diff --git a/test/synthesis/function_pointer.cpp b/test/synthesis/function_pointer.cpp
new file mode 100644
index 0000000..1150934
--- /dev/null
+++ b/test/synthesis/function_pointer.cpp
@@ -0,0 +1,24 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/function_types/function_pointer.hpp>
+
+namespace ft = boost::function_types;
+namespace mpl = boost::mpl;
+
+using boost::is_same;
+
+typedef int (* expected)(int,int);
+
+BOOST_MPL_ASSERT((
+ is_same< ft::function_pointer< mpl::vector<int,int,int> >::type, expected >
+));
+
diff --git a/test/synthesis/function_reference.cpp b/test/synthesis/function_reference.cpp
new file mode 100644
index 0000000..92fa714
--- /dev/null
+++ b/test/synthesis/function_reference.cpp
@@ -0,0 +1,24 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/function_types/function_reference.hpp>
+
+namespace ft = boost::function_types;
+namespace mpl = boost::mpl;
+
+using boost::is_same;
+
+typedef int (& expected)(int);
+
+BOOST_MPL_ASSERT((
+ is_same< ft::function_reference< mpl::vector<int,int> >::type, expected >
+));
+
diff --git a/test/synthesis/function_type.cpp b/test/synthesis/function_type.cpp
new file mode 100644
index 0000000..bb08ce7
--- /dev/null
+++ b/test/synthesis/function_type.cpp
@@ -0,0 +1,23 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/function_types/function_type.hpp>
+
+namespace ft = boost::function_types;
+namespace mpl = boost::mpl;
+using boost::is_same;
+
+typedef int expected(int,int);
+
+BOOST_MPL_ASSERT((
+ is_same< ft::function_type< mpl::vector<int,int,int> >::type, expected >
+));
+
diff --git a/test/synthesis/mem_func_ptr_cv1.cpp b/test/synthesis/mem_func_ptr_cv1.cpp
new file mode 100644
index 0000000..b1f70be
--- /dev/null
+++ b/test/synthesis/mem_func_ptr_cv1.cpp
@@ -0,0 +1,94 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/function_types/member_function_pointer.hpp>
+
+namespace ft = boost::function_types;
+namespace mpl = boost::mpl;
+using boost::is_same;
+
+class C;
+
+typedef int (C::* expected1)(int);
+typedef int (C::* expected2)(int) const;
+typedef int (C::* expected3)(int) volatile;
+typedef int (C::* expected4)(int) const volatile;
+
+// implicitly specified cv qualification
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer< mpl::vector<int,C,int> >::type
+ , expected1 >
+));
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer< mpl::vector<int,C const,int> >::type
+ , expected2 >
+));
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer<
+ mpl::vector<int,C volatile,int> >::type
+ , expected3 >
+));
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer<
+ mpl::vector<int,C const volatile,int> >::type
+ , expected4 >
+));
+
+// implicit & explicit/overrides
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer<
+ mpl::vector<int,C const volatile,int>
+ , ft::tag<ft::non_const, ft::non_volatile> >::type
+ , expected1 >
+));
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer< mpl::vector<int,C volatile,int>,
+ ft::tag<ft::const_qualified, ft::non_volatile> >::type
+ , expected2 >
+));
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer< mpl::vector<int,C const,int>,
+ ft::tag<ft::non_const, ft::volatile_qualified> >::type
+ , expected3 >
+));
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer< mpl::vector<int,C const,int>,
+ ft::tag<ft::const_qualified, ft::volatile_qualified> >::type
+ , expected4 >
+));
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer< mpl::vector<int,C volatile,int>,
+ ft::tag<ft::const_qualified, ft::volatile_qualified> >::type
+ , expected4 >
+));
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer< mpl::vector<int,C volatile,int>
+ , ft::const_qualified >::type
+ , expected4 >
+));
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer< mpl::vector<int,C const,int>
+ , ft::volatile_qualified >::type
+ , expected4 >
+));
+
+
diff --git a/test/synthesis/mem_func_ptr_cv2.cpp b/test/synthesis/mem_func_ptr_cv2.cpp
new file mode 100644
index 0000000..007efa0
--- /dev/null
+++ b/test/synthesis/mem_func_ptr_cv2.cpp
@@ -0,0 +1,94 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/function_types/member_function_pointer.hpp>
+
+namespace ft = boost::function_types;
+namespace mpl = boost::mpl;
+using boost::is_same;
+
+class C;
+
+typedef int (C::* expected1)(int);
+typedef int (C::* expected2)(int) const;
+typedef int (C::* expected3)(int) volatile;
+typedef int (C::* expected4)(int) const volatile;
+
+// implicitly specified cv qualification
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer< mpl::vector<int,C &,int> >::type
+ , expected1 >
+));
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer< mpl::vector<int,C const &,int> >::type
+ , expected2 >
+));
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer<
+ mpl::vector<int,C volatile &,int> >::type
+ , expected3 >
+));
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer<
+ mpl::vector<int,C const volatile &,int> >::type
+ , expected4 >
+));
+
+// implicit & explicit/overrides
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer<
+ mpl::vector<int,C const volatile &,int>
+ , ft::tag<ft::non_const, ft::non_volatile> >::type
+ , expected1 >
+));
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer< mpl::vector<int,C volatile &,int>,
+ ft::tag<ft::const_qualified, ft::non_volatile> >::type
+ , expected2 >
+));
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer< mpl::vector<int,C const &,int>,
+ ft::tag<ft::non_const, ft::volatile_qualified> >::type
+ , expected3 >
+));
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer< mpl::vector<int,C const &,int>,
+ ft::tag<ft::const_qualified, ft::volatile_qualified> >::type
+ , expected4 >
+));
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer< mpl::vector<int,C volatile &,int>,
+ ft::tag<ft::const_qualified, ft::volatile_qualified> >::type
+ , expected4 >
+));
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer< mpl::vector<int,C volatile &,int>
+ , ft::const_qualified >::type
+ , expected4 >
+));
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer< mpl::vector<int,C const &,int>
+ , ft::volatile_qualified >::type
+ , expected4 >
+));
+
+
diff --git a/test/synthesis/mem_func_ptr_cv_ptr_to_this.cpp b/test/synthesis/mem_func_ptr_cv_ptr_to_this.cpp
new file mode 100644
index 0000000..1b6d906
--- /dev/null
+++ b/test/synthesis/mem_func_ptr_cv_ptr_to_this.cpp
@@ -0,0 +1,37 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/function_types/member_function_pointer.hpp>
+
+namespace ft = boost::function_types;
+namespace mpl = boost::mpl;
+using boost::is_same;
+
+class C;
+typedef int (C::* expected)();
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer< mpl::vector<int,C * const> >::type
+ , expected >
+));
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer< mpl::vector<int,C * volatile> >::type
+ , expected >
+));
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer< mpl::vector<int,C * const volatile> >::type
+ , expected >
+));
+
+
+
diff --git a/test/synthesis/member_function_pointer.cpp b/test/synthesis/member_function_pointer.cpp
new file mode 100644
index 0000000..6234c47
--- /dev/null
+++ b/test/synthesis/member_function_pointer.cpp
@@ -0,0 +1,66 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/function_types/member_function_pointer.hpp>
+
+namespace ft = boost::function_types;
+namespace mpl = boost::mpl;
+using boost::is_same;
+
+class C;
+
+typedef int (C::* expected1)(int);
+typedef int (C::* expected2)(int) const;
+typedef int (C::* expected3)(int) volatile;
+typedef int (C::* expected4)(int) const volatile;
+
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer< mpl::vector<int,C,int> >::type
+ , expected1 >
+));
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer< mpl::vector<int,C,int>,
+ ft::tag<ft::non_const, ft::non_volatile> >::type
+ , expected1 >
+));
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer< mpl::vector<int,C,int>
+ , ft::const_qualified >::type
+ , expected2 >
+));
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer< mpl::vector<int,C,int>,
+ ft::tag<ft::const_qualified, ft::non_volatile> >::type
+ , expected2 >
+));
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer< mpl::vector<int,C,int>
+ , ft::volatile_qualified >::type
+ , expected3 >
+));
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer< mpl::vector<int,C,int>,
+ ft::tag<ft::non_const, ft::volatile_qualified> >::type
+ , expected3 >
+));
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_function_pointer< mpl::vector<int,C,int>,
+ ft::tag<ft::const_qualified, ft::volatile_qualified> >::type
+ , expected4 >
+));
+
diff --git a/test/synthesis/member_object_pointer.cpp b/test/synthesis/member_object_pointer.cpp
new file mode 100644
index 0000000..65af741
--- /dev/null
+++ b/test/synthesis/member_object_pointer.cpp
@@ -0,0 +1,27 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/function_types/member_object_pointer.hpp>
+
+namespace ft = boost::function_types;
+namespace mpl = boost::mpl;
+using boost::is_same;
+
+class C;
+
+typedef int C::* expected;
+
+
+BOOST_MPL_ASSERT((
+ is_same< ft::member_object_pointer< mpl::vector<int,C> >::type
+ , expected >
+));
+
diff --git a/test/synthesis/transformation.cpp b/test/synthesis/transformation.cpp
new file mode 100644
index 0000000..3885647
--- /dev/null
+++ b/test/synthesis/transformation.cpp
@@ -0,0 +1,75 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+#include <boost/function_types/function_type.hpp>
+#include <boost/function_types/function_pointer.hpp>
+#include <boost/function_types/function_reference.hpp>
+#include <boost/function_types/member_function_pointer.hpp>
+
+namespace ft = boost::function_types;
+namespace mpl = boost::mpl;
+using boost::is_same;
+
+class C;
+
+typedef C func1(C &);
+typedef C (*func_ptr1)(C &);
+typedef C (&func_ref1)(C &);
+typedef C (C::*mem_func_ptr1)();
+
+BOOST_MPL_ASSERT(( is_same< func1, ft::function_type<func1>::type > ));
+BOOST_MPL_ASSERT(( is_same< func1, ft::function_type<func_ptr1>::type > ));
+BOOST_MPL_ASSERT(( is_same< func1, ft::function_type<func_ref1>::type > ));
+BOOST_MPL_ASSERT(( is_same< func1, ft::function_type<mem_func_ptr1>::type > ));
+
+BOOST_MPL_ASSERT(( is_same< func_ptr1, ft::function_pointer<func1>::type > ));
+BOOST_MPL_ASSERT(( is_same< func_ptr1, ft::function_pointer<func_ptr1>::type > ));
+BOOST_MPL_ASSERT(( is_same< func_ptr1, ft::function_pointer<func_ref1>::type > ));
+BOOST_MPL_ASSERT(( is_same< func_ptr1, ft::function_pointer<mem_func_ptr1>::type > ));
+
+BOOST_MPL_ASSERT(( is_same< func_ref1, ft::function_reference<func1>::type > ));
+BOOST_MPL_ASSERT(( is_same< func_ref1, ft::function_reference<func_ptr1>::type > ));
+BOOST_MPL_ASSERT(( is_same< func_ref1, ft::function_reference<func_ref1>::type > ));
+BOOST_MPL_ASSERT(( is_same< func_ref1, ft::function_reference<mem_func_ptr1>::type > ));
+
+BOOST_MPL_ASSERT(( is_same< mem_func_ptr1, ft::member_function_pointer<func1>::type > ));
+BOOST_MPL_ASSERT(( is_same< mem_func_ptr1, ft::member_function_pointer<func_ptr1>::type > ));
+BOOST_MPL_ASSERT(( is_same< mem_func_ptr1, ft::member_function_pointer<func_ref1>::type > ));
+BOOST_MPL_ASSERT(( is_same< mem_func_ptr1, ft::member_function_pointer<mem_func_ptr1>::type > ));
+
+
+typedef C func2(C const &);
+typedef C (*func_ptr2)(C const &);
+typedef C (&func_ref2)(C const &);
+typedef C (C::*mem_func_ptr2)() const;
+
+BOOST_MPL_ASSERT(( is_same< func2, ft::function_type<func2>::type > ));
+BOOST_MPL_ASSERT(( is_same< func2, ft::function_type<func_ptr2>::type > ));
+BOOST_MPL_ASSERT(( is_same< func2, ft::function_type<func_ref2>::type > ));
+BOOST_MPL_ASSERT(( is_same< func2, ft::function_type<mem_func_ptr2>::type > ));
+
+BOOST_MPL_ASSERT(( is_same< func_ptr2, ft::function_pointer<func2>::type > ));
+BOOST_MPL_ASSERT(( is_same< func_ptr2, ft::function_pointer<func_ptr2>::type > ));
+BOOST_MPL_ASSERT(( is_same< func_ptr2, ft::function_pointer<func_ref2>::type > ));
+BOOST_MPL_ASSERT(( is_same< func_ptr2, ft::function_pointer<mem_func_ptr2>::type > ));
+
+BOOST_MPL_ASSERT(( is_same< func_ref2, ft::function_reference<func2>::type > ));
+BOOST_MPL_ASSERT(( is_same< func_ref2, ft::function_reference<func_ptr2>::type > ));
+BOOST_MPL_ASSERT(( is_same< func_ref2, ft::function_reference<func_ref2>::type > ));
+BOOST_MPL_ASSERT(( is_same< func_ref2, ft::function_reference<mem_func_ptr2>::type > ));
+
+BOOST_MPL_ASSERT(( is_same< mem_func_ptr2, ft::member_function_pointer<func2>::type > ));
+BOOST_MPL_ASSERT(( is_same< mem_func_ptr2, ft::member_function_pointer<func_ptr2>::type > ));
+BOOST_MPL_ASSERT(( is_same< mem_func_ptr2, ft::member_function_pointer<func_ref2>::type > ));
+BOOST_MPL_ASSERT(( is_same< mem_func_ptr2, ft::member_function_pointer<mem_func_ptr2>::type > ));
+
+
+
diff --git a/test/synthesis/variadic_function_synthesis.cpp b/test/synthesis/variadic_function_synthesis.cpp
new file mode 100644
index 0000000..d35b319
--- /dev/null
+++ b/test/synthesis/variadic_function_synthesis.cpp
@@ -0,0 +1,63 @@
+
+// (C) Copyright Tobias Schwinger
+//
+// Use modification and distribution are subject to the boost Software License,
+// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).
+
+//------------------------------------------------------------------------------
+
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+#include <boost/function_types/function_type.hpp>
+#include <boost/function_types/function_pointer.hpp>
+#include <boost/function_types/function_reference.hpp>
+#include <boost/function_types/member_function_pointer.hpp>
+
+namespace ft = boost::function_types;
+namespace mpl = boost::mpl;
+using boost::is_same;
+
+class C;
+typedef int expected_v_1(...);
+typedef int expected_nv_1();
+typedef int (C::*expected_v_2)(...);
+typedef int (C::*expected_nv_2)();
+
+BOOST_MPL_ASSERT(( is_same<
+ ft::function_type<mpl::vector<int>, ft::variadic>::type, expected_v_1
+> ));
+
+BOOST_MPL_ASSERT(( is_same<
+ ft::function_type<mpl::vector<int>, ft::non_variadic>::type, expected_nv_1
+> ));
+
+BOOST_MPL_ASSERT(( is_same<
+ ft::function_pointer<mpl::vector<int>, ft::variadic>::type, expected_v_1 *
+> ));
+
+BOOST_MPL_ASSERT(( is_same<
+ ft::function_pointer<mpl::vector<int>, ft::non_variadic>::type
+ , expected_nv_1 *
+> ));
+
+BOOST_MPL_ASSERT(( is_same<
+ ft::function_reference<mpl::vector<int>, ft::variadic>::type, expected_v_1 &
+> ));
+
+BOOST_MPL_ASSERT(( is_same<
+ ft::function_reference<mpl::vector<int>, ft::non_variadic>::type
+ , expected_nv_1 &
+> ));
+
+BOOST_MPL_ASSERT(( is_same<
+ ft::member_function_pointer<mpl::vector<int,C>, ft::variadic>::type
+ , expected_v_2
+> ));
+
+BOOST_MPL_ASSERT(( is_same<
+ ft::member_function_pointer<mpl::vector<int,C>, ft::non_variadic>::type
+ , expected_nv_2
+> ));
+