onilink_

Untitled

Nov 23rd, 2020
872
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.48 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <centauri/cell.h>
  4. #include <algorithm>
  5.  
  6. class BlockRegionIterator
  7. {
  8. public:
  9.     struct iterator {
  10.         const BlockRegionIterator& base;
  11.         Cell cell;
  12.        
  13.         iterator(const BlockRegionIterator& base, Cell cell):
  14.             base(base), cell(cell) {}
  15.         const iterator& operator++();
  16.         bool operator==(const iterator& o) { return cell == o.cell; }
  17.         bool operator!=(const iterator& o) { return cell != o.cell; }
  18.         Cell operator*() const { return cell; }
  19.     };
  20.    
  21.     BlockRegionIterator(BlockRegion r);
  22.    
  23.     iterator begin() const;
  24.     iterator end() const;
  25.    
  26.     BlockRegion region() const { return _r; }
  27.    
  28. private:
  29.     BlockRegion _r;
  30. };
  31.  
  32. inline const BlockRegionIterator::iterator&
  33.     BlockRegionIterator::iterator::operator++()
  34. {
  35.     const BlockRegion r = base.region();
  36.    
  37.     // scanline iterations
  38.     if(cell.x == r.x2) {
  39.         cell.x = r.x1;
  40.         ++cell.y;
  41.     } else {
  42.         ++cell.x;
  43.     }
  44.     return *this;
  45. }
  46.  
  47. inline BlockRegionIterator::BlockRegionIterator(BlockRegion r):
  48.     _r(r)
  49. {
  50.     if(_r.x2 < _r.x1) {
  51.         std::swap(_r.x1, _r.x2);
  52.     }
  53.     if(_r.y2 < _r.y1) {
  54.         std::swap(_r.y1, _r.y2);
  55.     }
  56. }
  57.  
  58. inline BlockRegionIterator::iterator BlockRegionIterator::begin() const {
  59.     return iterator(*this, _r.lower());
  60. }
  61.  
  62. inline BlockRegionIterator::iterator BlockRegionIterator::end() const {
  63.     return iterator(*this, Cell(_r.x1, _r.y2+1));
  64. }
  65.  
Advertisement
Add Comment
Please, Sign In to add comment