module des.gui.base;

public
{
    import des.math.linear;

    import des.util.arch;
    import des.util.helpers;
    import des.util.logsys;
    import des.util.localization;
    import des.util.testsuite;
    import des.il.region;
}

alias DiRect=Region!(2,int);
alias DiVec=Vector!(2,int);

///
class DiException : Exception
{
    ///
    this( string msg, string file=__FILE__, size_t line=__LINE__ ) pure nothrow @safe
    { super( msg, file, line ); }
}

/// add binary flag
T binAdd(T)( in T a, in T b ) if( isIntegral!T ) { return a | b; }

/// remove binary flag
T binRemove(T)( in T a, in T b ) if( isIntegral!T ) { return a ^ ( a & b ); }

/// find binary flag ( b in a )
bool binFind(T)( in T a, in T b ) if( isIntegral!T ) { return ( a & b ) == b; }

unittest
{
    auto a = 0b0001;
    auto b = 0b0010;
    auto c = binAdd(a,b);
    assertEq( c, 0b0011 );
    assertEq( binRemove(c,a), b );
    assertEq( binRemove(c,b), a );
    assert( binFind(c,a) );
    assert( binFind(c,b) );
    auto x = 0b0100;
    assert( !binFind(c,x) );
}