File: input_iterator.hpp

package info (click to toggle)
boost1.83 1.83.0-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 545,632 kB
  • sloc: cpp: 3,857,086; xml: 125,552; ansic: 34,414; python: 25,887; asm: 5,276; sh: 4,799; ada: 1,681; makefile: 1,629; perl: 1,212; pascal: 1,139; sql: 810; yacc: 478; ruby: 102; lisp: 24; csh: 6
file content (165 lines) | stat: -rw-r--r-- 4,457 bytes parent folder | download | duplicates (14)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165

// Copyright 2005-2010 Daniel James.
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

#if !defined(BOOST_UNORDERED_TEST_HELPERS_INPUT_ITERATOR_HEADER)
#define BOOST_UNORDERED_TEST_HELPERS_INPUT_ITERATOR_HEADER

#include <boost/config.hpp>
#include <iterator>

namespace test {
  template <class Iterator> struct proxy
  {
    typedef typename Iterator::value_type value_type;

    explicit proxy(value_type const& v) : v_(v) {}
    proxy(proxy const& x) : v_(x.v_) {}
    operator value_type const&() const { return v_; }

    value_type v_;

  private:
    proxy& operator=(proxy const&);
  };

  template <class Iterator> struct input_iterator_adaptor
  {
    typedef typename std::iterator_traits<Iterator>::value_type value_type;
    typedef typename std::iterator_traits<Iterator>::pointer pointer;
    typedef proxy<Iterator> reference;
    typedef std::ptrdiff_t difference_type;
    typedef std::input_iterator_tag iterator_category;

    input_iterator_adaptor() : base_() {}
    explicit input_iterator_adaptor(Iterator& it) : base_(&it) {}
    proxy<Iterator> operator*() const { return proxy<Iterator>(**base_); }
    value_type* operator->() const { return &**base_; }
    input_iterator_adaptor& operator++()
    {
      ++*base_;
      return *this;
    }
    // input_iterator_adaptor operator++(int) {
    //}
    bool operator==(input_iterator_adaptor const& x) const
    {
      return *base_ == *x.base_;
    }
    bool operator!=(input_iterator_adaptor const& x) const
    {
      return *base_ != *x.base_;
    }

  private:
    Iterator* base_;
  };

  template <class Iterator>
  input_iterator_adaptor<Iterator> input_iterator(Iterator& it)
  {
    return input_iterator_adaptor<Iterator>(it);
  }

  template <class Iterator> struct copy_iterator_adaptor
  {
    typedef typename std::iterator_traits<Iterator>::value_type value_type;
    typedef
      typename std::iterator_traits<Iterator>::difference_type difference_type;
    typedef typename std::iterator_traits<Iterator>::iterator_category
      iterator_category;
    typedef typename std::iterator_traits<Iterator>::pointer pointer;
    typedef proxy<Iterator> reference;

    copy_iterator_adaptor() : base_() {}
    explicit copy_iterator_adaptor(Iterator const& it) : base_(it) {}
    value_type operator*() const { return *base_; }
    value_type* operator->() const { return &*base_; }
    value_type operator[](difference_type d) { return base_[d]; }
    copy_iterator_adaptor& operator++()
    {
      ++base_;
      return *this;
    }
    copy_iterator_adaptor operator++(int)
    {
      copy_iterator_adaptor tmp(*this);
      ++base_;
      return tmp;
    }
    copy_iterator_adaptor& operator--()
    {
      --base_;
      return *this;
    }
    copy_iterator_adaptor operator--(int)
    {
      copy_iterator_adaptor tmp(*this);
      --base_;
      return tmp;
    }
    copy_iterator_adaptor operator+=(difference_type x)
    {
      base_ += x;
      return *this;
    }
    copy_iterator_adaptor operator-=(difference_type x)
    {
      base_ -= x;
      return *this;
    }
    copy_iterator_adaptor operator+(difference_type n)
    {
      return copy_iterator_adaptor(base_ + n);
    }
    copy_iterator_adaptor operator-(difference_type n)
    {
      return copy_iterator_adaptor(base_ - n);
    }
    friend copy_iterator_adaptor operator+(
      difference_type n, copy_iterator_adaptor x)
    {
      return x + n;
    }
    difference_type operator-(copy_iterator_adaptor const& other)
    {
      return base_ - other.base_;
    }
    bool operator==(copy_iterator_adaptor const& x) const
    {
      return base_ == x.base_;
    }
    bool operator!=(copy_iterator_adaptor const& x) const
    {
      return base_ != x.base_;
    }
    bool operator<(copy_iterator_adaptor const& x) const
    {
      return base_ < x.base_;
    }
    bool operator>(copy_iterator_adaptor const& x) const
    {
      return base_ > x.base_;
    }
    bool operator<=(copy_iterator_adaptor const& x) const
    {
      return base_ <= x.base_;
    }
    bool operator>=(copy_iterator_adaptor const& x) const
    {
      return base_ >= x.base_;
    }

  private:
    Iterator base_;
  };

  template <class Iterator>
  copy_iterator_adaptor<Iterator> copy_iterator(Iterator const& it)
  {
    return copy_iterator_adaptor<Iterator>(it);
  }
}

#endif