25 #include <boost/intrusive/options.hpp>
26 #include <boost/intrusive/set.hpp>
35 struct lfu_policy_traits {
43 struct policy_hook_type :
public boost::intrusive::set_member_hook<> {
47 template<
class Container>
48 struct container_hook {
49 typedef boost::intrusive::member_hook<Container, policy_hook_type, &Container::policy_hook_>
53 template<
class Base,
class Container,
class Hook>
56 get_order(
typename Container::iterator item)
58 return static_cast<policy_hook_type*
>(policy_container::value_traits::to_node_ptr(*item))
63 get_order(
typename Container::const_iterator item)
65 return static_cast<const policy_hook_type*
>(
66 policy_container::value_traits::to_node_ptr(*item))->frequency;
70 struct MemberHookLess {
72 operator()(
const Key& a,
const Key& b)
const
74 return get_order(&a) < get_order(&b);
78 typedef boost::intrusive::multiset<Container,
79 boost::intrusive::compare<MemberHookLess<Container>>,
80 Hook> policy_container;
83 class type :
public policy_container {
85 typedef policy policy_base;
86 typedef Container parent_trie;
95 update(
typename parent_trie::iterator item)
97 policy_container::erase(policy_container::s_iterator_to(*item));
99 policy_container::insert(*item);
103 insert(
typename parent_trie::iterator item)
107 if (max_size_ != 0 && policy_container::size() >= max_size_) {
109 base_.erase(&(*policy_container::begin()));
112 policy_container::insert(*item);
117 lookup(
typename parent_trie::iterator item)
119 policy_container::erase(policy_container::s_iterator_to(*item));
120 get_order(item) += 1;
121 policy_container::insert(*item);
125 erase(
typename parent_trie::iterator item)
127 policy_container::erase(policy_container::s_iterator_to(*item));
133 policy_container::clear();
137 set_max_size(
size_t max_size)
139 max_size_ = max_size;
150 : base_(*((Base*)0)){};
165 #endif // LFU_POLICY_H