Chris@101
|
1 /* Copyright 2003-2013 Joaquin M Lopez Munoz.
|
Chris@16
|
2 * Distributed under the Boost Software License, Version 1.0.
|
Chris@16
|
3 * (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
4 * http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
5 *
|
Chris@16
|
6 * See http://www.boost.org/libs/multi_index for library home page.
|
Chris@16
|
7 */
|
Chris@16
|
8
|
Chris@16
|
9 #ifndef BOOST_MULTI_INDEX_DETAIL_DUPLICATES_ITERATOR_HPP
|
Chris@16
|
10 #define BOOST_MULTI_INDEX_DETAIL_DUPLICATES_ITERATOR_HPP
|
Chris@16
|
11
|
Chris@101
|
12 #if defined(_MSC_VER)
|
Chris@16
|
13 #pragma once
|
Chris@16
|
14 #endif
|
Chris@16
|
15
|
Chris@16
|
16 #include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
|
Chris@16
|
17 #include <cstddef>
|
Chris@16
|
18 #include <iterator>
|
Chris@16
|
19
|
Chris@16
|
20 namespace boost{
|
Chris@16
|
21
|
Chris@16
|
22 namespace multi_index{
|
Chris@16
|
23
|
Chris@16
|
24 namespace detail{
|
Chris@16
|
25
|
Chris@16
|
26 /* duplicates_operator is given a range of ordered elements and
|
Chris@16
|
27 * passes only over those which are duplicated.
|
Chris@16
|
28 */
|
Chris@16
|
29
|
Chris@16
|
30 template<typename Node,typename Predicate>
|
Chris@16
|
31 class duplicates_iterator
|
Chris@16
|
32 {
|
Chris@16
|
33 public:
|
Chris@16
|
34 typedef typename Node::value_type value_type;
|
Chris@16
|
35 typedef std::ptrdiff_t difference_type;
|
Chris@16
|
36 typedef const typename Node::value_type* pointer;
|
Chris@16
|
37 typedef const typename Node::value_type& reference;
|
Chris@16
|
38 typedef std::forward_iterator_tag iterator_category;
|
Chris@16
|
39
|
Chris@16
|
40 duplicates_iterator(Node* node_,Node* end_,Predicate pred_):
|
Chris@16
|
41 node(node_),begin_chunk(0),end(end_),pred(pred_)
|
Chris@16
|
42 {
|
Chris@16
|
43 advance();
|
Chris@16
|
44 }
|
Chris@16
|
45
|
Chris@16
|
46 duplicates_iterator(Node* end_,Predicate pred_):
|
Chris@16
|
47 node(end_),begin_chunk(end_),end(end_),pred(pred_)
|
Chris@16
|
48 {
|
Chris@16
|
49 }
|
Chris@16
|
50
|
Chris@16
|
51 reference operator*()const
|
Chris@16
|
52 {
|
Chris@16
|
53 return node->value();
|
Chris@16
|
54 }
|
Chris@16
|
55
|
Chris@16
|
56 pointer operator->()const
|
Chris@16
|
57 {
|
Chris@16
|
58 return &node->value();
|
Chris@16
|
59 }
|
Chris@16
|
60
|
Chris@16
|
61 duplicates_iterator& operator++()
|
Chris@16
|
62 {
|
Chris@16
|
63 Node::increment(node);
|
Chris@16
|
64 sync();
|
Chris@16
|
65 return *this;
|
Chris@16
|
66 }
|
Chris@16
|
67
|
Chris@16
|
68 duplicates_iterator operator++(int)
|
Chris@16
|
69 {
|
Chris@16
|
70 duplicates_iterator tmp(*this);
|
Chris@16
|
71 ++(*this);
|
Chris@16
|
72 return tmp;
|
Chris@16
|
73 }
|
Chris@16
|
74
|
Chris@16
|
75 Node* get_node()const{return node;}
|
Chris@16
|
76
|
Chris@16
|
77 private:
|
Chris@16
|
78 void sync()
|
Chris@16
|
79 {
|
Chris@16
|
80 if(node!=end&&pred(begin_chunk->value(),node->value()))advance();
|
Chris@16
|
81 }
|
Chris@16
|
82
|
Chris@16
|
83 void advance()
|
Chris@16
|
84 {
|
Chris@16
|
85 for(Node* node2=node;node!=end;node=node2){
|
Chris@16
|
86 Node::increment(node2);
|
Chris@16
|
87 if(node2!=end&&!pred(node->value(),node2->value()))break;
|
Chris@16
|
88 }
|
Chris@16
|
89 begin_chunk=node;
|
Chris@16
|
90 }
|
Chris@16
|
91
|
Chris@16
|
92 Node* node;
|
Chris@16
|
93 Node* begin_chunk;
|
Chris@16
|
94 Node* end;
|
Chris@16
|
95 Predicate pred;
|
Chris@16
|
96 };
|
Chris@16
|
97
|
Chris@16
|
98 template<typename Node,typename Predicate>
|
Chris@16
|
99 bool operator==(
|
Chris@16
|
100 const duplicates_iterator<Node,Predicate>& x,
|
Chris@16
|
101 const duplicates_iterator<Node,Predicate>& y)
|
Chris@16
|
102 {
|
Chris@16
|
103 return x.get_node()==y.get_node();
|
Chris@16
|
104 }
|
Chris@16
|
105
|
Chris@16
|
106 template<typename Node,typename Predicate>
|
Chris@16
|
107 bool operator!=(
|
Chris@16
|
108 const duplicates_iterator<Node,Predicate>& x,
|
Chris@16
|
109 const duplicates_iterator<Node,Predicate>& y)
|
Chris@16
|
110 {
|
Chris@16
|
111 return !(x==y);
|
Chris@16
|
112 }
|
Chris@16
|
113
|
Chris@16
|
114 } /* namespace multi_index::detail */
|
Chris@16
|
115
|
Chris@16
|
116 } /* namespace multi_index */
|
Chris@16
|
117
|
Chris@16
|
118 } /* namespace boost */
|
Chris@16
|
119
|
Chris@16
|
120 #endif
|