Mir
displacement_generic.h
Go to the documentation of this file.
1 /*
2  * Copyright © 2021 Canonical Ltd.
3  *
4  * This program is free software: you can redistribute it and/or modify it
5  * under the terms of the GNU Lesser General Public License version 2 or 3,
6  * as published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU Lesser General Public License for more details.
12  *
13  * You should have received a copy of the GNU Lesser General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  *
16  * Authored by: William Wold <william.wold@canonical.com>
17  */
18 
19 #ifndef MIR_GEOMETRY_DISPLACEMENT_GENERIC_H_
20 #define MIR_GEOMETRY_DISPLACEMENT_GENERIC_H_
21 
22 #include "dimensions_generic.h"
23 #include <ostream>
24 
25 namespace mir
26 {
27 namespace geometry
28 {
29 namespace detail
30 {
31 struct PointBase;
32 struct SizeBase;
33 struct DisplacementBase{};
34 }
35 namespace generic
36 {
37 template<template<typename> typename T>
38 struct Point;
39 
40 template<template<typename> typename T>
41 struct Size;
42 
43 template<template<typename> typename T>
45 {
46  template<typename Tag>
47  using Corresponding = T<Tag>;
48 
50  using SizeType = Size<T>;
51 
52  constexpr Displacement() {}
53  constexpr Displacement(Displacement const&) = default;
54  Displacement& operator=(Displacement const&) = default;
55 
56  template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value, bool>::type = true>
57  explicit constexpr Displacement(D const& other) noexcept
58  : dx{T<DeltaXTag>{other.dx}},
59  dy{T<DeltaYTag>{other.dy}}
60  {
61  }
62 
63  template<typename DeltaXType, typename DeltaYType>
64  constexpr Displacement(DeltaXType&& dx, DeltaYType&& dy) : dx{dx}, dy{dy} {}
65 
66  T<DeltaXTag> dx;
67  T<DeltaYTag> dy;
68 };
69 
70 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value, bool>::type = true>
71 inline constexpr bool operator==(D const& lhs, D const& rhs)
72 {
73  return lhs.dx == rhs.dx && lhs.dy == rhs.dy;
74 }
75 
76 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value, bool>::type = true>
77 inline constexpr bool operator!=(D const& lhs, D const& rhs)
78 {
79  return lhs.dx != rhs.dx || lhs.dy != rhs.dy;
80 }
81 
82 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value, bool>::type = true>
83 std::ostream& operator<<(std::ostream& out, D const& value)
84 {
85  out << '(' << value.dx << ", " << value.dy << ')';
86  return out;
87 }
88 
89 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value, bool>::type = true>
90 inline constexpr D operator+(D const& lhs, D const& rhs)
91 {
92  return D{lhs.dx + rhs.dx, lhs.dy + rhs.dy};
93 }
94 
95 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value, bool>::type = true>
96 inline constexpr D operator-(D const& lhs, D const& rhs)
97 {
98  return D{lhs.dx - rhs.dx, lhs.dy - rhs.dy};
99 }
100 
101 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value, bool>::type = true>
102 inline constexpr D operator-(D const& rhs)
103 {
104  return D{-rhs.dx, -rhs.dy};
105 }
106 
107 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value, bool>::type = true>
108 inline constexpr typename D::PointType operator+(typename D::PointType const& lhs, D const& rhs)
109 {
110  return typename D::PointType{lhs.x + rhs.dx, lhs.y + rhs.dy};
111 }
112 
113 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value, bool>::type = true>
114 inline constexpr typename D::PointType operator+(D const& lhs, typename D::PointType const& rhs)
115 {
116  return typename D::PointType{rhs.x + lhs.dx, rhs.y + lhs.dy};
117 }
118 
119 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value, bool>::type = true>
120 inline constexpr typename D::PointType operator-(typename D::PointType const& lhs, D const& rhs)
121 {
122  return typename D::PointType{lhs.x - rhs.dx, lhs.y - rhs.dy};
123 }
124 
125 template<typename P, typename std::enable_if<std::is_base_of<detail::PointBase, P>::value, bool>::type = true>
126 inline constexpr typename P::DisplacementType operator-(P const& lhs, P const& rhs)
127 {
128  return typename P::DisplacementType{lhs.x - rhs.x, lhs.y - rhs.y};
129 }
130 
131 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value, bool>::type = true>
132 inline constexpr typename D::PointType& operator+=(typename D::PointType& lhs, D const& rhs)
133 {
134  return lhs = lhs + rhs;
135 }
136 
137 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value, bool>::type = true>
138 inline constexpr typename D::PointType& operator-=(typename D::PointType& lhs, D const& rhs)
139 {
140  return lhs = lhs - rhs;
141 }
142 
143 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value, bool>::type = true>
144 inline bool operator<(D const& lhs, D const& rhs)
145 {
146  return lhs.length_squared() < rhs.length_squared();
147 }
148 
149 template<typename Scalar, typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value, bool>::type = true>
150 inline constexpr D operator*(Scalar scale, D const& disp)
151 {
152  return D{scale*disp.dx, scale*disp.dy};
153 }
154 
155 template<typename Scalar, typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value, bool>::type = true>
156 inline constexpr D operator*(D const& disp, Scalar scale)
157 {
158  return scale*disp;
159 }
160 
161 template<typename S, typename std::enable_if<std::is_base_of<detail::SizeBase, S>::value, bool>::type = true>
162 inline constexpr typename S::DisplacementType as_displacement(S const& size)
163 {
164  return typename S::DisplacementType{size.width.as_value(), size.height.as_value()};
165 }
166 
167 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value, bool>::type = true>
168 inline constexpr typename D::SizeType as_size(D const& disp)
169 {
170  return typename D::SizeType{disp.dx.as_value(), disp.dy.as_value()};
171 }
172 
173 template<typename P, typename std::enable_if<std::is_base_of<detail::PointBase, P>::value, bool>::type = true>
174 inline constexpr typename P::DisplacementType as_displacement(P const& point)
175 {
176  return typename P::DisplacementType{point.x.as_value(), point.y.as_value()};
177 }
178 
179 template<typename D, typename std::enable_if<std::is_base_of<detail::DisplacementBase, D>::value, bool>::type = true>
180 inline constexpr typename D::PointType as_point(D const& disp)
181 {
182  return typename D::PointType{disp.dx.as_value(), disp.dy.as_value()};
183 }
184 }
185 }
186 }
187 
188 #endif // MIR_GEOMETRY_DISPLACEMENT_GENERIC_H_
mir::geometry::generic::operator+=
constexpr D::PointType & operator+=(typename D::PointType &lhs, D const &rhs)
Definition: displacement_generic.h:132
mir::geometry::generic::operator+
constexpr D operator+(D const &lhs, D const &rhs)
Definition: displacement_generic.h:90
mir::geometry::generic::Size< detail::IntWrapper >
dimensions_generic.h
mir::geometry::generic::Displacement::Displacement
constexpr Displacement(Displacement const &)=default
mir::geometry::generic::operator-
constexpr D operator-(D const &lhs, D const &rhs)
Definition: displacement_generic.h:96
mir::geometry::generic::Displacement::Displacement
constexpr Displacement(D const &other) noexcept
Definition: displacement_generic.h:57
mir::geometry::detail::IntWrapper
Definition: dimensions.h:36
mir::geometry::generic::Displacement::operator=
Displacement & operator=(Displacement const &)=default
mir::geometry::detail::DisplacementBase
Used for determining if a type is a displacement.
Definition: displacement_generic.h:33
mir::geometry::generic::operator<<
std::ostream & operator<<(std::ostream &out, W const &value)
Definition: dimensions_generic.h:144
mir::geometry::generic::Point< detail::IntWrapper >
mir::geometry::generic::Displacement::dy
T< DeltaYTag > dy
Definition: displacement_generic.h:67
mir::geometry::generic::as_displacement
constexpr S::DisplacementType as_displacement(S const &size)
Definition: displacement_generic.h:162
mir::geometry::generic::Displacement::Displacement
constexpr Displacement(DeltaXType &&dx, DeltaYType &&dy)
Definition: displacement_generic.h:64
mir::geometry::generic::operator<
bool operator<(D const &lhs, D const &rhs)
Definition: displacement_generic.h:144
mir
Definition: splash_session.h:24
mir::geometry::generic::as_point
constexpr D::PointType as_point(D const &disp)
Definition: displacement_generic.h:180
mir::geometry::generic::as_size
constexpr D::SizeType as_size(D const &disp)
Definition: displacement_generic.h:168
mir::geometry::generic::operator==
constexpr bool operator==(D const &lhs, D const &rhs)
Definition: displacement_generic.h:71
mir::geometry::Point
Definition: point.h:32
mir::geometry::generic::operator-=
constexpr D::PointType & operator-=(typename D::PointType &lhs, D const &rhs)
Definition: displacement_generic.h:138
mir::geometry::generic::Displacement
Definition: displacement_generic.h:45
mir::geometry::generic::Displacement::Displacement
constexpr Displacement()
Definition: displacement_generic.h:52
mir::geometry::generic::Displacement::dx
T< DeltaXTag > dx
Definition: displacement_generic.h:66
mir::geometry::generic::operator!=
constexpr bool operator!=(D const &lhs, D const &rhs)
Definition: displacement_generic.h:77
mir::geometry::Size
Definition: size.h:32
mir::geometry::generic::operator*
constexpr D operator*(Scalar scale, D const &disp)
Definition: displacement_generic.h:150

Copyright © 2012-2021 Canonical Ltd.
Generated on Thu Jun 24 19:55:23 UTC 2021
This documentation is licensed under the GPL version 2 or 3.