| 445 | |
| 446 | // Edge iterator class |
| 447 | class EdgeIterator { |
| 448 | public: |
| 449 | typedef std::forward_iterator_tag iterator_category; |
| 450 | typedef Edge value_type; |
| 451 | typedef ptrdiff_t difference_type; |
| 452 | typedef const Edge* pointer; |
| 453 | typedef const Edge& reference; |
| 454 | |
| 455 | EdgeIterator() : outer_it_(), inner_it_(), graph_(nullptr) {} |
| 456 | EdgeIterator(const Graph2D* graph, typename std::map<Point_2, std::set<Point_2>>::const_iterator outer_it) |
| 457 | : outer_it_(outer_it), graph_(graph) { |
| 458 | if (outer_it_ != graph_->adjacency_list.end()) { |
| 459 | inner_it_ = outer_it_->second.begin(); |
| 460 | advance_to_valid(); |
| 461 | } |
| 462 | } |
| 463 | |
| 464 | reference operator*() const { |
| 465 | current_edge_ = Edge(outer_it_->first, *inner_it_); |
| 466 | return current_edge_; |
| 467 | } |
| 468 | |
| 469 | pointer operator->() const { |
| 470 | current_edge_ = Edge(outer_it_->first, *inner_it_); |
| 471 | return ¤t_edge_; |
| 472 | } |
| 473 | |
| 474 | EdgeIterator& operator++() { |
| 475 | ++inner_it_; |
| 476 | advance_to_valid(); |
| 477 | return *this; |
| 478 | } |
| 479 | |
| 480 | EdgeIterator operator++(int) { |
| 481 | EdgeIterator tmp = *this; |
| 482 | ++(*this); |
| 483 | return tmp; |
| 484 | } |
| 485 | |
| 486 | bool operator==(const EdgeIterator& other) const { |
| 487 | return outer_it_ == other.outer_it_ && (outer_it_ == graph_->adjacency_list.end() || inner_it_ == other.inner_it_); |
| 488 | } |
| 489 | |
| 490 | bool operator!=(const EdgeIterator& other) const { |
| 491 | return !(*this == other); |
| 492 | } |
| 493 | |
| 494 | private: |
| 495 | void advance_to_valid() { |
| 496 | while (outer_it_ != graph_->adjacency_list.end()) { |
| 497 | while (inner_it_ != outer_it_->second.end() && *inner_it_ < outer_it_->first) { |
| 498 | ++inner_it_; |
| 499 | } |
| 500 | if (inner_it_ != outer_it_->second.end()) { |
| 501 | break; |
| 502 | } |
| 503 | ++outer_it_; |
| 504 | if (outer_it_ != graph_->adjacency_list.end()) { |
no outgoing calls
no test coverage detected