Ejemplo n.º 1
0
int LRUCache::get(int key) {
    hash_iterator hash_iter = hash_map_.find(key);
    if (hash_iter == hash_map_.end()) return -1;
    int value = hash_iter->second->value;
    remove(hash_iter->second);
    append(key, value);
    return value;
}
Ejemplo n.º 2
0
void LRUCache::set(int key, int value) {
    hash_iterator hash_iter = hash_map_.find(key);
    if (hash_iter != hash_map_.end()) {
        remove(hash_iter->second);                                                                                                                                                          
        append(key, value);
        return;
    }

    append(key, value);
    while (lst_.size() > capacity_) {
        remove(--lst_.end());
    }
}
Ejemplo n.º 3
0
    virtual size_t      get_addr_hash               (void const* p)
    {
        //!!! accept 'table size' to do 'hash % table_size'
        // will give more information for state exploration

        hash_map_t::iterator iter (hash_map_.find(p));
        if (iter != hash_map_.end() && iter->first == p)
        {
            return iter->second;
        }
        else
        {
            //!!! distribute hashes more randomly, use rand()
            size_t hash = hash_seq_++;
            hash_map_.insert(std::make_pair(p, hash));
            return hash;
        }
    }
Ejemplo n.º 4
0
void LRUCache::remove(elem_iterator it) {
    hash_map_.erase(it->key); 
    lst_.erase(it);
}
Ejemplo n.º 5
0
void LRUCache::append(int key, int value) {
    lst_.emplace_front(key, value);
    pair<hash_iterator, bool> ret = 
        hash_map_.insert(hash_value_type(key, lst_.begin()));
    if (!ret.second) ret.first->second = lst_.begin();
}