#include "mvc.h"
ABC_NAMESPACE_IMPL_START
int Mvc_CubeCompareInt( Mvc_Cube_t * pC1, Mvc_Cube_t * pC2, Mvc_Cube_t * pMask )
{
if ( Mvc_Cube1Words(pC1) )
{
if ( pC1->pData[0] < pC2->pData[0] )
return -1;
if ( pC1->pData[0] > pC2->pData[0] )
return 1;
return 0;
}
else if ( Mvc_Cube2Words(pC1) )
{
if ( pC1->pData[1] < pC2->pData[1] )
return -1;
if ( pC1->pData[1] > pC2->pData[1] )
return 1;
if ( pC1->pData[0] < pC2->pData[0] )
return -1;
if ( pC1->pData[0] > pC2->pData[0] )
return 1;
return 0;
}
else
{
int i = Mvc_CubeReadLast(pC1);
for(; i >= 0; i--)
{
if ( pC1->pData[i] < pC2->pData[i] )
return -1;
if ( pC1->pData[i] > pC2->pData[i] )
return 1;
}
return 0;
}
}
int Mvc_CubeCompareSizeAndInt( Mvc_Cube_t * pC1, Mvc_Cube_t * pC2, Mvc_Cube_t * pMask )
{
if ( Mvc_CubeReadSize( pC1 ) < Mvc_CubeReadSize( pC2 ) )
return 1;
if ( Mvc_CubeReadSize( pC1 ) > Mvc_CubeReadSize( pC2 ) )
return -1;
if ( Mvc_Cube1Words( pC1 ) )
{
if ( pC1->pData[0] < pC2->pData[0] )
return -1;
if ( pC1->pData[0] > pC2->pData[0] )
return 1;
return 0;
}
else if ( Mvc_Cube2Words( pC1 ) )
{
if ( pC1->pData[1] < pC2->pData[1] )
return -1;
if ( pC1->pData[1] > pC2->pData[1] )
return 1;
if ( pC1->pData[0] < pC2->pData[0] )
return -1;
if ( pC1->pData[0] > pC2->pData[0] )
return 1;
return 0;
}
else
{
int i = Mvc_CubeReadLast( pC1 );
for(; i >= 0; i--)
{
if ( pC1->pData[i] < pC2->pData[i] )
return -1;
if ( pC1->pData[i] > pC2->pData[i] )
return 1;
}
return 0;
}
}
int Mvc_CubeCompareIntUnderMask( Mvc_Cube_t * pC1, Mvc_Cube_t * pC2, Mvc_Cube_t * pMask )
{
unsigned uBits1, uBits2;
if ( Mvc_Cube1Words(pC1) )
{
uBits1 = pC1->pData[0] & pMask->pData[0];
uBits2 = pC2->pData[0] & pMask->pData[0];
if ( uBits1 < uBits2 )
return -1;
if ( uBits1 > uBits2 )
return 1;
return 0;
}
else if ( Mvc_Cube2Words(pC1) )
{
uBits1 = pC1->pData[1] & pMask->pData[1];
uBits2 = pC2->pData[1] & pMask->pData[1];
if ( uBits1 < uBits2 )
return -1;
if ( uBits1 > uBits2 )
return 1;
uBits1 = pC1->pData[0] & pMask->pData[0];
uBits2 = pC2->pData[0] & pMask->pData[0];
if ( uBits1 < uBits2 )
return -1;
if ( uBits1 > uBits2 )
return 1;
return 0;
}
else
{
int i = Mvc_CubeReadLast(pC1);
for(; i >= 0; i--)
{
uBits1 = pC1->pData[i] & pMask->pData[i];
uBits2 = pC2->pData[i] & pMask->pData[i];
if ( uBits1 < uBits2 )
return -1;
if ( uBits1 > uBits2 )
return 1;
}
return 0;
}
}
int Mvc_CubeCompareIntOutsideMask( Mvc_Cube_t * pC1, Mvc_Cube_t * pC2, Mvc_Cube_t * pMask )
{
unsigned uBits1, uBits2;
if ( Mvc_Cube1Words(pC1) )
{
uBits1 = pC1->pData[0] | pMask->pData[0];
uBits2 = pC2->pData[0] | pMask->pData[0];
if ( uBits1 < uBits2 )
return -1;
if ( uBits1 > uBits2 )
return 1;
return 0;
}
else if ( Mvc_Cube2Words(pC1) )
{
uBits1 = pC1->pData[1] | pMask->pData[1];
uBits2 = pC2->pData[1] | pMask->pData[1];
if ( uBits1 < uBits2 )
return -1;
if ( uBits1 > uBits2 )
return 1;
uBits1 = pC1->pData[0] | pMask->pData[0];
uBits2 = pC2->pData[0] | pMask->pData[0];
if ( uBits1 < uBits2 )
return -1;
if ( uBits1 > uBits2 )
return 1;
return 0;
}
else
{
int i = Mvc_CubeReadLast(pC1);
for(; i >= 0; i--)
{
uBits1 = pC1->pData[i] | pMask->pData[i];
uBits2 = pC2->pData[i] | pMask->pData[i];
if ( uBits1 < uBits2 )
return -1;
if ( uBits1 > uBits2 )
return 1;
}
return 0;
}
}
int Mvc_CubeCompareIntOutsideAndUnderMask( Mvc_Cube_t * pC1, Mvc_Cube_t * pC2, Mvc_Cube_t * pMask )
{
unsigned uBits1, uBits2;
if ( Mvc_Cube1Words(pC1) )
{
uBits1 = pC1->pData[0] & ~(pMask->pData[0]);
uBits2 = pC2->pData[0] & ~(pMask->pData[0]);
if ( uBits1 < uBits2 )
return -1;
if ( uBits1 > uBits2 )
return 1;
uBits1 = pC1->pData[0] & pMask->pData[0];
uBits2 = pC2->pData[0] & pMask->pData[0];
if ( uBits1 < uBits2 )
return -1;
if ( uBits1 > uBits2 )
return 1;
assert( 0 );
return 0;
}
else if ( Mvc_Cube2Words(pC1) )
{
uBits1 = pC1->pData[1] & ~(pMask->pData[1]);
uBits2 = pC2->pData[1] & ~(pMask->pData[1]);
if ( uBits1 < uBits2 )
return -1;
if ( uBits1 > uBits2 )
return 1;
uBits1 = pC1->pData[0] & ~(pMask->pData[0]);
uBits2 = pC2->pData[0] & ~(pMask->pData[0]);
if ( uBits1 < uBits2 )
return -1;
if ( uBits1 > uBits2 )
return 1;
uBits1 = pC1->pData[1] & pMask->pData[1];
uBits2 = pC2->pData[1] & pMask->pData[1];
if ( uBits1 < uBits2 )
return -1;
if ( uBits1 > uBits2 )
return 1;
uBits1 = pC1->pData[0] & pMask->pData[0];
uBits2 = pC2->pData[0] & pMask->pData[0];
if ( uBits1 < uBits2 )
return -1;
if ( uBits1 > uBits2 )
return 1;
assert( 0 );
return 0;
}
else
{
int i;
for( i = Mvc_CubeReadLast(pC1); i >= 0; i-- )
{
uBits1 = pC1->pData[i] & ~(pMask->pData[i]);
uBits2 = pC2->pData[i] & ~(pMask->pData[i]);
if ( uBits1 < uBits2 )
return -1;
if ( uBits1 > uBits2 )
return 1;
}
for( i = Mvc_CubeReadLast(pC1); i >= 0; i-- )
{
uBits1 = pC1->pData[i] & pMask->pData[i];
uBits2 = pC2->pData[i] & pMask->pData[i];
if ( uBits1 < uBits2 )
return -1;
if ( uBits1 > uBits2 )
return 1;
}
assert( 0 );
return 0;
}
}
ABC_NAMESPACE_IMPL_END