#include "mvc.h"
ABC_NAMESPACE_IMPL_START
static void Mvc_CoverRemoveDuplicates( Mvc_Cover_t * pCover );
static void Mvc_CoverRemoveContained( Mvc_Cover_t * pCover );
int Mvc_CoverContain( Mvc_Cover_t * pCover )
{
int nCubes;
nCubes = Mvc_CoverReadCubeNum( pCover );
if ( nCubes < 2 )
return 0;
Mvc_CoverSetCubeSizes(pCover);
Mvc_CoverSort( pCover, NULL, Mvc_CubeCompareSizeAndInt );
Mvc_CoverRemoveDuplicates( pCover );
if ( nCubes > 1 )
Mvc_CoverRemoveContained( pCover );
return (nCubes != Mvc_CoverReadCubeNum(pCover));
}
void Mvc_CoverRemoveDuplicates( Mvc_Cover_t * pCover )
{
Mvc_Cube_t * pPrev, * pCube, * pCube2;
int fEqual;
pPrev = Mvc_CoverReadCubeHead(pCover);
Mvc_CoverForEachCubeStartSafe( Mvc_CubeReadNext(pPrev), pCube, pCube2 )
{
Mvc_CubeBitEqual( fEqual, pPrev, pCube );
if ( fEqual )
{ Mvc_CoverDeleteCube( pCover, pPrev, pCube );
Mvc_CubeFree( pCover, pCube );
}
else
{ pPrev = pCube;
}
}
}
void Mvc_CoverRemoveContained( Mvc_Cover_t * pCover )
{
Mvc_Cube_t * pCubeBeg, * pCubeEnd, * pCubeLarge;
Mvc_Cube_t * pCube, * pCube2, * pPrev;
unsigned sizeCur;
int Result;
pCubeBeg = Mvc_CoverReadCubeHead(pCover);
do
{
sizeCur = Mvc_CubeReadSize(pCubeBeg);
pCubeEnd = pCubeBeg;
Mvc_CoverForEachCubeStart( Mvc_CubeReadNext(pCubeBeg), pCube )
{
if ( sizeCur == Mvc_CubeReadSize(pCube) )
pCubeEnd = pCube;
else break;
}
if ( pCube == NULL )
break;
Mvc_CoverForEachCubeStart( pCubeBeg, pCubeLarge )
{
pPrev = pCubeEnd;
Mvc_CoverForEachCubeStartSafe( Mvc_CubeReadNext(pCubeEnd), pCube, pCube2 )
{
Mvc_CubeBitNotImpl( Result, pCube, pCubeLarge );
if ( !Result )
{ Mvc_CoverDeleteCube( pCover, pPrev, pCube );
Mvc_CubeFree( pCover, pCube );
}
else
{ pPrev = pCube;
}
}
if ( pCubeLarge == pCubeEnd )
break;
}
pCubeBeg = Mvc_CubeReadNext(pCubeEnd);
}
while ( pCubeBeg );
}
ABC_NAMESPACE_IMPL_END