Numeric Limits

This commit is contained in:
Isuru Samarathunga
2025-10-12 12:52:02 +05:30
parent 6ce5667ada
commit 07638ea7b3

View File

@ -1,16 +1,16 @@
// IACore-OSS; The Core Library for All IA Open Source Projects // IACore-OSS; The Core Library for All IA Open Source Projects
// Copyright (C) 2024 IAS (ias@iasoft.dev) // Copyright (C) 2024 IAS (ias@iasoft.dev)
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by // it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or // the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version. // (at your option) any later version.
// //
// This program is distributed in the hope that it will be useful, // This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of // but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details. // GNU General Public License for more details.
// //
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>. // along with this program. If not, see <https://www.gnu.org/licenses/>.
@ -22,119 +22,130 @@
namespace ia namespace ia
{ {
template<typename _value_type> template<typename _value_type> using initializer_list = std::initializer_list<_value_type>;
using initializer_list = std::initializer_list<_value_type>;
#undef VOID #undef VOID
typedef void VOID; typedef void VOID;
typedef bool BOOL; typedef bool BOOL;
typedef char CHAR; typedef char CHAR;
typedef uint16_t CHAR16; typedef uint16_t CHAR16;
typedef int8_t INT8; typedef int8_t INT8;
typedef int16_t INT16; typedef int16_t INT16;
typedef int32_t INT32; typedef int32_t INT32;
typedef int64_t INT64; typedef int64_t INT64;
typedef uint8_t UINT8; typedef uint8_t UINT8;
typedef uint16_t UINT16; typedef uint16_t UINT16;
typedef uint32_t UINT32; typedef uint32_t UINT32;
typedef uint64_t UINT64; typedef uint64_t UINT64;
typedef float FLOAT32; typedef float FLOAT32;
typedef double FLOAT64; typedef double FLOAT64;
typedef INT32 INT; typedef INT32 INT;
typedef UINT32 UINT; typedef UINT32 UINT;
typedef size_t SIZE_T; typedef size_t SIZE_T;
typedef std::make_signed_t<size_t> SSIZE_T; typedef std::make_signed_t<size_t> SSIZE_T;
typedef std::align_val_t ALIGN_T; typedef std::align_val_t ALIGN_T;
// pointer types // pointer types
typedef VOID* PVOID; typedef VOID *PVOID;
typedef BOOL* PBOOL; typedef BOOL *PBOOL;
typedef CHAR* PCHAR; typedef CHAR *PCHAR;
typedef CHAR16* PCHAR16; typedef CHAR16 *PCHAR16;
typedef INT8* PINT8; typedef INT8 *PINT8;
typedef INT16* PINT16; typedef INT16 *PINT16;
typedef INT32* PINT32; typedef INT32 *PINT32;
typedef INT64* PINT64; typedef INT64 *PINT64;
typedef UINT8* PUINT8; typedef UINT8 *PUINT8;
typedef UINT16* PUINT16; typedef UINT16 *PUINT16;
typedef UINT32* PUINT32; typedef UINT32 *PUINT32;
typedef UINT64* PUINT64; typedef UINT64 *PUINT64;
typedef INT* PINT; typedef INT *PINT;
typedef UINT* PUINT; typedef UINT *PUINT;
typedef SIZE_T* PSIZE; typedef SIZE_T *PSIZE;
typedef SSIZE_T* PSSIZE; typedef SSIZE_T *PSSIZE;
typedef FLOAT32 PFLOAT32; typedef FLOAT32 PFLOAT32;
typedef FLOAT64 PFLOAT64; typedef FLOAT64 PFLOAT64;
// const pointer types // const pointer types
typedef CONST VOID* PCVOID; typedef CONST VOID *PCVOID;
typedef CONST BOOL* PCBOOL; typedef CONST BOOL *PCBOOL;
typedef CONST CHAR* PCCHAR; typedef CONST CHAR *PCCHAR;
typedef CONST CHAR16* PCCHAR16; typedef CONST CHAR16 *PCCHAR16;
typedef CONST INT8* PCINT8; typedef CONST INT8 *PCINT8;
typedef CONST INT16* PCINT16; typedef CONST INT16 *PCINT16;
typedef CONST INT32* PCINT32; typedef CONST INT32 *PCINT32;
typedef CONST INT64* PCINT64; typedef CONST INT64 *PCINT64;
typedef CONST UINT8* PCUINT8; typedef CONST UINT8 *PCUINT8;
typedef CONST UINT16* PCUINT16; typedef CONST UINT16 *PCUINT16;
typedef CONST UINT32* PCUINT32; typedef CONST UINT32 *PCUINT32;
typedef CONST UINT64* PCUINT64; typedef CONST UINT64 *PCUINT64;
typedef CONST INT* PCINT; typedef CONST INT *PCINT;
typedef CONST UINT* PCUINT; typedef CONST UINT *PCUINT;
typedef CONST SIZE_T* PCSIZE; typedef CONST SIZE_T *PCSIZE;
typedef CONST SSIZE_T* PCSSIZE; typedef CONST SSIZE_T *PCSSIZE;
typedef CONST FLOAT32 PCFLOAT32; typedef CONST FLOAT32 PCFLOAT32;
typedef CONST FLOAT64 PCFLOAT64; typedef CONST FLOAT64 PCFLOAT64;
/* Uses the UEFI standard GUID structure definition */ /* Uses the UEFI standard GUID structure definition */
typedef struct _IA_GUID typedef struct _IA_GUID
{
UINT32 Data1;
UINT16 Data2;
UINT16 Data3;
UINT8 Data4[8];
bool operator==(const _IA_GUID& other)
{ {
UINT64* myData = (UINT64*)(&Data1); UINT32 Data1;
UINT64* otherData = (UINT64*)(&(other.Data1)); UINT16 Data2;
return ((myData[0] == otherData[0]) && (myData[1] == otherData[1])); UINT16 Data3;
} UINT8 Data4[8];
} GUID;
STATIC CONSTEXPR FLOAT32 FLOAT32_EPSILON = std::numeric_limits<FLOAT32>::epsilon(); bool operator==(const _IA_GUID &other)
STATIC CONSTEXPR FLOAT32 FLOAT64_EPSILON = std::numeric_limits<FLOAT64>::epsilon(); {
UINT64 *myData = (UINT64 *) (&Data1);
UINT64 *otherData = (UINT64 *) (&(other.Data1));
return ((myData[0] == otherData[0]) && (myData[1] == otherData[1]));
}
} GUID;
namespace types STATIC CONSTEXPR FLOAT32 FLOAT32_EPSILON = std::numeric_limits<FLOAT32>::epsilon();
{ STATIC CONSTEXPR FLOAT32 FLOAT64_EPSILON = std::numeric_limits<FLOAT64>::epsilon();
static BOOL __internal_validate_types()
namespace types
{ {
if(sizeof(CHAR) != static_cast<size_t>(1)) return false; static BOOL __internal_validate_types()
if(sizeof(INT8) != static_cast<size_t>(1)) return false; {
if(sizeof(INT16) != static_cast<size_t>(2)) return false; if (sizeof(CHAR) != static_cast<size_t>(1))
if(sizeof(INT32) != static_cast<size_t>(4)) return false; return false;
if(sizeof(INT64) != static_cast<size_t>(8)) return false; if (sizeof(INT8) != static_cast<size_t>(1))
if(sizeof(UINT8) != static_cast<size_t>(1)) return false; return false;
if(sizeof(UINT16) != static_cast<size_t>(2)) return false; if (sizeof(INT16) != static_cast<size_t>(2))
if(sizeof(UINT32) != static_cast<size_t>(4)) return false; return false;
if(sizeof(UINT64) != static_cast<size_t>(8)) return false; if (sizeof(INT32) != static_cast<size_t>(4))
if(sizeof(FLOAT32) != static_cast<size_t>(4)) return false; return false;
if(sizeof(FLOAT64) != static_cast<size_t>(8)) return false; if (sizeof(INT64) != static_cast<size_t>(8))
if(sizeof(PVOID) < static_cast<size_t>(4)) return false; return false;
return true; if (sizeof(UINT8) != static_cast<size_t>(1))
} return false;
} if (sizeof(UINT16) != static_cast<size_t>(2))
} return false;
if (sizeof(UINT32) != static_cast<size_t>(4))
return false;
if (sizeof(UINT64) != static_cast<size_t>(8))
return false;
if (sizeof(FLOAT32) != static_cast<size_t>(4))
return false;
if (sizeof(FLOAT64) != static_cast<size_t>(8))
return false;
if (sizeof(PVOID) < static_cast<size_t>(4))
return false;
return true;
}
} // namespace types
} // namespace ia