Goose  Artifact [0f3cf64b45]

Artifact 0f3cf64b45c45e78a8b0daeae7149c185c5d37b0251c8ad99e54562a4bf2a550:

  • File bs/sema/uni-context.h — part of check-in [f764dd2384] at 2018-12-17 14:39:33 on branch trunk — Refactored unify as a generator that can yield multiple solutions, along with a score to order them. (user: achavasse size: 1637)

#ifndef EMPATHY_SEMA_UNI_CONTEXT_H
#define EMPATHY_SEMA_UNI_CONTEXT_H

namespace empathy::sema
{
    class UnificationRuleSet;

    class UnificationContext
    {
        public:
            UnificationContext( const ptr< UnificationRuleSet >& rules );
            UnificationContext( ptr< UnificationRuleSet >&& rules );

            const auto& rules() const { return m_rules; }

            optional< uint32_t > getLHSHoleIndex( const StringId& name );
            optional< uint32_t > getRHSHoleIndex( const StringId& name );

            uint32_t createValue();
            void setLHSHoleIndex( const StringId& name, uint32_t index );
            void setRHSHoleIndex( const StringId& name, uint32_t index );

            const optional< Term >& getValue( uint32_t index ) const
            {
                assert( m_values.size() > index );
                return m_values[index];
            }

            UnificationContext& flip()
            {
                swap( m_currentLHSNamespaceIndex, m_currentRHSNamespaceIndex );
                return *this;
            }

        private:
            ptr< UnificationRuleSet >                   m_rules;
            immer::vector< optional< Term > >           m_values;

            uint32_t                                    m_currentLHSNamespaceIndex = 1;
            uint32_t                                    m_currentRHSNamespaceIndex = 2;

            using HoleName = pair< StringId, uint32_t >;
            ptr< unordered_map< HoleName, uint32_t > >  m_holes;

            size_t                                      m_dependencyUpdateCount = 1024;
    };
}

#endif