/* * Copyright 2012 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkTypedEnum_DEFINED #define SkTypedEnum_DEFINED #include "SkPreprocessorSeq.h" //Compatibility with non-clang compilers. #ifndef __has_feature #define __has_feature(x) 0 #endif #ifndef __has_extension #define __has_extension __has_feature #endif //Detect if typed enums are supported. #if defined(_MSC_VER) #define SK_TYPED_ENUMS #elif defined(__clang__) && __has_extension(cxx_strong_enums) #define SK_TYPED_ENUMS // Scoped enums are buggy in GCC 4.4.0 through 4.5.1. // See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38064 // __cplusplus should actually be accurate now. // See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773 #elif defined(__GNUC__) && (((__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__ >= 40501) && defined(__GXX_EXPERIMENTAL_CXX0X__)) || __cplusplus >= 201103L) #define SK_TYPED_ENUMS #endif //Define what a typed enum looks like. #ifdef SK_TYPED_ENUMS #define SK_TYPED_ENUM_VALUES(data, elem) \ SK_PAIR_FIRST(elem) = SK_PAIR_SECOND(elem), #define SK_TYPED_ENUM_IDS(data, elem) \ elem, #define SK_TYPED_ENUM_IDS_L(data, elem) \ elem #define SK_TYPED_ENUM(enumName, enumType, enumSeq, idSeq) \ enum enumName : enumType { \ SK_SEQ_FOREACH(SK_TYPED_ENUM_VALUES, _, enumSeq) \ } SK_SEQ_FOREACH_L(SK_TYPED_ENUM_IDS, SK_TYPED_ENUM_IDS_L, _, idSeq); #else #define SK_TYPED_ENUM_VALUES(enumType, elem) \ static const enumType SK_PAIR_FIRST(elem) = SK_PAIR_SECOND(elem); #define SK_TYPED_ENUM_IDS(enumType, elem) \ enumType elem; #define SK_TYPED_ENUM(enumName, enumType, enumSeq, idSeq) \ typedef enumType enumName; \ SK_SEQ_FOREACH(SK_TYPED_ENUM_VALUES, enumType, enumSeq) \ SK_SEQ_FOREACH(SK_TYPED_ENUM_IDS, enumType, idSeq) #endif #endif