[SVN r20167]
This commit is contained in:
Dave Abrahams
2003-09-23 22:58:59 +00:00
parent 7273be17c0
commit 20f188d971
2 changed files with 46 additions and 44 deletions

View File

@ -21,6 +21,7 @@
# include <boost/mpl/bool.hpp>
# include <boost/mpl/or.hpp>
# include <boost/mpl/and.hpp>
# include <boost/mpl/integral_c.hpp>
# include <boost/mpl/aux_/lambda_support.hpp>
# include <iterator>
@ -84,7 +85,7 @@ namespace boost
namespace detail
{
template <unsigned access>
access_c : mpl::integral_c<iterator_access,access>
struct access_c : mpl::integral_c<iterator_access,(iterator_access)access>
{};
@ -226,22 +227,28 @@ namespace boost
# endif // ndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
template <class Tag, class Known, class Else>
struct known_tag
: mpl::apply_if<is_tag<Known,Tag>, mpl::identity<Known>, Else>
// If TraversalTag is convertible to Known, return it, otherwise
// return the result of invoking NullaryElse
template <class TraversalTag, class Known, class NullaryElse>
struct known_traversal_tag
: mpl::apply_if<
is_convertible<TraversalTag,Known>
, mpl::identity<Known>
, NullaryElse
>
{};
template <class Tag>
struct max_known_traversal_tag
: known_tag<
: known_traversal_tag<
Tag, random_access_traversal_tag
, known_tag<
, known_traversal_tag<
Tag, bidirectional_traversal_tag
, known_tag<
, known_traversal_tag<
Tag, forward_traversal_tag
, known_tag<
, known_traversal_tag<
Tag, single_pass_traversal_tag
, known_tag<
, known_traversal_tag<
Tag, incrementable_traversal_tag
, error_iterator_tag
>
@ -251,24 +258,34 @@ namespace boost
>
{};
template <class AccessTag, unsigned Known, class NullaryElse>
struct known_access_tag
: mpl::apply_if_c<
((AccessTag::value & Known) == Known)
, mpl::identity<access_c<Known> >
, NullaryElse
>
{};
// Doesn't cope with these odd combinations: readable+swappable,
// writable+swappable. That doesn't matter for the sake of
// new-style tag base computation, which is all it's used for
// anyway.
template <class Tag>
struct max_known_access_tag
: known_tag<
Tag, writable_lvalue_iterator_tag
, known_tag<
Tag, readable_lvalue_iterator_tag
, known_tag<
Tag, readable_writable_iterator_tag
, known_tag<
Tag, writable_iterator_tag
, known_tag<
Tag, readable_iterator_tag
, mpl::apply_if<
is_tag<Tag, swappable_iterator_tag>
: known_access_tag<
Tag, (writable_iterator|readable_iterator|swappable_iterator|lvalue_iterator)
, known_access_tag<
Tag, (readable_iterator|lvalue_iterator)
, known_access_tag<
Tag, (writable_iterator|readable_iterator|swappable_iterator)
, known_access_tag<
Tag, writable_iterator
, known_access_tag<
Tag, readable_iterator
, mpl::apply_if_c<
(swappable_iterator & Tag::value)
, mpl::identity<null_category_tag>
, error_iterator_tag
>
@ -309,25 +326,6 @@ namespace boost
template <> struct minimum_category<int, int> { typedef minimum_category type; };
# endif
//
// Tag classification for use in iterator_adaptor
//
template <class Tag>
struct is_access_tag
: mpl::or_<
is_tag<readable_iterator_tag, Tag>
, mpl::or_<
is_tag<writable_iterator_tag, Tag>
, is_tag<swappable_iterator_tag, Tag>
>
>
{};
template <class Tag>
struct is_traversal_tag
: is_tag<incrementable_traversal_tag, Tag>
{};
} // namespace detail
} // namespace boost

View File

@ -237,12 +237,14 @@ namespace boost {
typedef typename NewCategoryTag::traversal type;
};
template <class NewCategoryTag, class Reference>
template <class NewCategoryTag>
struct new_tag_to_access
{
typedef typename NewCategoryTag::access_type type;
}
};
#if 0 // what was this all about?
template <class NewCategoryTag, class Reference>
struct new_tag_to_access
: mpl::apply_if<
python::detail::is_reference_to_const<Reference>
, remove_access_writability<typename NewCategoryTag::access>
@ -300,7 +302,9 @@ namespace boost {
// writability at the level of input iterator/output iterator.
template <>
struct iterator_tag_base<
readable_lvalue_iterator_tag,single_pass_traversal_tag>
readable_iterator|lvalue_iterator
, single_pass_traversal_tag
>
{
typedef std::input_iterator_tag type;
};
@ -369,7 +373,7 @@ namespace boost {
template <unsigned Access, class TraversalTag>
struct iterator_tag
: detail::iterator_tag_base<
typename detail::max_known_access_tag<Access>::type
typename detail::max_known_access_tag<detail::access_c<Access> >::type::value
, typename detail::max_known_traversal_tag<TraversalTag>::type
>::type
{