Goose  Artifact [64945f1cf9]

Artifact 64945f1cf92f6f9ae527b6ceb0a0c433a6b3b39aa6b4947a43bfba4227ddc30a:

  • File bs/sema/uni-context.cpp — part of check-in [fec093d83d] at 2019-01-06 16:35:28 on branch trunk — Implement unification scoring. (user: achavasse size: 1725)

#include "sema.h"

using namespace empathy;
using namespace empathy::sema;

UnificationContext::UnificationContext( const ptr< UnificationRuleSet >& rules ) :
    m_rules( rules )
{}

UnificationContext::UnificationContext( ptr< UnificationRuleSet >&& rules ) :
    m_rules( move( rules ) )
{}

uint32_t UnificationContext::getLHSHoleIndex( const StringId& name ) const
{
    HoleName holeName( name, m_currentLHSNamespaceIndex );

    auto it = m_pHoleDict->find( holeName );
    if( it == m_pHoleDict->end() )
        return InvalidIndex;

    return it->second;
}

uint32_t UnificationContext::getRHSHoleIndex( const StringId& name ) const
{
    HoleName holeName( name, m_currentRHSNamespaceIndex );

    auto it = m_pHoleDict->find( holeName );
    if( it == m_pHoleDict->end() )
        return InvalidIndex;

    return it->second;
}

uint32_t UnificationContext::createValue()
{
    m_values = m_values.push_back( { nullopt,0 } );
    uint32_t index = m_values.size() - 1;
    ++m_numUnknownValues;
    return index;
}

void UnificationContext::setValue( uint32_t index, Term&& val, uint32_t complexity )
{
    assert( m_values.size() > index );

    if( !m_values[index].first )
        --m_numUnknownValues;

    m_complexity -= m_values[index].second;
    m_values = m_values.set( index, { move( val ), complexity } );
}

void UnificationContext::setLHSHoleIndex( const StringId& name, uint32_t index )
{
    HoleName holeName( name, m_currentLHSNamespaceIndex );
    CoW( m_pHoleDict )->emplace( holeName, index );
}

void UnificationContext::setRHSHoleIndex( const StringId& name, uint32_t index )
{
    HoleName holeName( name, m_currentRHSNamespaceIndex );
    CoW( m_pHoleDict )->emplace( holeName, index );
}