void set( EnumT index, bool value ) { data = ( data & ~( 1 << index ) ) | ( StorageT(value) << index ); }
void clear() { data = StorageT( 0 ); }
template< EnumT index > flag_set& set() { data |= StorageT(1) << index; return *this; }
template< EnumT index > flag_set& reset() { data &= ~( StorageT(1) << index ); return *this; }
template< EnumT index > flag_set& set( bool value ) { data = ( data & ~( StorageT(1) << index ) ) | ( StorageT(value) << index ); return *this; }
template< EnumT index > bool get() { return ( data & ( StorageT(1) << index ) ) != 0; }
flag_set& set( EnumT index, bool value = true ) { data = ( data & ~( StorageT(1) << index ) ) | ( StorageT(value) << index ); return *this; }
flag_set( std::initializer_list< EnumT >& flags ) : data( StorageT( 0 ) ) { for ( auto f : flags ) set( f ); }
flag_set() : data( StorageT( 0 ) ) {}