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