#if !defined(_INLINE)
static char cvsid[] = "@(#)$Id: Integer.cpp,v 1.3 1999/05/22 13:00:29 philogelos Exp $";
static char debugFileId[] = __FILE__;
#endif
#include "Integer.hpp"
#include "Debug.hpp"
#include "OGuard.hpp"
#include "AeternalLifeController.hpp"
#include "exceptions/NotImplemented.hpp"
#include "exceptions/DivideByZero.hpp"
Integer::Integer( Index anInt )
{
setInt( anInt );
}
Integer::Integer( const Integer &anInteger )
{
setInt( anInteger.getInt() );
}
Index Integer::getInt() const
{
return core;
}
void Integer::setInt( Index anInt )
{
core = anInt;
}
const Integer *Integer::getZero()
{
if( zero == ( const Integer * ) NIL )
{
zero = new Integer( 0 );
zero -> dontManage();
}
return zero;
}
Integer *Integer::next() const
{
return new Integer( getInt() + 1 );
}
void Integer::inc()
{
setInt( getInt() + 1 );
}
boolean Integer::isZero() const
{
return( equals( getZero() ) );
}
Integer *Integer::add( const Integer *aTerm ) const
{
preC_( aTerm != ( const Integer * ) NIL );
return new Integer( getInt() + ( aTerm -> getInt() ) );
}
Integer *Integer::sub( const Integer *aTerm ) const
{
preC_( aTerm != ( const Integer * ) NIL );
return new Integer( getInt() - ( aTerm -> getInt() ) );
}
Integer *Integer::mul( const Integer *aTerm ) const
{
preC_( aTerm != ( const Integer * ) NIL );
return new Integer( getInt() * ( aTerm -> getInt() ) );
}
Integer *Integer::div( const Integer *aTerm ) const THROWS( DivideByZero * )
{
preC_( aTerm != ( const Integer * ) NIL );
if( aTerm -> equals( getZero() ) )
{
throw new DivideByZero( "Integer::div", null );
}
else
{
return new Integer( getInt() / ( aTerm -> getInt() ) );
}
}
boolean Integer::equals( const Top *anOther ) const
{
Integer *other;
other = DCAST( anOther, Integer );
if( other == ( Integer * ) NIL )
{
return false;
}
else
{
return( getInt() == other -> getInt() );
}
}
Top *Integer::clone() const
{
return new Integer( *this );
}
String Integer::getString() const
{
return String( getInt() );
}
String Integer::getClassName() const
{
return "Integer";
}
boolean Integer::invariant() const
{
return( Object::invariant() &&
(true ) );
}
#if defined( TESTING )
boolean Integer::tester( int ) const
{
{
Debug::getLogger() -> log( "Integer testing: constructor" );
Integer *target;
target = new Integer( 0 );
OGuard _target( target, this );
Debug::getLogger() -> logObject( "Fresh: %s", target );
if( ! ( target -> invariant() ) )
{
Debug::getLogger() -> log( "Invariant broken!" );
return false;
}
}
{
Debug::getLogger() -> log( "Integer testing: getZero" );
Integer *target;
target = new Integer( 0 );
OGuard _target( target, this );
Debug::getLogger() -> logObject( "Fresh: %s", target );
Debug::getLogger() -> logObject( "getZero: %s", getZero() );
if( ! ( target -> equals( getZero() ) ) )
{
Debug::getLogger() -> log( "Wrong zero!" );
return false;
}
}
return true;
}
#endif
const Integer *Integer::zero = ( const Integer * ) NIL;
#if defined(_INLINE)
#include "../src/Debug.ipp"
#endif