123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- #pragma once
- #include <stddef.h>
- #include <stdint.h>
- #include <vector>
- #include <type_traits>
- struct GaloisFieldInitByZero {};
- struct GaloisFieldInitByOne {};
- struct GaloisFieldInitByElement {};
- struct GaloisFieldInitByDump {};
- template<typename __FieldTraits>
- class GaloisField {
- public:
- static constexpr size_t BitSizeValue = __FieldTraits::BitSizeValue;
- static constexpr size_t DumpSizeValue = __FieldTraits::DumpSizeValue;
- private:
- static_assert(std::is_pod<typename __FieldTraits::ElementType>::value == true);
- typename __FieldTraits::ElementType _Val;
- #ifdef _MSC_VER
- #pragma warning(push)
- #pragma warning(disable: 26495) // disable uninitialized warning
- #endif
- struct NoInitialization {};
- GaloisField(NoInitialization) noexcept {};
- #ifdef _MSC_VER
- #pragma warning(pop)
- #endif
- public:
- GaloisField() noexcept {
- __FieldTraits::SetZero(_Val);
- }
- GaloisField(GaloisFieldInitByZero) noexcept {
- __FieldTraits::SetZero(_Val);
- }
- GaloisField(GaloisFieldInitByOne) noexcept {
- __FieldTraits::SetOne(_Val);
- }
- GaloisField(GaloisFieldInitByElement, const typename __FieldTraits::ElementType& Element) {
- __FieldTraits::Verify(Element);
- _Val = Element;
- }
- GaloisField(GaloisFieldInitByDump, const void* pbBuffer, size_t cbBuffer) {
- __FieldTraits::Load(_Val, pbBuffer, cbBuffer);
- }
- template<typename F=__FieldTraits, typename std::enable_if<F::BitSizeValue <= sizeof(uintptr_t) * 8, std::nullptr_t>::type = nullptr>
- GaloisField(GaloisFieldInitByDump, uintptr_t SerializedValue) {
- __FieldTraits::Load(_Val, SerializedValue);
- }
- GaloisField<__FieldTraits>& operator=(const typename __FieldTraits::ElementType& Element) {
- __FieldTraits::Verify(Element);
- _Val = Element;
- return *this;
- }
- template<typename F=__FieldTraits, typename std::enable_if<F::BitSizeValue <= sizeof(uintptr_t) * 8, std::nullptr_t>::type = nullptr>
- GaloisField<__FieldTraits>& operator=(uintptr_t SerializedValue) {
- __FieldTraits::Load(_Val, SerializedValue);
- return *this;
- }
- bool IsZero() const noexcept {
- return __FieldTraits::IsZero(_Val);
- }
- bool IsOne() const noexcept {
- return __FieldTraits::IsOne(_Val);
- }
- bool operator==(const GaloisField<__FieldTraits>& Other) const noexcept {
- return __FieldTraits::IsEqual(_Val, Other._Val);
- }
- bool operator!=(const GaloisField<__FieldTraits>& Other) const noexcept {
- return __FieldTraits::IsEqual(_Val, Other._Val) == false;
- }
- GaloisField<__FieldTraits> operator+(const GaloisField<__FieldTraits>& Other) const noexcept {
- GaloisField<__FieldTraits> Result(NoInitialization{});
- __FieldTraits::Add(Result._Val, _Val, Other._Val);
- return Result;
- }
- GaloisField<__FieldTraits>& operator+=(const GaloisField<__FieldTraits>& Other) noexcept {
- __FieldTraits::AddAssign(_Val, Other._Val);
- return *this;
- }
- GaloisField<__FieldTraits> operator-(const GaloisField<__FieldTraits>& Other) const noexcept {
- GaloisField<__FieldTraits> Result(NoInitialization{});
- __FieldTraits::Substract(Result._Val, _Val, Other._Val);
- return Result;
- }
- GaloisField<__FieldTraits>& operator-=(const GaloisField<__FieldTraits>& Other) noexcept {
- __FieldTraits::SubstractAssign(_Val, Other._Val);
- return *this;
- }
- GaloisField<__FieldTraits> operator*(const GaloisField<__FieldTraits>& Other) const noexcept {
- GaloisField<__FieldTraits> Result(NoInitialization{});
- __FieldTraits::Multiply(Result._Val, _Val, Other._Val);
- return Result;
- }
- GaloisField<__FieldTraits>& operator*=(const GaloisField<__FieldTraits>& Other) noexcept {
- __FieldTraits::MultiplyAssign(_Val, Other._Val);
- return *this;
- }
- GaloisField<__FieldTraits> operator/(const GaloisField<__FieldTraits>& Other) const {
- GaloisField<__FieldTraits> Result(NoInitialization{});
- __FieldTraits::Divide(Result._Val, _Val, Other._Val);
- return Result;
- }
- GaloisField<__FieldTraits>& operator/=(const GaloisField<__FieldTraits>& Other) {
- __FieldTraits::DivideAssign(_Val, Other._Val);
- return *this;
- }
- GaloisField<__FieldTraits>& operator++() noexcept { // prefix ++
- __FieldTraits::AddOneAssign(_Val);
- return *this;
- }
- GaloisField<__FieldTraits> operator++(int) noexcept { // postfix ++
- GaloisField<__FieldTraits> Prev(*this);
- __FieldTraits::AddOneAssign(_Val);
- return Prev;
- }
- GaloisField<__FieldTraits>& operator--() noexcept { // prefix --
- __FieldTraits::SubstractOneAssign(_Val);
- return *this;
- }
- GaloisField<__FieldTraits> operator--(int) noexcept { // postfix --
- GaloisField<__FieldTraits> Prev(*this);
- __FieldTraits::SubstractOneAssign(_Val);
- return Prev;
- }
- GaloisField<__FieldTraits>& Inverse() {
- __FieldTraits::InverseAssign(_Val);
- return *this;
- }
- GaloisField<__FieldTraits> InverseValue() const {
- GaloisField<__FieldTraits> Result(NoInitialization{});
- __FieldTraits::Inverse(Result, _Val);
- return Result;
- }
- GaloisField<__FieldTraits>& AddOne() noexcept {
- __FieldTraits::AddOneAssign(_Val);
- return *this;
- }
- GaloisField<__FieldTraits> AddOneValue() const noexcept {
- GaloisField<__FieldTraits> Result(NoInitialization{});
- __FieldTraits::AddOne(Result._Val, _Val);
- return Result;
- }
- GaloisField<__FieldTraits>& SubstractOne() noexcept {
- __FieldTraits::SubstractOneAssign(_Val);
- return *this;
- }
- GaloisField<__FieldTraits> SubstractOneValue() const noexcept {
- GaloisField<__FieldTraits> Result(NoInitialization{});
- __FieldTraits::SubstractOne(Result._Val, _Val);
- return Result;
- }
- GaloisField<__FieldTraits>& Square() noexcept {
- __FieldTraits::SquareAssign(_Val);
- return *this;
- }
- GaloisField<__FieldTraits> SquareValue() const noexcept {
- GaloisField<__FieldTraits> Result(NoInitialization{});
- __FieldTraits::Square(Result._Val, _Val);
- return Result;
- }
- template<typename F=__FieldTraits, typename std::enable_if<F::BitSizeValue <= sizeof(uintptr_t) * 8, std::nullptr_t>::type = nullptr>
- uintptr_t Dump() const noexcept {
- return __FieldTraits::Dump(_Val);
- }
- size_t Dump(void* lpBuffer, size_t cbBuffer) const {
- return __FieldTraits::Dump(_Val, lpBuffer, cbBuffer);
- }
- std::vector<uint8_t> Dump() const noexcept {
- return __FieldTraits::Dump(_Val);
- }
- template<typename F=__FieldTraits, typename std::enable_if<F::BitSizeValue <= sizeof(uintptr_t) * 8, std::nullptr_t>::type = nullptr>
- GaloisField<__FieldTraits>& Load(uintptr_t SerializedValue) {
- __FieldTraits::Load(_Val, SerializedValue);
- return *this;
- }
- GaloisField<__FieldTraits>& Load(const void* lpBuffer, size_t cbBuffer) {
- __FieldTraits::Load(_Val, lpBuffer, cbBuffer);
- return *this;
- }
- GaloisField<__FieldTraits>& Load(const std::vector<uint8_t>& Buffer) {
- __FieldTraits::Load(_Val, Buffer);
- return *this;
- }
- };
|