17 #ifndef MIR_GEOMETRY_DISPLACEMENT_H_
18 #define MIR_GEOMETRY_DISPLACEMENT_H_
44 Displacement&
operator=(Displacement
const&) =
default;
47 explicit constexpr Displacement(Displacement<U>
const& other)
noexcept
53 template<
typename DeltaXType,
typename DeltaYType>
56 template <
typename Q = T>
57 constexpr typename std::enable_if<std::is_integral<Q>::value,
long long>::
type length_squared()
const
59 long long x = dx.as_value(), y = dy.as_value();
63 template <
typename Q = T>
66 T x = dx.as_value(), y = dy.as_value();
75 inline constexpr bool operator==(Displacement<T>
const& lhs, Displacement<T>
const& rhs)
77 return lhs.dx == rhs.dx && lhs.dy == rhs.dy;
81 inline constexpr bool operator!=(Displacement<T>
const& lhs, Displacement<T>
const& rhs)
83 return lhs.dx != rhs.dx || lhs.dy != rhs.dy;
87 std::ostream& operator<<(std::ostream& out, Displacement<T>
const& value)
89 out <<
'(' << value.dx <<
", " << value.dy <<
')';
94 inline constexpr Displacement<T>
operator+(Displacement<T>
const& lhs, Displacement<T>
const& rhs)
96 return Displacement<T>{lhs.dx + rhs.dx, lhs.dy + rhs.dy};
100 inline constexpr Displacement<T>
operator-(Displacement<T>
const& lhs, Displacement<T>
const& rhs)
102 return Displacement<T>{lhs.dx - rhs.dx, lhs.dy - rhs.dy};
106 inline constexpr Displacement<T>
operator-(Displacement<T>
const& rhs)
108 return Displacement<T>{-rhs.dx, -rhs.dy};
112 inline constexpr Point<T>
operator+(Point<T>
const& lhs, Displacement<T>
const& rhs)
114 return Point<T>{lhs.x + rhs.dx, lhs.y + rhs.dy};
118 inline constexpr Point<T>
operator+(Displacement<T>
const& lhs, Point<T>
const& rhs)
120 return Point<T>{rhs.x + lhs.dx, rhs.y + lhs.dy};
124 inline constexpr Point<T>
operator-(Point<T>
const& lhs, Displacement<T>
const& rhs)
126 return Point<T>{lhs.x - rhs.dx, lhs.y - rhs.dy};
130 inline constexpr Displacement<T>
operator-(Point<T>
const& lhs, Point<T>
const& rhs)
132 return Displacement<T>{lhs.x - rhs.x, lhs.y - rhs.y};
136 inline constexpr Point<T>&
operator+=(Point<T>& lhs, Displacement<T>
const& rhs)
138 return lhs = lhs + rhs;
142 inline constexpr Point<T>&
operator-=(Point<T>& lhs, Displacement<T>
const& rhs)
144 return lhs = lhs - rhs;
148 inline bool operator<(Displacement<T>
const& lhs, Displacement<T>
const& rhs)
150 return lhs.length_squared() < rhs.length_squared();
153 template<
typename T,
typename Scalar>
154 inline constexpr Displacement<T>
operator*(Scalar scale, Displacement<T>
const& disp)
156 return Displacement<T>{scale*disp.dx, scale*disp.dy};
159 template<
typename T,
typename Scalar>
160 inline constexpr Displacement<T>
operator*(Displacement<T>
const& disp, Scalar scale)
168 return Displacement<T>{size.width.as_value(), size.height.as_value()};
174 return Size<T>{disp.dx.as_value(), disp.dy.as_value()};
180 return Displacement<T>{point.x.as_value(), point.y.as_value()};
184 inline constexpr Point<T>
as_point(Displacement<T>
const& disp)
186 return Point<T>{disp.dx.as_value(), disp.dy.as_value()};