namespace mpl
{
namespace detail
{
template < typename ... >
struct tuple_;
} // namespace detail
template < unsigned int x >
struct arg
{
static constexpr unsigned int value = x;
} ;
typedef arg< 1 > _1;
template < typename F, typename ... T >
struct apply
{
typedef typename F:: template apply<
typename F:: template replace< T... > :: type > :: type type;
} ;
template < typename T >
struct lambda;
template < template < typename ... > class F, typename ... Args >
struct lambda< F< Args... > >
{
template < typename >
struct apply;
template < typename ... T >
struct apply< detail:: tuple_ < T... > >
{
typedef typename F< T... > :: type type;
} ;
template < typename P, typename ... T >
struct replace_detail
{
template < unsigned int , typename U, typename ... >
struct replace_impl
{
typedef U type;
} ;
template < unsigned int n, unsigned int x,
typename Head, typename ... Tail >
struct replace_impl< n, arg< x > , Head, Tail... >
: public replace_impl< n + 1 , arg< x > , Tail... > { } ;
template < unsigned int x, typename Head, typename ... Tail >
struct replace_impl< x, arg< x > , Head, Tail... >
{
typedef Head type;
} ;
typedef typename replace_impl< 1 , P, T... > :: type type;
} ;
template < typename ... T >
struct replace
{
typedef detail:: tuple_ < typename replace_detail< Args, T... > :: type ... > type;
} ;
} ;
} // namespace mpl
template < typename T >
struct add_pointer
{ typedef T * type; } ;
template < typename , typename >
struct is_same
{
static constexpr bool value = false ;
} ;
template < typename T >
struct is_same< T, T >
{
static constexpr bool value = true ;
} ;
static_assert(
is_same<
mpl:: apply <
mpl:: lambda < add_pointer< mpl:: _1 > > ,
int > :: type ,
int * > :: value , "types are not same" ) ;
bmFtZXNwYWNlIG1wbAp7CgpuYW1lc3BhY2UgZGV0YWlsCnsKCnRlbXBsYXRlIDwgdHlwZW5hbWUuLi4gPgpzdHJ1Y3QgdHVwbGVfOwoKfSAvLyBuYW1lc3BhY2UgZGV0YWlsCgp0ZW1wbGF0ZSA8IHVuc2lnbmVkIGludCB4ID4Kc3RydWN0IGFyZwp7CiAgICBzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIGludCB2YWx1ZSA9IHg7Cn07Cgp0eXBlZGVmIGFyZzwgMSA+IF8xOwoKdGVtcGxhdGUgPCB0eXBlbmFtZSBGLCB0eXBlbmFtZS4uLiBUID4Kc3RydWN0IGFwcGx5CnsKICAgIHR5cGVkZWYgdHlwZW5hbWUgRjo6dGVtcGxhdGUgYXBwbHk8CiAgICAgIHR5cGVuYW1lIEY6OnRlbXBsYXRlIHJlcGxhY2U8IFQuLi4gPjo6dHlwZSA+Ojp0eXBlIHR5cGU7Cn07Cgp0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQgPgpzdHJ1Y3QgbGFtYmRhOwoKdGVtcGxhdGUgPCB0ZW1wbGF0ZSA8IHR5cGVuYW1lLi4uID4gY2xhc3MgRiwgdHlwZW5hbWUuLi4gQXJncyA+CnN0cnVjdCBsYW1iZGE8IEY8IEFyZ3MuLi4gPiA+CnsKICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgPgogICAgc3RydWN0IGFwcGx5OwoKICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUuLi4gVCA+CiAgICBzdHJ1Y3QgYXBwbHk8IGRldGFpbDo6dHVwbGVfPCBULi4uID4gPgogICAgewogICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgRjwgVC4uLiA+Ojp0eXBlIHR5cGU7CiAgICB9OwoKICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgUCwgdHlwZW5hbWUuLi4gVCA+CiAgICBzdHJ1Y3QgcmVwbGFjZV9kZXRhaWwKICAgIHsKICAgICAgICB0ZW1wbGF0ZSA8IHVuc2lnbmVkIGludCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUuLi4gPgogICAgICAgIHN0cnVjdCByZXBsYWNlX2ltcGwKICAgICAgICB7CiAgICAgICAgICAgIHR5cGVkZWYgVSB0eXBlOwogICAgICAgIH07CgogICAgICAgIHRlbXBsYXRlIDwgdW5zaWduZWQgaW50IG4sIHVuc2lnbmVkIGludCB4LAogICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgSGVhZCwgdHlwZW5hbWUuLi4gVGFpbCA+CiAgICAgICAgc3RydWN0IHJlcGxhY2VfaW1wbDwgbiwgYXJnPCB4ID4sIEhlYWQsIFRhaWwuLi4gPgogICAgICAgICAgOiBwdWJsaWMgcmVwbGFjZV9pbXBsPCBuICsgMSwgYXJnPCB4ID4sIFRhaWwuLi4gPiB7fTsKCiAgICAgICAgdGVtcGxhdGUgPCB1bnNpZ25lZCBpbnQgeCwgdHlwZW5hbWUgSGVhZCwgdHlwZW5hbWUuLi4gVGFpbCA+CiAgICAgICAgc3RydWN0IHJlcGxhY2VfaW1wbDwgeCwgYXJnPCB4ID4sIEhlYWQsIFRhaWwuLi4gPgogICAgICAgIHsKICAgICAgICAgICAgdHlwZWRlZiBIZWFkIHR5cGU7CiAgICAgICAgfTsKCiAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSByZXBsYWNlX2ltcGw8IDEsIFAsIFQuLi4gPjo6dHlwZSB0eXBlOwogICAgfTsKCiAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lLi4uIFQgPgogICAgc3RydWN0IHJlcGxhY2UKICAgIHsKICAgICAgICB0eXBlZGVmIGRldGFpbDo6dHVwbGVfPCB0eXBlbmFtZSByZXBsYWNlX2RldGFpbDwgQXJncywgVC4uLiA+Ojp0eXBlLi4uID4gdHlwZTsKICAgIH07Cn07Cgp9IC8vIG5hbWVzcGFjZSBtcGwKCnRlbXBsYXRlIDwgdHlwZW5hbWUgVCA+CnN0cnVjdCBhZGRfcG9pbnRlcgp7IHR5cGVkZWYgVCAqIHR5cGU7IH07Cgp0ZW1wbGF0ZSA8IHR5cGVuYW1lLCB0eXBlbmFtZSA+CnN0cnVjdCBpc19zYW1lCnsKICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCB2YWx1ZSA9IGZhbHNlOwp9OwoKdGVtcGxhdGUgPCB0eXBlbmFtZSBUID4Kc3RydWN0IGlzX3NhbWU8IFQsIFQgPgp7CiAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgdmFsdWUgPSB0cnVlOwp9OwoKc3RhdGljX2Fzc2VydCgKICBpc19zYW1lPAogICAgbXBsOjphcHBseTwKICAgICAgbXBsOjpsYW1iZGE8IGFkZF9wb2ludGVyPCBtcGw6Ol8xID4gPiwKICAgICAgaW50ID46OnR5cGUsCiAgICBpbnQgKiA+Ojp2YWx1ZSwgInR5cGVzIGFyZSBub3Qgc2FtZSIgKTsK