14 #if __cplusplus >= 202002L
15 #define __fp_consteval consteval
17 #define __fp_consteval constexpr
47 template <
intmax_t IntSize,
intmax_t FracSize,
bool Signed = true>
50 template <
intmax_t IntSize,
intmax_t FracSize,
bool Signed>
class FixedPoint {
51 static __fp_consteval
auto bytesForBits(
intmax_t v) {
return ((v + 7) / 8); }
52 static constexpr
auto storage_size = bytesForBits(IntSize + FracSize) * 8;
58 template <
intmax_t OI,
intmax_t OF,
bool S>
60 FixedPoint<(OI > IntSize ? OI : IntSize), (OF > FracSize ? OF : FracSize),
62 : OI < IntSize ? Signed
70 unsigned _BitInt(storage_size)>;
84 template <
typename T, std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
101 template <
typename T,
102 std::enable_if_t<std::is_floating_point_v<T>,
bool> =
true>
103 [[clang::always_inline]] __fp_consteval
explicit FixedPoint(T
f) {
109 template <
intmax_t OI,
intmax_t OF,
bool S>
111 if constexpr (FracSize > OF)
137 template <
intmax_t OI,
intmax_t OF,
bool S = true>
142 [[clang::always_inline]] constexpr
bool is_signed()
const {
return Signed; }
144 return IntSize + FracSize;
230 val = (temp.get() << FracSize) / o.
get();
245 val = (temp.get() * other.get()) >> FracSize;
286 template <
intmax_t OI,
intmax_t OF,
bool S>
287 [[clang::always_inline]] constexpr
auto
294 template <
intmax_t OI,
intmax_t OF,
bool S>
295 [[clang::always_inline]] constexpr
FixedPoint &
301 template <
intmax_t OI,
intmax_t OF,
bool S>
302 [[clang::always_inline]] constexpr
auto
309 template <
intmax_t OI,
intmax_t OF,
bool S>
310 [[clang::always_inline]] constexpr
FixedPoint &
315 template <
intmax_t OI,
intmax_t OF,
bool S>
316 [[clang::always_inline]] constexpr
auto
323 template <
intmax_t OI,
intmax_t OF,
bool S>
324 [[clang::always_inline]] constexpr
FixedPoint &
329 template <
intmax_t OI,
intmax_t OF,
bool S>
330 [[clang::always_inline]] constexpr
auto
337 template <
intmax_t OI,
intmax_t OF,
bool S>
338 [[clang::always_inline]] constexpr
FixedPoint &
343 template <
intmax_t OI,
intmax_t OF,
bool S>
344 [[clang::always_inline]] constexpr
auto
351 template <
intmax_t OI,
intmax_t OF,
bool S>
352 [[clang::always_inline]] constexpr
FixedPoint &
357 template <
intmax_t OI,
intmax_t OF,
bool S>
358 [[clang::always_inline]] constexpr
auto
365 template <
intmax_t OI,
intmax_t OF,
bool S>
366 [[clang::always_inline]] constexpr
FixedPoint &
372 template <
intmax_t OI,
intmax_t OF,
bool S>
373 [[clang::always_inline]] constexpr
auto
379 template <
intmax_t OI,
intmax_t OF,
bool S>
380 [[clang::always_inline]] constexpr
FixedPoint &
387 [[clang::always_inline]] constexpr
bool
391 [[clang::always_inline]] constexpr
bool
395 [[clang::always_inline]] constexpr
bool
399 [[clang::always_inline]] constexpr
bool
403 [[clang::always_inline]] constexpr
bool
407 [[clang::always_inline]] constexpr
bool
411 template <
intmax_t OI,
intmax_t OF,
bool S>
412 [[clang::always_inline]] constexpr
auto
418 template <
intmax_t OI,
intmax_t OF,
bool S>
419 [[clang::always_inline]] constexpr
auto
425 template <
intmax_t OI,
intmax_t OF,
bool S>
426 [[clang::always_inline]] constexpr
auto
432 template <
intmax_t OI,
intmax_t OF,
bool S>
433 [[clang::always_inline]] constexpr
auto
439 template <
intmax_t OI,
intmax_t OF,
bool S>
440 [[clang::always_inline]] constexpr
auto
446 template <
intmax_t OI,
intmax_t OF,
bool S>
447 [[clang::always_inline]] constexpr
auto
489 [[clang::always_inline]] __fp_consteval
fs8_8
490 operator""_s8_8(
long double fixed) {
493 [[clang::always_inline]] __fp_consteval
fs12_4
494 operator""_s12_4(
long double fixed) {
497 [[clang::always_inline]] __fp_consteval
fs16_8
498 operator""_s16_8(
long double fixed) {
501 [[clang::always_inline]] __fp_consteval
fs8_16
502 operator""_s8_16(
long double fixed) {
505 [[clang::always_inline]] __fp_consteval
fs12_12
506 operator""_s12_12(
long double fixed) {
509 [[clang::always_inline]] __fp_consteval
fs16_16
510 operator""_s16_16(
long double fixed) {
513 [[clang::always_inline]] __fp_consteval
fs24_8
514 operator""_s24_8(
long double fixed) {
518 [[clang::always_inline]] __fp_consteval
fu8_8
519 operator""_u8_8(
long double fixed) {
522 [[clang::always_inline]] __fp_consteval
fu12_4
523 operator""_u12_4(
long double fixed) {
526 [[clang::always_inline]] __fp_consteval
fu16_8
527 operator""_u16_8(
long double fixed) {
530 [[clang::always_inline]] __fp_consteval
fu8_16
531 operator""_u8_16(
long double fixed) {
534 [[clang::always_inline]] __fp_consteval
fu12_12
535 operator""_u12_12(
long double fixed) {
538 [[clang::always_inline]] __fp_consteval
fu16_16
539 operator""_u16_16(
long double fixed) {
542 [[clang::always_inline]] __fp_consteval
fu24_8
543 operator""_u24_8(
long double fixed) {
547 [[clang::always_inline]] __fp_consteval
fs8_8
548 operator""_8_8(
long double fixed) {
551 [[clang::always_inline]] __fp_consteval
fs12_4
552 operator""_12_4(
long double fixed) {
555 [[clang::always_inline]] __fp_consteval
fs16_8
556 operator""_16_8(
long double fixed) {
559 [[clang::always_inline]] __fp_consteval
fs8_16
560 operator""_8_16(
long double fixed) {
563 [[clang::always_inline]] __fp_consteval
fs12_12
564 operator""_12_12(
long double fixed) {
567 [[clang::always_inline]] __fp_consteval
fs16_16
568 operator""_16_16(
long double fixed) {
571 [[clang::always_inline]] __fp_consteval
fs24_8
572 operator""_24_8(
long double fixed) {
Definition: fixed_point.h:50
constexpr auto operator+(FixedPoint< OI, OF, S > o) const
Definition: fixed_point.h:288
constexpr FixedPoint & operator|=(FixedPoint< OI, OF, S > o)
Definition: fixed_point.h:367
constexpr FixedPoint operator~() const
Definition: fixed_point.h:161
constexpr FixedPoint & operator&=(FixedPoint o)
Definition: fixed_point.h:177
FixedPoint operator++(int)
Definition: fixed_point.h:280
StorageType val
Definition: fixed_point.h:75
constexpr void set_f(FracType value)
Update just the fractional portion.
Definition: fixed_point.h:128
constexpr FixedPoint & operator%=(FixedPoint o)
Definition: fixed_point.h:168
constexpr FixedPoint & operator+=(FixedPoint< OI, OF, S > o)
Definition: fixed_point.h:296
FracType f
Definition: fixed_point.h:77
constexpr IntType as_i() const
Returns just the integral portion.
Definition: fixed_point.h:120
constexpr FixedPoint operator-(FixedPoint o) const
Definition: fixed_point.h:220
constexpr FixedPoint & operator+=(FixedPoint o)
Definition: fixed_point.h:206
constexpr void set(StorageType value)
Update the entire value.
Definition: fixed_point.h:130
constexpr FixedPoint operator|(FixedPoint o) const
Definition: fixed_point.h:190
unsigned _BitInt(FracSize) FracType
Definition: fixed_point.h:68
constexpr FixedPoint operator*(FixedPoint o) const
Definition: fixed_point.h:248
constexpr auto operator==(FixedPoint< OI, OF, S > o) const noexcept
Definition: fixed_point.h:413
constexpr FixedPoint & operator|=(FixedPoint o)
Definition: fixed_point.h:186
constexpr FixedPoint operator<<(StorageType v) const
Definition: fixed_point.h:270
constexpr bool operator!=(const FixedPoint &o) const noexcept
Definition: fixed_point.h:396
constexpr auto operator!=(FixedPoint< OI, OF, S > o) const noexcept
Definition: fixed_point.h:427
constexpr FixedPoint()=default
constexpr FixedPoint & operator*=(FixedPoint o)
Definition: fixed_point.h:239
constexpr FixedPoint operator%(FixedPoint o) const
Definition: fixed_point.h:172
constexpr FixedPoint & operator&=(FixedPoint< OI, OF, S > o)
Definition: fixed_point.h:353
IntType i
Definition: fixed_point.h:78
std::conditional_t< Signed, _BitInt(storage_size), unsigned _BitInt(storage_size)> StorageType
Definition: fixed_point.h:70
constexpr auto operator*(FixedPoint< OI, OF, S > o) const
Definition: fixed_point.h:374
constexpr bool operator>(const FixedPoint &o) const noexcept
Definition: fixed_point.h:400
constexpr auto operator%(FixedPoint< OI, OF, S > o) const
Definition: fixed_point.h:317
constexpr FixedPoint & operator%=(FixedPoint< OI, OF, S > o)
Definition: fixed_point.h:325
constexpr FixedPoint(IntType i, FracType f)
Constructor for setting both the integral and fractional part.
Definition: fixed_point.h:89
constexpr FixedPoint operator+(FixedPoint o) const
Definition: fixed_point.h:210
constexpr bool operator<(const FixedPoint &o) const noexcept
Definition: fixed_point.h:392
constexpr FixedPoint & operator>>=(StorageType v)
Definition: fixed_point.h:254
constexpr FixedPoint operator>>(StorageType v) const
Definition: fixed_point.h:259
constexpr void set_i(IntType value)
Update just the integral portion.
Definition: fixed_point.h:126
constexpr auto operator-(FixedPoint< OI, OF, S > o) const
Definition: fixed_point.h:303
constexpr FixedPoint & operator^=(FixedPoint o)
Definition: fixed_point.h:195
constexpr FixedPoint & operator*=(FixedPoint< OI, OF, S > o)
Definition: fixed_point.h:381
constexpr bool operator<=(const FixedPoint &o) const noexcept
Definition: fixed_point.h:408
constexpr intmax_t frac_bitcount() const
Definition: fixed_point.h:149
constexpr FracType as_f() const
Returns just the fractional portion.
Definition: fixed_point.h:122
constexpr auto operator>=(FixedPoint< OI, OF, S > o) const noexcept
Definition: fixed_point.h:441
constexpr FixedPoint(T i)
Definition: fixed_point.h:85
constexpr FixedPoint operator/(FixedPoint o) const
Definition: fixed_point.h:233
constexpr intmax_t bitcount() const
Definition: fixed_point.h:143
constexpr bool operator>=(const FixedPoint &o) const noexcept
Definition: fixed_point.h:404
constexpr auto operator&(FixedPoint< OI, OF, S > o) const
Definition: fixed_point.h:345
constexpr auto operator|(FixedPoint< OI, OF, S > o) const
Definition: fixed_point.h:359
constexpr auto operator^(FixedPoint< OI, OF, S > o) const
Definition: fixed_point.h:331
FixedPoint & operator++()
Definition: fixed_point.h:276
constexpr bool is_signed() const
Definition: fixed_point.h:142
constexpr bool operator==(const FixedPoint &o) const noexcept
Definition: fixed_point.h:388
constexpr auto operator>(FixedPoint< OI, OF, S > o) const noexcept
Definition: fixed_point.h:434
constexpr FixedPoint operator&(FixedPoint o) const
Definition: fixed_point.h:181
constexpr StorageType get() const
Returns the entire value.
Definition: fixed_point.h:124
constexpr FixedPoint & operator<<=(StorageType v)
Definition: fixed_point.h:265
constexpr FixedPoint & operator/=(FixedPoint o)
Definition: fixed_point.h:226
constexpr FixedPoint & operator-=(FixedPoint< OI, OF, S > o)
Definition: fixed_point.h:311
constexpr FixedPoint operator-() const
Definition: fixed_point.h:156
constexpr FixedPoint< OI, OF, S > as()
Definition: fixed_point.h:138
constexpr FixedPoint operator^(FixedPoint o) const
Definition: fixed_point.h:199
constexpr intmax_t int_bitcount() const
Definition: fixed_point.h:146
constexpr FixedPoint & operator-=(FixedPoint o)
Definition: fixed_point.h:216
constexpr FixedPoint(FixedPoint< OI, OF, S > o)
Definition: fixed_point.h:110
constexpr FixedPoint & operator^=(FixedPoint< OI, OF, S > o)
Definition: fixed_point.h:339
std::conditional_t< Signed, _BitInt(IntSize), unsigned _BitInt(IntSize)> IntType
Definition: fixed_point.h:67
char value
Definition: bios.h:265
Definition: fixed_point.h:463
FixedPoint< 24, 8, true > fs24_8
Definition: fixed_point.h:471
FixedPoint< 16, 8, true > fs16_8
Definition: fixed_point.h:467
FixedPoint< 16, 16, false > fu16_16
Definition: fixed_point.h:478
FixedPoint< 16, 16, true > fs16_16
Definition: fixed_point.h:470
FixedPoint< 16, 8, false > fu16_8
Definition: fixed_point.h:475
FixedPoint< 8, 8, true > fs8_8
Definition: fixed_point.h:465
FixedPoint< 8, 8, false > fu8_8
Definition: fixed_point.h:473
FixedPoint< 8, 16, true > fs8_16
Definition: fixed_point.h:468
FixedPoint< 12, 4, false > fu12_4
Definition: fixed_point.h:474
FixedPoint< 12, 4, true > fs12_4
Definition: fixed_point.h:466
FixedPoint< 8, 16, false > fu8_16
Definition: fixed_point.h:476
FixedPoint< 12, 12, false > fu12_12
Definition: fixed_point.h:477
FixedPoint< 24, 8, false > fu24_8
Definition: fixed_point.h:479
FixedPoint< 12, 12, true > fs12_12
Definition: fixed_point.h:469
::intmax_t intmax_t
Definition: cstdint:19
typename conditional< B, T, F >::type conditional_t
Definition: type_traits:26