1 /* Copyright 2003-2013 Joaquin M Lopez Munoz.
2 * Distributed under the Boost Software License, Version 1.0.
3 * (See accompanying file LICENSE_1_0.txt or copy at
4 * http://www.boost.org/LICENSE_1_0.txt)
6 * See http://www.boost.org/libs/multi_index for library home page.
9 #ifndef BOOST_MULTI_INDEX_DETAIL_DUPLICATES_ITERATOR_HPP
10 #define BOOST_MULTI_INDEX_DETAIL_DUPLICATES_ITERATOR_HPP
16 #include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
22 namespace multi_index
{
26 /* duplicates_operator is given a range of ordered elements and
27 * passes only over those which are duplicated.
30 template<typename Node
,typename Predicate
>
31 class duplicates_iterator
34 typedef typename
Node::value_type value_type
;
35 typedef std::ptrdiff_t difference_type
;
36 typedef const typename
Node::value_type
* pointer
;
37 typedef const typename
Node::value_type
& reference
;
38 typedef std::forward_iterator_tag iterator_category
;
40 duplicates_iterator(Node
* node_
,Node
* end_
,Predicate pred_
):
41 node(node_
),begin_chunk(0),end(end_
),pred(pred_
)
46 duplicates_iterator(Node
* end_
,Predicate pred_
):
47 node(end_
),begin_chunk(end_
),end(end_
),pred(pred_
)
51 reference
operator*()const
56 pointer
operator->()const
58 return &node
->value();
61 duplicates_iterator
& operator++()
63 Node::increment(node
);
68 duplicates_iterator
operator++(int)
70 duplicates_iterator
tmp(*this);
75 Node
* get_node()const{return node
;}
80 if(node
!=end
&&pred(begin_chunk
->value(),node
->value()))advance();
85 for(Node
* node2
=node
;node
!=end
;node
=node2
){
86 Node::increment(node2
);
87 if(node2
!=end
&&!pred(node
->value(),node2
->value()))break;
98 template<typename Node
,typename Predicate
>
100 const duplicates_iterator
<Node
,Predicate
>& x
,
101 const duplicates_iterator
<Node
,Predicate
>& y
)
103 return x
.get_node()==y
.get_node();
106 template<typename Node
,typename Predicate
>
108 const duplicates_iterator
<Node
,Predicate
>& x
,
109 const duplicates_iterator
<Node
,Predicate
>& y
)
114 } /* namespace multi_index::detail */
116 } /* namespace multi_index */
118 } /* namespace boost */