Skip to content

Commit 19fe0e5

Browse files
authored
Support comparing Constant to ZERO (#668)
This might come in handy sometimes. (Inspired by an actual use case.) Seems like a sensible operation to provide. Follow-on to #607.
1 parent cab03c7 commit 19fe0e5

2 files changed

Lines changed: 66 additions & 0 deletions

File tree

au/constant.hh

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,26 @@ struct Constant : detail::MakesQuantityFromNumber<Constant, Unit>,
122122
return as<typename CorrespondingQuantity<T>::Rep>(
123123
typename CorrespondingQuantity<T>::Unit{});
124124
}
125+
126+
// Comparison with Zero.
127+
//
128+
// A Constant represents a value of 1 in its unit, which is never zero.
129+
friend constexpr bool operator==(Constant, Zero) { return false; }
130+
friend constexpr bool operator!=(Constant, Zero) { return true; }
131+
friend constexpr bool operator<(Constant, Zero) { return !is_positive(); }
132+
friend constexpr bool operator<=(Constant, Zero) { return !is_positive(); }
133+
friend constexpr bool operator>(Constant, Zero) { return is_positive(); }
134+
friend constexpr bool operator>=(Constant, Zero) { return is_positive(); }
135+
136+
friend constexpr bool operator==(Zero, Constant) { return false; }
137+
friend constexpr bool operator!=(Zero, Constant) { return true; }
138+
friend constexpr bool operator<(Zero, Constant) { return is_positive(); }
139+
friend constexpr bool operator<=(Zero, Constant) { return is_positive(); }
140+
friend constexpr bool operator>(Zero, Constant) { return !is_positive(); }
141+
friend constexpr bool operator>=(Zero, Constant) { return !is_positive(); }
142+
143+
private:
144+
static constexpr bool is_positive() { return IsPositive<detail::MagT<Unit>>::value; }
125145
};
126146

127147
// Make a constant from the given unit.

au/constant_test.cc

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,52 @@ TEST(Constant, OrderingWorksWithNegativeConstants) {
510510
EXPECT_THAT(c, Not(Le(neg_c)));
511511
}
512512

513+
TEST(Constant, EqualityComparisonWithZero) {
514+
constexpr auto one_meter = make_constant(meters);
515+
516+
EXPECT_THAT(one_meter == ZERO, IsFalse());
517+
EXPECT_THAT(ZERO == one_meter, IsFalse());
518+
EXPECT_THAT(one_meter != ZERO, IsTrue());
519+
EXPECT_THAT(ZERO != one_meter, IsTrue());
520+
}
521+
522+
TEST(Constant, EqualityComparisonWithZeroForNegativeConstant) {
523+
constexpr auto neg_meter = -make_constant(meters);
524+
525+
EXPECT_THAT(neg_meter == ZERO, IsFalse());
526+
EXPECT_THAT(ZERO == neg_meter, IsFalse());
527+
EXPECT_THAT(neg_meter != ZERO, IsTrue());
528+
EXPECT_THAT(ZERO != neg_meter, IsTrue());
529+
}
530+
531+
TEST(Constant, OrderingComparisonWithZero) {
532+
constexpr auto one_meter = make_constant(meters);
533+
534+
EXPECT_THAT(one_meter > ZERO, IsTrue());
535+
EXPECT_THAT(one_meter >= ZERO, IsTrue());
536+
EXPECT_THAT(one_meter < ZERO, IsFalse());
537+
EXPECT_THAT(one_meter <= ZERO, IsFalse());
538+
539+
EXPECT_THAT(ZERO < one_meter, IsTrue());
540+
EXPECT_THAT(ZERO <= one_meter, IsTrue());
541+
EXPECT_THAT(ZERO > one_meter, IsFalse());
542+
EXPECT_THAT(ZERO >= one_meter, IsFalse());
543+
}
544+
545+
TEST(Constant, OrderingComparisonWithZeroForNegativeConstant) {
546+
constexpr auto neg_meter = -make_constant(meters);
547+
548+
EXPECT_THAT(neg_meter < ZERO, IsTrue());
549+
EXPECT_THAT(neg_meter <= ZERO, IsTrue());
550+
EXPECT_THAT(neg_meter > ZERO, IsFalse());
551+
EXPECT_THAT(neg_meter >= ZERO, IsFalse());
552+
553+
EXPECT_THAT(ZERO > neg_meter, IsTrue());
554+
EXPECT_THAT(ZERO >= neg_meter, IsTrue());
555+
EXPECT_THAT(ZERO < neg_meter, IsFalse());
556+
EXPECT_THAT(ZERO <= neg_meter, IsFalse());
557+
}
558+
513559
TEST(Constant, OrderingWorksWithScaledConstants) {
514560
constexpr auto half_c = c / mag<2>();
515561
constexpr auto double_c = c * mag<2>();

0 commit comments

Comments
 (0)