From 5cae12a9be3a02fc15c78f3ca561972395a61bd0 Mon Sep 17 00:00:00 2001 From: Jeremy Siek Date: Wed, 27 Jun 2001 23:24:07 +0000 Subject: [PATCH] simplified named parameters mechanism [SVN r10455] --- include/boost/iterator_adaptors.hpp | 197 +++++++++++++++++----------- 1 file changed, 124 insertions(+), 73 deletions(-) diff --git a/include/boost/iterator_adaptors.hpp b/include/boost/iterator_adaptors.hpp index b05bef2..96eacfb 100644 --- a/include/boost/iterator_adaptors.hpp +++ b/include/boost/iterator_adaptors.hpp @@ -11,7 +11,9 @@ // to its suitability for any purpose. // // Revision History: - +// +// 27 June 2001 Jeremy Siek +// Simplified named template parameters. // 08 Mar 2001 Jeremy Siek // Added support for optional named template parameters. // 19 Feb 2001 David Abrahams @@ -440,105 +442,155 @@ namespace detail { // Specify the defaults for iterator_adaptor's template parameters struct default_value_type { - template - struct bind { + template + class bind { + typedef typename Info::base_type Base; + public: typedef typename boost::detail::iterator_traits::value_type type; }; }; struct default_difference_type { - template - struct bind { + template + class bind { + typedef typename Info::base_type Base; + public: typedef typename boost::detail::iterator_traits::difference_type type; }; }; struct default_iterator_category { - template - struct bind { + template + class bind { + typedef typename Info::base_type Base; + public: typedef typename boost::detail::iterator_traits::iterator_category type; }; }; struct default_pointer { - template - struct bind { + template + class bind { + typedef typename Info::base_type Base; + typedef typename Info::traits_type Traits; + public: typedef typename Traits::value_type Value; typedef typename boost::detail::iterator_defaults::pointer type; }; }; struct default_reference { - template - struct bind { + template + class bind { + typedef typename Info::base_type Base; + typedef typename Info::traits_type Traits; + public: typedef typename Traits::value_type Value; typedef typename boost::detail::iterator_defaults::reference type; }; }; +#ifdef BOOST_MSVC + // Using the default generator such as default_value_type + // directly inside of resolve_default causes problems, but + // going through this default_generator solves the problem + // on MSVC. + template <> struct default_generator { + typedef default_value_type type; }; + template <> struct default_generator { + typedef default_difference_type type; }; + template <> struct default_generator { + typedef default_pointer type; }; + template <> struct default_generator { + typedef default_reference type; }; + template <> struct default_generator { + typedef default_iterator_category type; }; +#endif + //=========================================================================== // Support for named template parameters -#if !defined(__BORLANDC__) - // Borland C++ thinks the nested recursive inheritance here is illegal. + struct value_type_tag { }; + struct reference_tag { }; + struct pointer_tag { }; + struct iterator_category_tag { }; + struct difference_type_tag { }; - template - struct iter_traits_gen : public named_template_param_base { - template - struct value_type : public iter_traits_gen { }; - template - struct reference : public iter_traits_gen { }; - template - struct pointer : public iter_traits_gen { }; - template - struct iterator_category : public iter_traits_gen{}; - template - struct difference_type : public iter_traits_gen { }; - - typedef boost::iterator traits; - }; -#endif - - BOOST_NAMED_TEMPLATE_PARAM(value_type); - BOOST_NAMED_TEMPLATE_PARAM(reference); - BOOST_NAMED_TEMPLATE_PARAM(pointer); - BOOST_NAMED_TEMPLATE_PARAM(iterator_category); - BOOST_NAMED_TEMPLATE_PARAM(difference_type); - - template - class iterator_adaptor_traits_gen + template + class iter_adaptor_traits_gen { - typedef boost::iterator - Traits0; + typedef std::pair::type, + std::pair::type, + std::pair::type, + std::pair::type, + std::pair::type, + list_end_type> > > > > NamedParamList; - typedef typename get_value_type::type, Traits0 - >::type value_type; - typedef typename get_difference_type::type - difference_type; - typedef typename get_iterator_category::type - iterator_category; + // Figure out the value_type + typedef typename find_param::type Val; + struct default_info { + typedef Base base_type; + typedef void traits_type; + }; + typedef typename resolve_default::type value_type; - typedef boost::iterator Traits1; - - typedef typename get_pointer::type pointer; - typedef typename get_reference::type reference; + // Compute the difference_type + typedef typename find_param::type + Diff; + typedef typename resolve_default::type difference_type; + + // Determine the iterator_category + typedef typename find_param::type + Cat; + typedef typename resolve_default::type iterator_category; + + typedef boost::iterator + Traits; + struct default_info2 { + typedef Base base_type; + typedef Traits traits_type; + }; + + // Extract the pointer type + typedef typename find_param::type Ptr; + typedef typename resolve_default::type + pointer; + + // Calculate the reference type + typedef typename find_param::type Ref; + typedef typename resolve_default::type reference; public: typedef boost::iterator type; }; - } // namespace detail - -#if !defined(__BORLANDC__) -struct iterator_traits_generator - : public detail::iter_traits_gen<> { }; -#endif + struct default_argument : public named_template_param_base { + typedef void type; + typedef void tag; + }; + template struct value_type_is : public named_template_param_base { + typedef T type; + typedef detail::value_type_tag tag; + }; + template struct reference_is : public named_template_param_base { + typedef T type; + typedef detail::reference_tag tag; + }; + template struct pointer_is : public named_template_param_base { + typedef T type; + typedef detail::pointer_tag tag; + }; + template struct iterator_category_is : public named_template_param_base { + typedef T type; + typedef detail::iterator_category_tag tag; + }; + template struct difference_type_is : public named_template_param_base + { + typedef T type; + typedef detail::difference_type_tag tag; + }; // This macro definition is only temporary in this file # if !defined(BOOST_MSVC) @@ -578,26 +630,25 @@ template struct undefined; // Distance - the difference_type of the resulting iterator. If not // supplied, iterator_traits::difference_type is used. template ::type, - class Pointer = BOOST_ARG_DEPENDENT_TYPENAME detail::choose_default_argument::type, - class Category = BOOST_ARG_DEPENDENT_TYPENAME detail::choose_default_argument::type, - class Distance = BOOST_ARG_DEPENDENT_TYPENAME detail::choose_default_argument::type + class Value = default_argument, + class Reference = default_argument, + class Pointer = default_argument, + class Category = default_argument, + class Distance = default_argument > struct iterator_adaptor : #ifdef BOOST_RELOPS_AMBIGUITY_BUG iterator_comparisons< iterator_adaptor, - typename detail::iterator_adaptor_traits_gen::type + typename detail::iter_adaptor_traits_gen::type > #else - detail::iterator_adaptor_traits_gen::type + detail::iter_adaptor_traits_gen::type #endif { typedef iterator_adaptor self; + typedef typename detail::iter_adaptor_traits_gen::type Traits; public: - typedef typename detail::iterator_adaptor_traits_gen::type Traits; - typedef typename Traits::difference_type difference_type; typedef typename Traits::value_type value_type; typedef typename Traits::pointer pointer; @@ -1139,7 +1190,7 @@ namespace detail { >::type type; # endif }; -} +} // namespace detail template ::value_type,