1
/* Copyright 2003-2008 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
12
#if defined(_MSC_VER)&&(_MSC_VER>=1200)
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 */
1
/* Copyright 2003-2008 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
12
#if defined(_MSC_VER)&&(_MSC_VER>=1200)
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 */