#ifndef __MLX_BITS__ #define __MLX_BITS__ namespace mlx { template constexpr T ByteSwap(T value) noexcept { static_assert(std::has_unique_object_representations_v, "T may not have padding bits"); auto value_representation = std::bit_cast>(value); std::ranges::reverse(value_representation); return std::bit_cast(value_representation); } constexpr std::uint32_t Rmask() noexcept { if constexpr(std::endian::native == std::endian::big) return 0xFF000000; else return 0x000000FF; } constexpr std::uint32_t Gmask() noexcept { if constexpr(std::endian::native == std::endian::big) return 0x00FF0000; else return 0x0000FF00; } constexpr std::uint32_t Bmask() noexcept { if constexpr(std::endian::native == std::endian::big) return 0x0000FF00; else return 0x00FF0000; } constexpr std::uint32_t Amask() noexcept { if constexpr(std::endian::native == std::endian::big) return 0x000000FF; else return 0xFF000000; } } #endif