17#ifndef MIR_GEOMETRY_DISPLACEMENT_GENERIC_H_
18#define MIR_GEOMETRY_DISPLACEMENT_GENERIC_H_
35template<
template<
typename>
typename T>
38template<
template<
typename>
typename T>
41template<
template<
typename>
typename T>
44 template<
typename Tag>
54 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
56 :
dx{T<DeltaXTag>{other.dx}},
57 dy{T<DeltaYTag>{other.dy}}
61 template<
typename DeltaXType,
typename DeltaYType>
68template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
69inline constexpr bool operator==(D
const& lhs, D
const& rhs)
71 return lhs.dx == rhs.dx && lhs.dy == rhs.dy;
74template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
75inline constexpr bool operator!=(D
const& lhs, D
const& rhs)
77 return lhs.dx != rhs.dx || lhs.dy != rhs.dy;
80template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
81std::ostream&
operator<<(std::ostream& out, D
const& value)
83 out <<
'(' << value.dx <<
", " << value.dy <<
')';
87template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
88inline constexpr D
operator+(D
const& lhs, D
const& rhs)
90 return D{lhs.dx + rhs.dx, lhs.dy + rhs.dy};
93template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
94inline constexpr D
operator-(D
const& lhs, D
const& rhs)
96 return D{lhs.dx - rhs.dx, lhs.dy - rhs.dy};
99template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
102 return D{-rhs.dx, -rhs.dy};
105template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
106inline constexpr typename D::PointType
operator+(
typename D::PointType
const& lhs, D
const& rhs)
108 return typename D::PointType{lhs.x + rhs.dx, lhs.y + rhs.dy};
111template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
112inline constexpr typename D::PointType
operator+(D
const& lhs,
typename D::PointType
const& rhs)
114 return typename D::PointType{rhs.x + lhs.dx, rhs.y + lhs.dy};
117template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
118inline constexpr typename D::PointType
operator-(
typename D::PointType
const& lhs, D
const& rhs)
120 return typename D::PointType{lhs.x - rhs.dx, lhs.y - rhs.dy};
123template<typename P, typename std::enable_if<std::is_base_of<detail::PointBase, P>::value,
bool>::type =
true>
124inline constexpr typename P::DisplacementType
operator-(P
const& lhs, P
const& rhs)
126 return typename P::DisplacementType{lhs.x - rhs.x, lhs.y - rhs.y};
129template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
130inline constexpr typename D::PointType&
operator+=(
typename D::PointType& lhs, D
const& rhs)
132 return lhs = lhs + rhs;
135template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
136inline constexpr typename D::PointType&
operator-=(
typename D::PointType& lhs, D
const& rhs)
138 return lhs = lhs - rhs;
141template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
144 return lhs.length_squared() < rhs.length_squared();
147template<typename Scalar, typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
148inline constexpr D
operator*(Scalar scale, D
const& disp)
150 return D{scale*disp.dx, scale*disp.dy};
153template<typename Scalar, typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
154inline constexpr D
operator*(D
const& disp, Scalar scale)
159template<typename S, typename std::enable_if<std::is_base_of<detail::SizeBase, S>::value,
bool>::type =
true>
162 return typename S::DisplacementType{size.width.as_value(), size.height.as_value()};
165template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
166inline constexpr typename D::SizeType
as_size(D
const& disp)
168 return typename D::SizeType{disp.dx.as_value(), disp.dy.as_value()};
171template<typename P, typename std::enable_if<std::is_base_of<detail::PointBase, P>::value,
bool>::type =
true>
174 return typename P::DisplacementType{point.x.as_value(), point.y.as_value()};
177template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
178inline constexpr typename D::PointType
as_point(D
const& disp)
180 return typename D::PointType{disp.dx.as_value(), disp.dy.as_value()};
std::ostream & operator<<(std::ostream &out, W const &value)
Definition: dimensions_generic.h:142
constexpr D operator-(D const &lhs, D const &rhs)
Definition: displacement_generic.h:94
bool operator<(D const &lhs, D const &rhs)
Definition: displacement_generic.h:142
constexpr D::PointType as_point(D const &disp)
Definition: displacement_generic.h:178
constexpr bool operator!=(D const &lhs, D const &rhs)
Definition: displacement_generic.h:75
constexpr D operator+(D const &lhs, D const &rhs)
Definition: displacement_generic.h:88
constexpr D::SizeType as_size(D const &disp)
Definition: displacement_generic.h:166
constexpr D operator*(Scalar scale, D const &disp)
Definition: displacement_generic.h:148
constexpr bool operator==(D const &lhs, D const &rhs)
Definition: displacement_generic.h:69
constexpr D::PointType & operator+=(typename D::PointType &lhs, D const &rhs)
Definition: displacement_generic.h:130
constexpr D::PointType & operator-=(typename D::PointType &lhs, D const &rhs)
Definition: displacement_generic.h:136
constexpr S::DisplacementType as_displacement(S const &size)
Definition: displacement_generic.h:160
Definition: splash_session.h:22
Used for determining if a type is a displacement.
Definition: displacement_generic.h:31
Definition: displacement_generic.h:43
Displacement & operator=(Displacement const &)=default
constexpr Displacement(D const &other) noexcept
Definition: displacement_generic.h:55
T< DeltaXTag > dx
Definition: displacement_generic.h:64
constexpr Displacement(Displacement const &)=default
T< DeltaYTag > dy
Definition: displacement_generic.h:65
T< Tag > Corresponding
Definition: displacement_generic.h:45
constexpr Displacement()
Definition: displacement_generic.h:50
constexpr Displacement(DeltaXType &&dx, DeltaYType &&dy)
Definition: displacement_generic.h:62
Definition: point_generic.h:40
Definition: size_generic.h:41