#include "CodegenDecl.hpp" #include static EnumValuePattern NextPattern(EnumValuePattern val) { return (EnumValuePattern)(val + 1); } EnumValuePattern DeclEnum::CalcPattern() const { if (elements.empty()) return EVP_Continuous; auto pattern = EVP_Continuous; restart: auto lastVal = elements[0].value; for (size_t i = 1; i < elements.size(); ++i) { auto currVal = elements[i].value; switch (pattern) { case EVP_Continuous: { bool satisfy = lastVal + 1 == currVal; if (!satisfy) { pattern = NextPattern(pattern); goto restart; } } break; case EVP_Bits: { bool satisfy = (lastVal << 1) == currVal; if (!satisfy) { pattern = NextPattern(pattern); goto restart; } } break; // A random pattern can match anything case EVP_Random: case EVP_COUNT: break; } lastVal = currVal; } return pattern; } void DeclEnum::CalcPatternIfNecessary() { if (pattern == EVP_COUNT) { CalcPattern(); } }