// bslmf_functionpointertraits_cpp03.h                                -*-C++-*-

// Automatically generated file.  **DO NOT EDIT**

#ifndef INCLUDED_BSLMF_FUNCTIONPOINTERTRAITS_CPP03
#define INCLUDED_BSLMF_FUNCTIONPOINTERTRAITS_CPP03

//@PURPOSE: Provide C++03 implementation for bslmf_functionpointertraits.h
//
//@CLASSES: See bslmf_functionpointertraits.h for list of classes
//
//@SEE_ALSO: bslmf_functionpointertraits
//
//@DESCRIPTION:  This component is the C++03 translation of a C++11 component,
// generated by the 'sim_cpp11_features.pl' program.  If the original header
// contains any specially delimited regions of C++11 code, then this generated
// file contains the C++03 equivalent, i.e., with variadic templates expanded
// and rvalue-references replaced by 'bslmf::MovableRef' objects.  The header
// code in this file is designed to be '#include'd into the original header
// when compiling with a C++03 compiler.  If there are no specially delimited
// regions of C++11 code, then this header contains no code and is not
// '#include'd in the original header.
//
// Generated on Sun Sep  1 05:38:31 2024
// Command line: sim_cpp11_features.pl bslmf_functionpointertraits.h

#ifdef COMPILING_BSLMF_FUNCTIONPOINTERTRAITS_H

namespace BloombergLP {
namespace bslmf {

/// C++ function pointer linkage tag.
struct FunctionPointerCPlusPlusLinkage {
};

/// C function pointer linkage tag.
struct FunctionPointerCLinkage {
};

                        // ===========================
                        // class FunctionPointerTraits
                        // ===========================

/// This class gives information about the specified `t_PROTOTYPE`.  The
/// general definition gives no information, but specializations for
/// function pointers types define nested types `ResultType`,
/// `ArgumentList`, and `Linkage`.
template <class t_PROTOTYPE>
struct FunctionPointerTraits {

    enum { IS_FUNCTION_POINTER = 0 };
};

                          // =======================
                          // class IsFunctionPointer
                          // =======================

/// This template determines if the specified `t_PROTOTYPE` is a free (i.e.,
/// non-member) function pointer.  `value` is defined as 1 if the specified
/// `t_PROTOTYPE` is a function pointer type, and a zero value otherwise.
template <class t_PROTOTYPE>
struct IsFunctionPointer
: bsl::integral_constant<
      bool,
      FunctionPointerTraits<t_PROTOTYPE>::IS_FUNCTION_POINTER> {
};

// ---- Anything below this line is implementation specific.  Do not use. ----

#if defined(BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT_TYPES) &&                  \
    !defined(BSLS_COMPILERFEATURES_SUPPORT_VARIADIC_TEMPLATES)
    // All of our compilers which identify 'noexcept' as part of the type
    // system (a C++17 piece of functionality) similarly also support variadic
    // templates, so we refrain from having the dead code to support this case.
#   error Feature not supported for compilers without variadic templates
#endif

                // ---------------------------
                // class FunctionPointerTraits
                // ---------------------------

#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
// {{{ BEGIN GENERATED CODE
// Command line: sim_cpp11_features.pl bslmf_functionpointertraits.h
#ifndef BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT
#define BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT 14
#endif
#ifndef BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A
#define BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT
#endif

#if defined(BSLS_PLATFORM_CMP_CLANG) && (!defined(BSLS_PLATFORM_OS_DARWIN)    \
        || BSLS_PLATFORM_CMP_VER_MAJOR > 130000)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-volatile"
#endif

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 0
template <class t_BSLMF_RETURN>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)()> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 0 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType();
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 0

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 1
template <class t_BSLMF_RETURN, class t_ARGS_01>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 0 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 1

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 2
template <class t_BSLMF_RETURN, class t_ARGS_01,
                                class t_ARGS_02>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01,
                                                t_ARGS_02)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 0 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01,
                                                      t_ARGS_02);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 2

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 3
template <class t_BSLMF_RETURN, class t_ARGS_01,
                                class t_ARGS_02,
                                class t_ARGS_03>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01,
                                                t_ARGS_02,
                                                t_ARGS_03)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 0 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01,
                                                      t_ARGS_02,
                                                      t_ARGS_03);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 3

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 4
template <class t_BSLMF_RETURN, class t_ARGS_01,
                                class t_ARGS_02,
                                class t_ARGS_03,
                                class t_ARGS_04>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01,
                                                t_ARGS_02,
                                                t_ARGS_03,
                                                t_ARGS_04)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 0 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01,
                                                      t_ARGS_02,
                                                      t_ARGS_03,
                                                      t_ARGS_04);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 4

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 5
template <class t_BSLMF_RETURN, class t_ARGS_01,
                                class t_ARGS_02,
                                class t_ARGS_03,
                                class t_ARGS_04,
                                class t_ARGS_05>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01,
                                                t_ARGS_02,
                                                t_ARGS_03,
                                                t_ARGS_04,
                                                t_ARGS_05)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 0 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01,
                                                      t_ARGS_02,
                                                      t_ARGS_03,
                                                      t_ARGS_04,
                                                      t_ARGS_05);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 5

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 6
template <class t_BSLMF_RETURN, class t_ARGS_01,
                                class t_ARGS_02,
                                class t_ARGS_03,
                                class t_ARGS_04,
                                class t_ARGS_05,
                                class t_ARGS_06>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01,
                                                t_ARGS_02,
                                                t_ARGS_03,
                                                t_ARGS_04,
                                                t_ARGS_05,
                                                t_ARGS_06)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 0 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01,
                                                      t_ARGS_02,
                                                      t_ARGS_03,
                                                      t_ARGS_04,
                                                      t_ARGS_05,
                                                      t_ARGS_06);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 6

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 7
template <class t_BSLMF_RETURN, class t_ARGS_01,
                                class t_ARGS_02,
                                class t_ARGS_03,
                                class t_ARGS_04,
                                class t_ARGS_05,
                                class t_ARGS_06,
                                class t_ARGS_07>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01,
                                                t_ARGS_02,
                                                t_ARGS_03,
                                                t_ARGS_04,
                                                t_ARGS_05,
                                                t_ARGS_06,
                                                t_ARGS_07)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 0 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01,
                                                      t_ARGS_02,
                                                      t_ARGS_03,
                                                      t_ARGS_04,
                                                      t_ARGS_05,
                                                      t_ARGS_06,
                                                      t_ARGS_07);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 7

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 8
template <class t_BSLMF_RETURN, class t_ARGS_01,
                                class t_ARGS_02,
                                class t_ARGS_03,
                                class t_ARGS_04,
                                class t_ARGS_05,
                                class t_ARGS_06,
                                class t_ARGS_07,
                                class t_ARGS_08>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01,
                                                t_ARGS_02,
                                                t_ARGS_03,
                                                t_ARGS_04,
                                                t_ARGS_05,
                                                t_ARGS_06,
                                                t_ARGS_07,
                                                t_ARGS_08)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 0 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01,
                                                      t_ARGS_02,
                                                      t_ARGS_03,
                                                      t_ARGS_04,
                                                      t_ARGS_05,
                                                      t_ARGS_06,
                                                      t_ARGS_07,
                                                      t_ARGS_08);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 8

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 9
template <class t_BSLMF_RETURN, class t_ARGS_01,
                                class t_ARGS_02,
                                class t_ARGS_03,
                                class t_ARGS_04,
                                class t_ARGS_05,
                                class t_ARGS_06,
                                class t_ARGS_07,
                                class t_ARGS_08,
                                class t_ARGS_09>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01,
                                                t_ARGS_02,
                                                t_ARGS_03,
                                                t_ARGS_04,
                                                t_ARGS_05,
                                                t_ARGS_06,
                                                t_ARGS_07,
                                                t_ARGS_08,
                                                t_ARGS_09)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 0 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01,
                                                      t_ARGS_02,
                                                      t_ARGS_03,
                                                      t_ARGS_04,
                                                      t_ARGS_05,
                                                      t_ARGS_06,
                                                      t_ARGS_07,
                                                      t_ARGS_08,
                                                      t_ARGS_09);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 9

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 10
template <class t_BSLMF_RETURN, class t_ARGS_01,
                                class t_ARGS_02,
                                class t_ARGS_03,
                                class t_ARGS_04,
                                class t_ARGS_05,
                                class t_ARGS_06,
                                class t_ARGS_07,
                                class t_ARGS_08,
                                class t_ARGS_09,
                                class t_ARGS_10>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01,
                                                t_ARGS_02,
                                                t_ARGS_03,
                                                t_ARGS_04,
                                                t_ARGS_05,
                                                t_ARGS_06,
                                                t_ARGS_07,
                                                t_ARGS_08,
                                                t_ARGS_09,
                                                t_ARGS_10)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 0 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01,
                                                      t_ARGS_02,
                                                      t_ARGS_03,
                                                      t_ARGS_04,
                                                      t_ARGS_05,
                                                      t_ARGS_06,
                                                      t_ARGS_07,
                                                      t_ARGS_08,
                                                      t_ARGS_09,
                                                      t_ARGS_10);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 10

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 11
template <class t_BSLMF_RETURN, class t_ARGS_01,
                                class t_ARGS_02,
                                class t_ARGS_03,
                                class t_ARGS_04,
                                class t_ARGS_05,
                                class t_ARGS_06,
                                class t_ARGS_07,
                                class t_ARGS_08,
                                class t_ARGS_09,
                                class t_ARGS_10,
                                class t_ARGS_11>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01,
                                                t_ARGS_02,
                                                t_ARGS_03,
                                                t_ARGS_04,
                                                t_ARGS_05,
                                                t_ARGS_06,
                                                t_ARGS_07,
                                                t_ARGS_08,
                                                t_ARGS_09,
                                                t_ARGS_10,
                                                t_ARGS_11)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 0 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10,
                              t_ARGS_11>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01,
                                                      t_ARGS_02,
                                                      t_ARGS_03,
                                                      t_ARGS_04,
                                                      t_ARGS_05,
                                                      t_ARGS_06,
                                                      t_ARGS_07,
                                                      t_ARGS_08,
                                                      t_ARGS_09,
                                                      t_ARGS_10,
                                                      t_ARGS_11);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 11

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 12
template <class t_BSLMF_RETURN, class t_ARGS_01,
                                class t_ARGS_02,
                                class t_ARGS_03,
                                class t_ARGS_04,
                                class t_ARGS_05,
                                class t_ARGS_06,
                                class t_ARGS_07,
                                class t_ARGS_08,
                                class t_ARGS_09,
                                class t_ARGS_10,
                                class t_ARGS_11,
                                class t_ARGS_12>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01,
                                                t_ARGS_02,
                                                t_ARGS_03,
                                                t_ARGS_04,
                                                t_ARGS_05,
                                                t_ARGS_06,
                                                t_ARGS_07,
                                                t_ARGS_08,
                                                t_ARGS_09,
                                                t_ARGS_10,
                                                t_ARGS_11,
                                                t_ARGS_12)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 0 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10,
                              t_ARGS_11,
                              t_ARGS_12>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01,
                                                      t_ARGS_02,
                                                      t_ARGS_03,
                                                      t_ARGS_04,
                                                      t_ARGS_05,
                                                      t_ARGS_06,
                                                      t_ARGS_07,
                                                      t_ARGS_08,
                                                      t_ARGS_09,
                                                      t_ARGS_10,
                                                      t_ARGS_11,
                                                      t_ARGS_12);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 12

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 13
template <class t_BSLMF_RETURN, class t_ARGS_01,
                                class t_ARGS_02,
                                class t_ARGS_03,
                                class t_ARGS_04,
                                class t_ARGS_05,
                                class t_ARGS_06,
                                class t_ARGS_07,
                                class t_ARGS_08,
                                class t_ARGS_09,
                                class t_ARGS_10,
                                class t_ARGS_11,
                                class t_ARGS_12,
                                class t_ARGS_13>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01,
                                                t_ARGS_02,
                                                t_ARGS_03,
                                                t_ARGS_04,
                                                t_ARGS_05,
                                                t_ARGS_06,
                                                t_ARGS_07,
                                                t_ARGS_08,
                                                t_ARGS_09,
                                                t_ARGS_10,
                                                t_ARGS_11,
                                                t_ARGS_12,
                                                t_ARGS_13)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 0 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10,
                              t_ARGS_11,
                              t_ARGS_12,
                              t_ARGS_13>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01,
                                                      t_ARGS_02,
                                                      t_ARGS_03,
                                                      t_ARGS_04,
                                                      t_ARGS_05,
                                                      t_ARGS_06,
                                                      t_ARGS_07,
                                                      t_ARGS_08,
                                                      t_ARGS_09,
                                                      t_ARGS_10,
                                                      t_ARGS_11,
                                                      t_ARGS_12,
                                                      t_ARGS_13);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 13

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 14
template <class t_BSLMF_RETURN, class t_ARGS_01,
                                class t_ARGS_02,
                                class t_ARGS_03,
                                class t_ARGS_04,
                                class t_ARGS_05,
                                class t_ARGS_06,
                                class t_ARGS_07,
                                class t_ARGS_08,
                                class t_ARGS_09,
                                class t_ARGS_10,
                                class t_ARGS_11,
                                class t_ARGS_12,
                                class t_ARGS_13,
                                class t_ARGS_14>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01,
                                                t_ARGS_02,
                                                t_ARGS_03,
                                                t_ARGS_04,
                                                t_ARGS_05,
                                                t_ARGS_06,
                                                t_ARGS_07,
                                                t_ARGS_08,
                                                t_ARGS_09,
                                                t_ARGS_10,
                                                t_ARGS_11,
                                                t_ARGS_12,
                                                t_ARGS_13,
                                                t_ARGS_14)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 0 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10,
                              t_ARGS_11,
                              t_ARGS_12,
                              t_ARGS_13,
                              t_ARGS_14>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01,
                                                      t_ARGS_02,
                                                      t_ARGS_03,
                                                      t_ARGS_04,
                                                      t_ARGS_05,
                                                      t_ARGS_06,
                                                      t_ARGS_07,
                                                      t_ARGS_08,
                                                      t_ARGS_09,
                                                      t_ARGS_10,
                                                      t_ARGS_11,
                                                      t_ARGS_12,
                                                      t_ARGS_13,
                                                      t_ARGS_14);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 14


#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 0
template <class t_BSLMF_RETURN>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(...)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 1 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(...);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 0

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 1
template <class t_BSLMF_RETURN, class t_ARGS_01>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01,...)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 1 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01,...);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 1

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 2
template <class t_BSLMF_RETURN, class t_ARGS_01,
                                class t_ARGS_02>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01,
                                                t_ARGS_02,...)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 1 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01,
                                                      t_ARGS_02,...);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 2

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 3
template <class t_BSLMF_RETURN, class t_ARGS_01,
                                class t_ARGS_02,
                                class t_ARGS_03>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01,
                                                t_ARGS_02,
                                                t_ARGS_03,...)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 1 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01,
                                                      t_ARGS_02,
                                                      t_ARGS_03,...);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 3

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 4
template <class t_BSLMF_RETURN, class t_ARGS_01,
                                class t_ARGS_02,
                                class t_ARGS_03,
                                class t_ARGS_04>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01,
                                                t_ARGS_02,
                                                t_ARGS_03,
                                                t_ARGS_04,...)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 1 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01,
                                                      t_ARGS_02,
                                                      t_ARGS_03,
                                                      t_ARGS_04,...);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 4

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 5
template <class t_BSLMF_RETURN, class t_ARGS_01,
                                class t_ARGS_02,
                                class t_ARGS_03,
                                class t_ARGS_04,
                                class t_ARGS_05>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01,
                                                t_ARGS_02,
                                                t_ARGS_03,
                                                t_ARGS_04,
                                                t_ARGS_05,...)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 1 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01,
                                                      t_ARGS_02,
                                                      t_ARGS_03,
                                                      t_ARGS_04,
                                                      t_ARGS_05,...);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 5

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 6
template <class t_BSLMF_RETURN, class t_ARGS_01,
                                class t_ARGS_02,
                                class t_ARGS_03,
                                class t_ARGS_04,
                                class t_ARGS_05,
                                class t_ARGS_06>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01,
                                                t_ARGS_02,
                                                t_ARGS_03,
                                                t_ARGS_04,
                                                t_ARGS_05,
                                                t_ARGS_06,...)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 1 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01,
                                                      t_ARGS_02,
                                                      t_ARGS_03,
                                                      t_ARGS_04,
                                                      t_ARGS_05,
                                                      t_ARGS_06,...);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 6

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 7
template <class t_BSLMF_RETURN, class t_ARGS_01,
                                class t_ARGS_02,
                                class t_ARGS_03,
                                class t_ARGS_04,
                                class t_ARGS_05,
                                class t_ARGS_06,
                                class t_ARGS_07>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01,
                                                t_ARGS_02,
                                                t_ARGS_03,
                                                t_ARGS_04,
                                                t_ARGS_05,
                                                t_ARGS_06,
                                                t_ARGS_07,...)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 1 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01,
                                                      t_ARGS_02,
                                                      t_ARGS_03,
                                                      t_ARGS_04,
                                                      t_ARGS_05,
                                                      t_ARGS_06,
                                                      t_ARGS_07,...);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 7

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 8
template <class t_BSLMF_RETURN, class t_ARGS_01,
                                class t_ARGS_02,
                                class t_ARGS_03,
                                class t_ARGS_04,
                                class t_ARGS_05,
                                class t_ARGS_06,
                                class t_ARGS_07,
                                class t_ARGS_08>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01,
                                                t_ARGS_02,
                                                t_ARGS_03,
                                                t_ARGS_04,
                                                t_ARGS_05,
                                                t_ARGS_06,
                                                t_ARGS_07,
                                                t_ARGS_08,...)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 1 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01,
                                                      t_ARGS_02,
                                                      t_ARGS_03,
                                                      t_ARGS_04,
                                                      t_ARGS_05,
                                                      t_ARGS_06,
                                                      t_ARGS_07,
                                                      t_ARGS_08,...);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 8

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 9
template <class t_BSLMF_RETURN, class t_ARGS_01,
                                class t_ARGS_02,
                                class t_ARGS_03,
                                class t_ARGS_04,
                                class t_ARGS_05,
                                class t_ARGS_06,
                                class t_ARGS_07,
                                class t_ARGS_08,
                                class t_ARGS_09>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01,
                                                t_ARGS_02,
                                                t_ARGS_03,
                                                t_ARGS_04,
                                                t_ARGS_05,
                                                t_ARGS_06,
                                                t_ARGS_07,
                                                t_ARGS_08,
                                                t_ARGS_09,...)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 1 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01,
                                                      t_ARGS_02,
                                                      t_ARGS_03,
                                                      t_ARGS_04,
                                                      t_ARGS_05,
                                                      t_ARGS_06,
                                                      t_ARGS_07,
                                                      t_ARGS_08,
                                                      t_ARGS_09,...);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 9

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 10
template <class t_BSLMF_RETURN, class t_ARGS_01,
                                class t_ARGS_02,
                                class t_ARGS_03,
                                class t_ARGS_04,
                                class t_ARGS_05,
                                class t_ARGS_06,
                                class t_ARGS_07,
                                class t_ARGS_08,
                                class t_ARGS_09,
                                class t_ARGS_10>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01,
                                                t_ARGS_02,
                                                t_ARGS_03,
                                                t_ARGS_04,
                                                t_ARGS_05,
                                                t_ARGS_06,
                                                t_ARGS_07,
                                                t_ARGS_08,
                                                t_ARGS_09,
                                                t_ARGS_10,...)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 1 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01,
                                                      t_ARGS_02,
                                                      t_ARGS_03,
                                                      t_ARGS_04,
                                                      t_ARGS_05,
                                                      t_ARGS_06,
                                                      t_ARGS_07,
                                                      t_ARGS_08,
                                                      t_ARGS_09,
                                                      t_ARGS_10,...);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 10

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 11
template <class t_BSLMF_RETURN, class t_ARGS_01,
                                class t_ARGS_02,
                                class t_ARGS_03,
                                class t_ARGS_04,
                                class t_ARGS_05,
                                class t_ARGS_06,
                                class t_ARGS_07,
                                class t_ARGS_08,
                                class t_ARGS_09,
                                class t_ARGS_10,
                                class t_ARGS_11>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01,
                                                t_ARGS_02,
                                                t_ARGS_03,
                                                t_ARGS_04,
                                                t_ARGS_05,
                                                t_ARGS_06,
                                                t_ARGS_07,
                                                t_ARGS_08,
                                                t_ARGS_09,
                                                t_ARGS_10,
                                                t_ARGS_11,...)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 1 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10,
                              t_ARGS_11>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01,
                                                      t_ARGS_02,
                                                      t_ARGS_03,
                                                      t_ARGS_04,
                                                      t_ARGS_05,
                                                      t_ARGS_06,
                                                      t_ARGS_07,
                                                      t_ARGS_08,
                                                      t_ARGS_09,
                                                      t_ARGS_10,
                                                      t_ARGS_11,...);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 11

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 12
template <class t_BSLMF_RETURN, class t_ARGS_01,
                                class t_ARGS_02,
                                class t_ARGS_03,
                                class t_ARGS_04,
                                class t_ARGS_05,
                                class t_ARGS_06,
                                class t_ARGS_07,
                                class t_ARGS_08,
                                class t_ARGS_09,
                                class t_ARGS_10,
                                class t_ARGS_11,
                                class t_ARGS_12>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01,
                                                t_ARGS_02,
                                                t_ARGS_03,
                                                t_ARGS_04,
                                                t_ARGS_05,
                                                t_ARGS_06,
                                                t_ARGS_07,
                                                t_ARGS_08,
                                                t_ARGS_09,
                                                t_ARGS_10,
                                                t_ARGS_11,
                                                t_ARGS_12,...)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 1 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10,
                              t_ARGS_11,
                              t_ARGS_12>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01,
                                                      t_ARGS_02,
                                                      t_ARGS_03,
                                                      t_ARGS_04,
                                                      t_ARGS_05,
                                                      t_ARGS_06,
                                                      t_ARGS_07,
                                                      t_ARGS_08,
                                                      t_ARGS_09,
                                                      t_ARGS_10,
                                                      t_ARGS_11,
                                                      t_ARGS_12,...);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 12

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 13
template <class t_BSLMF_RETURN, class t_ARGS_01,
                                class t_ARGS_02,
                                class t_ARGS_03,
                                class t_ARGS_04,
                                class t_ARGS_05,
                                class t_ARGS_06,
                                class t_ARGS_07,
                                class t_ARGS_08,
                                class t_ARGS_09,
                                class t_ARGS_10,
                                class t_ARGS_11,
                                class t_ARGS_12,
                                class t_ARGS_13>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01,
                                                t_ARGS_02,
                                                t_ARGS_03,
                                                t_ARGS_04,
                                                t_ARGS_05,
                                                t_ARGS_06,
                                                t_ARGS_07,
                                                t_ARGS_08,
                                                t_ARGS_09,
                                                t_ARGS_10,
                                                t_ARGS_11,
                                                t_ARGS_12,
                                                t_ARGS_13,...)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 1 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10,
                              t_ARGS_11,
                              t_ARGS_12,
                              t_ARGS_13>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01,
                                                      t_ARGS_02,
                                                      t_ARGS_03,
                                                      t_ARGS_04,
                                                      t_ARGS_05,
                                                      t_ARGS_06,
                                                      t_ARGS_07,
                                                      t_ARGS_08,
                                                      t_ARGS_09,
                                                      t_ARGS_10,
                                                      t_ARGS_11,
                                                      t_ARGS_12,
                                                      t_ARGS_13,...);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 13

#if BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 14
template <class t_BSLMF_RETURN, class t_ARGS_01,
                                class t_ARGS_02,
                                class t_ARGS_03,
                                class t_ARGS_04,
                                class t_ARGS_05,
                                class t_ARGS_06,
                                class t_ARGS_07,
                                class t_ARGS_08,
                                class t_ARGS_09,
                                class t_ARGS_10,
                                class t_ARGS_11,
                                class t_ARGS_12,
                                class t_ARGS_13,
                                class t_ARGS_14>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS_01,
                                                t_ARGS_02,
                                                t_ARGS_03,
                                                t_ARGS_04,
                                                t_ARGS_05,
                                                t_ARGS_06,
                                                t_ARGS_07,
                                                t_ARGS_08,
                                                t_ARGS_09,
                                                t_ARGS_10,
                                                t_ARGS_11,
                                                t_ARGS_12,
                                                t_ARGS_13,
                                                t_ARGS_14,...)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 1 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS_01,
                              t_ARGS_02,
                              t_ARGS_03,
                              t_ARGS_04,
                              t_ARGS_05,
                              t_ARGS_06,
                              t_ARGS_07,
                              t_ARGS_08,
                              t_ARGS_09,
                              t_ARGS_10,
                              t_ARGS_11,
                              t_ARGS_12,
                              t_ARGS_13,
                              t_ARGS_14>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS_01,
                                                      t_ARGS_02,
                                                      t_ARGS_03,
                                                      t_ARGS_04,
                                                      t_ARGS_05,
                                                      t_ARGS_06,
                                                      t_ARGS_07,
                                                      t_ARGS_08,
                                                      t_ARGS_09,
                                                      t_ARGS_10,
                                                      t_ARGS_11,
                                                      t_ARGS_12,
                                                      t_ARGS_13,
                                                      t_ARGS_14,...);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};
#endif  // BSLMF_FUNCTIONPOINTERTRAITS_VARIADIC_LIMIT_A >= 14


#if defined(BSLS_PLATFORM_CMP_CLANG)
#pragma clang diagnostic pop
#endif
#else
// The generated code below is a workaround for the absence of perfect
// forwarding in some compilers.

#if defined(BSLS_PLATFORM_CMP_CLANG) && (!defined(BSLS_PLATFORM_OS_DARWIN)    \
        || BSLS_PLATFORM_CMP_VER_MAJOR > 130000)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-volatile"
#endif

template <class t_BSLMF_RETURN, class... t_ARGS>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS...)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 0 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS...);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};

template <class t_BSLMF_RETURN, class... t_ARGS>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS...,...)> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 0
    };
    enum { e_IS_VARARG = 1 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS...,...);
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};

#if defined(BSLS_PLATFORM_CMP_CLANG)
#pragma clang diagnostic pop
#endif

// }}} END GENERATED CODE
#endif

#if defined(BSLS_PLATFORM_CMP_MSVC)
// Microsoft Visual C++ has a problem matching 'T * const' pointers to the
// appropriate partial specialization, whereas it will match a 'T const'
// specialization.  We could use the Microsoft fix on all platforms, but why
// instantiate more traits than necessary when testing pointer traits of
// cv-qualified types that are not function pointers?

template <class t_PROTOTYPE>
struct FunctionPointerTraits<t_PROTOTYPE const>
: FunctionPointerTraits<t_PROTOTYPE> {
    // This class gives information about the specified 't_PROTOTYPE'.  The
    // general definition gives no information, but specializations for
    // function pointers types define nested types 'ResultType',
    // 'ArgumentList', and 'Linkage'.
};

template <class t_PROTOTYPE>
struct FunctionPointerTraits<t_PROTOTYPE volatile>
: FunctionPointerTraits<t_PROTOTYPE> {
    // This class gives information about the specified 't_PROTOTYPE'.  The
    // general definition gives no information, but specializations for
    // function pointers types define nested types 'ResultType',
    // 'ArgumentList', and 'Linkage'.
};

template <class t_PROTOTYPE>
struct FunctionPointerTraits<t_PROTOTYPE const volatile>
: FunctionPointerTraits<t_PROTOTYPE> {
    // This class gives information about the specified 't_PROTOTYPE'.  The
    // general definition gives no information, but specializations for
    // function pointers types define nested types 'ResultType',
    // 'ArgumentList', and 'Linkage'.
};
#else
/// This class gives information about the specified `t_PROTOTYPE`.  The
/// general definition gives no information, but specializations for
/// function pointers types define nested types `ResultType`,
/// `ArgumentList`, and `Linkage`.
template <class t_PROTOTYPE>
struct FunctionPointerTraits<t_PROTOTYPE *const>
: FunctionPointerTraits<t_PROTOTYPE *> {
};

/// This class gives information about the specified `t_PROTOTYPE`.  The
/// general definition gives no information, but specializations for
/// function pointers types define nested types `ResultType`,
/// `ArgumentList`, and `Linkage`.
template <class t_PROTOTYPE>
struct FunctionPointerTraits<t_PROTOTYPE *volatile>
: FunctionPointerTraits<t_PROTOTYPE *> {
};

/// This class gives information about the specified `t_PROTOTYPE`.  The
/// general definition gives no information, but specializations for
/// function pointers types define nested types `ResultType`,
/// `ArgumentList`, and `Linkage`.
template <class t_PROTOTYPE>
struct FunctionPointerTraits<t_PROTOTYPE *const volatile>
: FunctionPointerTraits<t_PROTOTYPE *> {
};
// }}} END GENERATED CODE
#endif

#ifdef BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT_TYPES

#if defined(BSLS_PLATFORM_CMP_CLANG)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-volatile"
#endif

/// Specialization for `noexcept` function pointers that return
/// `t_BSLMF_RETURN` and accept a fixed number of arguments
template <class t_BSLMF_RETURN, class... t_ARGS>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS...) noexcept> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 1
    };
    enum { e_IS_VARARG = 0 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS...) noexcept;
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};

/// Specialization for `noexcept` function pointers that return
/// `t_BSLMF_RETURN` and accept variable (C-style varargs) number of
/// arguments
template <class t_BSLMF_RETURN, class... t_ARGS>
struct FunctionPointerTraits<t_BSLMF_RETURN (*)(t_ARGS...,...) noexcept> {

    enum {
        IS_FUNCTION_POINTER = 1,
        IS_NOEXCEPT = 1
    };
    enum { e_IS_VARARG = 1 };
    typedef t_BSLMF_RETURN                     ResultType;
    typedef typename TypeList<t_ARGS...>::Type ArgumentList;
    typedef t_BSLMF_RETURN                   FuncType(t_ARGS...,...) noexcept;
    typedef FunctionPointerCPlusPlusLinkage  Linkage;
};

#if defined(BSLS_PLATFORM_CMP_CLANG)
#pragma clang diagnostic pop
#endif

#endif // BSLS_COMPILERFEATURES_SUPPORT_NOEXCEPT_TYPES

}  // close package namespace

#ifndef BDE_OPENSOURCE_PUBLICATION  // BACKWARD_COMPATIBILITY
// ============================================================================
//                           BACKWARD COMPATIBILITY
// ============================================================================

/// This alias is defined for backward compatibility.
typedef bslmf::FunctionPointerCPlusPlusLinkage
                                         bslmf_FunctionPointerCPlusPlusLinkage;

/// This alias is defined for backward compatibility.
typedef bslmf::FunctionPointerCLinkage bslmf_FunctionPointerCLinkage;

#ifdef bslmf_FunctionPointerTraits
#undef bslmf_FunctionPointerTraits
#endif
/// This alias is defined for backward compatibility.
#define bslmf_FunctionPointerTraits bslmf::FunctionPointerTraits

#ifdef bslmf_IsFunctionPointer
#undef bslmf_IsFunctionPointer
#endif
/// This alias is defined for backward compatibility.
#define bslmf_IsFunctionPointer bslmf::IsFunctionPointer
#endif  // BDE_OPENSOURCE_PUBLICATION -- BACKWARD_COMPATIBILITY

}  // close enterprise namespace

#else // if ! defined(DEFINED_BSLMF_FUNCTIONPOINTERTRAITS_H)
# error Not valid except when included from bslmf_functionpointertraits.h
#endif // ! defined(COMPILING_BSLMF_FUNCTIONPOINTERTRAITS_H)

#endif // ! defined(INCLUDED_BSLMF_FUNCTIONPOINTERTRAITS_CPP03)

// ----------------------------------------------------------------------------
// Copyright 2013 Bloomberg Finance L.P.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ----------------------------- END-OF-FILE ----------------------------------
