#if !defined(_INLINE)
static char cvsid[] = "@(#)$Id: IndexableContainer.cpp,v 1.4 1999/05/22 13:00:34 philogelos Exp $";
static char debugFileId[] = __FILE__;
#endif
#include "containers/IndexableContainer.hpp"
#include "containers/IndexPosition.hpp"
#include "Debug.hpp"
#include "OGuard.hpp"
IndexableContainer::~IndexableContainer()
{}
IndexPosition *IndexableContainer::getPosition( const Index anIndex )
{
preC_( isValidIndex( anIndex ) );
return new IndexPosition( anIndex, this );
}
boolean IndexableContainer::isValid( const Position *aPosition ) const
{
preC_( aPosition != null );
OGuard _( aPosition, this );
if( ( ( const Container * ) aPosition -> getContainer() ) != this )
{
return false;
}
if( DCAST( aPosition, IndexPosition ) == null )
{
return false;
}
return isValidIndex
( DCAST( aPosition, IndexPosition ) -> getIndex() );
}
Top *IndexableContainer::getValue( const Position * aPosition )
{
preC_( aPosition != null );
preC_( isValid( aPosition ) );
return( aPosition -> getValue() );
}
Top *IndexableContainer::setValue( MutablePosition *aPosition, Top *aNewValue )
{
preC_( aPosition != null );
preC_( isValid( aPosition ) );
return( aPosition -> setValue( aNewValue ) );
}
IndexableContainer::InvalidIndex::InvalidIndex( String aMessage, const Top *const aSource ) :
InvalidArgument( aMessage, aSource ),
Exception( aMessage, aSource )
{}
String IndexableContainer::InvalidIndex::getDescription() const
{
return InvalidArgument::getDescription() +
String( ": index is beyond the domain of this container", false );
}
String IndexableContainer::InvalidIndex::getClassName() const
{
return "InvalidIndex";
}
PiMap::PiMap( const Index aProj )
{
setProj( aProj );
}
PiMap::~PiMap()
{}
void PiMap::setProj( const Index aProj )
{
projection = aProj;
}
Top *PiMap::apply( Top *anArgument )
{
IndexableContainer *tuple;
tuple = dynamic_cast< IndexableContainer * >( anArgument );
test_( tuple != ( IndexableContainer * ) NIL );
test_( tuple -> isValidIndex( projection ) );
return( tuple -> getAt( projection ) );
}
#if defined(_INLINE)
#include "../src/Debug.ipp"
#endif