/** ** \file assert/libassert.hxx ** \brief Implementation of functions exported by the assert module. */ #pragma once #include #include #include #include #include namespace assert { template void bind_and_types_check(A& tree) { misc::error e; e << ::assert::bind(tree); e.ice_on_error_here(); e << ::assert::types_check(tree); e.ice_on_error_here(); } template A* raw_desugar(const A& tree, bool desugar_for_p, bool desugar_string_cmp_p) { DesugarVisitor desugar(desugar_for_p, desugar_string_cmp_p); desugar(tree); return dynamic_cast(desugar.result_get()); } template A* desugar(const A& tree, bool desugar_for_p, bool desugar_string_cmp_p) { A* desugared = raw_desugar(tree, desugar_for_p, desugar_string_cmp_p); assertion(desugared); std::unique_ptr desugared_ptr(desugared); bind_and_types_check(*desugared_ptr); return desugared_ptr.release(); } }