@@ -47,7 +47,7 @@ class fixed;
4747namespace detail {
4848
4949// helper templates to make magic with types :)
50- // these allow us to determine resonable types from
50+ // these allow us to determine reasonable types from
5151// a desired size, they also let us infer the next largest type
5252// from a type which is nice for the division op
5353template <size_t T>
@@ -284,8 +284,8 @@ class fixed {
284284 static constexpr base_type one = base_type(1 ) << fractional_bits;
285285
286286public: // constructors
287- fixed () = default ;
288- fixed (const fixed &) = default ;
287+ fixed () = default ;
288+ fixed (const fixed &) = default ;
289289 fixed &operator =(const fixed &) = default ;
290290
291291 template <class Number >
@@ -538,16 +538,19 @@ CONSTEXPR14 fixed<I, F> operator+(fixed<I, F> lhs, fixed<I, F> rhs) {
538538 lhs += rhs;
539539 return lhs;
540540}
541+
541542template <size_t I, size_t F>
542543CONSTEXPR14 fixed<I, F> operator -(fixed<I, F> lhs, fixed<I, F> rhs) {
543544 lhs -= rhs;
544545 return lhs;
545546}
547+
546548template <size_t I, size_t F>
547549CONSTEXPR14 fixed<I, F> operator *(fixed<I, F> lhs, fixed<I, F> rhs) {
548550 lhs *= rhs;
549551 return lhs;
550552}
553+
551554template <size_t I, size_t F>
552555CONSTEXPR14 fixed<I, F> operator /(fixed<I, F> lhs, fixed<I, F> rhs) {
553556 lhs /= rhs;
@@ -559,16 +562,19 @@ CONSTEXPR14 fixed<I, F> operator+(fixed<I, F> lhs, Number rhs) {
559562 lhs += fixed<I, F>(rhs);
560563 return lhs;
561564}
565+
562566template <size_t I, size_t F, class Number , class = typename std::enable_if<std::is_arithmetic<Number>::value>::type>
563567CONSTEXPR14 fixed<I, F> operator -(fixed<I, F> lhs, Number rhs) {
564568 lhs -= fixed<I, F>(rhs);
565569 return lhs;
566570}
571+
567572template <size_t I, size_t F, class Number , class = typename std::enable_if<std::is_arithmetic<Number>::value>::type>
568573CONSTEXPR14 fixed<I, F> operator *(fixed<I, F> lhs, Number rhs) {
569574 lhs *= fixed<I, F>(rhs);
570575 return lhs;
571576}
577+
572578template <size_t I, size_t F, class Number , class = typename std::enable_if<std::is_arithmetic<Number>::value>::type>
573579CONSTEXPR14 fixed<I, F> operator /(fixed<I, F> lhs, Number rhs) {
574580 lhs /= fixed<I, F>(rhs);
@@ -581,18 +587,21 @@ CONSTEXPR14 fixed<I, F> operator+(Number lhs, fixed<I, F> rhs) {
581587 tmp += rhs;
582588 return tmp;
583589}
590+
584591template <size_t I, size_t F, class Number , class = typename std::enable_if<std::is_arithmetic<Number>::value>::type>
585592CONSTEXPR14 fixed<I, F> operator -(Number lhs, fixed<I, F> rhs) {
586593 fixed<I, F> tmp (lhs);
587594 tmp -= rhs;
588595 return tmp;
589596}
597+
590598template <size_t I, size_t F, class Number , class = typename std::enable_if<std::is_arithmetic<Number>::value>::type>
591599CONSTEXPR14 fixed<I, F> operator *(Number lhs, fixed<I, F> rhs) {
592600 fixed<I, F> tmp (lhs);
593601 tmp *= rhs;
594602 return tmp;
595603}
604+
596605template <size_t I, size_t F, class Number , class = typename std::enable_if<std::is_arithmetic<Number>::value>::type>
597606CONSTEXPR14 fixed<I, F> operator /(Number lhs, fixed<I, F> rhs) {
598607 fixed<I, F> tmp (lhs);
@@ -606,6 +615,7 @@ CONSTEXPR14 fixed<I, F> operator<<(fixed<I, F> lhs, Integer rhs) {
606615 lhs <<= rhs;
607616 return lhs;
608617}
618+
609619template <size_t I, size_t F, class Integer , class = typename std::enable_if<std::is_integral<Integer>::value>::type>
610620CONSTEXPR14 fixed<I, F> operator >>(fixed<I, F> lhs, Integer rhs) {
611621 lhs >>= rhs;
@@ -617,22 +627,27 @@ template <size_t I, size_t F, class Number, class = typename std::enable_if<std:
617627constexpr bool operator >(fixed<I, F> lhs, Number rhs) {
618628 return lhs > fixed<I, F>(rhs);
619629}
630+
620631template <size_t I, size_t F, class Number , class = typename std::enable_if<std::is_arithmetic<Number>::value>::type>
621632constexpr bool operator <(fixed<I, F> lhs, Number rhs) {
622633 return lhs < fixed<I, F>(rhs);
623634}
635+
624636template <size_t I, size_t F, class Number , class = typename std::enable_if<std::is_arithmetic<Number>::value>::type>
625637constexpr bool operator >=(fixed<I, F> lhs, Number rhs) {
626638 return lhs >= fixed<I, F>(rhs);
627639}
640+
628641template <size_t I, size_t F, class Number , class = typename std::enable_if<std::is_arithmetic<Number>::value>::type>
629642constexpr bool operator <=(fixed<I, F> lhs, Number rhs) {
630643 return lhs <= fixed<I, F>(rhs);
631644}
645+
632646template <size_t I, size_t F, class Number , class = typename std::enable_if<std::is_arithmetic<Number>::value>::type>
633647constexpr bool operator ==(fixed<I, F> lhs, Number rhs) {
634648 return lhs == fixed<I, F>(rhs);
635649}
650+
636651template <size_t I, size_t F, class Number , class = typename std::enable_if<std::is_arithmetic<Number>::value>::type>
637652constexpr bool operator !=(fixed<I, F> lhs, Number rhs) {
638653 return lhs != fixed<I, F>(rhs);
@@ -642,26 +657,32 @@ template <size_t I, size_t F, class Number, class = typename std::enable_if<std:
642657constexpr bool operator >(Number lhs, fixed<I, F> rhs) {
643658 return fixed<I, F>(lhs) > rhs;
644659}
660+
645661template <size_t I, size_t F, class Number , class = typename std::enable_if<std::is_arithmetic<Number>::value>::type>
646662constexpr bool operator <(Number lhs, fixed<I, F> rhs) {
647663 return fixed<I, F>(lhs) < rhs;
648664}
665+
649666template <size_t I, size_t F, class Number , class = typename std::enable_if<std::is_arithmetic<Number>::value>::type>
650667constexpr bool operator >=(Number lhs, fixed<I, F> rhs) {
651668 return fixed<I, F>(lhs) >= rhs;
652669}
670+
653671template <size_t I, size_t F, class Number , class = typename std::enable_if<std::is_arithmetic<Number>::value>::type>
654672constexpr bool operator <=(Number lhs, fixed<I, F> rhs) {
655673 return fixed<I, F>(lhs) <= rhs;
656674}
675+
657676template <size_t I, size_t F, class Number , class = typename std::enable_if<std::is_arithmetic<Number>::value>::type>
658677constexpr bool operator ==(Number lhs, fixed<I, F> rhs) {
659678 return fixed<I, F>(lhs) == rhs;
660679}
680+
661681template <size_t I, size_t F, class Number , class = typename std::enable_if<std::is_arithmetic<Number>::value>::type>
662682constexpr bool operator !=(Number lhs, fixed<I, F> rhs) {
663683 return fixed<I, F>(lhs) != rhs;
664684}
685+
665686}
666687
667688#undef CONSTEXPR14
0 commit comments