#pragma once #if defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__) || defined(_M_IX86) #define CPU_ARCH_X86 1 #endif #if defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64) #define CPU_ARCH_X86_64 1 #endif #if defined(__arm__) || defined(_M_ARM) #define CPU_ARCH_ARM 1 #endif #if defined(__aarch64__) || defined(_M_ARM64) #define CPU_ARCH_ARM64 1 #endif #if defined(EMSCRIPTEN) #define CPU_ARCH_ASMJS 1 #endif namespace vlc { class ICPUInfo { public: ICPUInfo() = default; virtual ~ICPUInfo() = default; ICPUInfo(const ICPUInfo&) = delete; ICPUInfo& operator = (const ICPUInfo&) = delete; virtual const char* vendorName() const = 0; virtual const char* cpuName() const = 0; virtual bool isX86() const = 0; virtual bool isARM() const = 0; virtual bool hasSSE2() const = 0; virtual bool hasSSE3() const = 0; virtual bool hasSSSE3() const = 0; virtual bool hasSSE41() const = 0; virtual bool hasSSE42() const = 0; virtual bool hasAVX() const = 0; virtual bool hasAVX2() const = 0; virtual bool hasFMA() const = 0; virtual bool hasNEON() const = 0; virtual uint32_t L2CacheLineSize() const = 0; virtual uint32_t L2CacheTotalSize() const = 0; }; class CPUInfo : public ICPUInfo { public: CPUInfo(); ~CPUInfo(); CPUInfo(const CPUInfo&) = delete; CPUInfo& operator = (const CPUInfo&) = delete; const char* vendorName() const override; const char* cpuName() const override; bool isX86() const override; bool isARM() const override; bool hasSSE2() const override; bool hasSSE3() const override; bool hasSSSE3() const override; bool hasSSE41() const override; bool hasSSE42() const override; bool hasAVX() const override; bool hasAVX2() const override; bool hasFMA() const override; bool hasNEON() const override; uint32_t L2CacheLineSize() const override; uint32_t L2CacheTotalSize() const override; private: struct PlatformCPUInfo; PlatformCPUInfo* m_info = nullptr; }; }