| 253 | using block_type = WordT; |
| 254 | |
| 255 | class internal_reference |
| 256 | { |
| 257 | public: |
| 258 | internal_reference(PackedVector &container, const InternalIndex internal_index) |
| 259 | : container(container), internal_index(internal_index) |
| 260 | { |
| 261 | } |
| 262 | |
| 263 | internal_reference &operator=(const value_type value) |
| 264 | { |
| 265 | container.set_value(internal_index, value); |
| 266 | return *this; |
| 267 | } |
| 268 | |
| 269 | operator T() const { return container.get_value(internal_index); } |
| 270 | |
| 271 | bool operator==(const internal_reference &other) const |
| 272 | { |
| 273 | return &container == &other.container && internal_index == other.internal_index; |
| 274 | } |
| 275 | |
| 276 | // FIXME: This is needed for tests on Boost ranges to correctly compare Alias values. |
| 277 | template <typename F, typename U> bool operator!=(const osrm::Alias<F, U> value) const |
| 278 | { |
| 279 | return container.get_value(internal_index) != value; |
| 280 | } |
| 281 | |
| 282 | friend std::ostream &operator<<(std::ostream &os, const internal_reference &rhs) |
| 283 | { |
| 284 | return os << static_cast<T>(rhs); |
| 285 | } |
| 286 | |
| 287 | private: |
| 288 | PackedVector &container; |
| 289 | const InternalIndex internal_index; |
| 290 | }; |
| 291 | |
| 292 | template <typename DataT, typename ContainerT, typename ReferenceT = internal_reference> |
| 293 | class iterator_impl |