Goose  Artifact [ac360a8154]

Artifact ac360a815411d49d42a61082a900918fb4d44b22cdf8912bbdd20137a384083f:

  • File bs/sema/uni-context.cpp — part of check-in [b5952084af] at 2019-01-07 22:00:03 on branch trunk — Unification: detect and reject solutions with recursively nested holes. (user: achavasse size: 1798)

#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_pCow->holeDict.find( holeName );
    if( it == m_pCow->holeDict.end() )
        return InvalidIndex;

    return it->second;
}

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

    auto it = m_pCow->holeDict.find( holeName );
    if( it == m_pCow->holeDict.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::setLHSHoleIndex( const StringId& name, uint32_t index )
{
    HoleName holeName( name, m_currentLHSNamespaceIndex );
    CoW( m_pCow )->holeDict.emplace( holeName, index );
}

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

bool UnificationContext::isHoleLocked( uint32_t index ) const
{
    return m_pCow->lockedHoles.find( index ) != m_pCow->lockedHoles.end();
}

void UnificationContext::lockHole( uint32_t index )
{
    CoW( m_pCow )->lockedHoles.emplace( index );
}

void UnificationContext::unlockHole( uint32_t index )
{
    CoW( m_pCow )->lockedHoles.erase( index );
}