Specification.h revision 36090673baf50cf3c70bdc89f9a4a872c05cf0f6
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 22c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include <fstream> 23c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include <list> 24c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include <map> 25c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include <string> 26c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#include <vector> 27c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 28c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass Constant; 29c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass ConstantSpecification; 30c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass Function; 31c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass FunctionPermutation; 32c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass FunctionSpecification; 33c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass SpecFile; 34c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass Specification; 35c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass Scanner; 36c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass SystemSpecification; 37c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass Type; 38c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass TypeSpecification; 39c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 40c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletenum NumberKind { SIGNED_INTEGER, UNSIGNED_INTEGER, FLOATING_POINT }; 41c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 42c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// Table of type equivalences. 43c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstruct NumericalType { 44c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const char* specType; // Name found in the .spec file 45c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const char* rsDataType; // RS data type 46c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const char* cType; // Type in a C file 47c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const char* javaType; // Type in a Java file 48c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet NumberKind kind; 49c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet /* For integers, number of bits of the number, excluding the sign bit. 50c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * For floats, number of implied bits of the mantissa. 51c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 52c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int significantBits; 53c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // For floats, number of bits of the exponent. 0 for integer types. 54c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int exponentBits; 55c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 56c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 57c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/* Corresponds to one parameter line in a .spec file. These will be parsed when 58c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * we instantiate the FunctionPermutation(s) that correspond to one FunctionSpecification. 59c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 60c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstruct ParameterEntry { 61c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string type; 62c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string name; 63c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet /* Optional information on how to generate test values for this parameter. Can be: 64c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * - range(low, high): Generates values between these two limits only. 65c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * - above(other_parameter): The values must be greater than those of the named parameter. 66c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Used for clamp. 67c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * - compatible(type): The values must also be fully representable in the specified type. 68c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * - conditional: Don't verify this value the function return NaN. 69c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 70c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string testOption; 71c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string documentation; 72c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int lineNumber; 73c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 74c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 75c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/* Information about a parameter to a function. The values of all the fields should only be set by 76c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * parseParameterDefinition. 77c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 78c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstruct ParameterDefinition { 79c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string rsType; // The Renderscript type, e.g. "uint3" 80c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string rsBaseType; // As above but without the number, e.g. "uint" 81c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string javaBaseType; // The type we need to declare in Java, e.g. "unsigned int" 82c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string specType; // The type found in the spec, e.g. "f16" 83c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool isFloatType; // True if it's a floating point value 84c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet /* The number of entries in the vector. It should be either "1", "2", "3", or "4". It's also 85c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * "1" for scalars. 86c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 87c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mVectorSize; 88c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet /* The space the vector takes in an array. It's the same as the vector size, except for size 89c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * "3", where the width is "4". 90c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 91c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string vectorWidth; 92c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 93c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string specName; // e.g. x, as found in the spec file 94c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string variableName; // e.g. inX, used both in .rs and .java 95c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string rsAllocName; // e.g. gAllocInX 96c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string javaAllocName; // e.g. inX 97c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string javaArrayName; // e.g. arrayInX 98c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 99c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // If non empty, the mininum and maximum values to be used when generating the test data. 100c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string minValue; 101c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string maxValue; 102c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet /* If non empty, contains the name of another parameter that should be smaller or equal to this 103c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * parameter, i.e. value(smallerParameter) <= value(this). This is used when testing clamp. 104c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 105c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string smallerParameter; 106c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 107c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool isOutParameter; // True if this parameter returns data from the script. 108c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool undefinedIfOutIsNan; // If true, we don't validate if 'out' is NaN. 109c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 110c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int typeIndex; // Index in the TYPES array. Negative if not found in the array. 111c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int compatibleTypeIndex; // Index in TYPES for which the test data must also fit. 112c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 113c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet /* Fill this object from the type, name, and testOption. 114c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * isReturn is true if we're processing the "return:" 115c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 116c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet void parseParameterDefinition(const std::string& type, const std::string& name, 117c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::string& testOption, int lineNumber, bool isReturn, 118c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet Scanner* scanner); 119c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 120c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 121c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletstruct VersionInfo { 122c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet /* The range of versions a specification applies to. Zero if there's no restriction, 123c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * so an API that became available at 12 and is still valid would have min:12 max:0. 124c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * If non zero, both versions should be at least 9, the API level that introduced 125c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * RenderScript. 126c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 127c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int minVersion; 128c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int maxVersion; 129c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Either 0, 32 or 64. If 0, this definition is valid for both 32 and 64 bits. 130c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int intSize; 131c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 132c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet VersionInfo() : minVersion(0), maxVersion(0), intSize(0) {} 1332217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet /* Scan the version info from the spec file. maxApiLevel specifies the maximum level 1342217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet * we are interested in. This may alter maxVersion. This method returns false if the 1352217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet * minVersion is greater than the maxApiLevel. 1362217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet */ 1372217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet bool scan(Scanner* scanner, int maxApiLevel); 13836090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet /* Return true if the target can be found whitin the range. */ 13936090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet bool includesVersion(int target) const { 14036090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet return (minVersion == 0 || target >= minVersion) && 14136090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet (maxVersion == 0 || target <= maxVersion); 14236090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet } 143c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 144c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 145c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// We have three type of definitions 146c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass Definition { 147c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletprotected: 148c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mName; 14936e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet /* If greater than 0, this definition is deprecated. It's the API level at which 15036e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet * we added the deprecation warning. 15136e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet */ 15236e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet int mDeprecatedApiLevel; 1534a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet std::string mDeprecatedMessage; // Optional specific warning if the API is deprecated 154c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool mHidden; // True if it should not be documented 155c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mSummary; // A one-line description 156c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<std::string> mDescription; // The comments to be included in the header 157c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mUrl; // The URL of the detailed documentation 15867923a9e829d89522bb5338a6d635d807a7ee59bJean-Luc Brouillet int mFinalVersion; // API level at which this API was removed, 0 if API is still valid 159c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 160c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletpublic: 1617c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet Definition(const std::string& name); 162c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 163c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getName() const { return mName; } 16436e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet bool deprecated() const { return mDeprecatedApiLevel > 0; } 16536e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet int getDeprecatedApiLevel() const { return mDeprecatedApiLevel; } 1664a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet std::string getDeprecatedMessage() const { return mDeprecatedMessage; } 167c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool hidden() const { return mHidden; } 168c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getSummary() const { return mSummary; } 169c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<std::string>& getDescription() const { return mDescription; } 170c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getUrl() const { return mUrl; } 17167923a9e829d89522bb5338a6d635d807a7ee59bJean-Luc Brouillet int getFinalVersion() const { return mFinalVersion; } 172c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 1737c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet void scanDocumentationTags(Scanner* scanner, bool firstOccurence, const SpecFile* specFile); 17467923a9e829d89522bb5338a6d635d807a7ee59bJean-Luc Brouillet // Keep track of the final version of this API, if any. 17567923a9e829d89522bb5338a6d635d807a7ee59bJean-Luc Brouillet void updateFinalVersion(const VersionInfo& info); 176c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 177c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 178c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/* Represents a constant, like M_PI. This is a grouping of the version specific specifications. 179c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * We'll only have one instance of Constant for each name. 180c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 181c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass Constant : public Definition { 182c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletprivate: 183c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<ConstantSpecification*> mSpecifications; // Owned 184c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 185c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletpublic: 1867c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet Constant(const std::string& name) : Definition(name) {} 187c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet ~Constant(); 188c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 189c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<ConstantSpecification*> getSpecifications() const { return mSpecifications; } 190c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // This method should only be called by the scanning code. 191c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet void addSpecification(ConstantSpecification* spec) { mSpecifications.push_back(spec); } 192c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 193c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 194c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/* Represents a type, like "float4". This is a grouping of the version specific specifications. 195c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * We'll only have one instance of Type for each name. 196c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 197c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass Type : public Definition { 198c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletprivate: 199c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<TypeSpecification*> mSpecifications; // Owned 200c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 201c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletpublic: 2027c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet Type(const std::string& name) : Definition(name) {} 203c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet ~Type(); 204c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 205c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<TypeSpecification*> getSpecifications() const { return mSpecifications; } 206c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // This method should only be called by the scanning code. 207c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet void addSpecification(TypeSpecification* spec) { mSpecifications.push_back(spec); } 208c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 209c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 210c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/* Represents a function, like "clamp". Even though the spec file contains many entries for clamp, 211c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * we'll only have one clamp instance. 212c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 213c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass Function : public Definition { 214c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletprivate: 215c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // mName in the base class contains the lower case name, e.g. native_log 216c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mCapitalizedName; // The capitalized name, e.g. NativeLog 217c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 218c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // The unique parameters between all the specifications. NOT OWNED. 219c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<ParameterEntry*> mParameters; 220c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mReturnDocumentation; 221c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 222c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<FunctionSpecification*> mSpecifications; // Owned 223c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 224c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletpublic: 2257c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet Function(const std::string& name); 226c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet ~Function(); 227c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 228c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getCapitalizedName() const { return mCapitalizedName; } 229c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<ParameterEntry*>& getParameters() const { return mParameters; } 230c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getReturnDocumentation() const { return mReturnDocumentation; } 231c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<FunctionSpecification*> getSpecifications() const { return mSpecifications; } 232c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 233c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool someParametersAreDocumented() const; 234c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 235c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // The following methods should only be called by the scanning code. 236c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet void addParameter(ParameterEntry* entry, Scanner* scanner); 237c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet void addReturn(ParameterEntry* entry, Scanner* scanner); 238c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet void addSpecification(FunctionSpecification* spec) { mSpecifications.push_back(spec); } 239c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 240c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 241c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/* Base class for TypeSpecification, ConstantSpecification, and FunctionSpecification. 242c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * A specification can be specific to a range of RenderScript version or 32bits vs 64 bits. 243c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * This base class contains code to parse and store this version information. 244c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 245c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass Specification { 246c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletprotected: 247c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet VersionInfo mVersionInfo; 248c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet void scanVersionInfo(Scanner* scanner); 249c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 250c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletpublic: 251c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet VersionInfo getVersionInfo() const { return mVersionInfo; } 252c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 253c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 254c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/* Defines one of the many variations of a constant. There's a one to one correspondance between 255c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * ConstantSpecification objects and entries in the spec file. 256c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 257c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass ConstantSpecification : public Specification { 258c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletprivate: 2597c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet Constant* mConstant; // Not owned 2607c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet 261c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mValue; // E.g. "3.1415" 262c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletpublic: 2637c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet ConstantSpecification(Constant* constant) : mConstant(constant) {} 2647c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet 2657c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet Constant* getConstant() const { return mConstant; } 266c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getValue() const { return mValue; } 267c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 268c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Parse a constant specification and add it to specFile. 2692217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet static void scanConstantSpecification(Scanner* scanner, SpecFile* specFile, int maxApiLevel); 270c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 271c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 272c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletenum TypeKind { 273c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet SIMPLE, 274c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet STRUCT, 275c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet ENUM, 276c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 277c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 278c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/* Defines one of the many variations of a type. There's a one to one correspondance between 279c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * TypeSpecification objects and entries in the spec file. 280c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 281c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass TypeSpecification : public Specification { 282c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletprivate: 2837c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet Type* mType; // Not owned 2847c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet 285c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet TypeKind mKind; // The kind of type specification 286c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 287c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // If mKind is SIMPLE: 288c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mSimpleType; // The definition of the type 289c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 290c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // If mKind is STRUCT: 291c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mStructName; // The name found after the struct keyword 292c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<std::string> mFields; // One entry per struct field 293c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<std::string> mFieldComments; // One entry per struct field 29436e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet std::string mAttribute; // Some structures may have attributes 295c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 296c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // If mKind is ENUM: 297c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mEnumName; // The name found after the enum keyword 298c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<std::string> mValues; // One entry per enum value 299c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<std::string> mValueComments; // One entry per enum value 300c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletpublic: 3017c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet TypeSpecification(Type* type) : mType(type) {} 3027c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet 3037c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet Type* getType() const { return mType; } 304c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet TypeKind getKind() const { return mKind; } 305c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getSimpleType() const { return mSimpleType; } 306c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getStructName() const { return mStructName; } 307c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<std::string>& getFields() const { return mFields; } 308c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<std::string>& getFieldComments() const { return mFieldComments; } 30936e2be56cd398bf4a318114bbc9fa3f4573c158fJean-Luc Brouillet std::string getAttribute() const { return mAttribute; } 310c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getEnumName() const { return mEnumName; } 311c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<std::string>& getValues() const { return mValues; } 312c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<std::string>& getValueComments() const { return mValueComments; } 313c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 314c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Parse a type specification and add it to specFile. 3152217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet static void scanTypeSpecification(Scanner* scanner, SpecFile* specFile, int maxApiLevel); 316c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 317c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 318c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// Maximum number of placeholders (like #1, #2) in function specifications. 319c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletconst int MAX_REPLACEABLES = 4; 320c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 321c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/* Defines one of the many variations of the function. There's a one to one correspondance between 322c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * FunctionSpecification objects and entries in the spec file. Some of the strings that are parts 323c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * of a FunctionSpecification can include placeholders, which are "#1", "#2", "#3", and "#4". We'll 324c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * replace these by values before generating the files. 325c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 326c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass FunctionSpecification : public Specification { 327c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletprivate: 3287c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet Function* mFunction; // Not owned 3297c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet 330c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet /* How to test. One of: 331c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * "scalar": Generate test code that checks entries of each vector indepently. E.g. for 332c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * sin(float3), the test code will call the CoreMathVerfier.computeSin 3 times. 333c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * "limited": Like "scalar" but we don't generate extreme values. This is not currently 334c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * enabled as we were generating to many errors. 335c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * "custom": Like "scalar" but instead of calling CoreMathVerifier.computeXXX() to compute 336c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * the expected value, we call instead CoreMathVerifier.verifyXXX(). This method 337c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * returns a string that contains the error message, null if there's no error. 338c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * "vector": Generate test code that calls the CoreMathVerifier only once for each vector. 339c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * This is useful for APIs like dot() or length(). 340c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * "noverify": Generate test code that calls the API but don't verify the returned value. 341c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * This can discover unresolved references. 34266fea24fb5f3a02b744a9c71ae0fc22c03c4fc6eJean-Luc Brouillet * "": Don't test. This is the default. 343c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 344c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mTest; 345c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mAttribute; // Function attributes. 346c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mPrecisionLimit; // Maximum precision required when checking output of this 347c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // function. 348c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 349c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // The vectors of values with which we'll replace #1, #2, ... 350c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<std::vector<std::string> > mReplaceables; 351c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 352c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet /* The collection of permutations for this specification, i.e. this class instantianted 353c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * for specific values of #1, #2, etc. Owned. 354c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 355c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<FunctionPermutation*> mPermutations; 356c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 357c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // The following fields may contain placeholders that will be replaced using the mReplaceables. 358c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 359c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet /* As of this writing, convert_... is the only function with #1 in its name. 360c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * The related Function object contains the name of the function without #n, e.g. convert. 361c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * This is the name with the #, e.g. convert_#1_#2 362c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 363c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mUnexpandedName; 3642217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet ParameterEntry* mReturn; // The return type. The name should be empty. Owned. 365c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<ParameterEntry*> mParameters; // The parameters. Owned. 366c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<std::string> mInline; // The inline code to be included in the header 367c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 368c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet /* Substitute the placeholders in the strings (e.g. #1, #2, ...) by the corresponding 369c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * entries in mReplaceables. indexOfReplaceable1 selects with value to use for #1, 370c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * same for 2, 3, and 4. 371c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 372c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string expandString(std::string s, int indexOfReplaceable[MAX_REPLACEABLES]) const; 373c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet void expandStringVector(const std::vector<std::string>& in, 374c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int replacementIndexes[MAX_REPLACEABLES], 375c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<std::string>* out) const; 376c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 377c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Fill the mPermutations field. 378c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet void createPermutations(Function* function, Scanner* scanner); 379c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 380c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletpublic: 3817c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet FunctionSpecification(Function* function) : mFunction(function), mReturn(nullptr) {} 382c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet ~FunctionSpecification(); 383c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 38467923a9e829d89522bb5338a6d635d807a7ee59bJean-Luc Brouillet Function* getFunction() const { return mFunction; } 385c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getAttribute() const { return mAttribute; } 386c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getTest() const { return mTest; } 387c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getPrecisionLimit() const { return mPrecisionLimit; } 388c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 389c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<FunctionPermutation*>& getPermutations() const { return mPermutations; } 390c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 391c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getName(int replacementIndexes[MAX_REPLACEABLES]) const; 392c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet void getReturn(int replacementIndexes[MAX_REPLACEABLES], std::string* retType, 393c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int* lineNumber) const; 394c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet size_t getNumberOfParams() const { return mParameters.size(); } 395c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet void getParam(size_t index, int replacementIndexes[MAX_REPLACEABLES], std::string* type, 396c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string* name, std::string* testOption, int* lineNumber) const; 397c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet void getInlines(int replacementIndexes[MAX_REPLACEABLES], 398c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<std::string>* inlines) const; 399c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 400c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Parse the "test:" line. 401c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet void parseTest(Scanner* scanner); 402c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 403c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Return true if we need to generate tests for this function. 404c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool hasTests(int versionOfTestFiles) const; 405c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 40636090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet bool hasInline() const { return mInline.size() > 0; } 40736090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet 40836090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet /* Return true if this function can be overloaded. This is added by default to all 40936090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet * specifications, so except for the very few exceptions that start the attributes 41036090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet * with an '=' to avoid this, we'll return true. 41136090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet */ 41236090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet bool isOverloadable() const { 41336090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet return mAttribute.empty() || mAttribute[0] != '='; 41436090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet } 41536090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet 416c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Parse a function specification and add it to specFile. 4172217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet static void scanFunctionSpecification(Scanner* scanner, SpecFile* specFile, int maxApiLevel); 418c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 419c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 420c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/* A concrete version of a function specification, where all placeholders have been replaced by 421c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * actual values. 422c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 423c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass FunctionPermutation { 424c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletprivate: 425c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // These are the expanded version of those found on FunctionSpecification 426c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mName; 427c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mNameTrunk; // The name without any expansion, e.g. convert 428c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mTest; // How to test. One of "scalar", "vector", "noverify", "limited", and 429c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // "none". 430c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mPrecisionLimit; // Maximum precision required when checking output of this 431c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // function. 432c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 433c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // The parameters of the function. This does not include the return type. Owned. 434c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<ParameterDefinition*> mParams; 435c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // The return type. nullptr if a void function. Owned. 436c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet ParameterDefinition* mReturn; 437c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 438c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // The number of input and output parameters. mOutputCount counts the return type. 439c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int mInputCount; 440c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int mOutputCount; 441c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 442c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Whether one of the output parameters is a float. 443c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool mHasFloatAnswers; 444c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 445c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // The inline code that implements this function. Will be empty if not an inline. 446c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<std::string> mInline; 447c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 448c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletpublic: 449c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet FunctionPermutation(Function* function, FunctionSpecification* specification, 450c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int replacementIndexes[MAX_REPLACEABLES], Scanner* scanner); 451c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet ~FunctionPermutation(); 452c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 453c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getName() const { return mName; } 454c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getNameTrunk() const { return mNameTrunk; } 455c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getTest() const { return mTest; } 456c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getPrecisionLimit() const { return mPrecisionLimit; } 457c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 45866fea24fb5f3a02b744a9c71ae0fc22c03c4fc6eJean-Luc Brouillet const std::vector<std::string>& getInline() const { return mInline; } 459c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const ParameterDefinition* getReturn() const { return mReturn; } 460c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int getInputCount() const { return mInputCount; } 461c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet int getOutputCount() const { return mOutputCount; } 462c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet bool hasFloatAnswers() const { return mHasFloatAnswers; } 463c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 464c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<ParameterDefinition*> getParams() const { return mParams; } 465c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 466c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 467c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// An entire spec file and the methods to process it. 468c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass SpecFile { 469c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletprivate: 470c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mSpecFileName; 471c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mHeaderFileName; 472c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mDetailedDocumentationUrl; 473c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string mBriefDescription; 474c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<std::string> mFullDescription; 475c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Text to insert as-is in the generated header. 476c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<std::string> mVerbatimInclude; 477c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 4787c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet /* The constants, types, and functions specifications declared in this 4797c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet * file, in the order they are found in the file. This matters for 480c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * header generation, as some types and inline functions depend 4817c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet * on each other. Pointers not owned. 482c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 4837c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet std::list<ConstantSpecification*> mConstantSpecificationsList; 4847c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet std::list<TypeSpecification*> mTypeSpecificationsList; 4857c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet std::list<FunctionSpecification*> mFunctionSpecificationsList; 4867c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet 4877c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet /* The constants, types, and functions that are documented in this file. 4887c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet * In very rare cases, specifications for an API are split across multiple 4897c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet * files, e.g. currently for ClearObject(). The documentation for 4907c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet * that function must be found in the first spec file encountered, so the 4917c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet * order of the files on the command line matters. 4927c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet */ 4937c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet std::map<std::string, Constant*> mDocumentedConstants; 4947c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet std::map<std::string, Type*> mDocumentedTypes; 4957c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet std::map<std::string, Function*> mDocumentedFunctions; 496c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 497c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletpublic: 498c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet explicit SpecFile(const std::string& specFileName); 499c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 500c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getSpecFileName() const { return mSpecFileName; } 501c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getHeaderFileName() const { return mHeaderFileName; } 502c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getDetailedDocumentationUrl() const { return mDetailedDocumentationUrl; } 503c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::string getBriefDescription() const { return mBriefDescription; } 504c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<std::string>& getFullDescription() const { return mFullDescription; } 505c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<std::string>& getVerbatimInclude() const { return mVerbatimInclude; } 506c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 5077c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet const std::list<ConstantSpecification*>& getConstantSpecifications() const { 5087c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet return mConstantSpecificationsList; 5097c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet } 5107c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet const std::list<TypeSpecification*>& getTypeSpecifications() const { 5117c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet return mTypeSpecificationsList; 5127c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet } 5137c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet const std::list<FunctionSpecification*>& getFunctionSpecifications() const { 5147c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet return mFunctionSpecificationsList; 5157c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet } 5167c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet const std::map<std::string, Constant*>& getDocumentedConstants() const { 5177c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet return mDocumentedConstants; 5187c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet } 5197c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet const std::map<std::string, Type*>& getDocumentedTypes() const { return mDocumentedTypes; } 5207c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet const std::map<std::string, Function*>& getDocumentedFunctions() const { 5217c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet return mDocumentedFunctions; 5227c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet } 523c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 5242217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet bool hasSpecifications() const { 5252217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet return !mDocumentedConstants.empty() || !mDocumentedTypes.empty() || 5262217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet !mDocumentedFunctions.empty(); 5272217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet } 5282217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet 5292217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet bool readSpecFile(int maxApiLevel); 530c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 5317c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet /* These are called by the parser to keep track of the specifications defined in this file. 5327c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet * hasDocumentation is true if this specification containes the documentation. 5337c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet */ 5347c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet void addConstantSpecification(ConstantSpecification* spec, bool hasDocumentation); 5357c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet void addTypeSpecification(TypeSpecification* spec, bool hasDocumentation); 5367c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet void addFunctionSpecification(FunctionSpecification* spec, bool hasDocumentation); 537c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 538c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 539c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// The collection of all the spec files. 540c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletclass SystemSpecification { 541c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletprivate: 542c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::vector<SpecFile*> mSpecFiles; 543c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 544c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet /* Entries in the table of contents. We accumulate them in a map to sort them. 5457c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet * Pointers are owned. 546c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet */ 547c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::map<std::string, Constant*> mConstants; 548c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::map<std::string, Type*> mTypes; 549c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::map<std::string, Function*> mFunctions; 550c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 551c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletpublic: 552c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet ~SystemSpecification(); 5537c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet 5547c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet /* These are called the parser to create unique instances per name. Set *created to true 5557c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet * if the named specification did not already exist. 5567c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet */ 5577c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet Constant* findOrCreateConstant(const std::string& name, bool* created); 5587c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet Type* findOrCreateType(const std::string& name, bool* created); 5597c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet Function* findOrCreateFunction(const std::string& name, bool* created); 5607c07854a959eb70ff9623202b2ca064407a1cc68Jean-Luc Brouillet 5612217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet /* Parse the spec file and create the object hierarchy, adding a pointer to mSpecFiles. 5622217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet * We won't include information passed the specified level. 5632217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet */ 5642217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet bool readSpecFile(const std::string& fileName, int maxApiLevel); 565c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Generate all the files. 5662217eb7b12e598e5b435a732207647918c171560Jean-Luc Brouillet bool generateFiles(bool forVerification, int maxApiLevel) const; 567c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 568c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::vector<SpecFile*>& getSpecFiles() const { return mSpecFiles; } 569c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::map<std::string, Constant*>& getConstants() const { return mConstants; } 570c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::map<std::string, Type*>& getTypes() const { return mTypes; } 571c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet const std::map<std::string, Function*>& getFunctions() const { return mFunctions; } 572c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 573c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet // Returns "<a href='...'> for the named specification, or empty if not found. 574c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet std::string getHtmlAnchor(const std::string& name) const; 57536090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet 57636090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet // Returns the maximum API level specified in any spec file. 57736090673baf50cf3c70bdc89f9a4a872c05cf0f6Jean-Luc Brouillet int getMaximumApiLevel(); 578c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet}; 579c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 580c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// Singleton that represents the collection of all the specs we're processing. 581c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern SystemSpecification systemSpecification; 582c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 583c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet// Table of equivalences of numerical types. 584c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern const NumericalType TYPES[]; 585c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern const int NUM_TYPES; 586c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 587c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#endif // ANDROID_RS_API_GENERATOR_SPECIFICATION_H 588