Goose  uni-ruleset.h at [c39a302502]

File bs/sema/uni-ruleset.h artifact 29b5302d8c part of check-in c39a302502


#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