static EnumState<States> _states = new EnumState<States>();
public static void Main()
_states.set( States.Idle );
log( "is Idle: {0}", _states.isSet( States.Idle ) );
log( "isOnly Idle: {0}", _states.isOnly( States.Idle ) );
_states.set( States.Jump );
log( "is Idle: {0}", _states.isSet( States.Idle ) );
_states.add( States.Idle );
log( "is Idle: {0}", _states.isSet( States.Idle ) );
log( "isOnly Idle: {0}", _states.isOnly( States.Idle ) );
log( "is 1 set: {0}", Flags.isUnshiftedFlagSet( flag, 1 ) );
Flags.setFlag( ref flag, 1 );
log( Flags.binaryStringRepresentation( flag ) );
log( "is 1 set: {0}", Flags.isUnshiftedFlagSet( flag, 1 ) );
Flags.setFlag( ref flag, 2 );
Flags.setFlag( ref flag, 3 );
log( Flags.binaryStringRepresentation( flag ) );
log( "is 2 set: {0}", Flags.isUnshiftedFlagSet( flag, 2 ) );
Flags.invertFlags( ref flag );
log( Flags.binaryStringRepresentation( flag ) );
log( "is 2 set: {0}", Flags.isUnshiftedFlagSet( flag, 2 ) );
public static void log( object obj, params object[] stuff )
Console.WriteLine( obj.ToString(), stuff );
public static class Flags
public static bool isFlagSet( this int self, int flag )
return ( self & flag ) != 0;
public static bool isUnshiftedFlagSet( this int self, int flag )
return ( self & flag ) != 0;
public static void setFlagExclusive( ref int self, int flag )
public static void setFlag( ref int self, int flag )
self = ( self | 1 << flag );
public static void unsetFlag( ref int self, int flag )
self = ( self & ( ~flag ) );
public static void invertFlags( ref int self )
public static string binaryStringRepresentation( this int self, int leftPadWidth = 32 )
return Convert.ToString( self, 2 ).PadLeft( leftPadWidth, '0' );
public class EnumState<T> where T : struct, IComparable, IConvertible, IFormattable
public int previousstate = 0;
public EnumState( T state )
public void set( T state )
previousstate = this.state;
this.state = Convert.ToInt32( state );
public void add( T state )
previousstate = this.state;
this.state |= Convert.ToInt32( state );
public void remove( T state )
previousstate = this.state;
this.state &= ~Convert.ToInt32( state );
public void toggle( T state )
previousstate = this.state;
this.state ^= Convert.ToInt32( state );
public bool isSet( T state )
return ( this.state & Convert.ToInt32( state ) ) != 0 ? true : false;
public bool isOnly( T state )
return this.state == Convert.ToInt32( state ) ? true : false;
return state == 0 ? true : false;
public bool wasSet( T state )
return ( previousstate & Convert.ToInt32( state )) != 0 ? true : false;
public bool wasOnly( T state )
return previousstate == Convert.ToInt32( state ) ? true : false;
return state != 0 ? true : false;
return previousstate != 0 ? true : false;
public override string ToString()
b[pos] = ( state & ( 1 << i ) ) != 0 ? '1' : '0';