1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #define LOG_TAG "hidl_test" 18 19 #include "Trie.h" 20 #include <android-base/logging.h> 21 #include <inttypes.h> 22 #include <string> 23 24 namespace android { 25 namespace hardware { 26 namespace tests { 27 namespace trie { 28 namespace V1_0 { 29 namespace implementation { 30 31 // Methods from ::android::hardware::tests::trie::V1_0::ITrie follow. 32 Return<void> Trie::newTrie(newTrie_cb _hidl_cb) { 33 LOG(INFO) << "SERVER(Trie) newTrie()"; 34 35 TrieNode ret; 36 ret.isTerminal = false; 37 _hidl_cb(ret); 38 return Void(); 39 } 40 41 Return<void> Trie::addStrings(const TrieNode& trie, const hidl_vec<hidl_string>& strings, 42 addStrings_cb _hidl_cb) { 43 LOG(INFO) << "SERVER(Trie) addStrings(trie, " << strings.size() << " strings)"; 44 45 // Make trie modifiable. 46 TrieNode newTrie = trie; 47 48 for (const auto& str : strings) { 49 addString(&newTrie, str); 50 } 51 _hidl_cb(newTrie); 52 return Void(); 53 } 54 55 Return<void> Trie::containsStrings(const TrieNode& trie, const hidl_vec<hidl_string>& strings, 56 containsStrings_cb _hidl_cb) { 57 LOG(INFO) << "SERVER(Trie) containsStrings(trie, " << strings.size() << " strings)"; 58 59 std::vector<bool> ret(strings.size()); 60 for (size_t i = 0; i != strings.size(); ++i) { 61 ret[i] = containsString(&trie, strings[i]); 62 } 63 _hidl_cb(ret); 64 return Void(); 65 } 66 67 void Trie::addString(TrieNode* trieRoot, const std::string& str) { 68 TrieNode* currNode = trieRoot; 69 70 for (char ch : str) { 71 auto& vec = currNode->next; 72 73 auto it = std::find_if(vec.begin(), vec.end(), 74 [&](const TrieEdge& edge) { return ch == edge.character; }); 75 76 if (it == vec.end()) { 77 vec.resize(vec.size() + 1); 78 it = vec.end() - 1; 79 it->character = ch; 80 it->node.isTerminal = false; 81 } 82 83 currNode = &(it->node); 84 } 85 86 currNode->isTerminal = true; 87 } 88 89 bool Trie::containsString(const TrieNode* trieRoot, const std::string& str) { 90 const TrieNode* currNode = trieRoot; 91 92 for (char ch : str) { 93 const auto& vec = currNode->next; 94 95 auto it = std::find_if(vec.begin(), vec.end(), 96 [&](const TrieEdge& edge) { return ch == edge.character; }); 97 98 if (it == vec.end()) return false; 99 currNode = &(it->node); 100 } 101 102 return currNode->isTerminal; 103 } 104 105 ITrie* HIDL_FETCH_ITrie(const char* /* name */) { 106 return new Trie(); 107 } 108 109 } // namespace implementation 110 } // namespace V1_0 111 } // namespace trie 112 } // namespace tests 113 } // namespace hardware 114 } // namespace android 115