finally ending up with a named struct, what seems to be the only thing

that is accepted from all compilers
compilers
This commit is contained in:
Uwe Rathmann 2017-12-07 12:44:58 +01:00
parent 659064ce5a
commit 5858d9a843
2 changed files with 45 additions and 51 deletions

View File

@ -336,7 +336,7 @@ const char* QskAspect::Aspect::toPrintable() const
QskAspect::State QskAspect::Aspect::topState() const QskAspect::State QskAspect::Aspect::topState() const
{ {
if ( m_states == NoState ) if ( m_bits.states == NoState )
return NoState; return NoState;
/* /*
@ -344,7 +344,7 @@ QskAspect::State QskAspect::Aspect::topState() const
_BitScanReverse - we can live with this. _BitScanReverse - we can live with this.
*/ */
const auto n = qCountLeadingZeroBits( static_cast< quint16 >( m_states ) ); const auto n = qCountLeadingZeroBits( static_cast< quint16 >( m_bits.states ) );
return static_cast< QskAspect::State >( 1 << ( 15 - n ) ); return static_cast< QskAspect::State >( 1 << ( 15 - n ) );
} }

View File

@ -183,18 +183,19 @@ namespace QskAspect
{ {
struct struct
{ {
uint m_subControl : 12; uint subControl : 12;
uint m_type : 3; uint type : 3;
bool m_isAnimator : 1; bool isAnimator : 1;
uint m_primitive : 7; uint primitive : 7;
uint m_placement : 1; uint placement : 1;
uint m_reserved1 : 8; uint reserved1 : 8;
uint m_states : 16; uint states : 16;
uint m_reserved2 : 16; uint reserved2 : 16;
};
} m_bits;
quint64 m_value; quint64 m_value;
}; };
@ -227,14 +228,7 @@ namespace QskAspect
inline constexpr Aspect::Aspect( uint subControl, uint type, bool isAnimator, inline constexpr Aspect::Aspect( uint subControl, uint type, bool isAnimator,
uint primitive, uint placement, uint states ): uint primitive, uint placement, uint states ):
m_subControl( subControl ), m_bits { subControl, type, isAnimator, primitive, placement, 0, states, 0 }
m_type( type ),
m_isAnimator( isAnimator ),
m_primitive( primitive ),
m_placement( placement ),
m_reserved1( 0 ),
m_states( states ),
m_reserved2( 0 )
{ {
} }
@ -255,20 +249,20 @@ namespace QskAspect
inline constexpr Aspect Aspect::operator|( Subcontrol subControl ) const inline constexpr Aspect Aspect::operator|( Subcontrol subControl ) const
{ {
return Aspect( subControl, m_type, m_isAnimator, return Aspect( subControl, m_bits.type, m_bits.isAnimator,
m_primitive, m_placement, m_states ); m_bits.primitive, m_bits.placement, m_bits.states );
} }
inline constexpr Aspect Aspect::operator|( Type type ) const inline constexpr Aspect Aspect::operator|( Type type ) const
{ {
return Aspect( m_subControl, type, m_isAnimator, return Aspect( m_bits.subControl, type, m_bits.isAnimator,
m_primitive, m_placement, m_states ); m_bits.primitive, m_bits.placement, m_bits.states );
} }
inline constexpr Aspect Aspect::operator|( FlagPrimitive primitive ) const inline constexpr Aspect Aspect::operator|( FlagPrimitive primitive ) const
{ {
return Aspect( m_subControl, m_type, m_isAnimator, return Aspect( m_bits.subControl, m_bits.type, m_bits.isAnimator,
primitive, m_placement, m_states ); primitive, m_bits.placement, m_bits.states );
} }
inline constexpr Aspect Aspect::operator|( MetricPrimitive primitive ) const inline constexpr Aspect Aspect::operator|( MetricPrimitive primitive ) const
@ -283,14 +277,14 @@ namespace QskAspect
inline constexpr Aspect Aspect::operator|( Placement placement ) const inline constexpr Aspect Aspect::operator|( Placement placement ) const
{ {
return Aspect( m_subControl, m_type, m_isAnimator, return Aspect( m_bits.subControl, m_bits.type, m_bits.isAnimator,
m_primitive, placement, m_states ); m_bits.primitive, placement, m_bits.states );
} }
inline constexpr Aspect Aspect::operator|( State state ) const inline constexpr Aspect Aspect::operator|( State state ) const
{ {
return Aspect( m_subControl, m_type, m_isAnimator, return Aspect( m_bits.subControl, m_bits.type, m_bits.isAnimator,
m_primitive, m_placement, m_states | state ); m_bits.primitive, m_bits.placement, m_bits.states | state );
} }
inline constexpr quint64 Aspect::value() const inline constexpr quint64 Aspect::value() const
@ -300,102 +294,102 @@ namespace QskAspect
inline bool Aspect::isAnimator() const inline bool Aspect::isAnimator() const
{ {
return m_isAnimator; return m_bits.isAnimator;
} }
inline void Aspect::setAnimator( bool on ) inline void Aspect::setAnimator( bool on )
{ {
m_isAnimator = on; m_bits.isAnimator = on;
} }
inline Subcontrol Aspect::subControl() const inline Subcontrol Aspect::subControl() const
{ {
return static_cast< Subcontrol >( m_subControl ); return static_cast< Subcontrol >( m_bits.subControl );
} }
inline void Aspect::setSubControl( Subcontrol subControl ) inline void Aspect::setSubControl( Subcontrol subControl )
{ {
m_subControl = subControl; m_bits.subControl = subControl;
} }
inline Type Aspect::type() const inline Type Aspect::type() const
{ {
return static_cast< Type >( m_type ); return static_cast< Type >( m_bits.type );
} }
inline void Aspect::setType( Type type ) inline void Aspect::setType( Type type )
{ {
m_type = type; m_bits.type = type;
} }
inline State Aspect::state() const inline State Aspect::state() const
{ {
return static_cast< State >( m_states ); return static_cast< State >( m_bits.states );
} }
inline void Aspect::addState( State state ) inline void Aspect::addState( State state )
{ {
m_states |= state; m_bits.states |= state;
} }
inline void Aspect::clearState( State state ) inline void Aspect::clearState( State state )
{ {
m_states &= ~state; m_bits.states &= ~state;
} }
inline void Aspect::clearStates() inline void Aspect::clearStates()
{ {
m_states = 0; m_bits.states = 0;
} }
inline FlagPrimitive Aspect::flagPrimitive() const inline FlagPrimitive Aspect::flagPrimitive() const
{ {
if ( m_type != Flag ) if ( m_bits.type != Flag )
return NoFlagPrimitive; return NoFlagPrimitive;
return static_cast< FlagPrimitive >( m_primitive ); return static_cast< FlagPrimitive >( m_bits.primitive );
} }
inline ColorPrimitive Aspect::colorPrimitive() const inline ColorPrimitive Aspect::colorPrimitive() const
{ {
if ( m_type != Color ) if ( m_bits.type != Color )
return NoColorPrimitive; return NoColorPrimitive;
return static_cast< ColorPrimitive >( m_primitive ); return static_cast< ColorPrimitive >( m_bits.primitive );
} }
inline MetricPrimitive Aspect::metricPrimitive() const inline MetricPrimitive Aspect::metricPrimitive() const
{ {
if ( m_type != Metric ) if ( m_bits.type != Metric )
return NoMetricPrimitive; return NoMetricPrimitive;
return static_cast< MetricPrimitive >( m_primitive ); return static_cast< MetricPrimitive >( m_bits.primitive );
} }
inline int Aspect::primitive() const inline int Aspect::primitive() const
{ {
return m_primitive; return m_bits.primitive;
} }
inline void Aspect::setPrimitive( Type type, int primitive ) inline void Aspect::setPrimitive( Type type, int primitive )
{ {
m_type = type; m_bits.type = type;
m_primitive = primitive; m_bits.primitive = primitive;
} }
inline void Aspect::clearPrimitive() inline void Aspect::clearPrimitive()
{ {
m_primitive = 0; m_bits.primitive = 0;
} }
inline Placement Aspect::placement() const inline Placement Aspect::placement() const
{ {
return static_cast< Placement >( m_placement ); return static_cast< Placement >( m_bits.placement );
} }
inline void Aspect::setPlacement( Placement placement ) inline void Aspect::setPlacement( Placement placement )
{ {
m_placement = placement; m_bits.placement = placement;
} }
inline constexpr Aspect operator|( State state, const Aspect& aspect ) inline constexpr Aspect operator|( State state, const Aspect& aspect )