Goose  Artifact [29b5302d8c]

Artifact 29b5302d8c03abaddcb81efa4829022e0b0fa64acff8181d18142cb51a3029b6:

  • File bs/sema/uni-ruleset.h — part of check-in [c39a302502] at 2020-05-23 12:58:20 on branch trunk —
    • Fixed the hole matching score which prevented some unification rules to be selected.
    • Implemented LowerTypeForRuntime for tuples.
    • Implemented an unification rule for constant tuples.
    • Added some debugging helpers.
    (user: achavasse size: 1583)

#ifndef GOOSE_SEMA_UNI_RULESET_H
#define GOOSE_SEMA_UNI_RULESET_H

//#define UNIRULES_DEBUG

namespace goose::sema
{
    class UnificationContext;

#ifdef UNIRULES_DEBUG
    struct UniRuleInfo
    {
        const char* pFilename = nullptr;
        uint32_t line = 0;
    };

    #define URINFOS UniRuleInfo{ __FILE__, __LINE__ }
#else
    struct UniRuleInfo
    {};

    #define URINFOS UniRuleInfo{}
#endif

    class UnificationRuleSet
    {
        public:
            using UniFunc = function< UniGen ( const Term& lhs, const Term& rhs, UnificationContext& ) >;
            using HalfUniFunc = function< UniGen ( const Term& lhs, UnificationContext& ) >;

            struct UniRule
            {
                UniFunc func;
                UniRuleInfo infos;
            };

            struct HalfUniRule
            {
                HalfUniFunc func;
                UniRuleInfo infos;
            };

            UnificationRuleSet();

            void addSymRule( UniRuleInfo&& infos, const Term& pat, UniFunc f );
            void addSymRule( UniRuleInfo&& infos, const Term& pat1, const Term& pat2, UniFunc f );
            void addAsymRule( UniRuleInfo&& infos, const Term& pat1, const Term& pat2, UniFunc f );

            void addHalfUnificationRule( UniRuleInfo&& infos, const Term& pat, HalfUniFunc f );

            const auto& uniRules() const { return m_uniRules; }
            const auto& halfUniRules() const { return m_halfUniRules; }

        private:
            Trie< UniRule > m_uniRules;
            Trie< HalfUniRule > m_halfUniRules;
    };
}

#endif