// bslmf_nthparameter_cpp03.h                                         -*-C++-*-

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

#ifndef INCLUDED_BSLMF_NTHPARAMETER_CPP03
#define INCLUDED_BSLMF_NTHPARAMETER_CPP03

//@PURPOSE: Provide C++03 implementation for bslmf_nthparameter.h
//
//@CLASSES: See bslmf_nthparameter.h for list of classes
//
//@SEE_ALSO: bslmf_nthparameter
//
//@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_nthparameter.h

#ifdef COMPILING_BSLMF_NTHPARAMETER_H

namespace BloombergLP {

namespace bslmf {

                        // ===========================
                        // class template NthParameter
                        // ===========================

struct NthParameter_Sentinel;  // Declared but not defined

#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
// {{{ BEGIN GENERATED CODE
// Command line: sim_cpp11_features.pl bslmf_nthparameter.h
#ifndef BSLMF_NTHPARAMETER_VARIADIC_LIMIT
#define BSLMF_NTHPARAMETER_VARIADIC_LIMIT 15
#endif
#ifndef BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A
#define BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A BSLMF_NTHPARAMETER_VARIADIC_LIMIT
#endif

template <std::size_t t_N,
          class t_FIRST_PARAM = NthParameter_Sentinel
#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 0
        , class t_PARAMS_0 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 0

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 1
        , class t_PARAMS_1 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 1

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 2
        , class t_PARAMS_2 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 2

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 3
        , class t_PARAMS_3 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 3

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 4
        , class t_PARAMS_4 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 4

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 5
        , class t_PARAMS_5 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 5

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 6
        , class t_PARAMS_6 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 6

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 7
        , class t_PARAMS_7 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 7

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 8
        , class t_PARAMS_8 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 8

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 9
        , class t_PARAMS_9 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 9

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 10
        , class t_PARAMS_10 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 10

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 11
        , class t_PARAMS_11 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 11

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 12
        , class t_PARAMS_12 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 12

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 13
        , class t_PARAMS_13 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 13

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 14
        , class t_PARAMS_14 = BSLS_COMPILERFEATURES_NILT
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 14
        , class = BSLS_COMPILERFEATURES_NILT>
struct NthParameter;

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 0
template <std::size_t t_N, class t_FIRST_PARAM>
struct NthParameter<t_N, t_FIRST_PARAM> {

    typedef typename NthParameter<t_N - 1>::Type Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 0

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 1
template <std::size_t t_N, class t_FIRST_PARAM, class t_PARAMS_01>
struct NthParameter<t_N, t_FIRST_PARAM, t_PARAMS_01> {

    typedef typename NthParameter<t_N - 1, t_PARAMS_01>::Type Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 1

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 2
template <std::size_t t_N, class t_FIRST_PARAM, class t_PARAMS_01,
                                                class t_PARAMS_02>
struct NthParameter<t_N, t_FIRST_PARAM, t_PARAMS_01,
                                        t_PARAMS_02> {

    typedef typename NthParameter<t_N - 1, t_PARAMS_01,
                                           t_PARAMS_02>::Type Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 2

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 3
template <std::size_t t_N, class t_FIRST_PARAM, class t_PARAMS_01,
                                                class t_PARAMS_02,
                                                class t_PARAMS_03>
struct NthParameter<t_N, t_FIRST_PARAM, t_PARAMS_01,
                                        t_PARAMS_02,
                                        t_PARAMS_03> {

    typedef typename NthParameter<t_N - 1, t_PARAMS_01,
                                           t_PARAMS_02,
                                           t_PARAMS_03>::Type Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 3

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 4
template <std::size_t t_N, class t_FIRST_PARAM, class t_PARAMS_01,
                                                class t_PARAMS_02,
                                                class t_PARAMS_03,
                                                class t_PARAMS_04>
struct NthParameter<t_N, t_FIRST_PARAM, t_PARAMS_01,
                                        t_PARAMS_02,
                                        t_PARAMS_03,
                                        t_PARAMS_04> {

    typedef typename NthParameter<t_N - 1, t_PARAMS_01,
                                           t_PARAMS_02,
                                           t_PARAMS_03,
                                           t_PARAMS_04>::Type Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 4

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 5
template <std::size_t t_N, class t_FIRST_PARAM, class t_PARAMS_01,
                                                class t_PARAMS_02,
                                                class t_PARAMS_03,
                                                class t_PARAMS_04,
                                                class t_PARAMS_05>
struct NthParameter<t_N, t_FIRST_PARAM, t_PARAMS_01,
                                        t_PARAMS_02,
                                        t_PARAMS_03,
                                        t_PARAMS_04,
                                        t_PARAMS_05> {

    typedef typename NthParameter<t_N - 1, t_PARAMS_01,
                                           t_PARAMS_02,
                                           t_PARAMS_03,
                                           t_PARAMS_04,
                                           t_PARAMS_05>::Type Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 5

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 6
template <std::size_t t_N, class t_FIRST_PARAM, class t_PARAMS_01,
                                                class t_PARAMS_02,
                                                class t_PARAMS_03,
                                                class t_PARAMS_04,
                                                class t_PARAMS_05,
                                                class t_PARAMS_06>
struct NthParameter<t_N, t_FIRST_PARAM, t_PARAMS_01,
                                        t_PARAMS_02,
                                        t_PARAMS_03,
                                        t_PARAMS_04,
                                        t_PARAMS_05,
                                        t_PARAMS_06> {

    typedef typename NthParameter<t_N - 1, t_PARAMS_01,
                                           t_PARAMS_02,
                                           t_PARAMS_03,
                                           t_PARAMS_04,
                                           t_PARAMS_05,
                                           t_PARAMS_06>::Type Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 6

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 7
template <std::size_t t_N, class t_FIRST_PARAM, class t_PARAMS_01,
                                                class t_PARAMS_02,
                                                class t_PARAMS_03,
                                                class t_PARAMS_04,
                                                class t_PARAMS_05,
                                                class t_PARAMS_06,
                                                class t_PARAMS_07>
struct NthParameter<t_N, t_FIRST_PARAM, t_PARAMS_01,
                                        t_PARAMS_02,
                                        t_PARAMS_03,
                                        t_PARAMS_04,
                                        t_PARAMS_05,
                                        t_PARAMS_06,
                                        t_PARAMS_07> {

    typedef typename NthParameter<t_N - 1, t_PARAMS_01,
                                           t_PARAMS_02,
                                           t_PARAMS_03,
                                           t_PARAMS_04,
                                           t_PARAMS_05,
                                           t_PARAMS_06,
                                           t_PARAMS_07>::Type Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 7

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 8
template <std::size_t t_N, class t_FIRST_PARAM, class t_PARAMS_01,
                                                class t_PARAMS_02,
                                                class t_PARAMS_03,
                                                class t_PARAMS_04,
                                                class t_PARAMS_05,
                                                class t_PARAMS_06,
                                                class t_PARAMS_07,
                                                class t_PARAMS_08>
struct NthParameter<t_N, t_FIRST_PARAM, t_PARAMS_01,
                                        t_PARAMS_02,
                                        t_PARAMS_03,
                                        t_PARAMS_04,
                                        t_PARAMS_05,
                                        t_PARAMS_06,
                                        t_PARAMS_07,
                                        t_PARAMS_08> {

    typedef typename NthParameter<t_N - 1, t_PARAMS_01,
                                           t_PARAMS_02,
                                           t_PARAMS_03,
                                           t_PARAMS_04,
                                           t_PARAMS_05,
                                           t_PARAMS_06,
                                           t_PARAMS_07,
                                           t_PARAMS_08>::Type Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 8

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 9
template <std::size_t t_N, class t_FIRST_PARAM, class t_PARAMS_01,
                                                class t_PARAMS_02,
                                                class t_PARAMS_03,
                                                class t_PARAMS_04,
                                                class t_PARAMS_05,
                                                class t_PARAMS_06,
                                                class t_PARAMS_07,
                                                class t_PARAMS_08,
                                                class t_PARAMS_09>
struct NthParameter<t_N, t_FIRST_PARAM, t_PARAMS_01,
                                        t_PARAMS_02,
                                        t_PARAMS_03,
                                        t_PARAMS_04,
                                        t_PARAMS_05,
                                        t_PARAMS_06,
                                        t_PARAMS_07,
                                        t_PARAMS_08,
                                        t_PARAMS_09> {

    typedef typename NthParameter<t_N - 1, t_PARAMS_01,
                                           t_PARAMS_02,
                                           t_PARAMS_03,
                                           t_PARAMS_04,
                                           t_PARAMS_05,
                                           t_PARAMS_06,
                                           t_PARAMS_07,
                                           t_PARAMS_08,
                                           t_PARAMS_09>::Type Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 9

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 10
template <std::size_t t_N, class t_FIRST_PARAM, class t_PARAMS_01,
                                                class t_PARAMS_02,
                                                class t_PARAMS_03,
                                                class t_PARAMS_04,
                                                class t_PARAMS_05,
                                                class t_PARAMS_06,
                                                class t_PARAMS_07,
                                                class t_PARAMS_08,
                                                class t_PARAMS_09,
                                                class t_PARAMS_10>
struct NthParameter<t_N, t_FIRST_PARAM, t_PARAMS_01,
                                        t_PARAMS_02,
                                        t_PARAMS_03,
                                        t_PARAMS_04,
                                        t_PARAMS_05,
                                        t_PARAMS_06,
                                        t_PARAMS_07,
                                        t_PARAMS_08,
                                        t_PARAMS_09,
                                        t_PARAMS_10> {

    typedef typename NthParameter<t_N - 1, t_PARAMS_01,
                                           t_PARAMS_02,
                                           t_PARAMS_03,
                                           t_PARAMS_04,
                                           t_PARAMS_05,
                                           t_PARAMS_06,
                                           t_PARAMS_07,
                                           t_PARAMS_08,
                                           t_PARAMS_09,
                                           t_PARAMS_10>::Type Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 10

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 11
template <std::size_t t_N, class t_FIRST_PARAM, class t_PARAMS_01,
                                                class t_PARAMS_02,
                                                class t_PARAMS_03,
                                                class t_PARAMS_04,
                                                class t_PARAMS_05,
                                                class t_PARAMS_06,
                                                class t_PARAMS_07,
                                                class t_PARAMS_08,
                                                class t_PARAMS_09,
                                                class t_PARAMS_10,
                                                class t_PARAMS_11>
struct NthParameter<t_N, t_FIRST_PARAM, t_PARAMS_01,
                                        t_PARAMS_02,
                                        t_PARAMS_03,
                                        t_PARAMS_04,
                                        t_PARAMS_05,
                                        t_PARAMS_06,
                                        t_PARAMS_07,
                                        t_PARAMS_08,
                                        t_PARAMS_09,
                                        t_PARAMS_10,
                                        t_PARAMS_11> {

    typedef typename NthParameter<t_N - 1, t_PARAMS_01,
                                           t_PARAMS_02,
                                           t_PARAMS_03,
                                           t_PARAMS_04,
                                           t_PARAMS_05,
                                           t_PARAMS_06,
                                           t_PARAMS_07,
                                           t_PARAMS_08,
                                           t_PARAMS_09,
                                           t_PARAMS_10,
                                           t_PARAMS_11>::Type Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 11

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 12
template <std::size_t t_N, class t_FIRST_PARAM, class t_PARAMS_01,
                                                class t_PARAMS_02,
                                                class t_PARAMS_03,
                                                class t_PARAMS_04,
                                                class t_PARAMS_05,
                                                class t_PARAMS_06,
                                                class t_PARAMS_07,
                                                class t_PARAMS_08,
                                                class t_PARAMS_09,
                                                class t_PARAMS_10,
                                                class t_PARAMS_11,
                                                class t_PARAMS_12>
struct NthParameter<t_N, t_FIRST_PARAM, t_PARAMS_01,
                                        t_PARAMS_02,
                                        t_PARAMS_03,
                                        t_PARAMS_04,
                                        t_PARAMS_05,
                                        t_PARAMS_06,
                                        t_PARAMS_07,
                                        t_PARAMS_08,
                                        t_PARAMS_09,
                                        t_PARAMS_10,
                                        t_PARAMS_11,
                                        t_PARAMS_12> {

    typedef typename NthParameter<t_N - 1, t_PARAMS_01,
                                           t_PARAMS_02,
                                           t_PARAMS_03,
                                           t_PARAMS_04,
                                           t_PARAMS_05,
                                           t_PARAMS_06,
                                           t_PARAMS_07,
                                           t_PARAMS_08,
                                           t_PARAMS_09,
                                           t_PARAMS_10,
                                           t_PARAMS_11,
                                           t_PARAMS_12>::Type Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 12

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 13
template <std::size_t t_N, class t_FIRST_PARAM, class t_PARAMS_01,
                                                class t_PARAMS_02,
                                                class t_PARAMS_03,
                                                class t_PARAMS_04,
                                                class t_PARAMS_05,
                                                class t_PARAMS_06,
                                                class t_PARAMS_07,
                                                class t_PARAMS_08,
                                                class t_PARAMS_09,
                                                class t_PARAMS_10,
                                                class t_PARAMS_11,
                                                class t_PARAMS_12,
                                                class t_PARAMS_13>
struct NthParameter<t_N, t_FIRST_PARAM, t_PARAMS_01,
                                        t_PARAMS_02,
                                        t_PARAMS_03,
                                        t_PARAMS_04,
                                        t_PARAMS_05,
                                        t_PARAMS_06,
                                        t_PARAMS_07,
                                        t_PARAMS_08,
                                        t_PARAMS_09,
                                        t_PARAMS_10,
                                        t_PARAMS_11,
                                        t_PARAMS_12,
                                        t_PARAMS_13> {

    typedef typename NthParameter<t_N - 1, t_PARAMS_01,
                                           t_PARAMS_02,
                                           t_PARAMS_03,
                                           t_PARAMS_04,
                                           t_PARAMS_05,
                                           t_PARAMS_06,
                                           t_PARAMS_07,
                                           t_PARAMS_08,
                                           t_PARAMS_09,
                                           t_PARAMS_10,
                                           t_PARAMS_11,
                                           t_PARAMS_12,
                                           t_PARAMS_13>::Type Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 13

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 14
template <std::size_t t_N, class t_FIRST_PARAM, class t_PARAMS_01,
                                                class t_PARAMS_02,
                                                class t_PARAMS_03,
                                                class t_PARAMS_04,
                                                class t_PARAMS_05,
                                                class t_PARAMS_06,
                                                class t_PARAMS_07,
                                                class t_PARAMS_08,
                                                class t_PARAMS_09,
                                                class t_PARAMS_10,
                                                class t_PARAMS_11,
                                                class t_PARAMS_12,
                                                class t_PARAMS_13,
                                                class t_PARAMS_14>
struct NthParameter<t_N, t_FIRST_PARAM, t_PARAMS_01,
                                        t_PARAMS_02,
                                        t_PARAMS_03,
                                        t_PARAMS_04,
                                        t_PARAMS_05,
                                        t_PARAMS_06,
                                        t_PARAMS_07,
                                        t_PARAMS_08,
                                        t_PARAMS_09,
                                        t_PARAMS_10,
                                        t_PARAMS_11,
                                        t_PARAMS_12,
                                        t_PARAMS_13,
                                        t_PARAMS_14> {

    typedef typename NthParameter<t_N - 1, t_PARAMS_01,
                                           t_PARAMS_02,
                                           t_PARAMS_03,
                                           t_PARAMS_04,
                                           t_PARAMS_05,
                                           t_PARAMS_06,
                                           t_PARAMS_07,
                                           t_PARAMS_08,
                                           t_PARAMS_09,
                                           t_PARAMS_10,
                                           t_PARAMS_11,
                                           t_PARAMS_12,
                                           t_PARAMS_13,
                                           t_PARAMS_14>::Type Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 14

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 15
template <std::size_t t_N, class t_FIRST_PARAM, class t_PARAMS_01,
                                                class t_PARAMS_02,
                                                class t_PARAMS_03,
                                                class t_PARAMS_04,
                                                class t_PARAMS_05,
                                                class t_PARAMS_06,
                                                class t_PARAMS_07,
                                                class t_PARAMS_08,
                                                class t_PARAMS_09,
                                                class t_PARAMS_10,
                                                class t_PARAMS_11,
                                                class t_PARAMS_12,
                                                class t_PARAMS_13,
                                                class t_PARAMS_14,
                                                class t_PARAMS_15>
struct NthParameter<t_N, t_FIRST_PARAM, t_PARAMS_01,
                                        t_PARAMS_02,
                                        t_PARAMS_03,
                                        t_PARAMS_04,
                                        t_PARAMS_05,
                                        t_PARAMS_06,
                                        t_PARAMS_07,
                                        t_PARAMS_08,
                                        t_PARAMS_09,
                                        t_PARAMS_10,
                                        t_PARAMS_11,
                                        t_PARAMS_12,
                                        t_PARAMS_13,
                                        t_PARAMS_14,
                                        t_PARAMS_15> {

    typedef typename NthParameter<t_N - 1, t_PARAMS_01,
                                           t_PARAMS_02,
                                           t_PARAMS_03,
                                           t_PARAMS_04,
                                           t_PARAMS_05,
                                           t_PARAMS_06,
                                           t_PARAMS_07,
                                           t_PARAMS_08,
                                           t_PARAMS_09,
                                           t_PARAMS_10,
                                           t_PARAMS_11,
                                           t_PARAMS_12,
                                           t_PARAMS_13,
                                           t_PARAMS_14,
                                           t_PARAMS_15>::Type Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 15



#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 0
template <class t_FIRST_PARAM>
struct NthParameter<0, t_FIRST_PARAM> {

    typedef t_FIRST_PARAM Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 0

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 1
template <class t_FIRST_PARAM, class t_PARAMS_01>
struct NthParameter<0, t_FIRST_PARAM, t_PARAMS_01> {

    typedef t_FIRST_PARAM Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 1

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 2
template <class t_FIRST_PARAM, class t_PARAMS_01,
                               class t_PARAMS_02>
struct NthParameter<0, t_FIRST_PARAM, t_PARAMS_01,
                                      t_PARAMS_02> {

    typedef t_FIRST_PARAM Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 2

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 3
template <class t_FIRST_PARAM, class t_PARAMS_01,
                               class t_PARAMS_02,
                               class t_PARAMS_03>
struct NthParameter<0, t_FIRST_PARAM, t_PARAMS_01,
                                      t_PARAMS_02,
                                      t_PARAMS_03> {

    typedef t_FIRST_PARAM Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 3

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 4
template <class t_FIRST_PARAM, class t_PARAMS_01,
                               class t_PARAMS_02,
                               class t_PARAMS_03,
                               class t_PARAMS_04>
struct NthParameter<0, t_FIRST_PARAM, t_PARAMS_01,
                                      t_PARAMS_02,
                                      t_PARAMS_03,
                                      t_PARAMS_04> {

    typedef t_FIRST_PARAM Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 4

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 5
template <class t_FIRST_PARAM, class t_PARAMS_01,
                               class t_PARAMS_02,
                               class t_PARAMS_03,
                               class t_PARAMS_04,
                               class t_PARAMS_05>
struct NthParameter<0, t_FIRST_PARAM, t_PARAMS_01,
                                      t_PARAMS_02,
                                      t_PARAMS_03,
                                      t_PARAMS_04,
                                      t_PARAMS_05> {

    typedef t_FIRST_PARAM Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 5

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 6
template <class t_FIRST_PARAM, class t_PARAMS_01,
                               class t_PARAMS_02,
                               class t_PARAMS_03,
                               class t_PARAMS_04,
                               class t_PARAMS_05,
                               class t_PARAMS_06>
struct NthParameter<0, t_FIRST_PARAM, t_PARAMS_01,
                                      t_PARAMS_02,
                                      t_PARAMS_03,
                                      t_PARAMS_04,
                                      t_PARAMS_05,
                                      t_PARAMS_06> {

    typedef t_FIRST_PARAM Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 6

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 7
template <class t_FIRST_PARAM, class t_PARAMS_01,
                               class t_PARAMS_02,
                               class t_PARAMS_03,
                               class t_PARAMS_04,
                               class t_PARAMS_05,
                               class t_PARAMS_06,
                               class t_PARAMS_07>
struct NthParameter<0, t_FIRST_PARAM, t_PARAMS_01,
                                      t_PARAMS_02,
                                      t_PARAMS_03,
                                      t_PARAMS_04,
                                      t_PARAMS_05,
                                      t_PARAMS_06,
                                      t_PARAMS_07> {

    typedef t_FIRST_PARAM Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 7

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 8
template <class t_FIRST_PARAM, class t_PARAMS_01,
                               class t_PARAMS_02,
                               class t_PARAMS_03,
                               class t_PARAMS_04,
                               class t_PARAMS_05,
                               class t_PARAMS_06,
                               class t_PARAMS_07,
                               class t_PARAMS_08>
struct NthParameter<0, t_FIRST_PARAM, t_PARAMS_01,
                                      t_PARAMS_02,
                                      t_PARAMS_03,
                                      t_PARAMS_04,
                                      t_PARAMS_05,
                                      t_PARAMS_06,
                                      t_PARAMS_07,
                                      t_PARAMS_08> {

    typedef t_FIRST_PARAM Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 8

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 9
template <class t_FIRST_PARAM, class t_PARAMS_01,
                               class t_PARAMS_02,
                               class t_PARAMS_03,
                               class t_PARAMS_04,
                               class t_PARAMS_05,
                               class t_PARAMS_06,
                               class t_PARAMS_07,
                               class t_PARAMS_08,
                               class t_PARAMS_09>
struct NthParameter<0, t_FIRST_PARAM, t_PARAMS_01,
                                      t_PARAMS_02,
                                      t_PARAMS_03,
                                      t_PARAMS_04,
                                      t_PARAMS_05,
                                      t_PARAMS_06,
                                      t_PARAMS_07,
                                      t_PARAMS_08,
                                      t_PARAMS_09> {

    typedef t_FIRST_PARAM Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 9

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 10
template <class t_FIRST_PARAM, class t_PARAMS_01,
                               class t_PARAMS_02,
                               class t_PARAMS_03,
                               class t_PARAMS_04,
                               class t_PARAMS_05,
                               class t_PARAMS_06,
                               class t_PARAMS_07,
                               class t_PARAMS_08,
                               class t_PARAMS_09,
                               class t_PARAMS_10>
struct NthParameter<0, t_FIRST_PARAM, t_PARAMS_01,
                                      t_PARAMS_02,
                                      t_PARAMS_03,
                                      t_PARAMS_04,
                                      t_PARAMS_05,
                                      t_PARAMS_06,
                                      t_PARAMS_07,
                                      t_PARAMS_08,
                                      t_PARAMS_09,
                                      t_PARAMS_10> {

    typedef t_FIRST_PARAM Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 10

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 11
template <class t_FIRST_PARAM, class t_PARAMS_01,
                               class t_PARAMS_02,
                               class t_PARAMS_03,
                               class t_PARAMS_04,
                               class t_PARAMS_05,
                               class t_PARAMS_06,
                               class t_PARAMS_07,
                               class t_PARAMS_08,
                               class t_PARAMS_09,
                               class t_PARAMS_10,
                               class t_PARAMS_11>
struct NthParameter<0, t_FIRST_PARAM, t_PARAMS_01,
                                      t_PARAMS_02,
                                      t_PARAMS_03,
                                      t_PARAMS_04,
                                      t_PARAMS_05,
                                      t_PARAMS_06,
                                      t_PARAMS_07,
                                      t_PARAMS_08,
                                      t_PARAMS_09,
                                      t_PARAMS_10,
                                      t_PARAMS_11> {

    typedef t_FIRST_PARAM Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 11

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 12
template <class t_FIRST_PARAM, class t_PARAMS_01,
                               class t_PARAMS_02,
                               class t_PARAMS_03,
                               class t_PARAMS_04,
                               class t_PARAMS_05,
                               class t_PARAMS_06,
                               class t_PARAMS_07,
                               class t_PARAMS_08,
                               class t_PARAMS_09,
                               class t_PARAMS_10,
                               class t_PARAMS_11,
                               class t_PARAMS_12>
struct NthParameter<0, t_FIRST_PARAM, t_PARAMS_01,
                                      t_PARAMS_02,
                                      t_PARAMS_03,
                                      t_PARAMS_04,
                                      t_PARAMS_05,
                                      t_PARAMS_06,
                                      t_PARAMS_07,
                                      t_PARAMS_08,
                                      t_PARAMS_09,
                                      t_PARAMS_10,
                                      t_PARAMS_11,
                                      t_PARAMS_12> {

    typedef t_FIRST_PARAM Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 12

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 13
template <class t_FIRST_PARAM, class t_PARAMS_01,
                               class t_PARAMS_02,
                               class t_PARAMS_03,
                               class t_PARAMS_04,
                               class t_PARAMS_05,
                               class t_PARAMS_06,
                               class t_PARAMS_07,
                               class t_PARAMS_08,
                               class t_PARAMS_09,
                               class t_PARAMS_10,
                               class t_PARAMS_11,
                               class t_PARAMS_12,
                               class t_PARAMS_13>
struct NthParameter<0, t_FIRST_PARAM, t_PARAMS_01,
                                      t_PARAMS_02,
                                      t_PARAMS_03,
                                      t_PARAMS_04,
                                      t_PARAMS_05,
                                      t_PARAMS_06,
                                      t_PARAMS_07,
                                      t_PARAMS_08,
                                      t_PARAMS_09,
                                      t_PARAMS_10,
                                      t_PARAMS_11,
                                      t_PARAMS_12,
                                      t_PARAMS_13> {

    typedef t_FIRST_PARAM Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 13

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 14
template <class t_FIRST_PARAM, class t_PARAMS_01,
                               class t_PARAMS_02,
                               class t_PARAMS_03,
                               class t_PARAMS_04,
                               class t_PARAMS_05,
                               class t_PARAMS_06,
                               class t_PARAMS_07,
                               class t_PARAMS_08,
                               class t_PARAMS_09,
                               class t_PARAMS_10,
                               class t_PARAMS_11,
                               class t_PARAMS_12,
                               class t_PARAMS_13,
                               class t_PARAMS_14>
struct NthParameter<0, t_FIRST_PARAM, t_PARAMS_01,
                                      t_PARAMS_02,
                                      t_PARAMS_03,
                                      t_PARAMS_04,
                                      t_PARAMS_05,
                                      t_PARAMS_06,
                                      t_PARAMS_07,
                                      t_PARAMS_08,
                                      t_PARAMS_09,
                                      t_PARAMS_10,
                                      t_PARAMS_11,
                                      t_PARAMS_12,
                                      t_PARAMS_13,
                                      t_PARAMS_14> {

    typedef t_FIRST_PARAM Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 14

#if BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 15
template <class t_FIRST_PARAM, class t_PARAMS_01,
                               class t_PARAMS_02,
                               class t_PARAMS_03,
                               class t_PARAMS_04,
                               class t_PARAMS_05,
                               class t_PARAMS_06,
                               class t_PARAMS_07,
                               class t_PARAMS_08,
                               class t_PARAMS_09,
                               class t_PARAMS_10,
                               class t_PARAMS_11,
                               class t_PARAMS_12,
                               class t_PARAMS_13,
                               class t_PARAMS_14,
                               class t_PARAMS_15>
struct NthParameter<0, t_FIRST_PARAM, t_PARAMS_01,
                                      t_PARAMS_02,
                                      t_PARAMS_03,
                                      t_PARAMS_04,
                                      t_PARAMS_05,
                                      t_PARAMS_06,
                                      t_PARAMS_07,
                                      t_PARAMS_08,
                                      t_PARAMS_09,
                                      t_PARAMS_10,
                                      t_PARAMS_11,
                                      t_PARAMS_12,
                                      t_PARAMS_13,
                                      t_PARAMS_14,
                                      t_PARAMS_15> {

    typedef t_FIRST_PARAM Type;
};
#endif  // BSLMF_NTHPARAMETER_VARIADIC_LIMIT_A >= 15

#else
// The generated code below is a workaround for the absence of perfect
// forwarding in some compilers.

template <std::size_t t_N,
          class t_FIRST_PARAM = NthParameter_Sentinel,
          class... t_PARAMS>
struct NthParameter {

    typedef typename NthParameter<t_N - 1, t_PARAMS...>::Type Type;
};


template <class t_FIRST_PARAM, class... t_PARAMS>
struct NthParameter<0, t_FIRST_PARAM, t_PARAMS...> {

    typedef t_FIRST_PARAM Type;
};

// }}} END GENERATED CODE
#endif

/// Specialization of `NthParameter` for when `t_N` exceeds the actual
/// number of parameters.
template <>
struct NthParameter<0, NthParameter_Sentinel> {

#ifdef BSLS_COMPILERFEATURES_SUPPORT_VARIADIC_TEMPLATES
    // No 'Type' member is defined.
#else
    // There are no dependent parameters because this is a full specialization.
    // When used in another simulated variadic template, the compiler may
    // attempt to evaluate the 'Type' member even when that client is not
    // actually instantiated.  To avoid a spurious compilation error, we must
    // therefore make sure that 'Type' is defined, even if it is defined as an
    // incomplete class.
    typedef NthParameter_Sentinel Type;
#endif
};

}  // close package namespace
}  // close enterprise namespace

#else // if ! defined(DEFINED_BSLMF_NTHPARAMETER_H)
# error Not valid except when included from bslmf_nthparameter.h
#endif // ! defined(COMPILING_BSLMF_NTHPARAMETER_H)

#endif // ! defined(INCLUDED_BSLMF_NTHPARAMETER_CPP03)

// ----------------------------------------------------------------------------
// Copyright 2019 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 ----------------------------------
