--- boost_1_38_0/boost/scope_exit.hpp Wed Jan 21 20:33:17 2009 +++ boost_1_38_0/boost/scope_exit.hpp Fri Feb 27 02:00:47 2009 @@ -140,15 +140,101 @@ typedef void (*BOOST_SCOPE_EXIT_AUX_TAG(id,i))(int var); +#if BOOST_WORKAROUND(BOOST_MSVC,>=1300) + // Boost.Typeof for VC71's typeid-based workaround does not work + // to determine the type of 'this' due to error C2355 being + // incorrectly reported (a compiler bug that's present in 8 and 9 + // also). The typical avoidance strategy to evade this error is + // to make an indirect compile-time constant by assignment through + // enum, then use that as a type-index. This cannot happen with + // the typeid() approach, only with a sizeof() approach. + // + // The implementation below is the more general, type-index + // sizeof()-based approach implemented in Boost.Typeof which + // appears to work fine for typeof(this) provided the reference to + // 'this' is not present in the template argument list (i.e. the + // type-index is captured into a local enumerator before being + // used as a template argument). + // + // Inline documentation is removed and conditional compilation + // applied. + // + namespace boost { namespace scope_exit { namespace msvc_typeof_this + { + template + struct msvc_typeid_wrapper { + typedef typename boost::type_of::msvc_extract_type >::id2type id2type; + typedef typename id2type::type type; + }; + template<> + struct msvc_typeid_wrapper<4> { + typedef msvc_typeid_wrapper<4> type; + }; + template + struct encode_type + { + BOOST_STATIC_CONSTANT(unsigned,value=BOOST_TYPEOF_INDEX(T)); + typedef typename boost::type_of::msvc_register_type >::id2type type; + BOOST_STATIC_CONSTANT(unsigned,next=value+1); + BOOST_TYPEOF_NEXT_INDEX(next); + }; + template + struct sizer + { + typedef char(*type)[encode_type::value]; + }; + template typename disable_if< + typename is_function::type, + typename sizer::type>::type encode_start(T const&); + template typename enable_if< + typename is_function::type, + typename sizer::type>::type encode_start(T&); + template + boost::type_of::msvc_register_type typeof_register_type(const T&,Organizer* =0); + + }}} + +# define BOOST_SCOPE_EXIT_TYPEDEF_TYPEOF_THIS() \ + enum { BOOST_PP_CAT(boost_se_thistype_index_,__LINE__) = sizeof(*boost::scope_exit::msvc_typeof_this::encode_start(this)) }; \ + typedef boost::scope_exit::msvc_typeof_this::msvc_typeid_wrapper::type + +#else // other Boost.Typeof 'this' appear to be okay +# define BOOST_SCOPE_EXIT_TYPEDEF_TYPEOF_THIS() typedef BOOST_TYPEOF(this) +#endif + + +// "this capture" function-macros for when (*this) is requested +// +#define BOOST_SCOPE_EXIT_REALTHIS_COMMA_IF_this(seq) this BOOST_PP_COMMA_IF(BOOST_PP_SEQ_SIZE(seq)) +#define BOOST_SCOPE_EXIT_THISPARAM_COMMA_IF_this(id,seq) BOOST_PP_CAT(se_this_type,id) se_this BOOST_PP_COMMA_IF(BOOST_PP_SEQ_SIZE(seq)) +#define BOOST_SCOPE_EXIT_THISINIT_COMMA_IF_this(seq) se_this(se_this) BOOST_PP_COMMA_IF(BOOST_PP_SEQ_SIZE(seq)) + +#define BOOST_SCOPE_EXIT_TYPEDEF_THISTYPE_this(id) BOOST_SCOPE_EXIT_TYPEDEF_TYPEOF_THIS() BOOST_PP_CAT(se_this_type,id); +#define BOOST_SCOPE_EXIT_DEFINE_THISMEMBER_this(id) BOOST_PP_CAT(se_this_type,id) se_this; +#define BOOST_SCOPE_EXIT_DEFINE_THIS_ACCESSOR_this(id) \ + inline BOOST_PP_CAT(se_this_type,id) operator->() { return boost_se_params_->se_this; } + +// "this capture" function-macros for when (*this) is not requested +// +#define BOOST_SCOPE_EXIT_REALTHIS_COMMA_IF_nothis(seq) +#define BOOST_SCOPE_EXIT_THISPARAM_COMMA_IF_nothis(id,seq) +#define BOOST_SCOPE_EXIT_THISINIT_COMMA_IF_nothis(seq) + +#define BOOST_SCOPE_EXIT_TYPEDEF_THISTYPE_nothis(id) +#define BOOST_SCOPE_EXIT_DEFINE_THISMEMBER_nothis(id) +#define BOOST_SCOPE_EXIT_DEFINE_THIS_ACCESSOR_nothis(id) + + #ifdef BOOST_SCOPE_EXIT_AUX_TPL_WORKAROUND -#define BOOST_SCOPE_EXIT_AUX_PARAMS_T_CTOR(id, seq) +#define BOOST_SCOPE_EXIT_AUX_PARAMS_T_CTOR(id, seq, this) #define BOOST_SCOPE_EXIT_AUX_PARAM_INIT(r, id, i, var) \ BOOST_PP_COMMA_IF(i) { BOOST_SCOPE_EXIT_AUX_DEREF(id,i,var) } -#define BOOST_SCOPE_EXIT_AUX_PARAMS_INIT(id, seq) \ - = { BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_PARAM_INIT, id, seq) }; +#define BOOST_SCOPE_EXIT_AUX_PARAMS_INIT(id, seq, this) \ + = { BOOST_PP_CAT(BOOST_SCOPE_EXIT_REALTHIS_COMMA_IF_,this)(seq) \ + BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_PARAM_INIT, id, seq) }; #else @@ -158,16 +244,18 @@ #define BOOST_SCOPE_EXIT_AUX_MEMBER_INIT(r, id, i, var) BOOST_PP_COMMA_IF(i) \ BOOST_SCOPE_EXIT_AUX_PARAM(id,i,var) ( BOOST_PP_CAT(a,i) ) -#define BOOST_SCOPE_EXIT_AUX_PARAMS_T_CTOR(id, seq) \ +#define BOOST_SCOPE_EXIT_AUX_PARAMS_T_CTOR(id, seq, this) \ BOOST_SCOPE_EXIT_AUX_PARAMS_T(id)( \ + BOOST_PP_CAT(BOOST_SCOPE_EXIT_THISPARAM_COMMA_IF_,this)(id,seq) \ BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_CTOR_ARG, id, seq ) ) \ - : BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_MEMBER_INIT, id, seq) {} + : BOOST_PP_CAT(BOOST_SCOPE_EXIT_THISINIT_COMMA_IF_,this)(seq) \ + BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_MEMBER_INIT, id, seq) {} #define BOOST_SCOPE_EXIT_AUX_PARAM_INIT(r, id, i, var) \ BOOST_PP_COMMA_IF(i) BOOST_SCOPE_EXIT_AUX_DEREF(id,i,var) -#define BOOST_SCOPE_EXIT_AUX_PARAMS_INIT(id, seq) \ - ( BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_PARAM_INIT, id, seq) ); +#define BOOST_SCOPE_EXIT_AUX_PARAMS_INIT(id, seq, this) \ + ( BOOST_PP_CAT(BOOST_SCOPE_EXIT_REALTHIS_COMMA_IF_,this)(seq) BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_PARAM_INIT, id, seq) ); #endif @@ -206,14 +294,16 @@ BOOST_SCOPE_EXIT_AUX_PARAM_T(BOOST_PP_TUPLE_ELEM(2,0,idty), i, var); -#define BOOST_SCOPE_EXIT_AUX_IMPL(id, seq, ty) \ +#define BOOST_SCOPE_EXIT_AUX_IMPL(id, seq, ty, this) \ BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_TAG_DECL, id, seq) \ - BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_CAPTURE_DECL, (id,ty), seq) \ - struct BOOST_SCOPE_EXIT_AUX_PARAMS_T(id) { \ - BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_PARAM_DECL, (id,ty), seq)\ + BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_CAPTURE_DECL, (id,ty), seq) \ + BOOST_PP_CAT(BOOST_SCOPE_EXIT_TYPEDEF_THISTYPE_,this)(id) \ + struct BOOST_SCOPE_EXIT_AUX_PARAMS_T(id) { \ + BOOST_PP_CAT(BOOST_SCOPE_EXIT_DEFINE_THISMEMBER_,this)(id) \ + BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_PARAM_DECL, (id,ty), seq) \ BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_MEMBER, id, seq) \ - BOOST_SCOPE_EXIT_AUX_PARAMS_T_CTOR(id, seq) \ - } BOOST_SCOPE_EXIT_AUX_PARAMS(id) BOOST_SCOPE_EXIT_AUX_PARAMS_INIT(id, seq)\ + BOOST_SCOPE_EXIT_AUX_PARAMS_T_CTOR(id, seq, this) \ + } BOOST_SCOPE_EXIT_AUX_PARAMS(id) BOOST_SCOPE_EXIT_AUX_PARAMS_INIT(id, seq, this)\ boost::scope_exit::aux::declare \ ::apply<0> boost_scope_exit_args; \ boost_scope_exit_args.value = &BOOST_SCOPE_EXIT_AUX_PARAMS(id); \ @@ -223,18 +313,26 @@ : boost_se_params_( \ (BOOST_SCOPE_EXIT_AUX_PARAMS_T(id)*)boost_se_params) \ {} \ + BOOST_PP_CAT(BOOST_SCOPE_EXIT_DEFINE_THIS_ACCESSOR_,this)(id) \ ~BOOST_SCOPE_EXIT_AUX_GUARD_T(id)() { boost_se_body( \ BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_ARG, id, seq) ); } \ - static void boost_se_body(BOOST_PP_SEQ_FOR_EACH_I( \ + void boost_se_body(BOOST_PP_SEQ_FOR_EACH_I( \ BOOST_SCOPE_EXIT_AUX_ARG_DECL, (id,ty), seq) ) #if defined(BOOST_MSVC) +#ifndef BOOST_SCOPE_EXIT_DONT_DISABLE_C4003 +#pragma warning(disable:4003) +#endif + #define BOOST_SCOPE_EXIT_END } BOOST_SCOPE_EXIT_AUX_GUARD(__COUNTER__) ( \ boost_scope_exit_args.value); #define BOOST_SCOPE_EXIT(seq) \ - BOOST_SCOPE_EXIT_AUX_IMPL(__COUNTER__, seq, BOOST_PP_EMPTY()) + BOOST_SCOPE_EXIT_AUX_IMPL(__COUNTER__, seq, BOOST_PP_EMPTY(), nothis) + +#define BOOST_SCOPE_EXIT_THIS(seq) \ + BOOST_SCOPE_EXIT_AUX_IMPL(__COUNTER__, seq, BOOST_PP_EMPTY(), this) #else @@ -242,15 +340,21 @@ boost_scope_exit_args.value); #define BOOST_SCOPE_EXIT(seq) \ - BOOST_SCOPE_EXIT_AUX_IMPL(__LINE__, seq, BOOST_PP_EMPTY()) + BOOST_SCOPE_EXIT_AUX_IMPL(__LINE__, seq, BOOST_PP_EMPTY(), nothis) + +#define BOOST_SCOPE_EXIT_THIS(seq) \ + BOOST_SCOPE_EXIT_AUX_IMPL(__LINE__, seq, BOOST_PP_EMPTY(), this) #endif #ifdef BOOST_SCOPE_EXIT_AUX_TPL_WORKAROUND #define BOOST_SCOPE_EXIT_TPL(seq) \ - BOOST_SCOPE_EXIT_AUX_IMPL(__LINE__, seq, typename) + BOOST_SCOPE_EXIT_AUX_IMPL(__LINE__, seq, typename, nothis) +#define BOOST_SCOPE_EXIT_THIS_TPL(seq) \ + BOOST_SCOPE_EXIT_AUX_IMPL(__LINE__, seq, typename, this) #else -#define BOOST_SCOPE_EXIT_TPL(seq) BOOST_SCOPE_EXIT(seq) +#define BOOST_SCOPE_EXIT_TPL(seq) BOOST_SCOPE_EXIT(seq) +#define BOOST_SCOPE_EXIT_THIS_TPL(seq) BOOST_SCOPE_EXIT_THIS(seq) #endif #endif // #ifndef FILE_boost_scope_exit_hpp_INCLUDED --- boost_1_38_0/boost/typeof/msvc/typeof_impl.hpp Fri Feb 27 08:06:09 2009 +++ boost_1_38_0/boost/typeof/msvc/typeof_impl.hpp Fri Feb 27 08:06:51 2009 @@ -70,7 +70,7 @@ } }; -# define BOOST_TYPEOF_INDEX(T) (encode_counter::count) +# define BOOST_TYPEOF_INDEX(T) (boost::type_of::encode_counter::count) # define BOOST_TYPEOF_NEXT_INDEX(next) # else template struct encode_counter : encode_counter {}; @@ -80,7 +80,7 @@ char (*encode_index(...))[5]; # define BOOST_TYPEOF_INDEX(T) (sizeof(*boost::type_of::encode_index((boost::type_of::encode_counter<1005>*)0))) -# define BOOST_TYPEOF_NEXT_INDEX(next) friend char (*encode_index(encode_counter*))[next]; +# define BOOST_TYPEOF_NEXT_INDEX(next) friend char (*boost::type_of::encode_index(encode_counter*))[next]; # endif //Typeof code