/* Copyright (c) 2018 Microsoft Corporation. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Author: Leonardo de Moura */ #include "library/context_cache.h" #include "library/type_context.h" namespace lean { context_cache::context_cache(): context_cacheless() { } context_cache::context_cache(options const & o): context_cacheless(o) { } context_cache::~context_cache() { } optional context_cache::get_decl(type_context_old & ctx, transparency_mode m, name const & n) { auto & cache = m_transparency_cache[static_cast(m)]; auto it = cache.find(n); if (it != cache.end()) { return it->second; } optional r = context_cacheless::get_decl(ctx, m, n); cache.insert(mk_pair(n, r)); return r; } optional context_cache::get_proj_info(type_context_old & ctx, name const & n) { // TODO(Leo): check if we really need a cache for get_proj_info return context_cacheless::get_proj_info(ctx, n); } bool context_cache::get_aux_recursor(type_context_old & ctx, name const & n) { auto it = m_aux_recursor_cache.find(n); if (it != m_aux_recursor_cache.end()) return it->second; bool r = context_cacheless::get_aux_recursor(ctx, n); m_aux_recursor_cache.insert(mk_pair(n, r)); return r; } template optional find_at(C const & c, K const & e) { auto it = c.find(e); if (it != c.end()) return optional(it->second); else return optional(); } optional context_cache::get_infer(expr const & e) { return find_at(m_infer_cache, e); } void context_cache::set_infer(expr const & e, expr const & ty) { m_infer_cache.insert(mk_pair(e, ty)); } bool context_cache::get_equiv(transparency_mode m, expr const & e1, expr const & e2) { return m_equiv_manager[static_cast(m)].is_equiv(e1, e2); } void context_cache::set_equiv(transparency_mode m, expr const & e1, expr const & e2) { m_equiv_manager[static_cast(m)].add_equiv(e1, e2); } bool context_cache::get_is_def_eq_failure(transparency_mode m, expr const & t, expr const & s) { auto const & fcache = m_failure_cache[static_cast(m)]; if (hash(t) < hash(s)) { return fcache.find(mk_pair(t, s)) != fcache.end(); } else if (hash(t) > hash(s)) { return fcache.find(mk_pair(s, t)) != fcache.end(); } else { return fcache.find(mk_pair(t, s)) != fcache.end() || fcache.find(mk_pair(s, t)) != fcache.end(); } } void context_cache::set_is_def_eq_failure(transparency_mode m, expr const & t, expr const & s) { auto & fcache = m_failure_cache[static_cast(m)]; if (hash(t) <= hash(s)) fcache.insert(mk_pair(t, s)); else fcache.insert(mk_pair(s, t)); } optional context_cache::get_whnf(transparency_mode m, expr const & e) { return find_at(m_whnf_cache[static_cast(m)], e); } void context_cache::set_whnf(transparency_mode m, expr const & e, expr const & r) { m_whnf_cache[static_cast(m)].insert(mk_pair(e, r)); } optional context_cache::get_fun_info(transparency_mode m, expr const & e) { return find_at(m_fi_cache[static_cast(m)], e); } void context_cache::set_fun_info(transparency_mode m, expr const & e, fun_info const & fi) { m_fi_cache[static_cast(m)].insert(mk_pair(e, fi)); } optional context_cache::get_fun_info_nargs(transparency_mode m, expr const & e, unsigned nargs) { return find_at(m_fi_cache_nargs[static_cast(m)], expr_unsigned(e, nargs)); } void context_cache::set_fun_info_nargs(transparency_mode m, expr const & e, unsigned nargs, fun_info const & fi) { m_fi_cache_nargs[static_cast(m)].insert(mk_pair(expr_unsigned(e, nargs), fi)); } optional context_cache::get_specialization_prefix_size(transparency_mode m, expr const & e, unsigned nargs) { return find_at(m_prefix_cache[static_cast(m)], expr_unsigned(e, nargs)); } void context_cache::set_specialization_prefix_size(transparency_mode m, expr const & e, unsigned nargs, unsigned sz) { m_prefix_cache[static_cast(m)].insert(mk_pair(expr_unsigned(e, nargs), sz)); } optional context_cache::get_subsingleton_info(transparency_mode m, expr const & e) { return find_at(m_ss_cache[static_cast(m)], e); } void context_cache::set_subsingleton_info(transparency_mode m, expr const & e, ss_param_infos const & ss) { m_ss_cache[static_cast(m)].insert(mk_pair(e, ss)); } optional context_cache::get_subsingleton_info_nargs(transparency_mode m, expr const & e, unsigned nargs) { return find_at(m_ss_cache_nargs[static_cast(m)], expr_unsigned(e, nargs)); } void context_cache::set_subsingleton_info_nargs(transparency_mode m, expr const & e, unsigned nargs, ss_param_infos const & ss) { m_ss_cache_nargs[static_cast(m)].insert(mk_pair(expr_unsigned(e, nargs), ss)); } optional context_cache::get_specialized_subsingleton_info_nargs(transparency_mode m, expr const & e, unsigned nargs) { return find_at(m_ss_cache_spec[static_cast(m)], expr_unsigned(e, nargs)); } void context_cache::set_specialization_subsingleton_info_nargs(transparency_mode m, expr const & e, unsigned nargs, ss_param_infos const & ss) { m_ss_cache_spec[static_cast(m)].insert(mk_pair(expr_unsigned(e, nargs), ss)); } }