Goose  Artifact [aa2bdc128c]

Artifact aa2bdc128c971706a9f1aa900a2c8211f9136e61700b2082c82f519b5b72e365:

  • File bs/sema/env.h — part of check-in [12db48f235] at 2019-02-13 21:51:43 on branch trunk — Templates: added template rules base classes. (user: achavasse size: 1826)

#ifndef EMPATHY_SEMA_ENV_H
#define EMPATHY_SEMA_ENV_H

namespace empathy::sema
{
    class TemplateRuleSet;
    class InvocationRuleSet;
    class UnificationRuleSet;

    class Env
    {
        public:
            Env();

            enum class Status
            {
                Success,
                NoMatch,
                AmbiguousMatch
            };

            using ValueProvider = function< Status ( const Context& c, const Term& identity, const Term& contextId, Term& result ) >;

            void storeValue( const Term& idPat, const Term& contextIdPat, const Term& val );
            void storeValue( const Term& idPat, const Term& contextIdPat, const ptr< ValueProvider >& valp );
            Status retrieveValue( const Term& id, const Context& c, Term& result ) const;

            void addTransitiveImport( const Term& toImport, const Term& destination );
            void addIntransitiveImport( const Term& toImport, const Term& destination );

            const auto& templateRuleSet() const { return m_templateRuleSet; }
            const auto& invocationRuleSet() const { return m_invocationRuleSet; }
            const auto& unificationRuleSet() const { return m_unificationRuleSet; }

            auto& templateRuleSet() { return m_templateRuleSet; }
            auto& invocationRuleSet() { return m_invocationRuleSet; }
            auto& unificationRuleSet() { return m_unificationRuleSet; }

            static auto GetUniqueId() { return ms_nextUniqueId++; }

        private:
            Trie< ptr< ValueProvider > >    m_valueStore;
            ptr< TemplateRuleSet >          m_templateRuleSet;
            ptr< InvocationRuleSet >        m_invocationRuleSet;
            ptr< UnificationRuleSet >       m_unificationRuleSet;

            static uint32_t ms_nextUniqueId;
    };
}

#endif