2014-06-14 16:56:05 +00:00
|
|
|
/*
|
|
|
|
Copyright (c) 2014 Microsoft Corporation. All rights reserved.
|
|
|
|
Released under Apache 2.0 license as described in the file LICENSE.
|
|
|
|
|
|
|
|
Author: Leonardo de Moura
|
|
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <utility>
|
|
|
|
#include "util/rb_map.h"
|
|
|
|
#include "util/name.h"
|
|
|
|
#include "util/list.h"
|
|
|
|
#include "util/pair.h"
|
|
|
|
|
|
|
|
namespace lean {
|
|
|
|
/**
|
2015-05-07 18:10:15 +00:00
|
|
|
\brief A map from name to values.
|
2014-06-14 16:56:05 +00:00
|
|
|
|
|
|
|
It also supports the operation \c find_idx that returns "when a declaration was inserted into the map".
|
|
|
|
*/
|
|
|
|
template<typename V>
|
|
|
|
class local_decls {
|
2014-09-28 17:23:11 +00:00
|
|
|
typedef name_map<pair<V, unsigned>> map;
|
2014-10-09 05:21:29 +00:00
|
|
|
typedef list<pair<name, V>> entries;
|
|
|
|
map m_map;
|
|
|
|
entries m_entries;
|
2015-05-07 18:10:15 +00:00
|
|
|
unsigned m_counter;
|
2014-06-14 16:56:05 +00:00
|
|
|
public:
|
|
|
|
local_decls():m_counter(1) {}
|
2014-10-09 05:21:29 +00:00
|
|
|
local_decls(local_decls const & d):
|
2015-05-07 18:10:15 +00:00
|
|
|
m_map(d.m_map), m_entries(d.m_entries), m_counter(d.m_counter) {}
|
2014-09-11 23:37:23 +00:00
|
|
|
void insert(name const & k, V const & v) {
|
|
|
|
m_map.insert(k, mk_pair(v, m_counter));
|
2014-10-09 05:21:29 +00:00
|
|
|
m_entries = cons(mk_pair(k, v), m_entries);
|
2015-05-07 18:10:15 +00:00
|
|
|
m_counter++;
|
2015-05-15 00:17:48 +00:00
|
|
|
lean_assert(m_counter == length(m_entries)+1);
|
|
|
|
}
|
|
|
|
unsigned size() const {
|
|
|
|
lean_assert(m_counter > 0);
|
|
|
|
return m_counter - 1;
|
2014-09-11 23:37:23 +00:00
|
|
|
}
|
2015-06-04 04:40:03 +00:00
|
|
|
void update_entries(entries const & new_entries) {
|
|
|
|
lean_assert(length(new_entries) == length(m_entries));
|
|
|
|
auto it1 = m_entries;
|
|
|
|
auto it2 = new_entries;
|
|
|
|
unsigned i = length(new_entries);
|
|
|
|
while (it1.raw() != it2.raw()) {
|
|
|
|
name const & k = head(it2).first;
|
|
|
|
V const & v = head(it2).second;
|
|
|
|
lean_assert(m_map.find(k));
|
|
|
|
lean_assert_eq(m_map.find(k)->second, i);
|
|
|
|
m_map.insert(k, mk_pair(v, i));
|
|
|
|
it1 = tail(it1);
|
|
|
|
it2 = tail(it2);
|
|
|
|
--i;
|
2015-04-22 19:54:42 +00:00
|
|
|
}
|
2015-06-04 04:40:03 +00:00
|
|
|
m_entries = new_entries;
|
2015-04-22 19:22:17 +00:00
|
|
|
}
|
2015-06-04 04:40:03 +00:00
|
|
|
|
2014-06-14 16:56:05 +00:00
|
|
|
V const * find(name const & k) const { auto it = m_map.find(k); return it ? &(it->first) : nullptr; }
|
|
|
|
unsigned find_idx(name const & k) const { auto it = m_map.find(k); return it ? it->second : 0; }
|
|
|
|
bool contains(name const & k) const { return m_map.contains(k); }
|
2014-10-09 05:21:29 +00:00
|
|
|
entries const & get_entries() const { return m_entries; }
|
2014-10-10 03:48:20 +00:00
|
|
|
bool empty() const { return m_map.empty(); }
|
2014-06-14 16:56:05 +00:00
|
|
|
};
|
|
|
|
}
|