Goose  Artifact [d028f84504]

Artifact d028f84504b5449b3b1f06d4da310dcd502bd6604aa656d9059f09e319bcfc96:

  • File bs/sema/uni-context.cpp — part of check-in [1c4c7dde4c] at 2019-02-24 15:37:01 on branch trunk — Templates: implemented the template rules for Decl, TDecl, TNamedDecl and TVar. (user: achavasse size: 2300)

#include "sema.h"

using namespace empathy;
using namespace empathy::sema;

UnificationContext::UnificationContext( const ptr< Env >& env ) :
    m_env( env )
{}

UnificationContext::UnificationContext( ptr< Env >&& env ) :
    m_env( move( env ) )
{}

uint32_t UnificationContext::getLHSHoleIndex( const StringId& name ) const
{
    if( name == "_"_sid )
        return InvalidIndex;

    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
{
    if( name == "_"_sid )
        return InvalidIndex;

    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 )
{
    if( name == "_"_sid )
        return;

    HoleName holeName( name, m_currentLHSNamespaceIndex );
    CoW( m_pCow )->holeDict.emplace( holeName, index );
}

void UnificationContext::setRHSHoleIndex( const StringId& name, uint32_t index )
{
    if( name == "_"_sid )
        return;

    HoleName holeName( name, m_currentRHSNamespaceIndex );
    CoW( m_pCow )->holeDict.emplace( holeName, index );
}

void UnificationContext::eraseLHSName( const StringId& name )
{
    HoleName holeName( name, m_currentLHSNamespaceIndex );
    CoW( m_pCow )->holeDict.erase( holeName );
}

void UnificationContext::eraseRHSName( const StringId& name )
{
    HoleName holeName( name, m_currentRHSNamespaceIndex );
    CoW( m_pCow )->holeDict.erase( holeName );
}

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 );
}