Changeset 63907


Ignore:
Timestamp:
Jul 12, 2010, 1:36:38 AM (8 years ago)
Author:
Daniel Walker
Message:

merged changeset 63726 from trunk

Location:
branches/release
Files:
133 edited

Legend:

Unmodified
Added
Removed
  • branches/release

  • branches/release/INSTALL

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/Jamroot

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/LICENSE_1_0.txt

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost

  • branches/release/boost-build.jam

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost.css

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost.png

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/array.hpp

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/bimap

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/config

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/config.hpp

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/detail

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/detail/endian.hpp

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/filesystem

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/filesystem.hpp

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/fusion

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/gil

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/graph

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/integer

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/interprocess

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/intrusive

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/io

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/lambda/detail/function_adaptors.hpp

    r63555 r63907  
    2424namespace detail {
    2525
    26 BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(has_template_sig, sig, 1, true)
     26BOOST_MPL_HAS_XXX_TEMPLATE_DEF(sig)
    2727
    2828template<class Tuple>
     
    161161        Args
    162162      , tuples::length<typename Args::tail_type>::value
    163       , detail::has_template_sig<plainF, Args>::value
     163      , detail::has_sig<plainF>::value
    164164      >
    165165  {};
  • branches/release/boost/math

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/math_fwd.hpp

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/mpl/has_xxx.hpp

    r63518 r63907  
    281281#if !defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
    282282
    283 // Create boolean n-ary Metafunction to detect a nested template
    284 // member with n template parameters. This implementation is based on
    285 // a USENET newsgroup's posting by Aleksey Gurtovoy
    286 // (comp.lang.c++.moderated, 2002-03-19), Rani Sharoni's USENET
    287 // posting cited above, the non-template has_xxx implementations
    288 // above, and discussion on the Boost mailing list.
     283// Create a boolean Metafunction to detect a nested template
     284// member. This implementation is based on a USENET newsgroup's
     285// posting by Aleksey Gurtovoy (comp.lang.c++.moderated, 2002-03-19),
     286// Rani Sharoni's USENET posting cited above, the non-template has_xxx
     287// implementations above, and discussion on the Boost mailing list.
    289288
    290289#   if !defined(BOOST_MPL_HAS_XXX_NO_WRAPPED_TYPES)
     
    295294
    296295#   if !defined(BOOST_MPL_HAS_XXX_NO_EXPLICIT_TEST_FUNCTION)
    297 #     if (defined(BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS) \
    298           || BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, <= 0x0303))
     296#     if (defined(BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS))
    299297#       define BOOST_MPL_HAS_XXX_NO_EXPLICIT_TEST_FUNCTION 1
    300 #     endif
    301 #   endif
    302 
    303 #   if !defined(BOOST_MPL_HAS_XXX_NO_IMPLICIT_SUBSTITUTE_TEMPLATE)
    304 #     if BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, <= 0x0303)
    305 #       define BOOST_MPL_HAS_XXX_NO_IMPLICIT_SUBSTITUTE_TEMPLATE 1
    306298#     endif
    307299#   endif
     
    313305#   endif
    314306
    315 // NOTE: All internal implementation macros take a Boost.Preprocessor
    316 // array argument called args which contains the arguments passed to
    317 // HAS_XXX_TEMPLATE_NAMED_DEF and is of the following form.
    318 //               ( 4, ( trait, name, n, default_ ) )
     307// NOTE: Many internal implementation macros take a Boost.Preprocessor
     308// array argument called args which is of the following form.
     309//           ( 4, ( trait, name, max_arity, default_ ) )
    319310
    320311#   define BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args) \
     
    322313    /**/
    323314
    324 #   define BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args) \
    325       BOOST_PP_CAT(BOOST_PP_ARRAY_ELEM(0, args) , _substitute) \
     315#   define BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args, n) \
     316      BOOST_PP_CAT(BOOST_PP_CAT(BOOST_PP_ARRAY_ELEM(0, args) , _substitute), n) \
    326317    /**/
    327318
     
    333324// "substitute" template as an argument to the overloaded test
    334325// functions to get SFINAE to work for member templates with the
    335 // correct name but incorrect arguments.
     326// correct name but different number of arguments.
     327#   define BOOST_MPL_HAS_MEMBER_MULTI_SUBSTITUTE(z, n, args) \
     328      template< \
     329          template< BOOST_PP_ENUM_PARAMS(BOOST_PP_INC(n), typename V) > class V \
     330       > \
     331      struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args, n) { \
     332      }; \
     333    /**/
     334
    336335#   define BOOST_MPL_HAS_MEMBER_SUBSTITUTE(args, substitute_macro) \
    337       template< substitute_macro(args, V) > \
    338       struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args) { \
    339       }; \
     336      BOOST_PP_REPEAT( \
     337          BOOST_PP_ARRAY_ELEM(2, args) \
     338        , BOOST_MPL_HAS_MEMBER_MULTI_SUBSTITUTE \
     339        , args \
     340      ) \
    340341    /**/
    341342
     
    354355
    355356#   if !BOOST_MPL_HAS_XXX_NO_WRAPPED_TYPES
    356 #     define BOOST_MPL_HAS_MEMBER_ACCEPT(args, member_macro) \
     357#     define BOOST_MPL_HAS_MEMBER_MULTI_ACCEPT(z, n, args) \
    357358        template< typename V > \
    358359        static boost::mpl::aux::yes_tag \
    359360        BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)( \
    360361            boost::mpl::aux::type_wrapper< V > const volatile* \
    361           , BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args) < \
    362                 member_macro(args, V, T) \
     362          , BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args, n) < \
     363                V::template BOOST_PP_ARRAY_ELEM(1, args) \
    363364            >* = 0 \
    364365        ); \
     366      /**/
     367#     define BOOST_MPL_HAS_MEMBER_ACCEPT(args, member_macro) \
     368        BOOST_PP_REPEAT( \
     369            BOOST_PP_ARRAY_ELEM(2, args) \
     370          , BOOST_MPL_HAS_MEMBER_MULTI_ACCEPT \
     371          , args \
     372        ) \
    365373      /**/
    366374#   else
     
    420428      template< \
    421429          typename T \
    422           BOOST_PP_ENUM_TRAILING_PARAMS( \
    423               BOOST_PP_ARRAY_ELEM(2, args), typename T \
    424           )  \
    425430        , typename fallback_ \
    426431              = boost::mpl::bool_< BOOST_PP_ARRAY_ELEM(3, args) > \
     
    437442    /**/
    438443
    439 // For example,
    440 // BOOST_MPL_HAS_MEMBER_WITH_FUNCTION_SFINAE(
    441 //     (4, (has_xxx, xxx, 2, false))
    442 //   , BOOST_MPL_HAS_MEMBER_TEMPLATE_SUBSTITUTE_PARAMETER
    443 //   , BOOST_MPL_HAS_MEMBER_TEMPLATE_ACCESS
    444 // )
    445 // expands to something like the following...
    446 //
    447 // template<
    448 //     typename T , typename T0 , typename T1
    449 //   , typename fallback_ = boost::mpl::bool_< false >
    450 // >
    451 // class has_xxx {
    452 //     template< typename U >
    453 //     struct has_xxx_introspect {
    454 //         template< template< typename V0 , typename V1 > class V >
    455 //         struct has_xxx_substitute {
    456 //         };
    457 //
    458 //         template< typename V >
    459 //         static boost::mpl::aux::no_tag
    460 //         has_xxx_test(...);
    461 //
    462 //         template< typename V >
    463 //         static boost::mpl::aux::yes_tag
    464 //         has_xxx_test(
    465 //             boost::mpl::aux::type_wrapper< V > const volatile*
    466 //           , has_xxx_substitute < V::template xxx >* = 0
    467 //         );
    468 //
    469 //         static const bool value
    470 //             = sizeof(has_xxx_test< U >(0))
    471 //                   == sizeof(boost::mpl::aux::yes_tag);
    472 //         typedef boost::mpl::bool_< value > type;
    473 //     };
    474 // public:
    475 //     static const bool value = has_xxx_introspect< T >::value;
    476 //     typedef typename has_xxx_introspect< T >::type type;
    477 // };
     444// BOOST_MPL_HAS_MEMBER_WITH_FUNCTION_SFINAE expands to the full
     445// implementation of the function-based metafunction. Compile with -E
     446// to see the preprocessor output for this macro.
    478447#   define BOOST_MPL_HAS_MEMBER_WITH_FUNCTION_SFINAE( \
    479448               args, substitute_macro, member_macro \
     
    497466#     if !BOOST_MPL_HAS_XXX_NEEDS_NAMESPACE_LEVEL_SUBSTITUTE
    498467#       define BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME_WITH_TEMPLATE_SFINAE( \
    499                    args \
     468                   args, n \
    500469               ) \
    501           BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args) \
     470          BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args, n) \
    502471        /**/
    503472#     else
    504473#       define BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME_WITH_TEMPLATE_SFINAE( \
    505                    args \
     474                   args, n \
    506475               ) \
    507476          BOOST_PP_CAT( \
    508477              boost_mpl_has_xxx_ \
    509             , BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args) \
     478            , BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args, n) \
    510479          ) \
    511480        /**/
     
    517486        BOOST_PP_CAT( \
    518487            BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME_WITH_TEMPLATE_SFINAE( \
    519                 args \
     488                args, 0 \
    520489            ) \
    521490          , _tag \
     
    523492      /**/
    524493
    525 #     define BOOST_MPL_HAS_MEMBER_SUBSTITUTE_WITH_TEMPLATE_SFINAE( \
    526                  args, substitute_macro \
    527              ) \
    528         typedef void \
    529             BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_TAG_NAME(args); \
    530         template< substitute_macro(args, U) > \
     494#     define BOOST_MPL_HAS_MEMBER_MULTI_SUBSTITUTE_WITH_TEMPLATE_SFINAE( \
     495                 z, n, args \
     496             ) \
     497        template< \
     498             template< BOOST_PP_ENUM_PARAMS(BOOST_PP_INC(n), typename U) > class U \
     499        > \
    531500        struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME_WITH_TEMPLATE_SFINAE( \
    532                 args \
     501                args, n \
    533502               ) { \
    534503            typedef \
     
    538507      /**/
    539508
     509#     define BOOST_MPL_HAS_MEMBER_SUBSTITUTE_WITH_TEMPLATE_SFINAE( \
     510                 args, substitute_macro \
     511             ) \
     512        typedef void \
     513            BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_TAG_NAME(args); \
     514        BOOST_PP_REPEAT( \
     515            BOOST_PP_ARRAY_ELEM(2, args) \
     516          , BOOST_MPL_HAS_MEMBER_MULTI_SUBSTITUTE_WITH_TEMPLATE_SFINAE \
     517          , args \
     518        ) \
     519      /**/
     520
    540521#     define BOOST_MPL_HAS_MEMBER_REJECT_WITH_TEMPLATE_SFINAE( \
    541522                 args, member_macro \
     
    543524        template< \
    544525            typename U \
    545             BOOST_PP_ENUM_TRAILING_PARAMS( \
    546                 BOOST_PP_ARRAY_ELEM(2, args), typename U \
    547             ) \
    548526          , typename V \
    549527                = BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_TAG_NAME(args) \
     
    555533      /**/
    556534
    557 #     define BOOST_MPL_HAS_MEMBER_ACCEPT_WITH_TEMPLATE_SFINAE( \
    558                  args, member_macro \
    559              ) \
    560         template< \
    561             typename U \
    562             BOOST_PP_ENUM_TRAILING_PARAMS( \
    563                 BOOST_PP_ARRAY_ELEM(2, args), typename U \
    564             ) \
    565         > \
     535#     define BOOST_MPL_HAS_MEMBER_MULTI_ACCEPT_WITH_TEMPLATE_SFINAE( \
     536                 z, n, args \
     537             ) \
     538        template< typename U > \
    566539        struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)< \
    567             U BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ARRAY_ELEM(2, args), U) \
     540            U \
    568541          , typename \
    569542                BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME_WITH_TEMPLATE_SFINAE( \
    570                     args \
     543                    args, n \
    571544                )< \
    572                     member_macro(args, U, U) \
     545                    BOOST_MSVC_TYPENAME U::BOOST_PP_ARRAY_ELEM(1, args)< > \
    573546                >::type \
    574547        > { \
     
    578551      /**/
    579552
    580 #     define BOOST_MPL_HAS_MEMBER_BASIC_INTROSPECT_WITH_TEMPLATE_SFINAE( \
     553#     define BOOST_MPL_HAS_MEMBER_ACCEPT_WITH_TEMPLATE_SFINAE( \
     554                 args, member_macro \
     555             ) \
     556        BOOST_PP_REPEAT( \
     557            BOOST_PP_ARRAY_ELEM(2, args) \
     558          , BOOST_MPL_HAS_MEMBER_MULTI_ACCEPT_WITH_TEMPLATE_SFINAE \
     559          , args \
     560        ) \
     561      /**/
     562
     563#     define BOOST_MPL_HAS_MEMBER_INTROSPECT_WITH_TEMPLATE_SFINAE( \
    581564                 args, substitute_macro, member_macro \
    582565             ) \
     
    585568        template< typename U > \
    586569        struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args) \
    587             : BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)< \
    588                   U \
    589                   BOOST_PP_ENUM_TRAILING_PARAMS( \
    590                       BOOST_PP_ARRAY_ELEM(2, args) \
    591                     , T \
    592                   ) \
    593               > { \
     570            : BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)< U > { \
    594571        }; \
    595572      /**/
    596 
    597 #     if !BOOST_MPL_HAS_XXX_NEEDS_NAMESPACE_LEVEL_SUBSTITUTE
    598 #       define BOOST_MPL_HAS_MEMBER_INTROSPECT_WITH_TEMPLATE_SFINAE( \
    599                    args, substitute_macro, member_macro \
    600                ) \
    601           BOOST_MPL_HAS_MEMBER_SUBSTITUTE_WITH_TEMPLATE_SFINAE( \
    602               args, substitute_macro \
    603           ) \
    604           BOOST_MPL_HAS_MEMBER_BASIC_INTROSPECT_WITH_TEMPLATE_SFINAE( \
    605               args, substitute_macro, member_macro \
    606           ) \
    607         /**/
    608 #     else
    609 #       define BOOST_MPL_HAS_MEMBER_INTROSPECT_WITH_TEMPLATE_SFINAE( \
    610                    args, substitute_macro, member_macro \
    611                ) \
    612           BOOST_MPL_HAS_MEMBER_BASIC_INTROSPECT_WITH_TEMPLATE_SFINAE( \
    613               args, substitute_macro, member_macro \
    614           ) \
    615         /**/
    616 #     endif
    617 
    618 // For example,
    619 // BOOST_MPL_HAS_MEMBER_WITH_TEMPLATE_SFINAE(
    620 //     (4, (has_xxx, xxx, 2, false))
    621 //   , BOOST_MPL_HAS_MEMBER_TEMPLATE_SUBSTITUTE_PARAMETER
    622 //   , BOOST_MPL_HAS_MEMBER_TEMPLATE_ACCESS
    623 // )
    624 // expands to something like the following...
    625 //
    626 // template<
    627 //     typename T , typename T0 , typename T1
    628 //   , typename fallback_ = boost::mpl::bool_< false >
    629 // >
    630 // class has_xxx {
    631 //     typedef void has_xxx_substitute_tag;
    632 //
    633 //     template< template< typename U0 , typename U1 > class U >
    634 //     struct has_xxx_substitute {
    635 //         typedef has_xxx_substitute_tag type;
    636 //     };
    637 //
    638 //     template<
    639 //         typename U , typename U0 , typename U1
    640 //       , typename V = has_xxx_substitute_tag
    641 //     >
    642 //     struct has_xxx_test {
    643 //         static const bool value = false;
    644 //         typedef boost::mpl::bool_< value > type;
    645 //     };
    646 //
    647 //     template< typename U , typename U0 , typename U1 >
    648 //     struct has_xxx_test<
    649 //         U , U0 , U1
    650 //       , typename has_xxx_substitute< U::template xxx >::type
    651 //     > {
    652 //         static const bool value = true;
    653 //         typedef boost::mpl::bool_< value > type;
    654 //     };
    655 //
    656 //     template< typename U >
    657 //     struct has_xxx_introspect : has_xxx_test< U , T0 , T1 > {
    658 //     };
    659 // public:
    660 //     static const bool value = has_xxx_introspect< T >::value;
    661 //     typedef typename has_xxx_introspect< T >::type type;
    662 // };
     573 
     574// BOOST_MPL_HAS_MEMBER_WITH_TEMPLATE_SFINAE expands to the full
     575// implementation of the template-based metafunction. Compile with -E
     576// to see the preprocessor output for this macro.
    663577//
    664578// Note that if BOOST_MPL_HAS_XXX_NEEDS_NAMESPACE_LEVEL_SUBSTITUTE is
     
    669583                 args, substitute_macro, member_macro \
    670584             ) \
     585        BOOST_MPL_HAS_MEMBER_SUBSTITUTE_WITH_TEMPLATE_SFINAE( \
     586            args, substitute_macro \
     587        ) \
    671588        BOOST_MPL_HAS_MEMBER_IMPLEMENTATION( \
    672589            args \
     
    679596#   endif // BOOST_MPL_HAS_XXX_NEEDS_TEMPLATE_SFINAE
    680597
    681 #   define BOOST_MPL_HAS_MEMBER_TEMPLATE_EXPLICIT_SUBSTITUTE_PARAMETER( \
    682                args, param \
    683            ) \
    684       typename \
    685     /**/
    686 
    687 #   if !BOOST_MPL_HAS_XXX_NO_IMPLICIT_SUBSTITUTE_TEMPLATE
    688 #     define BOOST_MPL_HAS_MEMBER_TEMPLATE_IMPLICIT_SUBSTITUTE_PARAMETER( \
    689                  args, param \
    690              ) \
    691         template< \
    692             BOOST_PP_ENUM_PARAMS(BOOST_PP_ARRAY_ELEM(2, args), typename param) \
    693         > \
    694         class param\
    695       /**/
    696 
    697 // See comment at BOOST_MPL_HAS_MEMBER_TEMPLATE_ACCESS below.
    698 #     define BOOST_MPL_HAS_MEMBER_TEMPLATE_SUBSTITUTE_PARAMETER(args, param) \
    699         BOOST_PP_IF( \
    700             BOOST_PP_ARRAY_ELEM(2, args) \
    701           , BOOST_MPL_HAS_MEMBER_TEMPLATE_IMPLICIT_SUBSTITUTE_PARAMETER \
    702           , BOOST_MPL_HAS_MEMBER_TEMPLATE_EXPLICIT_SUBSTITUTE_PARAMETER \
    703         ) ( args, param ) \
    704       /**/
    705 #   else
    706 #     define BOOST_MPL_HAS_MEMBER_TEMPLATE_SUBSTITUTE_PARAMETER(args, param) \
    707         BOOST_MPL_HAS_MEMBER_TEMPLATE_EXPLICIT_SUBSTITUTE_PARAMETER( \
    708             args, param \
    709         ) \
    710       /**/
    711 #   endif
    712 
    713 #   define BOOST_MPL_HAS_MEMBER_TEMPLATE_EXPLICIT_ACCESS( \
    714                args, class_type, param \
    715            ) \
    716       typename class_type::template BOOST_PP_ARRAY_ELEM(1, args)< \
    717           BOOST_PP_ENUM_PARAMS(BOOST_PP_ARRAY_ELEM(2, args), param) \
    718       > \
    719     /**/
    720 
    721 #   if !BOOST_MPL_HAS_XXX_NO_IMPLICIT_SUBSTITUTE_TEMPLATE
    722 #     define BOOST_MPL_HAS_MEMBER_TEMPLATE_IMPLICIT_ACCESS( \
    723                args, class_type, param \
    724              ) \
    725         class_type::template BOOST_PP_ARRAY_ELEM(1, args) \
    726       /**/
    727 
    728 // Note: to recognize templates with no required arguments use
    729 // explicit access since a substitute template with no args cannot be
    730 // declared.
    731 #     define BOOST_MPL_HAS_MEMBER_TEMPLATE_ACCESS(args, class_type, param) \
    732         BOOST_PP_IF( \
    733             BOOST_PP_ARRAY_ELEM(2, args) \
    734           , BOOST_MPL_HAS_MEMBER_TEMPLATE_IMPLICIT_ACCESS \
    735           , BOOST_MPL_HAS_MEMBER_TEMPLATE_EXPLICIT_ACCESS \
    736         ) ( args, class_type, param ) \
    737       /**/
    738 #   else
    739 #     define BOOST_MPL_HAS_MEMBER_TEMPLATE_ACCESS(args, class_type, param) \
    740         BOOST_MPL_HAS_MEMBER_TEMPLATE_EXPLICIT_ACCESS( \
    741             args, class_type, param \
    742         ) \
    743       /**/
    744 #   endif
    745 
    746 #   if BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
    747 // MSVC (7.1, 8.0) accepts the member template access syntax below
    748 // regardless of the member template's arity. introspect will reject
    749 // member templates with the wrong arity due to the substitute
    750 // template. Note that using this syntax also enables MSVC
    751 // template-based SFINAE to reject non-template members. This is
    752 // important because explicitly passing the template args will match
    753 // templates with the correct name and arguments but will cause ICE on
    754 // non-template members. However, MSVC nullary template-based SFINAE
    755 // (introspection for a member template with no required args) can not
    756 // reject non-template members, but MSVC function-based SFINAE
    757 // can. So, one of the two is chosen based on the number of required
    758 // template parameters.
    759 #     if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
    760 #       define BOOST_MPL_HAS_MEMBER_TEMPLATE_ACCESS_MSVC( \
    761                    args, class_type, param \
    762                ) \
    763           typename class_type::template BOOST_PP_ARRAY_ELEM(1, args)< > \
    764         /**/
    765 #     else
    766 #       define BOOST_MPL_HAS_MEMBER_TEMPLATE_ACCESS_MSVC( \
    767                    args, class_type, param \
    768                ) \
    769           class_type::BOOST_PP_ARRAY_ELEM(1, agrs)< > \
    770         /**/
    771 #     endif
    772 
    773 #     define BOOST_MPL_HAS_MEMBER_TEMPLATE_MSVC( \
    774                  args, substitute_macro, member_macro \
    775              ) \
    776         BOOST_MPL_HAS_MEMBER_SUBSTITUTE_WITH_TEMPLATE_SFINAE( \
    777             args, substitute_macro \
    778         ) \
    779         BOOST_PP_IF( \
    780             BOOST_PP_ARRAY_ELEM(2, args) \
    781           , BOOST_MPL_HAS_MEMBER_WITH_TEMPLATE_SFINAE \
    782           , BOOST_MPL_HAS_MEMBER_WITH_FUNCTION_SFINAE \
    783         ) ( \
    784             args \
    785           , substitute_macro \
    786           , member_macro \
    787         ) \
    788       /**/
    789 #   endif
    790 
     598// Note: In the current implementation the parameter and access macros
     599// are no longer expanded.
    791600#   if !BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
    792 #     define BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(trait, name, n, default_) \
     601#     define BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(trait, name, default_) \
    793602        BOOST_MPL_HAS_MEMBER_WITH_FUNCTION_SFINAE( \
    794             ( 4, ( trait, name, n, default_ ) ) \
     603            ( 4, ( trait, name, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, default_ ) ) \
    795604          , BOOST_MPL_HAS_MEMBER_TEMPLATE_SUBSTITUTE_PARAMETER \
    796605          , BOOST_MPL_HAS_MEMBER_TEMPLATE_ACCESS \
     
    798607      /**/
    799608#   else
    800 #     define BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(trait, name, n, default_) \
    801         BOOST_MPL_HAS_MEMBER_TEMPLATE_MSVC( \
    802             ( 4, ( trait, name, n, default_ ) ) \
     609#     define BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(trait, name, default_) \
     610        BOOST_MPL_HAS_MEMBER_WITH_TEMPLATE_SFINAE( \
     611            ( 4, ( trait, name, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, default_ ) ) \
    803612          , BOOST_MPL_HAS_MEMBER_TEMPLATE_SUBSTITUTE_PARAMETER \
    804           , BOOST_MPL_HAS_MEMBER_TEMPLATE_ACCESS_MSVC \
     613          , BOOST_MPL_HAS_MEMBER_TEMPLATE_ACCESS \
    805614        ) \
    806615      /**/
     
    811620// placeholder implementation
    812621
    813 #   define BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(trait, name, n, default_) \
     622#   define BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(trait, name, default_) \
    814623      template< typename T \
    815                 BOOST_PP_ENUM_TRAILING_PARAMS(n, typename U) \
    816624              , typename fallback_ = boost::mpl::bool_< default_ > > \
    817625      struct trait { \
     
    823631#endif // BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE
    824632
    825 #   define BOOST_MPL_HAS_XXX_TEMPLATE_DEF(name, n) \
     633#   define BOOST_MPL_HAS_XXX_TEMPLATE_DEF(name) \
    826634      BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF( \
    827           BOOST_PP_CAT(has_, name), name, n, false \
     635          BOOST_PP_CAT(has_, name), name, false \
    828636      ) \
    829637    /**/
  • branches/release/boost/msm

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/numeric/ublas

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/numeric/ublas/functional.hpp

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/program_options

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/property_tree

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/python

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/range

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/regex

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/signals

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/signals2

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/spirit

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/spirit/home

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/spirit/home/karma

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/spirit/home/support/attributes.hpp

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/statechart

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/system

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/tr1

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/utility

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/utility/value_init.hpp

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/uuid

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/variant

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/version.hpp

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/boost/wave

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/bootstrap.bat

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/bootstrap.sh

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/doc

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/index.htm

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/index.html

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs

  • branches/release/libs/array/doc/array.xml

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/array/test/array0.cpp

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/array/test/array2.cpp

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/bimap

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/config

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/config/test/boost_no_com_value_init.ipp

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/filesystem

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/graph_parallel

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/interprocess

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/intrusive

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/libraries.htm

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/maintainers.txt

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/math

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/mpl/doc/refmanual/broken-compiler-workarounds.html

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/mpl/doc/refmanual/categorized-index-concepts.html

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/mpl/doc/refmanual/cfg-no-preprocessed-headers.html

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/mpl/doc/refmanual/composition-and-argument-binding.html

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/mpl/doc/refmanual/data-types-concepts.html

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/mpl/doc/refmanual/data-types-miscellaneous.html

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/mpl/doc/refmanual/extensible-associative-sequence.html

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/mpl/doc/refmanual/inserter-class.html

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/mpl/doc/refmanual/tag-dispatched-metafunction.html

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/mpl/doc/refmanual/trivial-metafunctions-summary.html

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/mpl/doc/src/refmanual/HAS_XXX_TEMPLATE_DEF.rst

    r63518 r63907  
    1414.. parsed-literal::
    1515
    16     #define BOOST_MPL_HAS_XXX_TEMPLATE_DEF(name, n) \\
     16    #define BOOST_MPL_HAS_XXX_TEMPLATE_DEF(name) \\
    1717        |unspecified-token-seq| \\
    1818    /\*\*/
     
    2222-----------
    2323
    24 Expands into the definition of a boolean n-ary |Metafunction|
    25 ``has_name`` such that for any types ``x, a1, a2, ..., an``
    26 ``has_name<x, a1, ..., an>::value == true`` if and only if ``x`` is a
    27 class type and has a nested template member ``x::template name<a1,
    28 ..., an>``.
     24Expands into the definition of a boolean |Metafunction| ``has_name``
     25such that for any type ``x`` ``has_name<x>::value == true`` if and
     26only if ``x`` is a class type and has a nested template member
     27``x::template name`` with no more than
     28|BOOST_MPL_LIMIT_METAFUNCTION_ARITY| parameters.
    2929
    3030On deficient compilers not capable of performing the detection,
    31 ``has_name<x, a1, ..., an>::value`` always returns ``false``. A
    32 boolean configuration macro, |BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE|, is
    33 provided to signal or override the "deficient" status of a particular
    34 compiler.
     31``has_name<x>::value`` is always ``false``. A boolean configuration
     32macro, |BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE|, is provided to signal or
     33override the "deficient" status of a particular compiler.
    3534
    3635|Note:| |BOOST_MPL_HAS_XXX_TEMPLATE_DEF| is a simplified front end to
     
    5655| ``name``      | A legal identifier token      | A name of the template member being detected.     |
    5756+---------------+-------------------------------+---------------------------------------------------+
    58 | ``n``         | An integral constant >= 0     | The arity of the template member being detected.  |
    59 +---------------+-------------------------------+---------------------------------------------------+
    6057
    6158
     
    6360--------------------
    6461
    65 For any legal C++ identifier ``name`` and integral constant expression
    66 ``n`` greater than or equal to 0:
     62For any legal C++ identifier ``name``:
    6763
    6864.. parsed-literal::
    6965
    70     BOOST_MPL_HAS_XXX_TEMPLATE_DEF(name, n)
     66    BOOST_MPL_HAS_XXX_TEMPLATE_DEF(name)
    7167
    7268:Precondition:
     
    8278
    8379        BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(
    84               BOOST_PP_CAT(has\_,name), name, n, false
     80              BOOST_PP_CAT(has\_,name), name, false
    8581            )
    8682
     
    9187.. parsed-literal::
    9288   
    93     BOOST_MPL_HAS_XXX_TEMPLATE_DEF(xxx, 1)
     89    BOOST_MPL_HAS_XXX_TEMPLATE_DEF(xxx)
    9490   
    9591    struct test1  {};
     
    10399    struct test9  { template< class T > struct xxx {}; };
    104100   
    105     BOOST_MPL_ASSERT_NOT(( has_xxx<test1, int> ));
    106     BOOST_MPL_ASSERT_NOT(( has_xxx<test2, int> ));
    107     BOOST_MPL_ASSERT_NOT(( has_xxx<test3, int> ));
    108     BOOST_MPL_ASSERT_NOT(( has_xxx<test4, int> ));
    109     BOOST_MPL_ASSERT_NOT(( has_xxx<test5, int> ));
    110     BOOST_MPL_ASSERT_NOT(( has_xxx<test6, int> ));
    111     BOOST_MPL_ASSERT_NOT(( has_xxx<test7, int> ));
    112     BOOST_MPL_ASSERT_NOT(( has_xxx<test8, int> ));
     101    BOOST_MPL_ASSERT_NOT(( has_xxx<test1> ));
     102    BOOST_MPL_ASSERT_NOT(( has_xxx<test2> ));
     103    BOOST_MPL_ASSERT_NOT(( has_xxx<test3> ));
     104    BOOST_MPL_ASSERT_NOT(( has_xxx<test4> ));
     105    BOOST_MPL_ASSERT_NOT(( has_xxx<test5> ));
     106    BOOST_MPL_ASSERT_NOT(( has_xxx<test6> ));
     107    BOOST_MPL_ASSERT_NOT(( has_xxx<test7> ));
     108    BOOST_MPL_ASSERT_NOT(( has_xxx<test8> ));
    113109   
    114110    #if !defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
    115     BOOST_MPL_ASSERT(( has_xxx<test9, int> ));
     111    BOOST_MPL_ASSERT(( has_xxx<test9> ));
    116112    #endif
    117113   
    118     BOOST_MPL_ASSERT(( has_xxx<test9, int, true\_> ));
     114    BOOST_MPL_ASSERT(( has_xxx<test9, true\_> ));
    119115
    120116
     
    122118--------
    123119
    124 |Macros|, |BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF|, |BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE|
     120|Macros|, |BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF|,
     121|BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE|, |BOOST_MPL_LIMIT_METAFUNCTION_ARITY|
    125122
  • branches/release/libs/mpl/doc/src/refmanual/HAS_XXX_TEMPLATE_NAMED_DEF.rst

    r63518 r63907  
    1414.. parsed-literal::
    1515
    16     #define BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(trait, name, n, default\_) \\
     16    #define BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(trait, name, default\_) \\
    1717        |unspecified-token-seq| \\
    1818    /\*\*/
     
    2222-----------
    2323
    24 Expands into the definition of a boolean n-ary |Metafunction| ``trait``
    25 such that for any types ``x, a1, a2, ..., an`` ``trait<x, a1, ...,
    26 an>::value == true`` if and only if ``x`` is a class type and has a
    27 nested template member ``x::template name<a1, ..., an>``.
     24Expands into the definition of a boolean |Metafunction| ``trait`` such
     25that for any type ``x`` ``trait<x>::value == true`` if and only if
     26``x`` is a class type and has a nested template member ``x::template
     27name`` with no more than |BOOST_MPL_LIMIT_METAFUNCTION_ARITY|
     28parameters.
    2829
    2930On deficient compilers not capable of performing the detection,
    30 ``trait<x, a1, ..., an>::value`` always returns a fallback value
    31 ``default_``.  A boolean configuration macro,
    32 |BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE|, is provided to signal or override
    33 the "deficient" status of a particular compiler.  |Note:| The fallback
    34 value can also be provided at the point of the metafunction
    35 invocation; see the `Expression semantics` section for details |-- end
    36 note|
     31``trait<x>::value`` always returns a fallback value ``default_``.  A
     32boolean configuration macro, |BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE|, is
     33provided to signal or override the "deficient" status of a particular
     34compiler.  |Note:| The fallback value can also be provided at the
     35point of the metafunction invocation; see the `Expression semantics`
     36section for details |-- end note|
    3737
    3838
     
    5555| ``name``      | A legal identifier token      | A name of the member being detected.              |
    5656+---------------+-------------------------------+---------------------------------------------------+
    57 | ``n``         | An integral constant >= 0     | The arity of the template member being detected.  |
    58 +---------------+-------------------------------+---------------------------------------------------+
    5957| ``default_``  | An boolean constant           | A fallback value for the deficient compilers.     |
    6058+---------------+-------------------------------+---------------------------------------------------+
     
    6462--------------------
    6563
    66 For any legal C++ identifiers ``trait`` and ``name``, integral
    67 constant expression ``n`` greater than or equal to 0, boolean constant
     64For any legal C++ identifiers ``trait`` and ``name``, boolean constant
    6865expression ``c1``, boolean |Integral Constant| ``c2``, and arbitrary
    6966type ``x``:
     
    7168.. parsed-literal::
    7269
    73     BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(trait, name, n, c1)
     70    BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(trait, name, c1)
    7471
    7572:Precondition:
     
    8784        template<
    8885            typename X
    89           , typename A1, ..., typename An
    9086          , typename fallback = boost::mpl::bool\_<c1>
    9187        >
     
    10197    .. parsed-literal::
    10298
    103         typedef trait<x, a1, ..., an>::type r;
     99        typedef trait<x>::type r;
    104100
    105101    :Return type:
     
    109105        If |BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE| is defined, ``r::value
    110106        == c1``; otherwise, ``r::value == true`` if and only if ``x``
    111         is a class type that has a nested type member ``x::template
    112         name<a1, ..., an>``.
     107        is a class type that has a nested template member ``x::template
     108        name`` with no more than |BOOST_MPL_LIMIT_METAFUNCTION_ARITY|.
    113109   
    114110   
    115111    .. parsed-literal::
    116112
    117         typedef trait< x, a1, ..., an, c2 >::type r;
     113        typedef trait< x, c2 >::type r;
    118114
    119115    :Return type:
     
    126122        .. parsed-literal::
    127123
    128             typedef trait<x, a1, ..., an>::type r;
     124            typedef trait<x>::type r;
    129125
    130126
     
    135131   
    136132    BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(
    137         has_xxx, xxx, 1, false
     133        has_xxx, xxx, false
    138134    )
    139135
     
    148144    struct test9  { template< class T > struct xxx {}; };
    149145
    150     BOOST_MPL_ASSERT_NOT(( has_xxx<test1, int> ));
    151     BOOST_MPL_ASSERT_NOT(( has_xxx<test2, int> ));
    152     BOOST_MPL_ASSERT_NOT(( has_xxx<test3, int> ));
    153     BOOST_MPL_ASSERT_NOT(( has_xxx<test4, int> ));
    154     BOOST_MPL_ASSERT_NOT(( has_xxx<test5, int> ));
    155     BOOST_MPL_ASSERT_NOT(( has_xxx<test6, int> ));
    156     BOOST_MPL_ASSERT_NOT(( has_xxx<test7, int> ));
    157     BOOST_MPL_ASSERT_NOT(( has_xxx<test8, int> ));
     146    BOOST_MPL_ASSERT_NOT(( has_xxx<test1> ));
     147    BOOST_MPL_ASSERT_NOT(( has_xxx<test2> ));
     148    BOOST_MPL_ASSERT_NOT(( has_xxx<test3> ));
     149    BOOST_MPL_ASSERT_NOT(( has_xxx<test4> ));
     150    BOOST_MPL_ASSERT_NOT(( has_xxx<test5> ));
     151    BOOST_MPL_ASSERT_NOT(( has_xxx<test6> ));
     152    BOOST_MPL_ASSERT_NOT(( has_xxx<test7> ));
     153    BOOST_MPL_ASSERT_NOT(( has_xxx<test8> ));
    158154
    159155    #if !defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
    160     BOOST_MPL_ASSERT(( has_xxx<test9, int> ));
     156    BOOST_MPL_ASSERT(( has_xxx<test9> ));
    161157    #endif
    162158
    163     BOOST_MPL_ASSERT(( has_xxx<test9, int, true\_> ));
     159    BOOST_MPL_ASSERT(( has_xxx<test9, true\_> ));
    164160
    165161
     
    167163--------
    168164
    169 |Macros|, |BOOST_MPL_HAS_XXX_TEMPLATE_DEF|, |BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE|
     165|Macros|, |BOOST_MPL_HAS_XXX_TEMPLATE_DEF|,
     166|BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE|, |BOOST_MPL_LIMIT_METAFUNCTION_ARITY|
    170167
  • branches/release/libs/mpl/doc/src/refmanual/Iterators-Iterator.rst

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/mpl/test/has_xxx.cpp

    r63518 r63907  
    1818
    1919BOOST_MPL_HAS_XXX_TRAIT_DEF(xxx)
    20 BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(has_xxx0, xxx, 0, false)
    21 BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(has_xxx1, xxx, 1, false)
    22 BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(has_xxx2, xxx, 2, false)
    23 BOOST_MPL_HAS_XXX_TEMPLATE_DEF(yyy0, 0)
    24 BOOST_MPL_HAS_XXX_TEMPLATE_DEF(yyy1, 1)
    25 BOOST_MPL_HAS_XXX_TEMPLATE_DEF(yyy2, 2)
     20BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(has_xxx_template, xxx, false)
     21BOOST_MPL_HAS_XXX_TEMPLATE_DEF(yyy)
    2622
    2723struct a1 {};
     
    3935struct b7 { typedef void (xxx)(); };
    4036
    41 struct c0 { template< typename T0 = int > struct xxx {}; };
    42 struct c1 { template< typename T1 > struct xxx {}; };
     37struct c1 { template< typename T > struct xxx {}; };
    4338struct c2 { template< typename T1, typename T2 > struct xxx {}; };
    44 struct c3 { template< typename T0 = int > struct yyy0 {}; };
    45 struct c4 { template< typename T1 > struct yyy1 {}; };
    46 struct c5 { template< typename T1, typename T2 > struct yyy2 {}; };
     39struct c3 { template< typename T1, typename T2, typename T3 > struct xxx {}; };
     40struct c4 { template< typename T1, typename T2, typename T3, typename T4 > struct xxx {}; };
     41struct c5 { template< typename T1, typename T2, typename T3, typename T4, typename T5 > struct xxx {}; };
     42struct c6 { template< typename T > struct yyy {}; };
     43struct c7 { template< typename T1, typename T2 > struct yyy {}; };
    4744
    4845template< typename T > struct outer;
     
    5754{
    5855    MPL_ASSERT_NOT(( has_xxx<int> ));
    59     MPL_ASSERT_NOT(( has_xxx0< int > ));
    60     MPL_ASSERT_NOT(( has_xxx1< int, int > ));
    61     MPL_ASSERT_NOT(( has_xxx2< int, int, int > ));
    62     MPL_ASSERT_NOT(( has_yyy0< int > ));
    63     MPL_ASSERT_NOT(( has_yyy1< int, int > ));
    64     MPL_ASSERT_NOT(( has_yyy2< int, int, int > ));
     56    MPL_ASSERT_NOT(( has_xxx_template<int> ));
    6557
    6658#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
    6759    MPL_ASSERT_NOT(( has_xxx<int&> ));
    68     MPL_ASSERT_NOT(( has_xxx0< int& > ));
    69     MPL_ASSERT_NOT(( has_xxx1< int&, int > ));
    70     MPL_ASSERT_NOT(( has_xxx2< int&, int, int > ));
    71     MPL_ASSERT_NOT(( has_yyy0< int& > ));
    72     MPL_ASSERT_NOT(( has_yyy1< int&, int > ));
    73     MPL_ASSERT_NOT(( has_yyy2< int&, int, int > ));
     60    MPL_ASSERT_NOT(( has_xxx_template<int&> ));
    7461
    7562    MPL_ASSERT_NOT(( has_xxx<int*> ));
    76     MPL_ASSERT_NOT(( has_xxx0< int* > ));
    77     MPL_ASSERT_NOT(( has_xxx1< int*, int > ));
    78     MPL_ASSERT_NOT(( has_xxx2< int*, int, int > ));
    79     MPL_ASSERT_NOT(( has_yyy0< int* > ));
    80     MPL_ASSERT_NOT(( has_yyy1< int*, int > ));
    81     MPL_ASSERT_NOT(( has_yyy2< int*, int, int > ));
     63    MPL_ASSERT_NOT(( has_xxx_template<int*> ));
    8264
    8365    MPL_ASSERT_NOT(( has_xxx<int[]> ));
    84     MPL_ASSERT_NOT(( has_xxx0< int[] > ));
    85     MPL_ASSERT_NOT(( has_xxx1< int[], int > ));
    86     MPL_ASSERT_NOT(( has_xxx2< int[], int, int > ));
    87     MPL_ASSERT_NOT(( has_yyy0< int[] > ));
    88     MPL_ASSERT_NOT(( has_yyy1< int[], int > ));
    89     MPL_ASSERT_NOT(( has_yyy2< int[], int, int > ));
     66    MPL_ASSERT_NOT(( has_xxx_template<int[]> ));
    9067
    9168    MPL_ASSERT_NOT(( has_xxx<int (*)()> ));
    92     MPL_ASSERT_NOT(( has_xxx0< int (*)() > ));
    93     MPL_ASSERT_NOT(( has_xxx1< int (*)(), int > ));
    94     MPL_ASSERT_NOT(( has_xxx2< int (*)(), int, int > ));
    95     MPL_ASSERT_NOT(( has_yyy0< int (*)() > ));
    96     MPL_ASSERT_NOT(( has_yyy1< int (*)(), int > ));
    97     MPL_ASSERT_NOT(( has_yyy2< int (*)(), int, int > ));
     69    MPL_ASSERT_NOT(( has_xxx_template<int (*)()> ));
    9870
    9971    MPL_ASSERT_NOT(( has_xxx<a2> ));
    100     MPL_ASSERT_NOT(( has_xxx0< a2 > ));
    101     MPL_ASSERT_NOT(( has_xxx1< a2, int > ));
    102     MPL_ASSERT_NOT(( has_xxx2< a2, int, int > ));
    103     MPL_ASSERT_NOT(( has_yyy0< a2 > ));
    104     MPL_ASSERT_NOT(( has_yyy1< a2, int > ));
    105     MPL_ASSERT_NOT(( has_yyy2< a2, int, int > ));
     72    MPL_ASSERT_NOT(( has_xxx_template<a2> ));
    10673
    10774    MPL_ASSERT_NOT(( has_xxx<a3> ));
    108     MPL_ASSERT_NOT(( has_xxx0< a3 > ));
    109     MPL_ASSERT_NOT(( has_xxx1< a3, int > ));
    110     MPL_ASSERT_NOT(( has_xxx2< a3, int, int > ));
    111     MPL_ASSERT_NOT(( has_yyy0< a3 > ));
    112     MPL_ASSERT_NOT(( has_yyy1< a3, int > ));
    113     MPL_ASSERT_NOT(( has_yyy2< a3, int, int > ));
     75    MPL_ASSERT_NOT(( has_xxx_template<a3> ));
    11476
    11577    MPL_ASSERT_NOT(( has_xxx<a4> ));
    116     MPL_ASSERT_NOT(( has_xxx0< a4 > ));
    117     MPL_ASSERT_NOT(( has_xxx1< a4, int > ));
    118     MPL_ASSERT_NOT(( has_xxx2< a4, int, int > ));
    119     MPL_ASSERT_NOT(( has_yyy0< a4 > ));
    120     MPL_ASSERT_NOT(( has_yyy1< a4, int > ));
    121     MPL_ASSERT_NOT(( has_yyy2< a4, int, int > ));
     78    MPL_ASSERT_NOT(( has_xxx_template<a4> ));
    12279
    12380#if !BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3202))
    12481    MPL_ASSERT_NOT(( has_xxx<a5> ));
     82    MPL_ASSERT(( has_xxx_template<a5> ));
    12583#endif
    12684    MPL_ASSERT_NOT(( has_xxx< enum_ > ));
    127     MPL_ASSERT_NOT(( has_xxx0< enum_ > ));
    128     MPL_ASSERT_NOT(( has_xxx1< enum_, int > ));
    129     MPL_ASSERT_NOT(( has_xxx2< enum_, int, int > ));
    130     MPL_ASSERT_NOT(( has_yyy0< enum_ > ));
    131     MPL_ASSERT_NOT(( has_yyy1< enum_, int > ));
    132     MPL_ASSERT_NOT(( has_yyy2< enum_, int, int > ));
     85    MPL_ASSERT_NOT(( has_xxx_template< enum_ > ));
    13386#endif
    13487
    13588    MPL_ASSERT_NOT(( has_xxx<a1> ));
    136     MPL_ASSERT_NOT(( has_xxx0< a1 > ));
    137     MPL_ASSERT_NOT(( has_xxx1< a1, int > ));
    138     MPL_ASSERT_NOT(( has_xxx2< a1, int, int > ));
    139     MPL_ASSERT_NOT(( has_yyy0< a1 > ));
    140     MPL_ASSERT_NOT(( has_yyy1< a1, int > ));
    141     MPL_ASSERT_NOT(( has_yyy2< a1, int, int > ));
     89    MPL_ASSERT_NOT(( has_xxx_template<a1> ));
    14290
    14391    MPL_ASSERT_NOT(( has_xxx< outer< inner<int> > > ));
    144     MPL_ASSERT_NOT(( has_xxx0< outer< inner<int> > > ));
    145     MPL_ASSERT_NOT(( has_xxx1< outer< inner<int> >, int > ));
    146     MPL_ASSERT_NOT(( has_xxx2< outer< inner<int> >, int, int > ));
    147     MPL_ASSERT_NOT(( has_yyy0< outer< inner<int> > > ));
    148     MPL_ASSERT_NOT(( has_yyy1< outer< inner<int> >, int > ));
    149     MPL_ASSERT_NOT(( has_yyy2< outer< inner<int> >, int, int > ));
     92    MPL_ASSERT_NOT(( has_xxx_template< outer< inner<int> > > ));
    15093
    15194    MPL_ASSERT_NOT(( has_xxx< incomplete > ));
    152     MPL_ASSERT_NOT(( has_xxx0< incomplete > ));
    153     MPL_ASSERT_NOT(( has_xxx1< incomplete, int > ));
    154     MPL_ASSERT_NOT(( has_xxx2< incomplete, int, int > ));
    155     MPL_ASSERT_NOT(( has_yyy0< incomplete > ));
    156     MPL_ASSERT_NOT(( has_yyy1< incomplete, int > ));
    157     MPL_ASSERT_NOT(( has_yyy2< incomplete, int, int > ));
     95    MPL_ASSERT_NOT(( has_xxx_template< incomplete > ));
    15896
    15997    MPL_ASSERT_NOT(( has_xxx< abstract > ));
    160     MPL_ASSERT_NOT(( has_xxx0< abstract > ));
    161     MPL_ASSERT_NOT(( has_xxx1< abstract, int > ));
    162     MPL_ASSERT_NOT(( has_xxx2< abstract, int, int > ));
    163     MPL_ASSERT_NOT(( has_yyy0< abstract > ));
    164     MPL_ASSERT_NOT(( has_yyy1< abstract, int > ));
    165     MPL_ASSERT_NOT(( has_yyy2< abstract, int, int > ));
     98    MPL_ASSERT_NOT(( has_xxx_template< abstract > ));
    16699
    167100    MPL_ASSERT_NOT(( has_xxx< noncopyable > ));
    168     MPL_ASSERT_NOT(( has_xxx0< noncopyable > ));
    169     MPL_ASSERT_NOT(( has_xxx1< noncopyable, int > ));
    170     MPL_ASSERT_NOT(( has_xxx2< noncopyable, int, int > ));
    171     MPL_ASSERT_NOT(( has_yyy0< noncopyable > ));
    172     MPL_ASSERT_NOT(( has_yyy1< noncopyable, int > ));
    173     MPL_ASSERT_NOT(( has_yyy2< noncopyable, int, int > ));
     101    MPL_ASSERT_NOT(( has_xxx_template< noncopyable > ));
    174102
    175103#if !BOOST_WORKAROUND(__COMO_VERSION__, BOOST_TESTED_AT(4308))
    176     MPL_ASSERT_NOT(( has_xxx0< b1 > ));
    177     MPL_ASSERT_NOT(( has_xxx1< b1, int > ));
    178     MPL_ASSERT_NOT(( has_xxx2< b1, int, int > ));
    179     MPL_ASSERT_NOT(( has_yyy0< b1 > ));
    180     MPL_ASSERT_NOT(( has_yyy1< b1, int > ));
    181     MPL_ASSERT_NOT(( has_yyy2< b1, int, int > ));
    182 
    183     MPL_ASSERT_NOT(( has_xxx0< b2 > ));
    184     MPL_ASSERT_NOT(( has_xxx1< b2, int > ));
    185     MPL_ASSERT_NOT(( has_xxx2< b2, int, int > ));
    186     MPL_ASSERT_NOT(( has_yyy0< b2 > ));
    187     MPL_ASSERT_NOT(( has_yyy1< b2, int > ));
    188     MPL_ASSERT_NOT(( has_yyy2< b2, int, int > ));
    189 
    190     MPL_ASSERT_NOT(( has_xxx0< b3 > ));
    191     MPL_ASSERT_NOT(( has_xxx1< b3, int > ));
    192     MPL_ASSERT_NOT(( has_xxx2< b3, int, int > ));
    193     MPL_ASSERT_NOT(( has_yyy0< b3 > ));
    194     MPL_ASSERT_NOT(( has_yyy1< b3, int > ));
    195     MPL_ASSERT_NOT(( has_yyy2< b3, int, int > ));
    196 
    197     MPL_ASSERT_NOT(( has_xxx0< b4 > ));
    198     MPL_ASSERT_NOT(( has_xxx1< b4, int > ));
    199     MPL_ASSERT_NOT(( has_xxx2< b4, int, int > ));
    200     MPL_ASSERT_NOT(( has_yyy0< b4 > ));
    201     MPL_ASSERT_NOT(( has_yyy1< b4, int > ));
    202     MPL_ASSERT_NOT(( has_yyy2< b4, int, int > ));
    203 
    204     MPL_ASSERT_NOT(( has_xxx0< b5 > ));
    205     MPL_ASSERT_NOT(( has_xxx1< b5, int > ));
    206     MPL_ASSERT_NOT(( has_xxx2< b5, int, int > ));
    207     MPL_ASSERT_NOT(( has_yyy0< b5 > ));
    208     MPL_ASSERT_NOT(( has_yyy1< b5, int > ));
    209     MPL_ASSERT_NOT(( has_yyy2< b5, int, int > ));
    210 
    211     MPL_ASSERT_NOT(( has_xxx0< b6 > ));
    212     MPL_ASSERT_NOT(( has_xxx1< b6, int > ));
    213     MPL_ASSERT_NOT(( has_xxx2< b6, int, int > ));
    214     MPL_ASSERT_NOT(( has_yyy0< b6 > ));
    215     MPL_ASSERT_NOT(( has_yyy1< b6, int > ));
    216     MPL_ASSERT_NOT(( has_yyy2< b6, int, int > ));
    217 
    218     MPL_ASSERT_NOT(( has_xxx0< b7 > ));
    219     MPL_ASSERT_NOT(( has_xxx1< b7, int > ));
    220     MPL_ASSERT_NOT(( has_xxx2< b7, int, int > ));
    221     MPL_ASSERT_NOT(( has_yyy0< b7 > ));
    222     MPL_ASSERT_NOT(( has_yyy1< b7, int > ));
    223     MPL_ASSERT_NOT(( has_yyy2< b7, int, int > ));
     104    MPL_ASSERT_NOT(( has_xxx_template<b1> ));
     105    MPL_ASSERT_NOT(( has_xxx_template<b2> ));
     106    MPL_ASSERT_NOT(( has_xxx_template<b3> ));
     107    MPL_ASSERT_NOT(( has_xxx_template<b4> ));
     108    MPL_ASSERT_NOT(( has_xxx_template<b5> ));
     109    MPL_ASSERT_NOT(( has_xxx_template<b6> ));
     110    MPL_ASSERT_NOT(( has_xxx_template<b7> ));
    224111#endif
    225112
    226113    // Same name, different args.
    227     //   Note: has_xxx0 is not test here because it's impossible to
    228     //   declare a template with no arguments (only no required
    229     //   arguments), so there is no zero argument substitute template
    230     //   to reject n-ary member templates.
    231 #if (!BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, <= 0x0303) \
    232      && !BOOST_WORKAROUND(__COMO_VERSION__, BOOST_TESTED_AT(4308)))
    233     MPL_ASSERT_NOT(( has_xxx1<c2, int> ));
    234     MPL_ASSERT_NOT(( has_xxx2<c0, int, int> ));
    235     MPL_ASSERT_NOT(( has_xxx2<c1, int, int> ));
    236 #endif
    237 
    238     // Different name, same args.
    239     MPL_ASSERT_NOT(( has_xxx0<c3> ));
    240     MPL_ASSERT_NOT(( has_xxx1<c4, int> ));
    241     MPL_ASSERT_NOT(( has_xxx2<c5, int, int> ));
     114    MPL_ASSERT(( has_xxx_template<c1> ));
     115    MPL_ASSERT(( has_xxx_template<c2> ));
     116    MPL_ASSERT(( has_xxx_template<c3> ));
     117    MPL_ASSERT(( has_xxx_template<c4> ));
     118    MPL_ASSERT(( has_xxx_template<c5> ));
     119    MPL_ASSERT(( has_yyy<c6> ));
     120    MPL_ASSERT(( has_yyy<c7> ));
    242121
    243122    // Different name, different args.
    244     MPL_ASSERT_NOT(( has_xxx0<c4> ));
    245     MPL_ASSERT_NOT(( has_xxx1<c5, int> ));
    246     MPL_ASSERT_NOT(( has_xxx2<c3, int, int> ));
    247     MPL_ASSERT_NOT(( has_xxx2<c4, int, int> ));
     123    MPL_ASSERT_NOT(( has_xxx_template<c6> ));
     124    MPL_ASSERT_NOT(( has_xxx_template<c7> ));
     125    MPL_ASSERT_NOT(( has_yyy<c1> ));
     126    MPL_ASSERT_NOT(( has_yyy<c2> ));
     127    MPL_ASSERT_NOT(( has_yyy<c3> ));
     128    MPL_ASSERT_NOT(( has_yyy<c4> ));
     129    MPL_ASSERT_NOT(( has_yyy<c5> ));
    248130
    249131    MPL_ASSERT(( has_xxx<b1,true_> ));
     
    255137    MPL_ASSERT(( has_xxx<b7,true_> ));
    256138
    257 #if !BOOST_WORKAROUND(__COMO_VERSION__, BOOST_TESTED_AT(4308)) && !BOOST_WORKAROUND(BOOST_MSVC, >= 1500)
    258     MPL_ASSERT(( has_xxx0<c0, true_> ));
    259     MPL_ASSERT(( has_yyy0<c3, true_> ));
    260 #endif
    261     MPL_ASSERT(( has_xxx1<c1, int, true_> ));
    262     MPL_ASSERT(( has_xxx2<c2, int, int, true_> ));
    263     MPL_ASSERT(( has_yyy1<c4, int, true_> ));
    264     MPL_ASSERT(( has_yyy2<c5, int, int, true_> ));
     139    MPL_ASSERT(( has_xxx_template<c1,true_> ));
    265140
    266141#if !defined(HAS_XXX_ASSERT)
     
    280155#endif
    281156
    282 #if !BOOST_WORKAROUND(__COMO_VERSION__, BOOST_TESTED_AT(4308)) && !BOOST_WORKAROUND(BOOST_MSVC, >= 1500)
    283     HAS_XXX_TEMPLATE_ASSERT(( has_xxx0<c0> ));
    284     HAS_XXX_TEMPLATE_ASSERT(( has_yyy0<c3> ));
    285 #endif
    286     HAS_XXX_TEMPLATE_ASSERT(( has_xxx1<c1, int> ));
    287     HAS_XXX_TEMPLATE_ASSERT(( has_xxx2<c2, int, int> ));
    288     HAS_XXX_TEMPLATE_ASSERT(( has_yyy1<c4, int> ));
    289     HAS_XXX_TEMPLATE_ASSERT(( has_yyy2<c5, int, int> ));
     157    HAS_XXX_TEMPLATE_ASSERT(( has_xxx_template<c1> ));
    290158}
  • branches/release/libs/msm

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/numeric/ublas

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/numeric/ublas/doc

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/program_options

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/property_tree

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/python

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/python/doc/v2/args.html

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/python/doc/v2/return_internal_reference.html

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/range

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/range/doc

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/regex

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/serialization/test

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/serialization/test/test_diamond_complex.cpp

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/signals

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/signals2

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/spirit

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/spirit/classic/example

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/spirit/doc

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/spirit/example

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/spirit/phoenix

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/spirit/test

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/spirit/test/qi/optional.cpp

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/statechart

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/static_assert

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/system

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/timer

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/tr1

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/type_traits

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/utility

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/utility/swap.html

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/utility/swap/test/std_bitset.cpp

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/utility/value_init.htm

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/utility/value_init_test.cpp

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/uuid

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/libs/wave

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/more

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/more/getting_started

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/rst.css

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/status

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/status/Jamfile.v2

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/tools

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/tools/bcp

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/tools/boostbook

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/tools/build/v2

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/tools/build/v2/tools

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/tools/inspect

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/tools/jam

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/tools/regression

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/tools/release

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/release/tools/wave

    • Property svn:mergeinfo changed (with no actual effect on merging)
Note: See TracChangeset for help on using the changeset viewer.