Skip to content

Commit 2977873

Browse files
committed
Use concepts to only implement some methods for Angle
1 parent 7f73125 commit 2977873

1 file changed

Lines changed: 20 additions & 10 deletions

File tree

src/software/geom/angle.h

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ struct AngleTag;
1010
struct AngularVelocityTag;
1111
struct 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+
196203
template <typename T>
197204
concept 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

469476
template <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

485493
template <typename Tag>
486494
inline 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

527536
template <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

533544
template <typename Tag>
534545
inline 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

Comments
 (0)