1c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/* 2c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Copyright (C) 2015 The Android Open Source Project 3c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * 4c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Licensed under the Apache License, Version 2.0 (the "License"); 5c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * you may not use this file except in compliance with the License. 6c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * You may obtain a copy of the License at 7c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * 8c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * http://www.apache.org/licenses/LICENSE-2.0 9c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * 10c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Unless required by applicable law or agreed to in writing, software 11c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * distributed under the License is distributed on an "AS IS" BASIS, 12c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * See the License for the specific language governing permissions and 14c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * limitations under the License. 15c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 16c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 17c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#ifndef ANDROID_RS_API_GENERATOR_SPECIFICATION_H 18c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#define ANDROID_RS_API_GENERATOR_SPECIFICATION_H 19c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 20c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// See Generator.cpp for documentation of the .spec file format. 21c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 2212398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni#include <climits> 23c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include <fstream> 24c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include <list> 25c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include <map> 26c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include <string> 27c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include <vector> 28c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 29c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass Constant; 30c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass ConstantSpecification; 31c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass Function; 32c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass FunctionPermutation; 33c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass FunctionSpecification; 34c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass SpecFile; 35c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass Specification; 36c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass Scanner; 37c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass SystemSpecification; 38c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass Type; 39c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass TypeSpecification; 40c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 41c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletenum NumberKind { SIGNED_INTEGER, UNSIGNED_INTEGER, FLOATING_POINT }; 42c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 43c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// Table of type equivalences. 44c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstruct NumericalType { 45c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const char* specType; // Name found in the .spec file 46c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const char* rsDataType; // RS data type 47c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const char* cType; // Type in a C file 48c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const char* javaType; // Type in a Java file 49c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet NumberKind kind; 50c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet /* For integers, number of bits of the number, excluding the sign bit. 51c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * For floats, number of implied bits of the mantissa. 52c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 53c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int significantBits; 54c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // For floats, number of bits of the exponent. 0 for integer types. 55c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int exponentBits; 56c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 57c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 58c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/* Corresponds to one parameter line in a .spec file. These will be parsed when 59c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * we instantiate the FunctionPermutation(s) that correspond to one FunctionSpecification. 60c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 61c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstruct ParameterEntry { 62c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string type; 63c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string name; 64c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet /* Optional information on how to generate test values for this parameter. Can be: 65c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * - range(low, high): Generates values between these two limits only. 66c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * - above(other_parameter): The values must be greater than those of the named parameter. 67c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Used for clamp. 68c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * - compatible(type): The values must also be fully representable in the specified type. 69c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * - conditional: Don't verify this value the function return NaN. 70c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 71c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string testOption; 72c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string documentation; 73c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int lineNumber; 74c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 75c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 76c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/* Information about a parameter to a function. The values of all the fields should only be set by 77c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * parseParameterDefinition. 78c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 79c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstruct ParameterDefinition { 80c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string rsType; // The Renderscript type, e.g. "uint3" 81c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string rsBaseType; // As above but without the number, e.g. "uint" 82c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string javaBaseType; // The type we need to declare in Java, e.g. "unsigned int" 83c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string specType; // The type found in the spec, e.g. "f16" 84c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool isFloatType; // True if it's a floating point value 85c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet /* The number of entries in the vector. It should be either "1", "2", "3", or "4". It's also 86c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * "1" for scalars. 87c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 88c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mVectorSize; 89c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet /* The space the vector takes in an array. It's the same as the vector size, except for size 90c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * "3", where the width is "4". 91c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 92c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string vectorWidth; 93c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 94c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string specName; // e.g. x, as found in the spec file 95c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string variableName; // e.g. inX, used both in .rs and .java 96c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string rsAllocName; // e.g. gAllocInX 97c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string javaAllocName; // e.g. inX 98c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string javaArrayName; // e.g. arrayInX 993b2be14b4f4e1932f4e67c12d691ca85e937d936Pirama Arumuga Nainar std::string doubleVariableName; // e.g. inXDouble, used in .java for storing Float16 parameters 1003b2be14b4f4e1932f4e67c12d691ca85e937d936Pirama Arumuga Nainar // in double. 101c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 102c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // If non empty, the mininum and maximum values to be used when generating the test data. 103c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string minValue; 104c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string maxValue; 105c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet /* If non empty, contains the name of another parameter that should be smaller or equal to this 106c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * parameter, i.e. value(smallerParameter) <= value(this). This is used when testing clamp. 107c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 108c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string smallerParameter; 109c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 110c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool isOutParameter; // True if this parameter returns data from the script. 111c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool undefinedIfOutIsNan; // If true, we don't validate if 'out' is NaN. 112c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 113c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int typeIndex; // Index in the TYPES array. Negative if not found in the array. 114c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int compatibleTypeIndex; // Index in TYPES for which the test data must also fit. 115c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 116c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet /* Fill this object from the type, name, and testOption. 117c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * isReturn is true if we're processing the "return:" 118c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 119c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet void parseParameterDefinition(const std::string& type, const std::string& name, 120c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::string& testOption, int lineNumber, bool isReturn, 121c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet Scanner* scanner); 1223b2be14b4f4e1932f4e67c12d691ca85e937d936Pirama Arumuga Nainar 1233b2be14b4f4e1932f4e67c12d691ca85e937d936Pirama Arumuga Nainar bool isFloat16Parameter() const { return specType.compare("f16") == 0; } 124c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 125c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 126c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstruct VersionInfo { 127c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet /* The range of versions a specification applies to. Zero if there's no restriction, 128c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * so an API that became available at 12 and is still valid would have min:12 max:0. 129c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * If non zero, both versions should be at least 9, the API level that introduced 130c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * RenderScript. 131c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 13212398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni unsigned int minVersion; 13312398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni unsigned int maxVersion; 134c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Either 0, 32 or 64. If 0, this definition is valid for both 32 and 64 bits. 135c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int intSize; 136c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 137c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet VersionInfo() : minVersion(0), maxVersion(0), intSize(0) {} 1382217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet /* Scan the version info from the spec file. maxApiLevel specifies the maximum level 1392217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet * we are interested in. This may alter maxVersion. This method returns false if the 1402217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet * minVersion is greater than the maxApiLevel. 1412217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet */ 14212398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni bool scan(Scanner* scanner, unsigned int maxApiLevel); 14336090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet /* Return true if the target can be found whitin the range. */ 14436090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet bool includesVersion(int target) const { 14536090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet return (minVersion == 0 || target >= minVersion) && 14636090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet (maxVersion == 0 || target <= maxVersion); 14736090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet } 14812398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni 14912398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni static constexpr unsigned int kUnreleasedVersion = UINT_MAX; 150c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 151c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 152c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// We have three type of definitions 153c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass Definition { 154c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletprotected: 155c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mName; 15636e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet /* If greater than 0, this definition is deprecated. It's the API level at which 15736e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet * we added the deprecation warning. 15836e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet */ 15936e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet int mDeprecatedApiLevel; 1604a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet std::string mDeprecatedMessage; // Optional specific warning if the API is deprecated 161c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool mHidden; // True if it should not be documented 162c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mSummary; // A one-line description 163c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<std::string> mDescription; // The comments to be included in the header 164c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mUrl; // The URL of the detailed documentation 16567923a9e829d89522bb5338a6d635d807a7ee59bJean-Luc Brouillet int mFinalVersion; // API level at which this API was removed, 0 if API is still valid 166c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 167c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletpublic: 1687c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet Definition(const std::string& name); 169c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 170c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getName() const { return mName; } 17136e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet bool deprecated() const { return mDeprecatedApiLevel > 0; } 17236e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet int getDeprecatedApiLevel() const { return mDeprecatedApiLevel; } 1734a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet std::string getDeprecatedMessage() const { return mDeprecatedMessage; } 174c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool hidden() const { return mHidden; } 175c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getSummary() const { return mSummary; } 176c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<std::string>& getDescription() const { return mDescription; } 177c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getUrl() const { return mUrl; } 17867923a9e829d89522bb5338a6d635d807a7ee59bJean-Luc Brouillet int getFinalVersion() const { return mFinalVersion; } 179c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 1807c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet void scanDocumentationTags(Scanner* scanner, bool firstOccurence, const SpecFile* specFile); 18167923a9e829d89522bb5338a6d635d807a7ee59bJean-Luc Brouillet // Keep track of the final version of this API, if any. 18267923a9e829d89522bb5338a6d635d807a7ee59bJean-Luc Brouillet void updateFinalVersion(const VersionInfo& info); 183c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 184c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 185c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/* Represents a constant, like M_PI. This is a grouping of the version specific specifications. 186c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * We'll only have one instance of Constant for each name. 187c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 188c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass Constant : public Definition { 189c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletprivate: 190c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<ConstantSpecification*> mSpecifications; // Owned 191c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 192c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletpublic: 1937c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet Constant(const std::string& name) : Definition(name) {} 194c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet ~Constant(); 195c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 196c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<ConstantSpecification*> getSpecifications() const { return mSpecifications; } 197c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // This method should only be called by the scanning code. 198c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet void addSpecification(ConstantSpecification* spec) { mSpecifications.push_back(spec); } 199c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 200c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 201c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/* Represents a type, like "float4". This is a grouping of the version specific specifications. 202c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * We'll only have one instance of Type for each name. 203c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 204c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass Type : public Definition { 205c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletprivate: 206c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<TypeSpecification*> mSpecifications; // Owned 207c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 208c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletpublic: 2097c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet Type(const std::string& name) : Definition(name) {} 210c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet ~Type(); 211c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 212c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<TypeSpecification*> getSpecifications() const { return mSpecifications; } 213c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // This method should only be called by the scanning code. 214c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet void addSpecification(TypeSpecification* spec) { mSpecifications.push_back(spec); } 215c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 216c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 217c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/* Represents a function, like "clamp". Even though the spec file contains many entries for clamp, 218c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * we'll only have one clamp instance. 219c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 220c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass Function : public Definition { 221c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletprivate: 222c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // mName in the base class contains the lower case name, e.g. native_log 223c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mCapitalizedName; // The capitalized name, e.g. NativeLog 224c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 225c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // The unique parameters between all the specifications. NOT OWNED. 226c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<ParameterEntry*> mParameters; 227c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mReturnDocumentation; 228c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 229c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<FunctionSpecification*> mSpecifications; // Owned 230c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 231c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletpublic: 2327c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet Function(const std::string& name); 233c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet ~Function(); 234c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 235c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getCapitalizedName() const { return mCapitalizedName; } 236c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<ParameterEntry*>& getParameters() const { return mParameters; } 237c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getReturnDocumentation() const { return mReturnDocumentation; } 238c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<FunctionSpecification*> getSpecifications() const { return mSpecifications; } 239c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 240c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool someParametersAreDocumented() const; 241c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 242c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // The following methods should only be called by the scanning code. 243c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet void addParameter(ParameterEntry* entry, Scanner* scanner); 244c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet void addReturn(ParameterEntry* entry, Scanner* scanner); 245c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet void addSpecification(FunctionSpecification* spec) { mSpecifications.push_back(spec); } 246c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 247c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 248c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/* Base class for TypeSpecification, ConstantSpecification, and FunctionSpecification. 249c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * A specification can be specific to a range of RenderScript version or 32bits vs 64 bits. 250c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * This base class contains code to parse and store this version information. 251c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 252c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass Specification { 253c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletprotected: 254c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet VersionInfo mVersionInfo; 255c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet void scanVersionInfo(Scanner* scanner); 256c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 257c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletpublic: 258c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet VersionInfo getVersionInfo() const { return mVersionInfo; } 259c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 260c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 261cb25a819dbb5bda7e5554ec5ff09d29586d84493David Gross/* Defines one of the many variations of a constant. There's a one to one correspondence between 262c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * ConstantSpecification objects and entries in the spec file. 263c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 264c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass ConstantSpecification : public Specification { 265c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletprivate: 2667c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet Constant* mConstant; // Not owned 2677c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet 268c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mValue; // E.g. "3.1415" 269cb25a819dbb5bda7e5554ec5ff09d29586d84493David Gross std::string mType; // E.g. "float" 270c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletpublic: 2717c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet ConstantSpecification(Constant* constant) : mConstant(constant) {} 2727c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet 2737c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet Constant* getConstant() const { return mConstant; } 274c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getValue() const { return mValue; } 275cb25a819dbb5bda7e5554ec5ff09d29586d84493David Gross std::string getType() const { return mType; } 276c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 277c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Parse a constant specification and add it to specFile. 27812398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni static void scanConstantSpecification(Scanner* scanner, SpecFile* specFile, unsigned int maxApiLevel); 279c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 280c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 281c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletenum TypeKind { 282c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet SIMPLE, 283ca51c78b9e3097ee31dd24cdc5982f550ee563d1Stephen Hines RS_OBJECT, 284c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet STRUCT, 285c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet ENUM, 286c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 287c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 288cb25a819dbb5bda7e5554ec5ff09d29586d84493David Gross/* Defines one of the many variations of a type. There's a one to one correspondence between 289c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * TypeSpecification objects and entries in the spec file. 290c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 291c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass TypeSpecification : public Specification { 292c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletprivate: 2937c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet Type* mType; // Not owned 2947c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet 295c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet TypeKind mKind; // The kind of type specification 296c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 297c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // If mKind is SIMPLE: 298c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mSimpleType; // The definition of the type 299c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 300c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // If mKind is STRUCT: 301c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mStructName; // The name found after the struct keyword 302c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<std::string> mFields; // One entry per struct field 303c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<std::string> mFieldComments; // One entry per struct field 30436e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet std::string mAttribute; // Some structures may have attributes 305c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 306c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // If mKind is ENUM: 307c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mEnumName; // The name found after the enum keyword 308c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<std::string> mValues; // One entry per enum value 309c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<std::string> mValueComments; // One entry per enum value 310c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletpublic: 3117c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet TypeSpecification(Type* type) : mType(type) {} 3127c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet 3137c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet Type* getType() const { return mType; } 314c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet TypeKind getKind() const { return mKind; } 315c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getSimpleType() const { return mSimpleType; } 316c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getStructName() const { return mStructName; } 317c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<std::string>& getFields() const { return mFields; } 318c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<std::string>& getFieldComments() const { return mFieldComments; } 31936e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet std::string getAttribute() const { return mAttribute; } 320c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getEnumName() const { return mEnumName; } 321c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<std::string>& getValues() const { return mValues; } 322c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<std::string>& getValueComments() const { return mValueComments; } 323c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 324c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Parse a type specification and add it to specFile. 32512398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni static void scanTypeSpecification(Scanner* scanner, SpecFile* specFile, unsigned int maxApiLevel); 326c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 327c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 328c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// Maximum number of placeholders (like #1, #2) in function specifications. 329c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletconst int MAX_REPLACEABLES = 4; 330c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 331cb25a819dbb5bda7e5554ec5ff09d29586d84493David Gross/* Defines one of the many variations of the function. There's a one to one correspondence between 332c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * FunctionSpecification objects and entries in the spec file. Some of the strings that are parts 333c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * of a FunctionSpecification can include placeholders, which are "#1", "#2", "#3", and "#4". We'll 334c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * replace these by values before generating the files. 335c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 336c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass FunctionSpecification : public Specification { 337c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletprivate: 3387c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet Function* mFunction; // Not owned 3397c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet 340c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet /* How to test. One of: 341c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * "scalar": Generate test code that checks entries of each vector indepently. E.g. for 342c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * sin(float3), the test code will call the CoreMathVerfier.computeSin 3 times. 343c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * "limited": Like "scalar" but we don't generate extreme values. This is not currently 344c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * enabled as we were generating to many errors. 345c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * "custom": Like "scalar" but instead of calling CoreMathVerifier.computeXXX() to compute 346c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * the expected value, we call instead CoreMathVerifier.verifyXXX(). This method 347c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * returns a string that contains the error message, null if there's no error. 348c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * "vector": Generate test code that calls the CoreMathVerifier only once for each vector. 349c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * This is useful for APIs like dot() or length(). 350c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * "noverify": Generate test code that calls the API but don't verify the returned value. 351c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * This can discover unresolved references. 35266fea24fb5f3a02b744a9c71ae0fc22c03c4fc6eJean-Luc Brouillet * "": Don't test. This is the default. 353c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 354c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mTest; 35512398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni bool mInternal; // Internal. Not visible to users. (Default: false) 35612398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni bool mIntrinsic; // Compiler intrinsic that is lowered to an internal API. 35712398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni // (Default: false) 358c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mAttribute; // Function attributes. 359c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mPrecisionLimit; // Maximum precision required when checking output of this 360c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // function. 361c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 362c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // The vectors of values with which we'll replace #1, #2, ... 363c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<std::vector<std::string> > mReplaceables; 364c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 36543d758c56868560fdd3cdcfeea599819ed037031Pirama Arumuga Nainar // i-th entry is true if each entry in mReplaceables[i] has an equivalent 36643d758c56868560fdd3cdcfeea599819ed037031Pirama Arumuga Nainar // RS numerical type (i.e. present in TYPES global) 36743d758c56868560fdd3cdcfeea599819ed037031Pirama Arumuga Nainar std::vector<bool> mIsRSTAllowed; 36843d758c56868560fdd3cdcfeea599819ed037031Pirama Arumuga Nainar 369c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet /* The collection of permutations for this specification, i.e. this class instantianted 370c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * for specific values of #1, #2, etc. Owned. 371c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 372c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<FunctionPermutation*> mPermutations; 373c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 374c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // The following fields may contain placeholders that will be replaced using the mReplaceables. 375c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 376c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet /* As of this writing, convert_... is the only function with #1 in its name. 377c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * The related Function object contains the name of the function without #n, e.g. convert. 378c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * This is the name with the #, e.g. convert_#1_#2 379c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 380c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mUnexpandedName; 3812217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet ParameterEntry* mReturn; // The return type. The name should be empty. Owned. 382c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<ParameterEntry*> mParameters; // The parameters. Owned. 383c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<std::string> mInline; // The inline code to be included in the header 384c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 38543d758c56868560fdd3cdcfeea599819ed037031Pirama Arumuga Nainar /* Substitute the placeholders in the strings (e.g. #1, #2, ...) by the 38643d758c56868560fdd3cdcfeea599819ed037031Pirama Arumuga Nainar * corresponding entries in mReplaceables. Substitute placeholders for RS 38743d758c56868560fdd3cdcfeea599819ed037031Pirama Arumuga Nainar * types (#RST_1, #RST_2, ...) by the RS Data type strings (UNSIGNED_8, 38843d758c56868560fdd3cdcfeea599819ed037031Pirama Arumuga Nainar * FLOAT_32 etc.) of the corresponding types in mReplaceables. 38943d758c56868560fdd3cdcfeea599819ed037031Pirama Arumuga Nainar * indexOfReplaceable1 selects with value to use for #1, same for 2, 3, and 39043d758c56868560fdd3cdcfeea599819ed037031Pirama Arumuga Nainar * 4. 391c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 392c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string expandString(std::string s, int indexOfReplaceable[MAX_REPLACEABLES]) const; 393c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet void expandStringVector(const std::vector<std::string>& in, 394c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int replacementIndexes[MAX_REPLACEABLES], 395c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<std::string>* out) const; 396c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 39743d758c56868560fdd3cdcfeea599819ed037031Pirama Arumuga Nainar // Helper function used by expandString to perform #RST_* substitution 39843d758c56868560fdd3cdcfeea599819ed037031Pirama Arumuga Nainar std::string expandRSTypeInString(const std::string &s, 39943d758c56868560fdd3cdcfeea599819ed037031Pirama Arumuga Nainar const std::string &pattern, 40043d758c56868560fdd3cdcfeea599819ed037031Pirama Arumuga Nainar const std::string &cTypeStr) const; 40143d758c56868560fdd3cdcfeea599819ed037031Pirama Arumuga Nainar 402c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Fill the mPermutations field. 403c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet void createPermutations(Function* function, Scanner* scanner); 404c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 405c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletpublic: 40612398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni FunctionSpecification(Function* function) : mFunction(function), mInternal(false), 40712398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni mIntrinsic(false), mReturn(nullptr) {} 408c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet ~FunctionSpecification(); 409c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 41067923a9e829d89522bb5338a6d635d807a7ee59bJean-Luc Brouillet Function* getFunction() const { return mFunction; } 41112398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni bool isInternal() const { return mInternal; } 41212398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni bool isIntrinsic() const { return mIntrinsic; } 413c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getAttribute() const { return mAttribute; } 414c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getTest() const { return mTest; } 415c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getPrecisionLimit() const { return mPrecisionLimit; } 416c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 417c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<FunctionPermutation*>& getPermutations() const { return mPermutations; } 418c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 419c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getName(int replacementIndexes[MAX_REPLACEABLES]) const; 420c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet void getReturn(int replacementIndexes[MAX_REPLACEABLES], std::string* retType, 421c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int* lineNumber) const; 422c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet size_t getNumberOfParams() const { return mParameters.size(); } 423c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet void getParam(size_t index, int replacementIndexes[MAX_REPLACEABLES], std::string* type, 424c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string* name, std::string* testOption, int* lineNumber) const; 425c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet void getInlines(int replacementIndexes[MAX_REPLACEABLES], 426c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<std::string>* inlines) const; 427c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 428c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Parse the "test:" line. 429c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet void parseTest(Scanner* scanner); 430c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 431c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Return true if we need to generate tests for this function. 43212398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni bool hasTests(unsigned int versionOfTestFiles) const; 433c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 43436090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet bool hasInline() const { return mInline.size() > 0; } 43536090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet 43636090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet /* Return true if this function can be overloaded. This is added by default to all 43736090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet * specifications, so except for the very few exceptions that start the attributes 43836090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet * with an '=' to avoid this, we'll return true. 43936090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet */ 44036090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet bool isOverloadable() const { 44136090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet return mAttribute.empty() || mAttribute[0] != '='; 44236090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet } 44336090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet 44443d758c56868560fdd3cdcfeea599819ed037031Pirama Arumuga Nainar /* Check if RST_i is present in 's' and report an error if 'allow' is false 44543d758c56868560fdd3cdcfeea599819ed037031Pirama Arumuga Nainar * or the i-th replacement list is not a valid candidate for RST_i 44643d758c56868560fdd3cdcfeea599819ed037031Pirama Arumuga Nainar * replacement 44743d758c56868560fdd3cdcfeea599819ed037031Pirama Arumuga Nainar */ 44843d758c56868560fdd3cdcfeea599819ed037031Pirama Arumuga Nainar void checkRSTPatternValidity(const std::string &s, bool allow, Scanner *scanner); 44943d758c56868560fdd3cdcfeea599819ed037031Pirama Arumuga Nainar 450c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Parse a function specification and add it to specFile. 45112398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni static void scanFunctionSpecification(Scanner* scanner, SpecFile* specFile, unsigned int maxApiLevel); 452c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 453c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 454c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/* A concrete version of a function specification, where all placeholders have been replaced by 455c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * actual values. 456c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 457c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass FunctionPermutation { 458c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletprivate: 459c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // These are the expanded version of those found on FunctionSpecification 460c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mName; 461c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mNameTrunk; // The name without any expansion, e.g. convert 462c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mTest; // How to test. One of "scalar", "vector", "noverify", "limited", and 463c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // "none". 464c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mPrecisionLimit; // Maximum precision required when checking output of this 465c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // function. 466c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 467c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // The parameters of the function. This does not include the return type. Owned. 468c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<ParameterDefinition*> mParams; 469c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // The return type. nullptr if a void function. Owned. 470c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet ParameterDefinition* mReturn; 471c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 472c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // The number of input and output parameters. mOutputCount counts the return type. 473c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int mInputCount; 474c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int mOutputCount; 475c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 476c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Whether one of the output parameters is a float. 477c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool mHasFloatAnswers; 478c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 479c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // The inline code that implements this function. Will be empty if not an inline. 480c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<std::string> mInline; 481c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 482c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletpublic: 483c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet FunctionPermutation(Function* function, FunctionSpecification* specification, 484c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int replacementIndexes[MAX_REPLACEABLES], Scanner* scanner); 485c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet ~FunctionPermutation(); 486c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 487c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getName() const { return mName; } 488c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getNameTrunk() const { return mNameTrunk; } 489c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getTest() const { return mTest; } 490c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getPrecisionLimit() const { return mPrecisionLimit; } 491c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 49266fea24fb5f3a02b744a9c71ae0fc22c03c4fc6eJean-Luc Brouillet const std::vector<std::string>& getInline() const { return mInline; } 493c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const ParameterDefinition* getReturn() const { return mReturn; } 494c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int getInputCount() const { return mInputCount; } 495c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int getOutputCount() const { return mOutputCount; } 496c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool hasFloatAnswers() const { return mHasFloatAnswers; } 497c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 498c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<ParameterDefinition*> getParams() const { return mParams; } 499c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 500c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 501c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// An entire spec file and the methods to process it. 502c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass SpecFile { 503c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletprivate: 504c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mSpecFileName; 505c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mHeaderFileName; 506c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mDetailedDocumentationUrl; 507c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mBriefDescription; 508c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<std::string> mFullDescription; 509c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Text to insert as-is in the generated header. 510c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<std::string> mVerbatimInclude; 511c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 5127c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet /* The constants, types, and functions specifications declared in this 5137c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet * file, in the order they are found in the file. This matters for 514c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * header generation, as some types and inline functions depend 5157c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet * on each other. Pointers not owned. 516c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 5177c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet std::list<ConstantSpecification*> mConstantSpecificationsList; 5187c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet std::list<TypeSpecification*> mTypeSpecificationsList; 5197c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet std::list<FunctionSpecification*> mFunctionSpecificationsList; 5207c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet 5217c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet /* The constants, types, and functions that are documented in this file. 5227c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet * In very rare cases, specifications for an API are split across multiple 5237c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet * files, e.g. currently for ClearObject(). The documentation for 5247c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet * that function must be found in the first spec file encountered, so the 5257c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet * order of the files on the command line matters. 5267c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet */ 5277c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet std::map<std::string, Constant*> mDocumentedConstants; 5287c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet std::map<std::string, Type*> mDocumentedTypes; 5297c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet std::map<std::string, Function*> mDocumentedFunctions; 530c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 531c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletpublic: 532c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet explicit SpecFile(const std::string& specFileName); 533c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 534c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getSpecFileName() const { return mSpecFileName; } 535c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getHeaderFileName() const { return mHeaderFileName; } 536c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getDetailedDocumentationUrl() const { return mDetailedDocumentationUrl; } 537c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::string getBriefDescription() const { return mBriefDescription; } 538c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<std::string>& getFullDescription() const { return mFullDescription; } 539c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<std::string>& getVerbatimInclude() const { return mVerbatimInclude; } 540c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 5417c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet const std::list<ConstantSpecification*>& getConstantSpecifications() const { 5427c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet return mConstantSpecificationsList; 5437c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet } 5447c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet const std::list<TypeSpecification*>& getTypeSpecifications() const { 5457c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet return mTypeSpecificationsList; 5467c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet } 5477c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet const std::list<FunctionSpecification*>& getFunctionSpecifications() const { 5487c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet return mFunctionSpecificationsList; 5497c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet } 5507c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet const std::map<std::string, Constant*>& getDocumentedConstants() const { 5517c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet return mDocumentedConstants; 5527c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet } 5537c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet const std::map<std::string, Type*>& getDocumentedTypes() const { return mDocumentedTypes; } 5547c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet const std::map<std::string, Function*>& getDocumentedFunctions() const { 5557c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet return mDocumentedFunctions; 5567c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet } 557c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 5582217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet bool hasSpecifications() const { 5592217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet return !mDocumentedConstants.empty() || !mDocumentedTypes.empty() || 5602217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet !mDocumentedFunctions.empty(); 5612217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet } 5622217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet 56312398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni bool readSpecFile(unsigned int maxApiLevel); 564c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 5657c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet /* These are called by the parser to keep track of the specifications defined in this file. 5667c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet * hasDocumentation is true if this specification containes the documentation. 5677c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet */ 5687c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet void addConstantSpecification(ConstantSpecification* spec, bool hasDocumentation); 5697c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet void addTypeSpecification(TypeSpecification* spec, bool hasDocumentation); 5707c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet void addFunctionSpecification(FunctionSpecification* spec, bool hasDocumentation); 571c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 572c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 573c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// The collection of all the spec files. 574c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass SystemSpecification { 575c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletprivate: 576c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<SpecFile*> mSpecFiles; 577c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 578c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet /* Entries in the table of contents. We accumulate them in a map to sort them. 5797c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet * Pointers are owned. 580c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 581c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::map<std::string, Constant*> mConstants; 582c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::map<std::string, Type*> mTypes; 583c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::map<std::string, Function*> mFunctions; 584c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 585c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletpublic: 586c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet ~SystemSpecification(); 5877c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet 5887c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet /* These are called the parser to create unique instances per name. Set *created to true 5897c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet * if the named specification did not already exist. 5907c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet */ 5917c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet Constant* findOrCreateConstant(const std::string& name, bool* created); 5927c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet Type* findOrCreateType(const std::string& name, bool* created); 5937c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet Function* findOrCreateFunction(const std::string& name, bool* created); 5947c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet 5952217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet /* Parse the spec file and create the object hierarchy, adding a pointer to mSpecFiles. 5962217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet * We won't include information passed the specified level. 5972217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet */ 59812398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni bool readSpecFile(const std::string& fileName, unsigned int maxApiLevel); 599c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Generate all the files. 60012398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni bool generateFiles(bool forVerification, unsigned int maxApiLevel) const; 601c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 602c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<SpecFile*>& getSpecFiles() const { return mSpecFiles; } 603c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::map<std::string, Constant*>& getConstants() const { return mConstants; } 604c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::map<std::string, Type*>& getTypes() const { return mTypes; } 605c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::map<std::string, Function*>& getFunctions() const { return mFunctions; } 606c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 607c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Returns "<a href='...'> for the named specification, or empty if not found. 608c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getHtmlAnchor(const std::string& name) const; 60936090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet 61036090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet // Returns the maximum API level specified in any spec file. 61112398d81f32e5e0479d02b8608a83c75cd991bb3Yang Ni unsigned int getMaximumApiLevel(); 612c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 613c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 614c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// Singleton that represents the collection of all the specs we're processing. 615c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern SystemSpecification systemSpecification; 616c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 617c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// Table of equivalences of numerical types. 618c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern const NumericalType TYPES[]; 619c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern const int NUM_TYPES; 620c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 6219309a0665a4866f708db9ae67e43b5ea6a27cf27Dean De Leo/* Given a renderscript type (string) calculate the vector size and base type. If the type 6229309a0665a4866f708db9ae67e43b5ea6a27cf27Dean De Leo * is not a vector the vector size is 1 and baseType is just the type itself. 6239309a0665a4866f708db9ae67e43b5ea6a27cf27Dean De Leo */ 6249309a0665a4866f708db9ae67e43b5ea6a27cf27Dean De Leovoid getVectorSizeAndBaseType(const std::string& type, std::string& vectorSize, 6259309a0665a4866f708db9ae67e43b5ea6a27cf27Dean De Leo std::string& baseType); 6269309a0665a4866f708db9ae67e43b5ea6a27cf27Dean De Leo 627c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#endif // ANDROID_RS_API_GENERATOR_SPECIFICATION_H 628