// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "third_party/libaddressinput/chromium/trie.h" #include #include #include "base/logging.h" // Separating template definitions and declarations requires defining all // possible template parameters to avoid linking errors. namespace i18n { namespace addressinput { class RegionData; } } namespace autofill { template Trie::Trie() {} template Trie::~Trie() {} template void Trie::AddDataForKey(const std::vector& key, const T& data_item) { Trie* current_node = this; for (std::vector::size_type i = 0; i < key.size(); ++i) { if (!key[i]) break; current_node = ¤t_node->sub_nodes_[key[i]]; } current_node->data_list_.insert(data_item); } template void Trie::FindDataForKeyPrefix(const std::vector& key_prefix, std::set* results) const { DCHECK(results); // Find the sub-trie for the key prefix. const Trie* current_node = this; for (std::vector::size_type i = 0; i < key_prefix.size(); ++i) { if (!key_prefix[i]) break; typename std::map >::const_iterator sub_node_it = current_node->sub_nodes_.find(key_prefix[i]); if (sub_node_it == current_node->sub_nodes_.end()) return; current_node = &sub_node_it->second; } // Collect data from all sub-tries. std::queue*> node_queue; node_queue.push(current_node); while (!node_queue.empty()) { const Trie* queue_front = node_queue.front(); node_queue.pop(); results->insert(queue_front->data_list_.begin(), queue_front->data_list_.end()); for (typename std::map >::const_iterator sub_node_it = queue_front->sub_nodes_.begin(); sub_node_it != queue_front->sub_nodes_.end(); ++sub_node_it) { node_queue.push(&sub_node_it->second); } } } template class Trie; template class Trie; } // namespace autofill