/* Copyright (c) 2016 Microsoft Corporation. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Author: Leonardo de Moura */ #include #include "util/serializer.h" #include "library/export_decl.h" #include "library/scoped_ext.h" namespace lean { static name * g_class_name = nullptr; static std::string * g_key = nullptr; static void write_pair_name(serializer & s, pair const & p) { s << p.first << p.second; } static serializer & operator<<(serializer & s, pair const & p) { write_pair_name(s, p); return s; } static pair read_pair_name(deserializer & d) { pair r; d >> r.first >> r.second; return r; } bool operator==(export_decl const & d1, export_decl const & d2) { return d1.m_ns == d2.m_ns && d1.m_as == d2.m_as && d1.m_decls == d2.m_decls && d1.m_had_explicit == d2.m_had_explicit && d1.m_metacls == d2.m_metacls && d1.m_renames == d2.m_renames && d1.m_except_names == d2.m_except_names; } bool operator!=(export_decl const & d1, export_decl const & d2) { return !(d1 == d2); } struct export_decl_config { typedef export_decl entry; typedef list state; static void add_entry(environment const &, io_state const &, state & s, entry const & e) { if (std::find(s.begin(), s.end(), e) == s.end()) { s = cons(e, s); } } static name const & get_class_name() { return *g_class_name; } static std::string const & get_serialization_key() { return *g_key; } static void write_entry(serializer & s, entry const & e) { s << e.m_ns << e.m_as << e.m_decls << e.m_had_explicit; write_list(s, e.m_metacls); write_list(s, e.m_except_names); write_list>(s, e.m_renames); } static entry read_entry(deserializer & d) { entry e; d >> e.m_ns >> e.m_as >> e.m_decls >> e.m_had_explicit; e.m_metacls = read_list(d, read_name); e.m_except_names = read_list(d, read_name); e.m_renames = read_list>(d, read_pair_name); return e; } static optional get_fingerprint(entry const &) { return optional(); } }; template class scoped_ext; typedef scoped_ext export_decl_ext; environment add_export_decl(environment const & env, export_decl const & entry) { bool persistent = true; return export_decl_ext::add_entry(env, get_dummy_ios(), entry, get_namespace(env), persistent); } list get_export_decls(environment const & env) { return export_decl_ext::get_state(env); } name const & get_export_decl_class_name() { return *g_class_name; } void initialize_export_decl() { g_class_name = new name("export_decl"); g_key = new std::string("export_decl"); export_decl_ext::initialize(); } void finalize_export_decl() { delete g_class_name; delete g_key; export_decl_ext::finalize(); } }