///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

#include "vu2.h"
#include "vu_priv.h"

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

//-----------------------------------------------------------------------------
// VuStandardFilter
//-----------------------------------------------------------------------------

VuStandardFilter::VuStandardFilter(VuFlagBits mask, VU_TRI_STATE localSession) : VuFilter()
{
    localSession_ = localSession;
    idmask_.breakdown_ = mask;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

VuStandardFilter::VuStandardFilter(ushort mask, VU_TRI_STATE localSession) : VuFilter()
{
    localSession_ = localSession;
    idmask_.val_ = mask;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

VuStandardFilter::VuStandardFilter(VuStandardFilter* other) : VuFilter(other)
{
    localSession_ = DONT_CARE;
    idmask_.val_ = 0;

    if (other)
    {
        idmask_.val_ = other->idmask_.val_;
        localSession_ = other->localSession_;
    }
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

VuStandardFilter::~VuStandardFilter()
{
    // empty
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

VU_BOOL
VuStandardFilter::Notice(VuMessage* event)
{
    if ((localSession_ not_eq DONT_CARE) and ((event->Type() == VU_TRANSFER_EVENT)))
    {
        return TRUE;
    }

    return FALSE;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

VU_BOOL VuStandardFilter::Test(VuEntity* ent)
{
    if
    (
        ((ushort)(ent->FlagValue()) bitand idmask_.val_) and 
        (
            (localSession_ == DONT_CARE) or
            ((localSession_ == TRUE) and (ent->IsLocal())) or
            ((localSession_ == FALSE) and ( not ent->IsLocal()))
        )
    )
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

int VuStandardFilter::Compare(VuEntity* ent1, VuEntity* ent2)
{
    return (int)ent1->Id() - (int)ent2->Id();
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

VuFilter *VuStandardFilter::Copy()
{
    return new VuStandardFilter(this);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
