| 101 | key_equal key_eq() const { return rep_.key_eq(); } |
| 102 | |
| 103 | class const_iterator { |
| 104 | public: |
| 105 | typedef typename FlatSet::difference_type difference_type; |
| 106 | typedef typename FlatSet::value_type value_type; |
| 107 | typedef typename FlatSet::const_pointer pointer; |
| 108 | typedef typename FlatSet::const_reference reference; |
| 109 | typedef ::std::forward_iterator_tag iterator_category; |
| 110 | |
| 111 | const_iterator() : b_(nullptr), end_(nullptr), i_(0) {} |
| 112 | |
| 113 | // Make iterator pointing at first element at or after b. |
| 114 | const_iterator(Bucket* b, Bucket* end) : b_(b), end_(end), i_(0) { |
| 115 | SkipUnused(); |
| 116 | } |
| 117 | |
| 118 | // Make iterator pointing exactly at ith element in b, which must exist. |
| 119 | const_iterator(Bucket* b, Bucket* end, uint32 i) |
| 120 | : b_(b), end_(end), i_(i) {} |
| 121 | |
| 122 | reference operator*() const { return key(); } |
| 123 | pointer operator->() const { return &key(); } |
| 124 | bool operator==(const const_iterator& x) const { |
| 125 | return b_ == x.b_ && i_ == x.i_; |
| 126 | } |
| 127 | bool operator!=(const const_iterator& x) const { return !(*this == x); } |
| 128 | const_iterator& operator++() { |
| 129 | DCHECK(b_ != end_); |
| 130 | i_++; |
| 131 | SkipUnused(); |
| 132 | return *this; |
| 133 | } |
| 134 | const_iterator operator++(int /*indicates postfix*/) { |
| 135 | const_iterator tmp(*this); |
| 136 | ++*this; |
| 137 | return tmp; |
| 138 | } |
| 139 | |
| 140 | private: |
| 141 | friend class FlatSet; |
| 142 | Bucket* b_; |
| 143 | Bucket* end_; |
| 144 | uint32 i_; |
| 145 | |
| 146 | reference key() const { return b_->key(i_); } |
| 147 | void SkipUnused() { |
| 148 | while (b_ < end_) { |
| 149 | if (i_ >= Rep::kWidth) { |
| 150 | i_ = 0; |
| 151 | b_++; |
| 152 | } else if (b_->marker[i_] < 2) { |
| 153 | i_++; |
| 154 | } else { |
| 155 | break; |
| 156 | } |
| 157 | } |
| 158 | } |
| 159 | }; |
| 160 | |