#include "../include/Platform.hpp" #include namespace sibs { static int countSetBits(u32 value) { int count = 0; while(value) { count += (value & 1U); value >>= 1U; } return count; } // Returns -1 if no bit is set static int getLeastSignificantBitSetPosition(u32 value) { for(u32 i = 0; i < sizeof(u32); ++i) { if(value & 1U) return i; value >>= 1U; } return -1; } bool containsPlatform(const std::vector &platforms, Platform platform) { for (Platform vecPlatform : platforms) { if(platform & vecPlatform) return true; } return false; } const char* asString(Platform platform) { switch (platform) { case PLATFORM_ANY: return "any"; case PLATFORM_LINUX: return "linux"; case PLATFORM_LINUX32: return "linux32"; case PLATFORM_LINUX64: return "linux64"; case PLATFORM_WIN: return "win"; case PLATFORM_WIN32: return "win32"; case PLATFORM_WIN64: return "win64"; case PLATFORM_MACOS: return "macos"; case PLATFORM_MACOS32: return "macos32"; case PLATFORM_MACOS64: return "macos64"; case PLATFORM_BSD: return "bsd"; case PLATFORM_OPENBSD: return "openbsd"; case PLATFORM_OPENBSD32: return "openbsd32"; case PLATFORM_OPENBSD64: return "openbsd64"; case PLATFORM_HAIKU: return "haiku"; case PLATFORM_HAIKU32: return "haiku32"; case PLATFORM_HAIKU64: return "haiku64"; default: assert(false); return nullptr; } } Platform getPlatformByName(StringView name) { auto it = PLATFORM_BY_NAME.find(name); if(it != PLATFORM_BY_NAME.end()) return it->second; return PLATFORM_INVALID; } bool isSamePlatformFamily(Platform a, Platform b) { return a & b; } bool isBaseForPlatform(Platform base, Platform platform) { return base == PLATFORM_ANY || base == platform || (isSamePlatformFamily(platform, base) && countSetBits(base) < countSetBits(platform)); } Platform getPlatformGenericType(Platform platform) { if(platform == PLATFORM_INVALID || platform == PLATFORM_ANY) return PLATFORM_INVALID; return (Platform)(1U << (u32)getLeastSignificantBitSetPosition(platform)); } }