|  | // Copyright 2013 The Flutter Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef FLUTTER_FML_ASCIITRIE_H_ | 
|  | #define FLUTTER_FML_ASCIITRIE_H_ | 
|  |  | 
|  | #include <memory> | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | namespace fml { | 
|  |  | 
|  | /// A trie for looking for ASCII prefixes. | 
|  | class AsciiTrie { | 
|  | public: | 
|  | struct TrieNode; | 
|  | typedef std::unique_ptr<TrieNode> TrieNodePtr; | 
|  | /// The max Ascii value. | 
|  | static const int kMaxAsciiValue = 128; | 
|  |  | 
|  | /// Clear and insert all the entries into the trie. | 
|  | void Fill(const std::vector<std::string>& entries); | 
|  |  | 
|  | /// Returns true if \p argument is prefixed by the contents of the trie. | 
|  | inline bool Query(const char* argument) { | 
|  | return !node_ || Query(node_.get(), argument); | 
|  | } | 
|  |  | 
|  | struct TrieNode { | 
|  | TrieNodePtr children[kMaxAsciiValue]; | 
|  | }; | 
|  |  | 
|  | private: | 
|  | static bool Query(TrieNode* trie, const char* query); | 
|  | TrieNodePtr node_; | 
|  | }; | 
|  | }  // namespace fml | 
|  |  | 
|  | #endif |