| 138 | |
| 139 | template<typename T> |
| 140 | static T *LookupTableByName(const SymbolTable<T> &table, |
| 141 | const std::string &name, |
| 142 | const Namespace ¤t_namespace, |
| 143 | size_t skip_top) { |
| 144 | const auto &components = current_namespace.components; |
| 145 | if (table.dict.empty()) return nullptr; |
| 146 | if (components.size() < skip_top) return nullptr; |
| 147 | const auto N = components.size() - skip_top; |
| 148 | std::string full_name; |
| 149 | for (size_t i = 0; i < N; i++) { |
| 150 | full_name += components[i]; |
| 151 | full_name += '.'; |
| 152 | } |
| 153 | for (size_t i = N; i > 0; i--) { |
| 154 | full_name += name; |
| 155 | auto obj = table.Lookup(full_name); |
| 156 | if (obj) return obj; |
| 157 | auto len = full_name.size() - components[i - 1].size() - 1 - name.size(); |
| 158 | full_name.resize(len); |
| 159 | } |
| 160 | FLATBUFFERS_ASSERT(full_name.empty()); |
| 161 | return table.Lookup(name); // lookup in global namespace |
| 162 | } |
| 163 | |
| 164 | // Declare tokens we'll use. Single character tokens are represented by their |
| 165 | // ascii character code (e.g. '{'), others above 256. |
no test coverage detected