/* Copyright (c) 2018 Microsoft Corporation. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Author: Leonardo de Moura */ #pragma once #include #include "library/unique_id.h" #include "library/abstract_context_cache.h" namespace lean { class context_cache; typedef unique_id context_cache_id; /* Ideally, we could have a "functional" implementation of abstract_context_cache using rb_map and rb_tree. This "functional" implementation could be used to store the cache, for example, in tactic_state objects. We don't use this solution for two reasons: - rb_map (and rb_tree) are 10x slower than hashtable maps (and sets). - The functional object would increase the size of the tactic_state object considerably. This class provides an alternative implementation where the tactic_state stores only the cache id. This id is used to retrieve a thread local context_cache object. See comment at abstract_context_cache for more details. */ class persistent_context_cache : public abstract_context_cache { context_cache_id m_id; std::unique_ptr m_cache_ptr; public: persistent_context_cache(context_cache_id, options const &); virtual ~persistent_context_cache(); context_cache_id get_id() const { return m_id; } /* Cached configuration options */ virtual options const & get_options() const override; virtual bool get_unfold_lemmas() const override; virtual unsigned get_nat_offset_cnstr_threshold() const override; virtual unsigned get_smart_unfolding() const override; virtual unsigned get_class_instance_max_depth() const override; /* Operations for accessing environment data more efficiently. The default implementation provided by this class does not have any optimization. */ virtual optional get_decl(type_context_old &, transparency_mode, name const &) override; virtual projection_info const * get_proj_info(type_context_old &, name const &) override; virtual bool get_aux_recursor(type_context_old &, name const &) override; /* Cache support for type_context_old module */ virtual optional get_infer(expr const &) override; virtual void set_infer(expr const &, expr const &) override; virtual bool get_equiv(transparency_mode, expr const &, expr const &) override; virtual void set_equiv(transparency_mode, expr const &, expr const &) override; virtual bool get_is_def_eq_failure(transparency_mode, expr const &, expr const &) override; virtual void set_is_def_eq_failure(transparency_mode, expr const &, expr const &) override; virtual optional get_whnf(transparency_mode, expr const &) override; virtual void set_whnf(transparency_mode, expr const &, expr const &) override; virtual optional> get_instance(expr const &) override; virtual void set_instance(expr const &, optional const &) override; virtual optional> get_subsingleton(expr const &) override; virtual void set_subsingleton(expr const &, optional const &) override; /* this method should flush the instance and subsingleton cache */ virtual void flush_instances() override; virtual void reset_frozen_local_instances() override; virtual void set_frozen_local_instances(local_instances const & lis) override; virtual optional get_frozen_local_instances() const override; /* Cache support for fun_info module */ virtual optional get_fun_info(transparency_mode, expr const &) override; virtual void set_fun_info(transparency_mode, expr const &, fun_info const &) override; virtual optional get_fun_info_nargs(transparency_mode, expr const &, unsigned) override; virtual void set_fun_info_nargs(transparency_mode, expr const &, unsigned, fun_info const &) override; virtual optional get_specialization_prefix_size(transparency_mode, expr const &, unsigned) override; virtual void set_specialization_prefix_size(transparency_mode, expr const &, unsigned, unsigned) override; virtual optional get_subsingleton_info(transparency_mode, expr const &) override; virtual void set_subsingleton_info(transparency_mode, expr const &, ss_param_infos const &) override; virtual optional get_subsingleton_info_nargs(transparency_mode, expr const &, unsigned) override; virtual void set_subsingleton_info_nargs(transparency_mode, expr const &, unsigned, ss_param_infos const &) override; virtual optional get_specialized_subsingleton_info_nargs(transparency_mode, expr const &, unsigned) override; virtual void set_specialization_subsingleton_info_nargs(transparency_mode, expr const &, unsigned, ss_param_infos const &) override; /* Cache support for app_builder */ virtual optional get_app_builder_info(expr const &, unsigned) override; virtual void set_app_builder_info(expr const &, unsigned, app_builder_info const &) override; virtual optional get_app_builder_info(expr const &, list const &) override; virtual void set_app_builder_info(expr const &, list const &, app_builder_info const &) override; }; }