// Copyright 2017 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef INTROSPECTION_PREFIX #error "missing INTROSPECTION_PREFIX" #endif #ifndef INTROSPECTION_ENUM_PREFIX #error "missing INTROSPECTION_ENUM_PREFIX" #endif #ifndef INTROSPECTION_TABLE #error "missing INTROSPECTION_TABLE" #endif #include #define STRINGIZE_(s) #s #define STRINGIZE(s) STRINGIZE_(s) #define FEAT_TYPE_NAME__(X) X##Features #define FEAT_TYPE_NAME_(X) FEAT_TYPE_NAME__(X) #define FEAT_TYPE_NAME FEAT_TYPE_NAME_(INTROSPECTION_PREFIX) #define FEAT_ENUM_NAME__(X) X##FeaturesEnum #define FEAT_ENUM_NAME_(X) FEAT_ENUM_NAME__(X) #define FEAT_ENUM_NAME FEAT_ENUM_NAME_(INTROSPECTION_PREFIX) #define GET_FEAT_ENUM_VALUE__(X) Get##X##FeaturesEnumValue #define GET_FEAT_ENUM_VALUE_(X) GET_FEAT_ENUM_VALUE__(X) #define GET_FEAT_ENUM_VALUE GET_FEAT_ENUM_VALUE_(INTROSPECTION_PREFIX) #define GET_FEAT_ENUM_NAME__(X) Get##X##FeaturesEnumName #define GET_FEAT_ENUM_NAME_(X) GET_FEAT_ENUM_NAME__(X) #define GET_FEAT_ENUM_NAME GET_FEAT_ENUM_NAME_(INTROSPECTION_PREFIX) #define FEAT_ENUM_LAST__(X) X##_LAST_ #define FEAT_ENUM_LAST_(X) FEAT_ENUM_LAST__(X) #define FEAT_ENUM_LAST FEAT_ENUM_LAST_(INTROSPECTION_ENUM_PREFIX) // Generate individual getters and setters. #define LINE(ENUM, NAME, A, B, C) \ static void set_##ENUM(FEAT_TYPE_NAME* features, bool value) { \ features->NAME = value; \ } \ static int get_##ENUM(const FEAT_TYPE_NAME* features) { \ return features->NAME; \ } INTROSPECTION_TABLE #undef LINE // Generate getters table #define LINE(ENUM, NAME, A, B, C) [ENUM] = get_##ENUM, static int (*const kGetters[])(const FEAT_TYPE_NAME*) = {INTROSPECTION_TABLE}; #undef LINE // Generate setters table #define LINE(ENUM, NAME, A, B, C) [ENUM] = set_##ENUM, static void (*const kSetters[])(FEAT_TYPE_NAME*, bool) = {INTROSPECTION_TABLE}; #undef LINE // Implements the `GetXXXFeaturesEnumValue` API. int GET_FEAT_ENUM_VALUE(const FEAT_TYPE_NAME* features, FEAT_ENUM_NAME value) { if (value >= FEAT_ENUM_LAST) return false; return kGetters[value](features); } // Generate feature name table. #define LINE(ENUM, NAME, A, B, C) [ENUM] = STRINGIZE(NAME), static const char* kFeatureNames[] = {INTROSPECTION_TABLE}; #undef LINE // Implements the `GetXXXFeaturesEnumName` API. const char* GET_FEAT_ENUM_NAME(FEAT_ENUM_NAME value) { if (value >= FEAT_ENUM_LAST) return "unknown_feature"; return kFeatureNames[value]; }