src/math/ds/nimber/lib.hpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include "../../nim_prod/lib.hpp" | ||
| 4 | |||
| 5 | namespace tifa_libs { | ||
| 6 | |||
| 7 | template <std::unsigned_integral T, T (*prod)(T, T)> | ||
| 8 | struct nimber { | ||
| 9 | T x; | ||
| 10 | 291992783 | CEXP nimber(T x = 0) NE : x{x} {} | |
| 11 | |||
| 12 | 3184994420 | CEXP nimber& operator+=(nimber CR p) NE { | |
| 13 | 3184994420 | x ^= p.x; | |
| 14 | 3184994420 | return *this; | |
| 15 | } | ||
| 16 | CEXP nimber& operator-=(nimber CR p) NE { | ||
| 17 | x ^= p.x; | ||
| 18 | return *this; | ||
| 19 | } | ||
| 20 | 32260704 | CEXP nimber& operator*=(nimber CR p) NE { | |
| 21 | 32260704 | x = prod(x, p.x); | |
| 22 | 32260704 | return *this; | |
| 23 | } | ||
| 24 | CEXP nimber operator+(nimber CR p) CNE { return x ^ p.x; } | ||
| 25 | CEXP nimber operator-(nimber CR p) CNE { return x ^ p.x; } | ||
| 26 | CEXP nimber operator*(nimber CR p) CNE { return prod(x, p.x); } | ||
| 27 | 291249164 | CEXP bool operator==(nimber CR p) CNE { return x == p.x; } | |
| 28 | friend std::ostream& operator<<(std::ostream& os, nimber CR p) NE { return os << p.x; } | ||
| 29 | }; | ||
| 30 | |||
| 31 | using nimber16 = nimber<u16, nimprod16>; | ||
| 32 | using nimber32 = nimber<u32, nimprod32>; | ||
| 33 | using nimber64 = nimber<u64, nimprod64>; | ||
| 34 | |||
| 35 | } // namespace tifa_libs | ||
| 36 |