1 /* Copyright 2003-2018 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 */
21 namespace multi_index{
25 /* duplicates_operator is given a range of ordered elements and
26 * passes only over those which are duplicated.
29 template<typename Node,typename Predicate>
30 class duplicates_iterator
33 typedef typename Node::value_type value_type;
34 typedef typename Node::difference_type difference_type;
35 typedef const typename Node::value_type* pointer;
36 typedef const typename Node::value_type& reference;
37 typedef std::forward_iterator_tag iterator_category;
39 duplicates_iterator(Node* node_,Node* end_,Predicate pred_):
40 node(node_),begin_chunk(0),end(end_),pred(pred_)
45 duplicates_iterator(Node* end_,Predicate pred_):
46 node(end_),begin_chunk(end_),end(end_),pred(pred_)
50 reference operator*()const
55 pointer operator->()const
57 return &node->value();
60 duplicates_iterator& operator++()
62 Node::increment(node);
67 duplicates_iterator operator++(int)
69 duplicates_iterator tmp(*this);
74 Node* get_node()const{return node;}
79 if(node!=end&&pred(begin_chunk->value(),node->value()))advance();
84 for(Node* node2=node;node!=end;node=node2){
85 Node::increment(node2);
86 if(node2!=end&&!pred(node->value(),node2->value()))break;
97 template<typename Node,typename Predicate>
99 const duplicates_iterator<Node,Predicate>& x,
100 const duplicates_iterator<Node,Predicate>& y)
102 return x.get_node()==y.get_node();
105 template<typename Node,typename Predicate>
107 const duplicates_iterator<Node,Predicate>& x,
108 const duplicates_iterator<Node,Predicate>& y)
113 } /* namespace multi_index::detail */
115 } /* namespace multi_index */
117 } /* namespace boost */