layout.cpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #include "layout.h"
  2. int2 select_corner(range2D rng, int2 direction) noexcept
  3. {
  4. // center + direction * half_size
  5. return
  6. (
  7. (rng.lower() + rng.upper()) // center * 2
  8. + direction * (rng.upper() - rng.lower()) // direction * size
  9. ) / 2; // all halved
  10. }
  11. bounds_layout& bounds_layout::operator+=(const int2& offset)
  12. {
  13. movable_bounds::operator+=(offset);
  14. for(auto&& element : elements)
  15. *element += offset;
  16. return *this;
  17. }
  18. template <typename Itr>
  19. class double_deref_itr
  20. {
  21. public:
  22. Itr itr;
  23. double_deref_itr& operator++() noexcept
  24. {
  25. ++itr;
  26. return *this;
  27. }
  28. double_deref_itr operator++(int) noexcept
  29. {
  30. double_deref_itr tmp{ itr++ };
  31. return tmp;
  32. }
  33. auto&& operator*() { return *(*itr); }
  34. bool operator==(double_deref_itr other) { return itr == other.itr; }
  35. bool operator!=(double_deref_itr other) { return !(*this == other); }
  36. };
  37. template <typename T> double_deref_itr(T) -> double_deref_itr<T>;
  38. range2D bounds_layout::update()
  39. {
  40. layout_bounds(double_deref_itr{elements.begin()}, double_deref_itr{elements.end()}, spacing);
  41. // invalid tange, returned for empty layout
  42. bounds = invalid_range;
  43. for(auto&& element : elements)
  44. {
  45. bounds.lower() = min(bounds.lower(), element->lower());
  46. bounds.upper() = max(bounds.upper(), element->upper());
  47. }
  48. return bounds;
  49. }