| 2021 | } |
| 2022 | |
| 2023 | CheckedError Parser::ParseFunction(const std::string *name, Value &e) { |
| 2024 | ParseDepthGuard depth_guard(this); |
| 2025 | ECHECK(depth_guard.Check()); |
| 2026 | |
| 2027 | // Copy name, attribute will be changed on NEXT(). |
| 2028 | const auto functionname = attribute_; |
| 2029 | if (!IsFloat(e.type.base_type)) { |
| 2030 | return Error(functionname + ": type of argument mismatch, expecting: " + |
| 2031 | TypeName(BASE_TYPE_DOUBLE) + |
| 2032 | ", found: " + TypeName(e.type.base_type) + |
| 2033 | ", name: " + (name ? *name : "") + ", value: " + e.constant); |
| 2034 | } |
| 2035 | NEXT(); |
| 2036 | EXPECT('('); |
| 2037 | ECHECK(ParseSingleValue(name, e, false)); |
| 2038 | EXPECT(')'); |
| 2039 | // calculate with double precision |
| 2040 | double x, y = 0.0; |
| 2041 | ECHECK(atot(e.constant.c_str(), *this, &x)); |
| 2042 | // clang-format off |
| 2043 | auto func_match = false; |
| 2044 | #define FLATBUFFERS_FN_DOUBLE(name, op) \ |
| 2045 | if (!func_match && functionname == name) { y = op; func_match = true; } |
| 2046 | FLATBUFFERS_FN_DOUBLE("deg", x / kPi * 180); |
| 2047 | FLATBUFFERS_FN_DOUBLE("rad", x * kPi / 180); |
| 2048 | FLATBUFFERS_FN_DOUBLE("sin", sin(x)); |
| 2049 | FLATBUFFERS_FN_DOUBLE("cos", cos(x)); |
| 2050 | FLATBUFFERS_FN_DOUBLE("tan", tan(x)); |
| 2051 | FLATBUFFERS_FN_DOUBLE("asin", asin(x)); |
| 2052 | FLATBUFFERS_FN_DOUBLE("acos", acos(x)); |
| 2053 | FLATBUFFERS_FN_DOUBLE("atan", atan(x)); |
| 2054 | // TODO(wvo): add more useful conversion functions here. |
| 2055 | #undef FLATBUFFERS_FN_DOUBLE |
| 2056 | // clang-format on |
| 2057 | if (true != func_match) { |
| 2058 | return Error(std::string("Unknown conversion function: ") + functionname + |
| 2059 | ", field name: " + (name ? *name : "") + |
| 2060 | ", value: " + e.constant); |
| 2061 | } |
| 2062 | e.constant = NumToString(y); |
| 2063 | return NoError(); |
| 2064 | } |
| 2065 | |
| 2066 | CheckedError Parser::TryTypedValue(const std::string *name, int dtoken, |
| 2067 | bool check, Value &e, BaseType req, |
nothing calls this directly
no test coverage detected