Improved category handling in iterator_adaptor.

[SVN r19231]
This commit is contained in:
Thomas Witt
2003-07-20 19:18:40 +00:00
parent 3fe0d4b532
commit ed8c60c20b
6 changed files with 90 additions and 27 deletions

View File

@ -329,6 +329,25 @@ 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

@ -15,34 +15,25 @@
namespace boost
{
namespace detail
{
template <class Iterator>
struct filter_iterator_category
{
typedef iterator_tag<
typename access_category<Iterator>::type
, typename minimum_category<
bidirectional_traversal_tag
, typename traversal_category<Iterator>::type
>::type
> type;
};
} // namespace detail
template <class Predicate, class Iterator>
class filter_iterator
: public iterator_adaptor<
filter_iterator<Predicate, Iterator>, Iterator
, use_default
, typename detail::filter_iterator_category<Iterator>::type
, typename detail::minimum_category<
bidirectional_traversal_tag
, typename traversal_category<Iterator>::type
>::type
>
{
typedef iterator_adaptor<
filter_iterator<Predicate, Iterator>, Iterator
, use_default
, typename detail::filter_iterator_category<Iterator>::type
, typename detail::minimum_category<
bidirectional_traversal_tag
, typename traversal_category<Iterator>::type
>::type
> super_t;
friend class iterator_core_access;

View File

@ -148,9 +148,18 @@ namespace boost
>
struct iterator_adaptor_base
{
private: // intermediate results
typedef typename detail::ia_dflt_help<
Category, BOOST_ITERATOR_CATEGORY<Base>
private: // intermediate results
typedef typename mpl::apply_if<
mpl::or_<
is_same<Category, use_default>
, mpl::or_<
is_access_tag<Category>
, is_traversal_tag<Category>
>
>
, BOOST_ITERATOR_CATEGORY<Base>
, mpl::identity<Category>
>::type category;
typedef typename detail::ia_dflt_help<
@ -170,9 +179,17 @@ namespace boost
Value, iterator_value<Base>
>::type
, typename access_category_tag<category, reference>::type
, typename traversal_category_tag<category>::type
, typename mpl::apply_if<
is_access_tag<Category>
, mpl::identity<Category>
, access_category_tag<category, reference>
>::type
, typename mpl::apply_if<
is_traversal_tag<Category>
, mpl::identity<Category>
, traversal_category_tag<category>
>::type
, reference

View File

@ -90,10 +90,7 @@ namespace boost
transform_iterator<UnaryFunction, Iterator, Reference, Value>
, Iterator
, cv_value_type
, iterator_tag<
access_category
, typename traversal_category<Iterator>::type
>
, access_category
, result_type
> type;
};