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