diff --git a/genreg/main.cpp b/genreg/main.cpp index 7c96b7f..0431f73 100755 --- a/genreg/main.cpp +++ b/genreg/main.cpp @@ -33,7 +33,7 @@ string name2path(const string& name, const string& ext) string copyright(const string& master) { return - "// Copyright (C) 2004 " + master + ".\n" + "// Copyright (C) 2005 " + master + ".\n" "// Use, modification and distribution is subject to the Boost Software\n" "// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt)\n\n" "// This is a generated file -- please do not modify by hand." @@ -114,7 +114,7 @@ public: else if (what == "TEMPLATE_X") { string params = getTokenAt(tokens, 2); - m_out << "BOOST_TYPEOF_REGISTER_TEMPLATE_X(" << name << ", " << params << ")" << endl; + m_out << "BOOST_TYPEOF_REGISTER_TEMPLATE(" << name << ", " << params << ")" << endl; } else { diff --git a/include/boost/typeof/compliant/integral_template_param.hpp b/include/boost/typeof/compliant/integral_template_param.hpp index 811fadb..f1dd477 100755 --- a/include/boost/typeof/compliant/integral_template_param.hpp +++ b/include/boost/typeof/compliant/integral_template_param.hpp @@ -31,7 +31,7 @@ #define BOOST_TYPEOF_INTEGRAL_PARAM_PLACEHOLDER_TYPES(Param, n)\ BOOST_PP_CAT(T,n) -#define BOOST_TYPEOF_INTEGRAL_PARAM_TT_CATEGORY 1 +#define BOOST_TYPEOF_INTEGRAL_PARAM_ISTEMPLATE 0 #endif//BOOST_TYPEOF_COMPLIANT_INTEGRAL_TEMPLATE_PARAM_HPP_INCLUDED diff --git a/include/boost/typeof/compliant/template_encoding.hpp b/include/boost/typeof/compliant/template_encoding.hpp index c064ed9..46f6b79 100755 --- a/include/boost/typeof/compliant/template_encoding.hpp +++ b/include/boost/typeof/compliant/template_encoding.hpp @@ -45,11 +45,12 @@ //Branch the decoding #define BOOST_TYPEOF_TYPEDEF_DECODED_TYPE(Name,Params)\ - BOOST_PP_IF(BOOST_TYPEOF_HAS_TEMPLATE_TEMPLATE_ARGUMENTS(Params),\ + BOOST_PP_IF(BOOST_TYPEOF_HAS_TEMPLATES(Params),\ BOOST_TYPEOF_TYPEDEF_DECODED_TEMPLATE_TEMPLATE_TYPE,\ BOOST_TYPEOF_TYPEDEF_DECODED_TEMPLATE_TYPE)(Name,Params) -#define BOOST_TYPEOF_REGISTER_TEMPLATE_X_IMPL(Name, Params, Size, ID)\ +#define BOOST_TYPEOF_REGISTER_TEMPLATE_IMPL(Name, Params, Size, ID)\ + namespace boost{namespace type_of{namespace{\ BOOST_TYPEOF_REGISTER_TEMPLATE_TEMPLATE_IMPL(Name, Params, ID)\ template -#include -#include +#include +#include #define BOOST_TYPEOF_MAKE_OBJ_template(x) BOOST_TYPEOF_TEMPLATE_PARAM(x) #define BOOST_TYPEOF_TEMPLATE(X) template(X) BOOST_TYPEOF_EAT @@ -24,7 +23,7 @@ //Encode / decode this #define BOOST_TYPEOF_TEMPLATE_PARAM_ENCODE(This, n)\ typedef typename encode_template\ + BOOST_PP_CAT(P, n)\ >::type BOOST_PP_CAT(V, BOOST_PP_INC(n)); #define BOOST_TYPEOF_TEMPLATE_PARAM_DECODE(This, n)\ @@ -44,9 +43,9 @@ // T3 #define BOOST_TYPEOF_TEMPLATE_PARAM_PLACEHOLDER_TYPES(Param, n)\ - BOOST_PP_CAT(T,n) + BOOST_PP_CAT(T,n) -#define BOOST_TYPEOF_TEMPLATE_PARAM_TT_CATEGORY 2 +#define BOOST_TYPEOF_TEMPLATE_PARAM_ISTEMPLATE 1 //////////////////////////// // move to encode_decode? @@ -110,21 +109,16 @@ namespace boost #define BOOST_TYPEOF_REGISTER_DECLARE_DECODER_TYPE_PARAM_PAIR(z,n,elem) \ BOOST_TYPEOF_VIRTUAL(DECLARATION_TYPE, elem)(elem) BOOST_PP_CAT(T, n) -#define BOOST_TYPEOF_CHECK_TT_CATEGORY(s, data, elem)\ - BOOST_PP_EQUAL(BOOST_TYPEOF_VIRTUAL(TT_CATEGORY, elem), data) +// BOOST_TYPEOF_HAS_TEMPLATES +#define BOOST_TYPEOF_HAS_TEMPLATES(Params)\ + BOOST_PP_SEQ_FOLD_LEFT(BOOST_TYPEOF_HAS_TEMPLATES_OP, 0, Params) -//Check if one of the arguments is a template template argument. -#define BOOST_TYPEOF_HAS_TEMPLATE_TEMPLATE_ARGUMENTS(Params)\ - BOOST_PP_NOT_EQUAL(\ - BOOST_PP_SEQ_SIZE(\ - (_)BOOST_PP_SEQ_FILTER(BOOST_TYPEOF_CHECK_TT_CATEGORY,2,Params)\ - ),\ - 1\ - ) +#define BOOST_TYPEOF_HAS_TEMPLATES_OP(s, state, elem)\ + BOOST_PP_OR(state, BOOST_TYPEOF_VIRTUAL(ISTEMPLATE, elem)) //Define template template arguments #define BOOST_TYPEOF_REGISTER_TEMPLATE_TEMPLATE_IMPL(Name,Params,ID)\ - BOOST_PP_IF(BOOST_TYPEOF_HAS_TEMPLATE_TEMPLATE_ARGUMENTS(Params),\ + BOOST_PP_IF(BOOST_TYPEOF_HAS_TEMPLATES(Params),\ BOOST_TYPEOF_REGISTER_NOTHING,\ BOOST_TYPEOF_REGISTER_TYPE_FOR_TEMPLATE_TEMPLATE)(Name,Params,ID) diff --git a/include/boost/typeof/compliant/type_template_param.hpp b/include/boost/typeof/compliant/type_template_param.hpp index 875a4f4..559236b 100755 --- a/include/boost/typeof/compliant/type_template_param.hpp +++ b/include/boost/typeof/compliant/type_template_param.hpp @@ -24,6 +24,6 @@ #define BOOST_TYPEOF_TYPE_PARAM_PLACEHOLDER(Param) int #define BOOST_TYPEOF_TYPE_PARAM_DECLARATION_TYPE(Param) class #define BOOST_TYPEOF_TYPE_PARAM_PLACEHOLDER_TYPES(Param, n) BOOST_PP_CAT(T,n) -#define BOOST_TYPEOF_TYPE_PARAM_TT_CATEGORY 1 +#define BOOST_TYPEOF_TYPE_PARAM_ISTEMPLATE 0 #endif//BOOST_TYPEOF_COMPLIANT_TYPE_TEMPLATE_PARAM_HPP_INCLUDED diff --git a/include/boost/typeof/std/bitset.hpp b/include/boost/typeof/std/bitset.hpp index b0f8d2f..014a114 100755 --- a/include/boost/typeof/std/bitset.hpp +++ b/include/boost/typeof/std/bitset.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2004 Arkadiy Vertleyb, Peder Holt. +// Copyright (C) 2005 Arkadiy Vertleyb, Peder Holt. // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) @@ -12,6 +12,6 @@ #include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP() -BOOST_TYPEOF_REGISTER_TEMPLATE_X(std::bitset, (size_t)) +BOOST_TYPEOF_REGISTER_TEMPLATE(std::bitset, (size_t)) #endif//BOOST_TYPEOF_STD_bitset_hpp_INCLUDED diff --git a/include/boost/typeof/std/complex.hpp b/include/boost/typeof/std/complex.hpp index 617c4cd..85c87a0 100755 --- a/include/boost/typeof/std/complex.hpp +++ b/include/boost/typeof/std/complex.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2004 Arkadiy Vertleyb, Peder Holt. +// Copyright (C) 2005 Arkadiy Vertleyb, Peder Holt. // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) diff --git a/include/boost/typeof/std/deque.hpp b/include/boost/typeof/std/deque.hpp index d264bd1..87f5f12 100755 --- a/include/boost/typeof/std/deque.hpp +++ b/include/boost/typeof/std/deque.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2004 Arkadiy Vertleyb, Peder Holt. +// Copyright (C) 2005 Arkadiy Vertleyb, Peder Holt. // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) diff --git a/include/boost/typeof/std/fstream.hpp b/include/boost/typeof/std/fstream.hpp index cfa056f..903b398 100755 --- a/include/boost/typeof/std/fstream.hpp +++ b/include/boost/typeof/std/fstream.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2004 Arkadiy Vertleyb, Peder Holt. +// Copyright (C) 2005 Arkadiy Vertleyb, Peder Holt. // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) diff --git a/include/boost/typeof/std/functional.hpp b/include/boost/typeof/std/functional.hpp index 0d9cd84..3e540f6 100755 --- a/include/boost/typeof/std/functional.hpp +++ b/include/boost/typeof/std/functional.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2004 Arkadiy Vertleyb, Peder Holt. +// Copyright (C) 2005 Arkadiy Vertleyb, Peder Holt. // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) diff --git a/include/boost/typeof/std/iostream.hpp b/include/boost/typeof/std/iostream.hpp index 762d6f9..5d879de 100755 --- a/include/boost/typeof/std/iostream.hpp +++ b/include/boost/typeof/std/iostream.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2004 Arkadiy Vertleyb, Peder Holt. +// Copyright (C) 2005 Arkadiy Vertleyb, Peder Holt. // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) diff --git a/include/boost/typeof/std/istream.hpp b/include/boost/typeof/std/istream.hpp index 431e058..a344d1d 100755 --- a/include/boost/typeof/std/istream.hpp +++ b/include/boost/typeof/std/istream.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2004 Arkadiy Vertleyb, Peder Holt. +// Copyright (C) 2005 Arkadiy Vertleyb, Peder Holt. // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) diff --git a/include/boost/typeof/std/iterator.hpp b/include/boost/typeof/std/iterator.hpp index 12fa823..c46601d 100755 --- a/include/boost/typeof/std/iterator.hpp +++ b/include/boost/typeof/std/iterator.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2004 Arkadiy Vertleyb, Peder Holt. +// Copyright (C) 2005 Arkadiy Vertleyb, Peder Holt. // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) diff --git a/include/boost/typeof/std/list.hpp b/include/boost/typeof/std/list.hpp index 991bdf5..e4f72fb 100755 --- a/include/boost/typeof/std/list.hpp +++ b/include/boost/typeof/std/list.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2004 Arkadiy Vertleyb, Peder Holt. +// Copyright (C) 2005 Arkadiy Vertleyb, Peder Holt. // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) diff --git a/include/boost/typeof/std/locale.hpp b/include/boost/typeof/std/locale.hpp index 7499560..292c8f6 100755 --- a/include/boost/typeof/std/locale.hpp +++ b/include/boost/typeof/std/locale.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2004 Arkadiy Vertleyb, Peder Holt. +// Copyright (C) 2005 Arkadiy Vertleyb, Peder Holt. // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) @@ -33,8 +33,8 @@ BOOST_TYPEOF_REGISTER_TEMPLATE(std::time_put_byname, 2) BOOST_TYPEOF_REGISTER_TYPE(std::money_base) BOOST_TYPEOF_REGISTER_TEMPLATE(std::money_get, 2) BOOST_TYPEOF_REGISTER_TEMPLATE(std::money_put, 2) -BOOST_TYPEOF_REGISTER_TEMPLATE_X(std::moneypunct, (class)(bool)) -BOOST_TYPEOF_REGISTER_TEMPLATE_X(std::moneypunct_byname, (class)(bool)) +BOOST_TYPEOF_REGISTER_TEMPLATE(std::moneypunct, (class)(bool)) +BOOST_TYPEOF_REGISTER_TEMPLATE(std::moneypunct_byname, (class)(bool)) BOOST_TYPEOF_REGISTER_TYPE(std::messages_base) BOOST_TYPEOF_REGISTER_TEMPLATE(std::messages, 1) BOOST_TYPEOF_REGISTER_TEMPLATE(std::messages_byname, 1) diff --git a/include/boost/typeof/std/map.hpp b/include/boost/typeof/std/map.hpp index 616ac46..076217a 100755 --- a/include/boost/typeof/std/map.hpp +++ b/include/boost/typeof/std/map.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2004 Arkadiy Vertleyb, Peder Holt. +// Copyright (C) 2005 Arkadiy Vertleyb, Peder Holt. // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) diff --git a/include/boost/typeof/std/memory.hpp b/include/boost/typeof/std/memory.hpp index 01156be..cd368fa 100755 --- a/include/boost/typeof/std/memory.hpp +++ b/include/boost/typeof/std/memory.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2004 Arkadiy Vertleyb, Peder Holt. +// Copyright (C) 2005 Arkadiy Vertleyb, Peder Holt. // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) diff --git a/include/boost/typeof/std/ostream.hpp b/include/boost/typeof/std/ostream.hpp index d8c20c7..831039c 100755 --- a/include/boost/typeof/std/ostream.hpp +++ b/include/boost/typeof/std/ostream.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2004 Arkadiy Vertleyb, Peder Holt. +// Copyright (C) 2005 Arkadiy Vertleyb, Peder Holt. // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) diff --git a/include/boost/typeof/std/queue.hpp b/include/boost/typeof/std/queue.hpp index 6681a57..8ea967f 100755 --- a/include/boost/typeof/std/queue.hpp +++ b/include/boost/typeof/std/queue.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2004 Arkadiy Vertleyb, Peder Holt. +// Copyright (C) 2005 Arkadiy Vertleyb, Peder Holt. // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) diff --git a/include/boost/typeof/std/set.hpp b/include/boost/typeof/std/set.hpp index 16c0665..a6f4bb0 100755 --- a/include/boost/typeof/std/set.hpp +++ b/include/boost/typeof/std/set.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2004 Arkadiy Vertleyb, Peder Holt. +// Copyright (C) 2005 Arkadiy Vertleyb, Peder Holt. // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) diff --git a/include/boost/typeof/std/sstream.hpp b/include/boost/typeof/std/sstream.hpp index 4d63503..5d2e7b1 100755 --- a/include/boost/typeof/std/sstream.hpp +++ b/include/boost/typeof/std/sstream.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2004 Arkadiy Vertleyb, Peder Holt. +// Copyright (C) 2005 Arkadiy Vertleyb, Peder Holt. // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) diff --git a/include/boost/typeof/std/stack.hpp b/include/boost/typeof/std/stack.hpp index 9414ef3..1a15a1b 100755 --- a/include/boost/typeof/std/stack.hpp +++ b/include/boost/typeof/std/stack.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2004 Arkadiy Vertleyb, Peder Holt. +// Copyright (C) 2005 Arkadiy Vertleyb, Peder Holt. // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) diff --git a/include/boost/typeof/std/streambuf.hpp b/include/boost/typeof/std/streambuf.hpp index 815da33..307d047 100755 --- a/include/boost/typeof/std/streambuf.hpp +++ b/include/boost/typeof/std/streambuf.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2004 Arkadiy Vertleyb, Peder Holt. +// Copyright (C) 2005 Arkadiy Vertleyb, Peder Holt. // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) diff --git a/include/boost/typeof/std/string.hpp b/include/boost/typeof/std/string.hpp index d7b70ed..dd509e4 100755 --- a/include/boost/typeof/std/string.hpp +++ b/include/boost/typeof/std/string.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2004 Arkadiy Vertleyb, Peder Holt. +// Copyright (C) 2005 Arkadiy Vertleyb, Peder Holt. // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) diff --git a/include/boost/typeof/std/utility.hpp b/include/boost/typeof/std/utility.hpp index 3500124..467e6c8 100755 --- a/include/boost/typeof/std/utility.hpp +++ b/include/boost/typeof/std/utility.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2004 Arkadiy Vertleyb, Peder Holt. +// Copyright (C) 2005 Arkadiy Vertleyb, Peder Holt. // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) diff --git a/include/boost/typeof/std/valarray.hpp b/include/boost/typeof/std/valarray.hpp index 01e5e81..9a36ee8 100755 --- a/include/boost/typeof/std/valarray.hpp +++ b/include/boost/typeof/std/valarray.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2004 Arkadiy Vertleyb, Peder Holt. +// Copyright (C) 2005 Arkadiy Vertleyb, Peder Holt. // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) diff --git a/include/boost/typeof/std/vector.hpp b/include/boost/typeof/std/vector.hpp index d650532..1f28827 100755 --- a/include/boost/typeof/std/vector.hpp +++ b/include/boost/typeof/std/vector.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2004 Arkadiy Vertleyb, Peder Holt. +// Copyright (C) 2005 Arkadiy Vertleyb, Peder Holt. // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) diff --git a/include/boost/typeof/template_encoding.hpp b/include/boost/typeof/template_encoding.hpp index 807ea5b..3d96444 100755 --- a/include/boost/typeof/template_encoding.hpp +++ b/include/boost/typeof/template_encoding.hpp @@ -24,37 +24,84 @@ #define BOOST_TYPEOF_TO_SEQ(tokens) BOOST_TYPEOF_ ## tokens ## _BOOST_TYPEOF +// BOOST_TYPEOF_REGISTER_TEMPLATE + +#define BOOST_TYPEOF_REGISTER_TEMPLATE(Name, Params)\ + BOOST_TYPEOF_REGISTER_TEMPLATE_IMPL(\ + Name,\ + BOOST_TYPEOF_MAKE_OBJS(BOOST_TYPEOF_TOSEQ(Params)),\ + BOOST_PP_SEQ_SIZE(BOOST_TYPEOF_TOSEQ(Params)),\ + BOOST_TYPEOF_UNIQUE_ID())\ + +#define BOOST_TYPEOF_OBJECT_MAKER(s, data, elem)\ + BOOST_TYPEOF_MAKE_OBJ(elem) + +#define BOOST_TYPEOF_MAKE_OBJS(Params)\ + BOOST_PP_SEQ_TRANSFORM(BOOST_TYPEOF_OBJECT_MAKER, ~, Params) + +#define BOOST_TYPEOF_TOSEQ(x)\ + BOOST_PP_SEQ_CAT(\ + (BOOST_TYPEOF_STEP3)\ + (BOOST_PP_CAT(BOOST_TYPEOF_STEP2, BOOST_PP_EXPAND(BOOST_TYPEOF_STEP1 x)))\ + ) + +#define BOOST_TYPEOF_STEP1(x) _(x) +#define BOOST_TYPEOF_STEP2BOOST_TYPEOF_STEP1 +#define BOOST_TYPEOF_STEP3BOOST_TYPEOF_STEP2_ + +#define BOOST_TYPEOF_STEP31 (class) +#define BOOST_TYPEOF_STEP32 BOOST_TYPEOF_STEP31(class) +#define BOOST_TYPEOF_STEP33 BOOST_TYPEOF_STEP32(class) +#define BOOST_TYPEOF_STEP34 BOOST_TYPEOF_STEP33(class) +#define BOOST_TYPEOF_STEP35 BOOST_TYPEOF_STEP34(class) +#define BOOST_TYPEOF_STEP36 BOOST_TYPEOF_STEP35(class) +#define BOOST_TYPEOF_STEP37 BOOST_TYPEOF_STEP36(class) +#define BOOST_TYPEOF_STEP38 BOOST_TYPEOF_STEP37(class) +#define BOOST_TYPEOF_STEP39 BOOST_TYPEOF_STEP38(class) +#define BOOST_TYPEOF_STEP310 BOOST_TYPEOF_STEP39(class) +#define BOOST_TYPEOF_STEP311 BOOST_TYPEOF_STEP310(class) +#define BOOST_TYPEOF_STEP312 BOOST_TYPEOF_STEP311(class) +#define BOOST_TYPEOF_STEP313 BOOST_TYPEOF_STEP312(class) +#define BOOST_TYPEOF_STEP314 BOOST_TYPEOF_STEP313(class) +#define BOOST_TYPEOF_STEP315 BOOST_TYPEOF_STEP314(class) +#define BOOST_TYPEOF_STEP316 BOOST_TYPEOF_STEP315(class) +#define BOOST_TYPEOF_STEP317 BOOST_TYPEOF_STEP316(class) +#define BOOST_TYPEOF_STEP318 BOOST_TYPEOF_STEP317(class) +#define BOOST_TYPEOF_STEP319 BOOST_TYPEOF_STEP318(class) +#define BOOST_TYPEOF_STEP320 BOOST_TYPEOF_STEP319(class) // "interface" #define BOOST_TYPEOF_PARAM_EXPAND_TYPE(Param)\ BOOST_PP_CAT(BOOST_TYPEOF_PARAM_EXPAND_, BOOST_PP_SEQ_ELEM(0, Param))(Param) +// BOOST_TYPEOF_VIRTUAL -// #define BOOST_TYPEOF_CAT_4(a, b, c, d) BOOST_TYPEOF_CAT_4_I(a, b, c, d) #define BOOST_TYPEOF_CAT_4_I(a, b, c, d) a ## b ## c ## d #define BOOST_TYPEOF_VIRTUAL(Fun, Obj)\ - BOOST_TYPEOF_CAT_4(BOOST_TYPEOF_, BOOST_PP_SEQ_ELEM(0, Obj), _, Fun) -// + BOOST_TYPEOF_CAT_4(BOOST_TYPEOF_, BOOST_PP_SEQ_HEAD(Obj), _, Fun) + +// BOOST_TYPEOF_SEQ_ENUM[_TRAILING][_1] +// Two versions provided due to reentrancy issue #define BOOST_TYPEOF_SEQ_EXPAND_ELEMENT(z,n,seq)\ BOOST_PP_SEQ_ELEM(0,seq) (z,n,BOOST_PP_SEQ_ELEM(n,BOOST_PP_SEQ_ELEM(1,seq))) #define BOOST_TYPEOF_SEQ_ENUM(seq,macro)\ -BOOST_PP_ENUM(BOOST_PP_SEQ_SIZE(seq),BOOST_TYPEOF_SEQ_EXPAND_ELEMENT,(macro)(seq)) + BOOST_PP_ENUM(BOOST_PP_SEQ_SIZE(seq),BOOST_TYPEOF_SEQ_EXPAND_ELEMENT,(macro)(seq)) #define BOOST_TYPEOF_SEQ_ENUM_TRAILING(seq,macro)\ -BOOST_PP_ENUM_TRAILING(BOOST_PP_SEQ_SIZE(seq),BOOST_TYPEOF_SEQ_EXPAND_ELEMENT,(macro)(seq)) + BOOST_PP_ENUM_TRAILING(BOOST_PP_SEQ_SIZE(seq),BOOST_TYPEOF_SEQ_EXPAND_ELEMENT,(macro)(seq)) #define BOOST_TYPEOF_SEQ_EXPAND_ELEMENT_1(z,n,seq)\ - BOOST_PP_SEQ_ELEM(0,seq) (z,n,BOOST_PP_SEQ_ELEM(n,BOOST_PP_SEQ_ELEM(1,seq))) + BOOST_PP_SEQ_ELEM(0,seq) (z,n,BOOST_PP_SEQ_ELEM(n,BOOST_PP_SEQ_ELEM(1,seq))) #define BOOST_TYPEOF_SEQ_ENUM_1(seq,macro)\ -BOOST_PP_ENUM(BOOST_PP_SEQ_SIZE(seq),BOOST_TYPEOF_SEQ_EXPAND_ELEMENT_1,(macro)(seq)) + BOOST_PP_ENUM(BOOST_PP_SEQ_SIZE(seq),BOOST_TYPEOF_SEQ_EXPAND_ELEMENT_1,(macro)(seq)) #define BOOST_TYPEOF_SEQ_ENUM_TRAILING_1(seq,macro)\ -BOOST_PP_ENUM_TRAILING(BOOST_PP_SEQ_SIZE(seq),BOOST_TYPEOF_SEQ_EXPAND_ELEMENT_1,(macro)(seq)) + BOOST_PP_ENUM_TRAILING(BOOST_PP_SEQ_SIZE(seq),BOOST_TYPEOF_SEQ_EXPAND_ELEMENT_1,(macro)(seq)) #endif//BOOST_TYPEOF_COMPLIANT_TEMPLATE_ENCODING_HPP_INCLUDED diff --git a/include/boost/typeof/typeof.hpp b/include/boost/typeof/typeof.hpp index e5a4778..444fb1a 100755 --- a/include/boost/typeof/typeof.hpp +++ b/include/boost/typeof/typeof.hpp @@ -5,6 +5,10 @@ #ifndef BOOST_TYPEOF_TYPEOF_HPP_INCLUDED #define BOOST_TYPEOF_TYPEOF_HPP_INCLUDED +#include +#include +#include + // implementation #include @@ -50,21 +54,9 @@ # include #else//BOOST_TYPEOF_NATIVE # define BOOST_TYPEOF_REGISTER_TYPE(x) -# define BOOST_TYPEOF_REGISTER_TEMPLATE_X(x, params) +# define BOOST_TYPEOF_REGISTER_TEMPLATE(x, params) #endif -#define BOOST_TYPEOF_REGISTER_TEMPLATE_TYPE_PARAM_(z, n, data) (typename) - -#define BOOST_TYPEOF_REGISTER_TEMPLATE(Name, n)\ - BOOST_TYPEOF_REGISTER_TEMPLATE_X(Name,\ - BOOST_PP_REPEAT(n, BOOST_TYPEOF_REGISTER_TEMPLATE_TYPE_PARAM_, ~)\ - ) - -#define BOOST_TYPEOF_REGISTER_TEMPLATE_WITH_DEFAULTS(Name, n)\ - BOOST_TYPEOF_REGISTER_TEMPLATE_WITH_DEFAULTS_X(Name,\ - BOOST_PP_REPEAT(n, BOOST_TYPEOF_REGISTER_TEMPLATE_TYPE_PARAM_, ~)\ - ) - #define BOOST_TYPEOF_UNIQUE_ID()\ BOOST_TYPEOF_REGISTRATION_GROUP * 0x10000 + __LINE__ diff --git a/include/boost/typeof/vintage/template_encoding.hpp b/include/boost/typeof/vintage/template_encoding.hpp index 23259a8..7138658 100644 --- a/include/boost/typeof/vintage/template_encoding.hpp +++ b/include/boost/typeof/vintage/template_encoding.hpp @@ -56,33 +56,30 @@ #define BOOST_TYPEOF_INTEGRAL_PARAM_CAST(This, n)\ BOOST_TYPEOF_PARAM_GETTYPE(This)(BOOST_PP_CAT(P,n)) -//#define BOOST_TYPEOF_CAST_EXPLICIT_INTEGRAL_PARAM(This, n)\ -// BOOST_TYPEOF_PARAM_GETTYPE(This)(BOOST_PP_CAT(P,n)) - // #define BOOST_TYPEOF_REGISTER_TEMPLATE_DECODE_PARAM(r, data, n, elem)\ - BOOST_TYPEOF_VIRTUAL(DECODE, BOOST_TYPEOF_MAKE_OBJ(elem))(BOOST_TYPEOF_MAKE_OBJ(elem), n) + BOOST_TYPEOF_VIRTUAL(DECODE, elem)(elem, n) #define BOOST_TYPEOF_REGISTER_TEMPLATE_ENCODE_PARAM(r, data, n, elem)\ - , BOOST_TYPEOF_VIRTUAL(ENCODE, BOOST_TYPEOF_MAKE_OBJ(elem))(BOOST_TYPEOF_MAKE_OBJ(elem), n) + , BOOST_TYPEOF_VIRTUAL(ENCODE, elem)(elem, n) #define BOOST_TYPEOF_REGISTER_TEMPLATE_PARAM_PAIR(r, data, n, elem)\ - BOOST_PP_COMMA_IF(n) BOOST_TYPEOF_PARAM_GETTYPE(BOOST_TYPEOF_MAKE_OBJ(elem)) BOOST_PP_CAT(P, n) + BOOST_PP_COMMA_IF(n) BOOST_TYPEOF_PARAM_GETTYPE(elem) BOOST_PP_CAT(P, n) #define BOOST_TYPEOF_REGISTER_TEMPLATE_PARAM_CAST(r, data, n, elem)\ - BOOST_PP_COMMA_IF(n) BOOST_TYPEOF_VIRTUAL(CAST, BOOST_TYPEOF_MAKE_OBJ(elem))(BOOST_TYPEOF_MAKE_OBJ(elem), n) + BOOST_PP_COMMA_IF(n) BOOST_TYPEOF_VIRTUAL(CAST, elem)(elem, n) // -#define BOOST_TYPEOF_ENCODE_TEMPLATE_X_IMPL(Name, Params, ID)\ +#define BOOST_TYPEOF_ENCODE_TEMPLATE_IMPL(Name, Params, Size, ID)\ template<>\ struct encode_impl\ {\ - template\ + template\ struct encoder {\ - typedef Types BOOST_PP_CAT(types_,BOOST_PP_SEQ_SIZE(Params));\ - BOOST_PP_REPEAT(BOOST_PP_SEQ_SIZE(Params),BOOST_TYPEOF_PUSH_FRONT,BOOST_PP_SEQ_SIZE(Params))\ + typedef Types BOOST_PP_CAT(types_,Size);\ + BOOST_PP_REPEAT(Size,BOOST_TYPEOF_PUSH_FRONT,Size)\ BOOST_STATIC_CONSTANT(int,value =sizeof(BOOST_DEDUCED_TYPENAME encode_modifier::type,BOOST_DEDUCED_TYPENAME types_0::type,types_1>::encoded_type));\ friend sizer encode_value(const sizer&,const sizer&);\ };\ @@ -98,9 +95,9 @@ V\ BOOST_PP_SEQ_FOR_EACH_I(BOOST_TYPEOF_REGISTER_TEMPLATE_ENCODE_PARAM,~,Params),\ Types\ - > encode(Name const& (*)(V,Types)); + > encode(Name const& (*)(V,Types)); -#define BOOST_TYPEOF_DECODE_TEMPLATE_X_IMPL(Name, Params, ID)\ +#define BOOST_TYPEOF_DECODE_TEMPLATE_IMPL(Name, Params, Size, ID)\ template<>\ struct decode_impl\ {\ @@ -109,14 +106,15 @@ typedef Iter iter0;\ BOOST_PP_SEQ_FOR_EACH_I(BOOST_TYPEOF_REGISTER_TEMPLATE_DECODE_PARAM,~,Params)\ typedef Name type;\ - typedef BOOST_PP_CAT(iter,BOOST_PP_SEQ_SIZE(Params)) iter;\ + typedef BOOST_PP_CAT(iter,Size) iter;\ };\ }; -#define BOOST_TYPEOF_REGISTER_TEMPLATE_X(template_type,seq)\ -namespace boost { namespace type_of{\ - BOOST_TYPEOF_ENCODE_TEMPLATE_X_IMPL(template_type,seq,BOOST_TYPEOF_UNIQUE_ID())\ - BOOST_TYPEOF_DECODE_TEMPLATE_X_IMPL(template_type,seq,BOOST_TYPEOF_UNIQUE_ID())\ -}}//namespace boost::type_of +#define BOOST_TYPEOF_REGISTER_TEMPLATE_IMPL(Name, Params, Size, ID)\ + namespace boost { namespace type_of{\ + BOOST_TYPEOF_ENCODE_TEMPLATE_IMPL(Name, Params, Size, ID)\ + BOOST_TYPEOF_DECODE_TEMPLATE_IMPL(Name, Params, Size, ID)\ + }} + #endif //BOOST_VINTAGE_TEMPLATE_ENCODING_HPP_INCLUDED diff --git a/test/compliant/lambda/register.hpp b/test/compliant/lambda/register.hpp index 3e65563..4a69815 100755 --- a/test/compliant/lambda/register.hpp +++ b/test/compliant/lambda/register.hpp @@ -25,6 +25,6 @@ BOOST_TYPEOF_REGISTER_TYPE(boost::lambda::greater_action) BOOST_TYPEOF_REGISTER_TYPE(boost::lambda::less_action) BOOST_TYPEOF_REGISTER_TYPE(boost::lambda::and_action) BOOST_TYPEOF_REGISTER_TYPE(boost::lambda::subscript_action) -BOOST_TYPEOF_REGISTER_TEMPLATE_X(boost::lambda::placeholder, (int)) +BOOST_TYPEOF_REGISTER_TEMPLATE(boost::lambda::placeholder, (int)) #endif//LAMBDA_REGISTER_HPP_INCLUDED diff --git a/test/compliant/typeof.vcproj b/test/compliant/typeof.vcproj index 3e844b1..1624f38 100755 --- a/test/compliant/typeof.vcproj +++ b/test/compliant/typeof.vcproj @@ -134,12 +134,6 @@ - - - - - - - diff --git a/test/compliant/typeof_g++.bat b/test/compliant/typeof_g++.bat index 105f3f6..d08154c 100755 --- a/test/compliant/typeof_g++.bat +++ b/test/compliant/typeof_g++.bat @@ -1,3 +1,3 @@ +g++ -IC:\boost\boost_1_32_0 -I..\..\..\.. ..\main.cpp test_compliant.cpp odr1.cpp odr2.cpp g++ -IC:\boost\boost_1_32_0 -I..\..\..\.. -D BOOST_TYPEOF_COMPLIANT -D BOOST_TYPEOF_LIMIT_SIZE=50 -D BOOST_MPL_LIMIT_VECTOR_SIZE=50 test_compliant.cpp ..\main.cpp odr1.cpp odr2.cpp -g++ -IC:\boost\boost_1_32_0 -I..\..\..\.. odr1.cpp odr2.cpp test_compliant.cpp ..\main.cpp diff --git a/test/main.cpp b/test/main.cpp index a50293b..3dd8414 100755 --- a/test/main.cpp +++ b/test/main.cpp @@ -65,8 +65,15 @@ namespace template_template { struct C {}; } -BOOST_TYPEOF_REGISTER_TEMPLATE_X(template_template::tt_test,(BOOST_TYPEOF_TEMPLATE( (typename)(unsigned int) ))(int)) -BOOST_TYPEOF_REGISTER_TEMPLATE_X(template_template::C,(typename)(unsigned int)) +BOOST_TYPEOF_REGISTER_TEMPLATE(template_template::tt_test, + (BOOST_TYPEOF_TEMPLATE((typename)(unsigned int))) + (int) + ) + +BOOST_TYPEOF_REGISTER_TEMPLATE(template_template::C, + (typename) + (unsigned int) + ) BOOST_STATIC_ASSERT((typeof_test >::value)); #endif @@ -100,7 +107,7 @@ template struct with_integrals {}; -BOOST_TYPEOF_REGISTER_TEMPLATE_X(with_integrals, +BOOST_TYPEOF_REGISTER_TEMPLATE(with_integrals, (class) (char) (unsigned short) @@ -249,18 +256,18 @@ namespace test_integral {}; } -BOOST_TYPEOF_REGISTER_TEMPLATE_X(test_integral::foo, - (BOOST_TYPEOF_INTEGRAL(test_integral::E)) - ); +BOOST_TYPEOF_REGISTER_TEMPLATE(test_integral::foo, + (BOOST_TYPEOF_INTEGRAL(test_integral::E)) + ); -BOOST_TYPEOF_REGISTER_TEMPLATE_X(test_integral::blah, - (BOOST_TYPEOF_INTEGRAL(unsigned long int)) - ); +BOOST_TYPEOF_REGISTER_TEMPLATE(test_integral::blah, + (BOOST_TYPEOF_INTEGRAL(unsigned long int)) + ); -BOOST_TYPEOF_REGISTER_TEMPLATE_X(test_integral::bar, - (class) - (BOOST_TYPEOF_INTEGRAL(P0)) - ); +BOOST_TYPEOF_REGISTER_TEMPLATE(test_integral::bar, + (class) + (BOOST_TYPEOF_INTEGRAL(P0)) + ); namespace test_integral { diff --git a/test/stl/register.hpp b/test/stl/register.hpp index 9cecf77..9a6ddb7 100755 --- a/test/stl/register.hpp +++ b/test/stl/register.hpp @@ -14,7 +14,7 @@ #include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP() -BOOST_TYPEOF_REGISTER_TEMPLATE_X(std::vector, (class)(class)) +BOOST_TYPEOF_REGISTER_TEMPLATE(std::vector, (class)(class)) BOOST_TYPEOF_REGISTER_TEMPLATE(std::list, 2) BOOST_TYPEOF_REGISTER_TEMPLATE(std::set, 3) BOOST_TYPEOF_REGISTER_TEMPLATE(std::allocator, 1)