20 #ifndef TRIE_WITH_POLICY_H_ 
   21 #define TRIE_WITH_POLICY_H_ 
   31 template<
typename FullKey, 
typename PayloadTraits, 
typename PolicyTraits>
 
   32 class trie_with_policy {
 
   34   typedef trie<FullKey, PayloadTraits, typename PolicyTraits::policy_hook_type> parent_trie;
 
   36   typedef typename parent_trie::iterator iterator;
 
   37   typedef typename parent_trie::const_iterator const_iterator;
 
   39   typedef typename PolicyTraits::
 
   40     template policy<trie_with_policy<FullKey, PayloadTraits, PolicyTraits>, parent_trie,
 
   41                     typename PolicyTraits::template container_hook<parent_trie>::type>::type
 
   44   inline trie_with_policy(
size_t bucketSize = 1, 
size_t bucketIncrement = 1)
 
   45     : trie_(name::Component(), bucketSize, bucketIncrement)
 
   50   inline std::pair<iterator, bool>
 
   51   insert(
const FullKey& key, 
typename PayloadTraits::insert_type payload)
 
   53     std::pair<iterator, bool> item = trie_.insert(key, payload);
 
   57       bool ok = policy_.insert(s_iterator_to(item.first));
 
   60         return std::make_pair(end(), 
false);
 
   64       return std::make_pair(s_iterator_to(item.first), 
false);
 
   71   erase(
const FullKey& key)
 
   73     iterator foundItem, lastItem;
 
   75     std::tie(foundItem, reachLast, lastItem) = trie_.find(key);
 
   77     if (!reachLast || lastItem->payload() == PayloadTraits::empty_payload)
 
   89     policy_.erase(s_iterator_to(node));
 
  100   template<
typename Modifier>
 
  102   modify(iterator position, Modifier mod)
 
  104     if (position == end())
 
  106     if (position->payload() == PayloadTraits::empty_payload)
 
  109     mod(*position->payload());
 
  110     policy_.update(position);
 
  118   find_exact(
const FullKey& key)
 
  120     iterator foundItem, lastItem;
 
  122     std::tie(foundItem, reachLast, lastItem) = trie_.find(key);
 
  124     if (!reachLast || lastItem->payload() == PayloadTraits::empty_payload)
 
  134   longest_prefix_match(
const FullKey& key)
 
  136     iterator foundItem, lastItem;
 
  138     std::tie(foundItem, reachLast, lastItem) = trie_.find(key);
 
  139     if (foundItem != trie_.end()) {
 
  140       policy_.lookup(s_iterator_to(foundItem));
 
  148   template<
class Predicate>
 
  150   longest_prefix_match_if(
const FullKey& key, Predicate pred)
 
  152     iterator foundItem, lastItem;
 
  154     std::tie(foundItem, reachLast, lastItem) = trie_.find_if(key, pred);
 
  155     if (foundItem != trie_.end()) {
 
  156       policy_.lookup(s_iterator_to(foundItem));
 
  175   deepest_prefix_match(
const FullKey& key)
 
  177     iterator foundItem, lastItem;
 
  179     std::tie(foundItem, reachLast, lastItem) = trie_.find(key);
 
  182     if (lastItem == trie_.end())
 
  186       if (foundItem == trie_.end()) {
 
  187         foundItem = lastItem->find(); 
 
  189       policy_.lookup(s_iterator_to(foundItem));
 
  200   template<
class Predicate>
 
  202   deepest_prefix_match_if(
const FullKey& key, Predicate pred)
 
  204     iterator foundItem, lastItem;
 
  206     std::tie(foundItem, reachLast, lastItem) = trie_.find(key);
 
  209     if (lastItem == trie_.end())
 
  213       foundItem = lastItem->find_if(pred); 
 
  214       if (foundItem == trie_.end()) {
 
  217       policy_.lookup(s_iterator_to(foundItem));
 
  231   template<
class Predicate>
 
  233   deepest_prefix_match_if_next_level(
const FullKey& key, Predicate pred)
 
  235     iterator foundItem, lastItem;
 
  237     std::tie(foundItem, reachLast, lastItem) = trie_.find(key);
 
  240     if (lastItem == trie_.end())
 
  244       foundItem = lastItem->find_if_next_level(pred); 
 
  245       if (foundItem == trie_.end()) {
 
  248       policy_.lookup(s_iterator_to(foundItem));
 
  274   const policy_container&
 
  286   static inline iterator
 
  287   s_iterator_to(
typename parent_trie::iterator item)
 
  297   mutable policy_container policy_;
 
  306 #endif // TRIE_WITH_POLICY_H_