17 #ifndef MIR_GEOMETRY_DISPLACEMENT_GENERIC_H_
18 #define MIR_GEOMETRY_DISPLACEMENT_GENERIC_H_
35 template<
template<
typename>
typename T>
38 template<
template<
typename>
typename T>
41 template<
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>
68 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
69 inline constexpr
bool operator==(D
const& lhs, D
const& rhs)
71 return lhs.dx == rhs.dx && lhs.dy == rhs.dy;
74 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
75 inline constexpr
bool operator!=(D
const& lhs, D
const& rhs)
77 return lhs.dx != rhs.dx || lhs.dy != rhs.dy;
80 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
81 std::ostream&
operator<<(std::ostream& out, D
const& value)
83 out <<
'(' << value.dx <<
", " << value.dy <<
')';
87 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
88 inline constexpr D
operator+(D
const& lhs, D
const& rhs)
90 return D{lhs.dx + rhs.dx, lhs.dy + rhs.dy};
93 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
94 inline constexpr D
operator-(D
const& lhs, D
const& rhs)
96 return D{lhs.dx - rhs.dx, lhs.dy - rhs.dy};
99 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
102 return D{-rhs.dx, -rhs.dy};
105 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
106 inline 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};
111 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
112 inline 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};
117 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
118 inline 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};
123 template<typename P, typename std::enable_if<std::is_base_of<detail::PointBase, P>::value,
bool>::type =
true>
124 inline constexpr
typename P::DisplacementType
operator-(P
const& lhs, P
const& rhs)
126 return typename P::DisplacementType{lhs.x - rhs.x, lhs.y - rhs.y};
129 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
130 inline constexpr
typename D::PointType&
operator+=(
typename D::PointType& lhs, D
const& rhs)
132 return lhs = lhs + rhs;
135 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
136 inline constexpr
typename D::PointType&
operator-=(
typename D::PointType& lhs, D
const& rhs)
138 return lhs = lhs - rhs;
141 template<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();
147 template<typename Scalar, typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
148 inline constexpr D
operator*(Scalar scale, D
const& disp)
150 return D{scale*disp.dx, scale*disp.dy};
153 template<typename Scalar, typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
154 inline constexpr D
operator*(D
const& disp, Scalar scale)
159 template<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()};
165 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
166 inline constexpr
typename D::SizeType
as_size(D
const& disp)
168 return typename D::SizeType{disp.dx.as_value(), disp.dy.as_value()};
171 template<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()};
177 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value,
bool>::type =
true>
178 inline constexpr
typename D::PointType
as_point(D
const& disp)
180 return typename D::PointType{disp.dx.as_value(), disp.dy.as_value()};
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
std::ostream & operator<<(std::ostream &out, W const &value)
Definition: dimensions_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::PointType & operator-=(typename D::PointType &lhs, D const &rhs)
Definition: displacement_generic.h:136
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 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
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
Displacement & operator=(Displacement const &)=default
constexpr Displacement(DeltaXType &&dx, DeltaYType &&dy)
Definition: displacement_generic.h:62
Definition: point_generic.h:40
Definition: size_generic.h:41