From a83263748d108c392b6a861e2ce161c47eafa4e1 Mon Sep 17 00:00:00 2001 From: nobody Date: Tue, 6 Jan 2004 17:35:37 +0000 Subject: [PATCH] This commit was manufactured by cvs2svn to create branch 'RC_1_31_0'. [SVN r21515] --- include/boost/detail/is_incrementable.hpp | 71 +++++++++++++++++++++++ include/boost/indirect_reference.hpp | 40 +++++++++++++ 2 files changed, 111 insertions(+) create mode 100755 include/boost/detail/is_incrementable.hpp create mode 100755 include/boost/indirect_reference.hpp diff --git a/include/boost/detail/is_incrementable.hpp b/include/boost/detail/is_incrementable.hpp new file mode 100755 index 0000000..3054ced --- /dev/null +++ b/include/boost/detail/is_incrementable.hpp @@ -0,0 +1,71 @@ +// Copyright David Abrahams 2004. Use, modification and distribution is +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +#ifndef IS_INCREMENTABLE_DWA200415_HPP +# define IS_INCREMENTABLE_DWA200415_HPP + +# include +# include +# include + +namespace boost { namespace detail { + +// is_incrementable metafunction +// +// Requires: Given x of type T&, if the expression ++x is well-formed +// it must have complete type; otherwise, it must neither be ambiguous +// nor violate access. + +// This namespace ensures that ADL doesn't mess things up. +namespace is_incrementable_ +{ + struct tag {}; + + // any soaks up implicit conversions and makes the following + // operator++ less-preferred than any other such operator which + // might be found via ADL. + struct any { template any(T const&); }; + tag operator++(any const&); + + // two check overloads help us identify which operator++ was picked + char (& check(tag) )[2]; + + template + char check(T const&); + + + template + struct +# if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) + impl +# else + is_incrementable +# endif + { + static typename remove_cv::type& x; + + BOOST_STATIC_CONSTANT( + bool + , value = sizeof(is_incrementable_::check(++x)) == 1 + ); + + typedef mpl::bool_<( +# if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) + ::boost::detail::is_incrementable_::is_incrementable:: +# endif + value)> type; + }; +} + +# if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) +template +struct is_incrementable : is_incrementable_::impl +{ +}; +# else +using is_incrementable_::is_incrementable; +# endif + +}} // namespace boost::detail + +#endif // IS_INCREMENTABLE_DWA200415_HPP diff --git a/include/boost/indirect_reference.hpp b/include/boost/indirect_reference.hpp new file mode 100755 index 0000000..51fedb1 --- /dev/null +++ b/include/boost/indirect_reference.hpp @@ -0,0 +1,40 @@ +// Copyright David Abrahams 2004. Use, modification and distribution is +// subject to the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +#ifndef INDIRECT_REFERENCE_DWA200415_HPP +# define INDIRECT_REFERENCE_DWA200415_HPP + +// dereferenceable_traits provides access to the value_type and +// reference of a Dereferenceable type. + +# include +# include +# include +# include + +namespace boost { + +namespace detail +{ + template + struct smart_ptr_reference + { + typedef typename P::element_type& type; + }; +} + +template +struct indirect_reference +{ + typedef typename remove_cv

::type stripped; + + typedef typename mpl::apply_if< + detail::is_incrementable + , iterator_reference + , detail::smart_ptr_reference + >::type type; +}; + +} // namespace boost + +#endif // INDIRECT_REFERENCE_DWA200415_HPP