// Copyright (C) 2005 Arkadiy Vertleyb
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

#ifndef NDNBOOST_TYPEOF_INTEGRAL_TEMPLATE_PARAM_HPP_INCLUDED
#define NDNBOOST_TYPEOF_INTEGRAL_TEMPLATE_PARAM_HPP_INCLUDED

#define NDNBOOST_TYPEOF_unsigned (unsigned)
#define NDNBOOST_TYPEOF_signed (signed)

#define char_NDNBOOST_TYPEOF (char)
#define short_NDNBOOST_TYPEOF (short)
#define int_NDNBOOST_TYPEOF (int)
#define long_NDNBOOST_TYPEOF (long)

#define NDNBOOST_TYPEOF_char_NDNBOOST_TYPEOF (char)
#define NDNBOOST_TYPEOF_short_NDNBOOST_TYPEOF (short)
#define NDNBOOST_TYPEOF_int_NDNBOOST_TYPEOF (int)
#define NDNBOOST_TYPEOF_long_NDNBOOST_TYPEOF (long)
#define NDNBOOST_TYPEOF_bool_NDNBOOST_TYPEOF (bool)
#define NDNBOOST_TYPEOF_unsigned_NDNBOOST_TYPEOF (unsigned)
#define NDNBOOST_TYPEOF_size_t_NDNBOOST_TYPEOF (size_t)

#define NDNBOOST_TYPEOF_MAKE_OBJ_char          NDNBOOST_TYPEOF_INTEGRAL_PARAM(char)
#define NDNBOOST_TYPEOF_MAKE_OBJ_short         NDNBOOST_TYPEOF_INTEGRAL_PARAM(short)
#define NDNBOOST_TYPEOF_MAKE_OBJ_int           NDNBOOST_TYPEOF_INTEGRAL_PARAM(int)
#define NDNBOOST_TYPEOF_MAKE_OBJ_long          NDNBOOST_TYPEOF_INTEGRAL_PARAM(long)
#define NDNBOOST_TYPEOF_MAKE_OBJ_bool          NDNBOOST_TYPEOF_INTEGRAL_PARAM(bool)
#define NDNBOOST_TYPEOF_MAKE_OBJ_unsigned      NDNBOOST_TYPEOF_INTEGRAL_PARAM(unsigned)
#define NDNBOOST_TYPEOF_MAKE_OBJ_size_t        NDNBOOST_TYPEOF_INTEGRAL_PARAM(size_t)
#define NDNBOOST_TYPEOF_MAKE_OBJ_unsignedchar  NDNBOOST_TYPEOF_INTEGRAL_PARAM(unsigned char)
#define NDNBOOST_TYPEOF_MAKE_OBJ_unsignedshort NDNBOOST_TYPEOF_INTEGRAL_PARAM(unsigned short)
#define NDNBOOST_TYPEOF_MAKE_OBJ_unsignedint   NDNBOOST_TYPEOF_INTEGRAL_PARAM(unsigned int)
#define NDNBOOST_TYPEOF_MAKE_OBJ_unsignedlong  NDNBOOST_TYPEOF_INTEGRAL_PARAM(unsigned long)
#define NDNBOOST_TYPEOF_MAKE_OBJ_signedchar    NDNBOOST_TYPEOF_INTEGRAL_PARAM(signed char)
#define NDNBOOST_TYPEOF_MAKE_OBJ_signedshort   NDNBOOST_TYPEOF_INTEGRAL_PARAM(signed short)
#define NDNBOOST_TYPEOF_MAKE_OBJ_signedint     NDNBOOST_TYPEOF_INTEGRAL_PARAM(signed int)
#define NDNBOOST_TYPEOF_MAKE_OBJ_signedlong    NDNBOOST_TYPEOF_INTEGRAL_PARAM(signed long)
#define NDNBOOST_TYPEOF_MAKE_OBJ_integral(x)   NDNBOOST_TYPEOF_INTEGRAL_PARAM(x)

#define NDNBOOST_TYPEOF_INTEGRAL(X) integral(X) NDNBOOST_TYPEOF_EAT
#define NDNBOOST_TYPEOF_EAT_NDNBOOST_TYPEOF
#define NDNBOOST_TYPEOF_integral(X) (integral(X))

#define NDNBOOST_TYPEOF_INTEGRAL_PARAM(Type)\
    (INTEGRAL_PARAM)\
    (Type)

#define NDNBOOST_TYPEOF_INTEGRAL_PARAM_GETTYPE(Param)\
    NDNBOOST_PP_SEQ_ELEM(1, Param)

#define NDNBOOST_TYPEOF_INTEGRAL_PARAM_EXPANDTYPE(Param)\
    NDNBOOST_TYPEOF_INTEGRAL_PARAM_GETTYPE(Param)

// INTEGRAL_PARAM "virtual functions" implementation

#define NDNBOOST_TYPEOF_INTEGRAL_PARAM_ENCODE(This, n)\
    typedef typename ndnboost::type_of::encode_integral<\
        NDNBOOST_PP_CAT(V, n),\
        NDNBOOST_TYPEOF_INTEGRAL_PARAM_GETTYPE(This),\
        NDNBOOST_PP_CAT(P, n)\
    >::type NDNBOOST_PP_CAT(V, NDNBOOST_PP_INC(n)); 

#define NDNBOOST_TYPEOF_INTEGRAL_PARAM_DECODE(This, n)\
    typedef ndnboost::type_of::decode_integral<NDNBOOST_TYPEOF_INTEGRAL_PARAM_GETTYPE(This), NDNBOOST_PP_CAT(iter, n)> NDNBOOST_PP_CAT(d, n);\
    static const NDNBOOST_TYPEOF_INTEGRAL_PARAM_GETTYPE(This) NDNBOOST_PP_CAT(P, n) = NDNBOOST_PP_CAT(d, n)::value;\
    typedef typename NDNBOOST_PP_CAT(d, n)::iter NDNBOOST_PP_CAT(iter, NDNBOOST_PP_INC(n));

#define NDNBOOST_TYPEOF_INTEGRAL_PARAM_PLACEHOLDER(Param)\
    (NDNBOOST_TYPEOF_INTEGRAL_PARAM_GETTYPE(Param))0

#define NDNBOOST_TYPEOF_INTEGRAL_PARAM_DECLARATION_TYPE(Param)\
    NDNBOOST_TYPEOF_INTEGRAL_PARAM_GETTYPE(Param)

#define NDNBOOST_TYPEOF_INTEGRAL_PARAM_PLACEHOLDER_TYPES(Param, n)\
    NDNBOOST_PP_CAT(T,n)

#define NDNBOOST_TYPEOF_INTEGRAL_PARAM_ISTEMPLATE 0

#endif//NDNBOOST_TYPEOF_INTEGRAL_TEMPLATE_PARAM_HPP_INCLUDED
