@@ -10,6 +10,9 @@ struct AngleTag;
1010struct AngularVelocityTag ;
1111struct AngularAccelerationTag ;
1212
13+ template <typename Tag>
14+ concept IsBaseAngleTag = std::is_same_v<Tag, AngleTag>;
15+
1316/* *
1417 * A typesafe representation of an angle.
1518 *
@@ -117,7 +120,7 @@ class GenericAngle final
117120 *
118121 * @return the modulus of this GenericAngle ÷ divisor.
119122 */
120- constexpr GenericAngle mod (GenericAngle divisor) const ;
123+ constexpr GenericAngle mod (GenericAngle divisor) const requires IsBaseAngleTag<Tag> ;
121124
122125 /* *
123126 * Computes the remainder of a division between this angle and
@@ -127,7 +130,8 @@ class GenericAngle final
127130 *
128131 * @return the remainder of this GenericAngle ÷ divisor.
129132 */
130- constexpr GenericAngle remainder (const GenericAngle& divisor) const ;
133+ constexpr GenericAngle remainder (const GenericAngle& divisor) const requires
134+ IsBaseAngleTag<Tag>;
131135
132136 /* *
133137 * Returns the absolute value of this angle.
@@ -172,7 +176,7 @@ class GenericAngle final
172176 *
173177 * @return the clamped angle.
174178 */
175- constexpr GenericAngle clamp () const ;
179+ constexpr GenericAngle clamp () const requires IsBaseAngleTag<Tag> ;
176180
177181 /* *
178182 * Returns the smallest possible rotational difference between this angle
@@ -182,7 +186,8 @@ class GenericAngle final
182186 *
183187 * @return the angle between this GenericAngle and other, in the range [0, π].
184188 */
185- constexpr GenericAngle minDiff (const GenericAngle& other) const ;
189+ constexpr GenericAngle minDiff (const GenericAngle& other) const requires
190+ IsBaseAngleTag<Tag>;
186191
187192 private:
188193 /* *
@@ -193,6 +198,8 @@ class GenericAngle final
193198 explicit constexpr GenericAngle (double rads);
194199};
195200
201+ using Angle = GenericAngle<AngleTag>;
202+
196203template <typename T>
197204concept AngleType = std::is_same_v<T, GenericAngle<AngleTag>> ||
198205 std::is_same_v<T, GenericAngle<AngularVelocityTag>> ||
@@ -467,7 +474,8 @@ inline constexpr double GenericAngle<Tag>::toDegrees() const
467474}
468475
469476template <typename Tag>
470- inline constexpr GenericAngle<Tag> GenericAngle<Tag>::mod(GenericAngle<Tag> divisor) const
477+ inline constexpr GenericAngle<Tag> GenericAngle<Tag>::mod(
478+ GenericAngle<Tag> divisor) const requires IsBaseAngleTag<Tag>
471479{
472480 if (divisor.toRadians () < FIXED_EPSILON )
473481 {
@@ -484,7 +492,8 @@ inline constexpr GenericAngle<Tag> GenericAngle<Tag>::mod(GenericAngle<Tag> divi
484492
485493template <typename Tag>
486494inline constexpr GenericAngle<Tag> GenericAngle<Tag>::remainder(
487- const GenericAngle<Tag>& divisor) const
495+ const GenericAngle<Tag>& divisor) const requires IsBaseAngleTag<Tag>
496+
488497{
489498 return GenericAngle<Tag>::fromRadians (
490499 toRadians () - static_cast <double >(static_cast <long >(
@@ -525,14 +534,17 @@ inline double GenericAngle<Tag>::tan() const
525534}
526535
527536template <typename Tag>
528- inline constexpr GenericAngle<Tag> GenericAngle<Tag>::clamp() const
537+ inline constexpr GenericAngle<Tag> GenericAngle<Tag>::clamp() const requires
538+ IsBaseAngleTag<Tag>
539+
529540{
530541 return remainder (GenericAngle<Tag>::full ());
531542}
532543
533544template <typename Tag>
534545inline constexpr GenericAngle<Tag> GenericAngle<Tag>::minDiff(
535- const GenericAngle<Tag>& other) const
546+ const GenericAngle<Tag>& other) const requires IsBaseAngleTag<Tag>
547+
536548{
537549 return (*this - other).clamp ().abs ();
538550}
@@ -640,5 +652,3 @@ inline std::ostream& operator<<(std::ostream& os, const AngleType auto& a)
640652 os << a.toRadians () << " R" ;
641653 return os;
642654}
643-
644- using Angle = GenericAngle<AngleTag>;
0 commit comments