diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..bc2a8f9 --- /dev/null +++ b/.clang-format @@ -0,0 +1,56 @@ +--- +Language: Cpp +BasedOnStyle: LLVM +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignOperands: false +AlignTrailingComments: false +AlwaysBreakTemplateDeclarations: Yes +BreakBeforeBraces: Custom +BraceWrapping: + AfterCaseLabel: false + AfterClass: false + AfterControlStatement: false + AfterEnum: false + AfterFunction: false + AfterNamespace: false + AfterStruct: false + AfterUnion: false + AfterExternBlock: false + BeforeCatch: true + BeforeElse: false + BeforeLambdaBody: false + BeforeWhile: true + SplitEmptyFunction: false + SplitEmptyRecord: false + SplitEmptyNamespace: false +BreakConstructorInitializers: AfterColon +BreakConstructorInitializersBeforeComma: false +ColumnLimit: 120 +ConstructorInitializerAllOnOneLineOrOnePerLine: false +IndentAccessModifiers: false +AccessModifierOffset: 0 +ContinuationIndentWidth: 0 +IncludeCategories: + - Regex: '^<.*' + Priority: 1 + - Regex: '^".*' + Priority: 2 + - Regex: '.*' + Priority: 3 +IncludeIsMainRegex: '([-_](test|unittest))?$' +IndentCaseBlocks: true +InsertNewlineAtEOF: true +MacroBlockBegin: '' +MacroBlockEnd: '' +SortIncludes: Never +MaxEmptyLinesToKeep: 2 +NamespaceIndentation: Inner +SpaceInEmptyParentheses: false +SpacesInAngles: false +SpacesInConditionalStatement: false +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +TabWidth: 4 +IndentWidth: 4 +... diff --git a/file.hpp b/file.hpp index 1e9b11a..c4a7b8f 100644 --- a/file.hpp +++ b/file.hpp @@ -1,5 +1,5 @@ #pragma once -#include +#include "types.hpp" #include #include #include @@ -7,37 +7,37 @@ namespace fs = std::filesystem; namespace ircolib { -static inline std::vector ReadFileBinary(const std::string &path) { - std::ifstream file(path, std::ios::binary); - return {std::istreambuf_iterator{file}, {}}; +static inline std::vector read_file_binary(const std::string &path) { + std::ifstream file(path, std::ios::binary); + return {std::istreambuf_iterator{file}, {}}; } -static inline void WriteFileBinary(const std::vector &data, const std::string &path) { - std::ofstream file(path, std::ios::binary); - std::copy(data.begin(), data.end(), std::ostreambuf_iterator{file}); +static inline void write_file_binary(const std::vector &data, const std::string &path) { + std::ofstream file(path, std::ios::binary); + std::copy(data.begin(), data.end(), std::ostreambuf_iterator{file}); } -static inline void WriteFileBinary(const u8 *data, const size_t size, const std::string &path) { - FILE *out = fopen(path.c_str(), "wb"); - fwrite(data, size, 1, out); - fclose(out); +static inline void write_file_binary(const u8 *data, const size_t size, const std::string &path) { + FILE *out = fopen(path.c_str(), "wb"); + fwrite(data, size, 1, out); + fclose(out); } template -static inline void WriteFileBinary(const std::array &data, const std::string &path) { - std::ofstream file(path, std::ios::binary); - std::copy(data.begin(), data.end(), std::ostreambuf_iterator{file}); +static inline void write_file_binary(const std::array &data, const std::string &path) { + std::ofstream file(path, std::ios::binary); + std::copy(data.begin(), data.end(), std::ostreambuf_iterator{file}); } -static inline size_t NextPow2(size_t num) { - // Taken from "Bit Twiddling Hacks" by Sean Anderson: - // https://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2 - --num; - num |= num >> 1; - num |= num >> 2; - num |= num >> 4; - num |= num >> 8; - num |= num >> 16; - return num + 1; +static inline size_t next_pow2(size_t num) { + // Taken from "Bit Twiddling Hacks" by Sean Anderson: + // https://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2 + --num; + num |= num >> 1; + num |= num >> 2; + num |= num >> 4; + num |= num >> 8; + num |= num >> 16; + return num + 1; } -} // namespace Util +} // namespace ircolib diff --git a/floats.hpp b/floats.hpp index 913f1de..30650f9 100644 --- a/floats.hpp +++ b/floats.hpp @@ -1,106 +1,106 @@ #pragma once #include -#include +#include "types.hpp" namespace ircolib { static inline auto roundCeil(float f) { #ifdef SIMD_SUPPORT - __m128 t = _mm_set_ss(f); - t = _mm_round_ss(t, t, _MM_FROUND_TO_POS_INF); - return _mm_cvtss_f32(t); + __m128 t = _mm_set_ss(f); + t = _mm_round_ss(t, t, _MM_FROUND_TO_POS_INF); + return _mm_cvtss_f32(t); #else - return ceilf(f); + return ceilf(f); #endif } static inline auto roundCeil(double f) { #ifdef SIMD_SUPPORT - __m128d t = _mm_set_sd(f); - t = _mm_round_sd(t, t, _MM_FROUND_TO_POS_INF); - return _mm_cvtsd_f64(t); + __m128d t = _mm_set_sd(f); + t = _mm_round_sd(t, t, _MM_FROUND_TO_POS_INF); + return _mm_cvtsd_f64(t); #else - return ceil(f); + return ceil(f); #endif } static inline auto roundNearest(float f) { #ifdef SIMD_SUPPORT - __m128 t = _mm_set_ss(f); - t = _mm_round_ss(t, t, _MM_FROUND_TO_NEAREST_INT); - return _mm_cvtss_f32(t); + __m128 t = _mm_set_ss(f); + t = _mm_round_ss(t, t, _MM_FROUND_TO_NEAREST_INT); + return _mm_cvtss_f32(t); #else - return roundf(f); + return roundf(f); #endif } static inline auto roundNearest(double f) { #ifdef SIMD_SUPPORT - __m128d t = _mm_set_sd(f); - t = _mm_round_sd(t, t, _MM_FROUND_TO_NEAREST_INT); - return _mm_cvtsd_f64(t); + __m128d t = _mm_set_sd(f); + t = _mm_round_sd(t, t, _MM_FROUND_TO_NEAREST_INT); + return _mm_cvtsd_f64(t); #else - return round(f); + return round(f); #endif } static inline auto roundCurrent(float f) { #ifdef SIMD_SUPPORT - auto t = _mm_set_ss(f); - t = _mm_round_ss(t, t, _MM_FROUND_CUR_DIRECTION); - return _mm_cvtss_f32(t); + auto t = _mm_set_ss(f); + t = _mm_round_ss(t, t, _MM_FROUND_CUR_DIRECTION); + return _mm_cvtss_f32(t); #else - return rint(f); + return rint(f); #endif } static inline auto roundCurrent(double f) { #ifdef SIMD_SUPPORT - auto t = _mm_set_sd(f); - t = _mm_round_sd(t, t, _MM_FROUND_CUR_DIRECTION); - return _mm_cvtsd_f64(t); + auto t = _mm_set_sd(f); + t = _mm_round_sd(t, t, _MM_FROUND_CUR_DIRECTION); + return _mm_cvtsd_f64(t); #else - return rint(f); + return rint(f); #endif } static inline auto roundFloor(float f) { #ifdef SIMD_SUPPORT - __m128 t = _mm_set_ss(f); - t = _mm_round_ss(t, t, _MM_FROUND_TO_NEG_INF); - return _mm_cvtss_f32(t); + __m128 t = _mm_set_ss(f); + t = _mm_round_ss(t, t, _MM_FROUND_TO_NEG_INF); + return _mm_cvtss_f32(t); #else - return floor(f); + return floor(f); #endif } static inline auto roundFloor(double f) { #ifdef SIMD_SUPPORT - __m128d t = _mm_set_sd(f); - t = _mm_round_sd(t, t, _MM_FROUND_TO_NEG_INF); - return _mm_cvtsd_f64(t); + __m128d t = _mm_set_sd(f); + t = _mm_round_sd(t, t, _MM_FROUND_TO_NEG_INF); + return _mm_cvtsd_f64(t); #else - return floor(f); + return floor(f); #endif } static inline auto roundTrunc(float f) { #ifdef SIMD_SUPPORT - __m128 t = _mm_set_ss(f); - t = _mm_round_ss(t, t, _MM_FROUND_TO_ZERO); - return _mm_cvtss_f32(t); + __m128 t = _mm_set_ss(f); + t = _mm_round_ss(t, t, _MM_FROUND_TO_ZERO); + return _mm_cvtss_f32(t); #else - return trunc(f); + return trunc(f); #endif } static inline auto roundTrunc(double f) { #ifdef SIMD_SUPPORT - __m128d t = _mm_set_sd(f); - t = _mm_round_sd(t, t, _MM_FROUND_TO_ZERO); - return _mm_cvtsd_f64(t); + __m128d t = _mm_set_sd(f); + t = _mm_round_sd(t, t, _MM_FROUND_TO_ZERO); + return _mm_cvtsd_f64(t); #else - return trunc(f); + return trunc(f); #endif } -} // namespace Util +} // namespace ircolib diff --git a/mem_access.hpp b/mem_access.hpp index 1b29bf3..8f38fc1 100644 --- a/mem_access.hpp +++ b/mem_access.hpp @@ -1,5 +1,6 @@ #pragma once -#include +#include "types.hpp" +#include #include #include #include @@ -8,128 +9,143 @@ #include namespace ircolib { -static inline std::vector IntegralToBuffer(const std::integral auto &val) { - std::vector ret{}; - ret.resize(sizeof(val)); +static inline std::vector integral_to_buffer(const std::integral auto &val) { + std::vector ret{}; + ret.resize(sizeof(val)); - memcpy(ret.data(), &val, sizeof(val)); + memcpy(ret.data(), &val, sizeof(val)); - return ret; + return ret; } -static inline constexpr bool IsInsideRange(const std::integral auto& addr, - const std::integral auto& start, - const std::integral auto& end) { - return addr >= start && addr <= end; +static inline auto integral_to_slice(const std::integral auto &val) -> std::array { + std::array ret{}; + + memcpy(ret.data(), &val, sizeof(val)); + + return ret; +} + +static inline constexpr bool is_inside_range(const std::integral auto &addr, const std::integral auto &start, + const std::integral auto &end) { + return addr >= start && addr <= end; } template -static constexpr inline T ReadAccess(const u8 *data, const u32 index); +static constexpr inline T read_access(const u8 *data, const u32 index); template -static constexpr inline T ReadAccess(const std::vector &data, const u32 index); +static constexpr inline T read_access(const std::vector &data, const u32 index); template -static constexpr inline T ReadAccess(const std::array &data, const u32 index); +static constexpr inline T read_access(const std::array &data, const u32 index); template -static constexpr inline void WriteAccess(u8 *data, const u32 index, const T val); +static constexpr inline void write_access(u8 *data, const u32 index, const T val); template -static constexpr inline void WriteAccess(std::vector &data, const u32 index, const T val); +static constexpr inline void write_access(std::vector &data, const u32 index, const T val); template -static constexpr inline void WriteAccess(std::array &data, const u32 index, const T val); +static constexpr inline void write_access(std::array &data, const u32 index, const T val); template <> -constexpr inline u64 ReadAccess(const u8 *data, const u32 index) { - u32 hi = *reinterpret_cast(&data[index + 0]); - u32 lo = *reinterpret_cast(&data[index + 4]); - const auto& result = static_cast(hi) << 32 | static_cast(lo); - return result; +constexpr inline u64 read_access(const u8 *data, const u32 index) { + u32 hi = *reinterpret_cast(&data[index + 0]); + u32 lo = *reinterpret_cast(&data[index + 4]); + const auto &result = static_cast(hi) << 32 | static_cast(lo); + return result; } template -static constexpr inline T ReadAccess(const u8 *data, const u32 index) { - return *reinterpret_cast(&data[index]); +static constexpr inline T read_access(const u8 *data, const u32 index) { + return *reinterpret_cast(&data[index]); } template <> -constexpr inline u64 ReadAccess(const std::vector &data, const u32 index) { - u32 hi = *reinterpret_cast(&data[index + 0]); - u32 lo = *reinterpret_cast(&data[index + 4]); - return (static_cast(hi) << 32) | static_cast(lo); +constexpr inline u64 read_access(const std::vector &data, const u32 index) { + u32 hi = *reinterpret_cast(&data[index + 0]); + u32 lo = *reinterpret_cast(&data[index + 4]); + return (static_cast(hi) << 32) | static_cast(lo); } template -static constexpr inline T ReadAccess(const std::vector &data, const u32 index) { - return *reinterpret_cast(&data[index]); +static constexpr inline T read_access(const std::vector &data, const u32 index) { + return *reinterpret_cast(&data[index]); } template -constexpr inline u64 ReadAccess(const std::array &data, const u32 index) { - u32 hi = *reinterpret_cast(&data[index + 0]); - u32 lo = *reinterpret_cast(&data[index + 4]); - return static_cast(hi) << 32 | static_cast(lo); +constexpr inline u64 read_access(const std::array &data, const u32 index) { + u32 hi = *reinterpret_cast(&data[index + 0]); + u32 lo = *reinterpret_cast(&data[index + 4]); + return static_cast(hi) << 32 | static_cast(lo); } template -static constexpr inline T ReadAccess(const std::array &data, const u32 index) { - return *reinterpret_cast(&data[index]); +static constexpr inline T read_access(const std::array &data, const u32 index) { + return *reinterpret_cast(&data[index]); } template -constexpr inline void WriteAccess(std::array &data, const u32 index, const u64 val) { - const u32 hi = val >> 32; - const u32 lo = val; +constexpr inline void write_access(std::array &data, const u32 index, const u64 val) { + const u32 hi = val >> 32; + const u32 lo = val; - *reinterpret_cast(&data[index + 0]) = hi; - *reinterpret_cast(&data[index + 4]) = lo; + *reinterpret_cast(&data[index + 0]) = hi; + *reinterpret_cast(&data[index + 4]) = lo; } template -static constexpr inline void WriteAccess(std::array &data, const u32 index, const T val) { - *reinterpret_cast(&data[index]) = val; +static constexpr inline void write_access(std::array &data, const u32 index, const T val) { + *reinterpret_cast(&data[index]) = val; } template <> -constexpr inline void WriteAccess(std::vector &data, const u32 index, const u64 val) { - const u32 hi = val >> 32; - const u32 lo = val; +constexpr inline void write_access(std::vector &data, const u32 index, const u64 val) { + const u32 hi = val >> 32; + const u32 lo = val; - *reinterpret_cast(&data[index + 0]) = hi; - *reinterpret_cast(&data[index + 4]) = lo; + *reinterpret_cast(&data[index + 0]) = hi; + *reinterpret_cast(&data[index + 4]) = lo; } template -static constexpr inline void WriteAccess(std::vector &data, const u32 index, const T val) { - *reinterpret_cast(&data[index]) = val; +static constexpr inline void write_access(std::vector &data, const u32 index, const T val) { + *reinterpret_cast(&data[index]) = val; } template <> -constexpr inline void WriteAccess(u8 *data, const u32 index, const u64 val) { - const u32 hi = val >> 32; - const u32 lo = val; +constexpr inline void write_access(u8 *data, const u32 index, const u64 val) { + const u32 hi = val >> 32; + const u32 lo = val; - *reinterpret_cast(&data[index + 0]) = hi; - *reinterpret_cast(&data[index + 4]) = lo; + *reinterpret_cast(&data[index + 0]) = hi; + *reinterpret_cast(&data[index + 4]) = lo; } template -static constexpr inline void WriteAccess(u8 *data, const u32 index, const T val) { - *reinterpret_cast(&data[index]) = val; +static constexpr inline void write_access(u8 *data, const u32 index, const T val) { + *reinterpret_cast(&data[index]) = val; } template -static constexpr inline void SwapBuffer(std::vector &data) { - for (size_t i = 0; i < data.size(); i += sizeof(T)) { - const T original = *reinterpret_cast(&data[i]); - *reinterpret_cast(&data[i]) = std::byteswap(original); - } +static constexpr inline void swap_buffer(std::vector &data) { + for (size_t i = 0; i < data.size(); i += sizeof(T)) { + const T original = *reinterpret_cast(&data[i]); + *reinterpret_cast(&data[i]) = std::byteswap(original); + } } template -static constexpr inline void SwapBuffer(std::array &data) { - for (size_t i = 0; i < data.size(); i += sizeof(T)) { - const T original = *reinterpret_cast(&data[i]); - *reinterpret_cast(&data[i]) = std::byteswap(original); - } +static constexpr inline void swap_buffer(std::array &data) { + for (size_t i = 0; i < data.size(); i += sizeof(T)) { + const T original = *reinterpret_cast(&data[i]); + *reinterpret_cast(&data[i]) = std::byteswap(original); + } +} + +template +static constexpr inline void swap_buffer(u8 *data, size_t size) { + for (size_t i = 0; i < size; i += sizeof(T)) { + const T original = *reinterpret_cast(&data[i]); + *reinterpret_cast(&data[i]) = std::byteswap(original); + } } #ifdef _WIN32 @@ -137,10 +153,8 @@ inline void *aligned_alloc(const size_t alignment, const size_t size) { return _ inline void aligned_free(void *ptr) { _aligned_free(ptr); } #else -inline void *aligned_alloc(const size_t alignment, const size_t size) { - return std::aligned_alloc(alignment, size); -} +inline void *aligned_alloc(const size_t alignment, const size_t size) { return std::aligned_alloc(alignment, size); } inline void aligned_free(void *ptr) { std::free(ptr); } #endif -} // namespace Util +} // namespace ircolib diff --git a/types.hpp b/types.hpp index 9752f90..396a74c 100644 --- a/types.hpp +++ b/types.hpp @@ -10,4 +10,28 @@ using s8 = int8_t; using s16 = int16_t; using s32 = int32_t; using s64 = int64_t; -} \ No newline at end of file + +template +static constexpr bool is_bit_set(const T &val) { + return val & (1 << bit); +} + +template +static constexpr void set_bit(T &val) { + val |= 1 << bit; +} + +template +inline bool is_bit_set(const T &val, const std::size_t &bit) { + return val & (1 << bit); +} + +template +inline void set_bit(T &val, const std::size_t &bit) { + val |= 1 << bit; +} +} // namespace ircolib + +constexpr ircolib::u32 operator""_kib(const unsigned long long v) { return v * 1024; } +constexpr ircolib::u32 operator""_mib(const unsigned long long v) { return v * 1024 * 1024; } +constexpr ircolib::u32 operator""_gib(const unsigned long long v) { return v * 1024 * 1024 * 1024; }