diff --git a/atom/src/behaviors.h b/atom/src/behaviors.h index 0b585c51..5c82ec83 100644 --- a/atom/src/behaviors.h +++ b/atom/src/behaviors.h @@ -14,7 +14,7 @@ namespace atom namespace GetAttr { -enum Mode +enum Mode: uint8_t { NoOp, Slot, @@ -37,7 +37,7 @@ enum Mode namespace PostGetAttr { -enum Mode +enum Mode: uint8_t { NoOp, Delegate, @@ -53,7 +53,7 @@ enum Mode namespace SetAttr { -enum Mode +enum Mode: uint8_t { NoOp, Slot, @@ -77,7 +77,7 @@ enum Mode namespace PostSetAttr { -enum Mode +enum Mode: uint8_t { NoOp, Delegate, @@ -94,7 +94,7 @@ enum Mode namespace DefaultValue { -enum Mode +enum Mode: uint8_t { NoOp, Static, @@ -119,7 +119,7 @@ enum Mode namespace Validate { -enum Mode +enum Mode: uint8_t { NoOp, Bool, @@ -162,7 +162,7 @@ enum Mode namespace PostValidate { -enum Mode +enum Mode: uint8_t { NoOp, Delegate, @@ -178,7 +178,7 @@ enum Mode namespace DelAttr { -enum Mode +enum Mode: uint8_t { NoOp, Slot, @@ -197,7 +197,7 @@ enum Mode namespace GetState { -enum Mode +enum Mode: uint8_t { Include, // We want include to be the default behavior Exclude, diff --git a/atom/src/member.cpp b/atom/src/member.cpp index d9e4f458..6a0c208d 100644 --- a/atom/src/member.cpp +++ b/atom/src/member.cpp @@ -390,7 +390,6 @@ Member_clone( Member* self ) return 0; Member* clone = member_cast( pyclone ); clone->modes = self->modes; - clone->extra_modes = self->extra_modes; clone->index = self->index; clone->name = cppy::incref( self->name ); if( self->metadata ) diff --git a/atom/src/member.h b/atom/src/member.h index 46d24f1c..7c84f8d9 100644 --- a/atom/src/member.h +++ b/atom/src/member.h @@ -25,12 +25,22 @@ namespace atom { +PACK(struct MemberModes +{ + GetAttr::Mode getattr: 4; + PostGetAttr::Mode post_getattr: 3; + SetAttr::Mode setattr: 4; + PostSetAttr::Mode post_setattr: 3; + DefaultValue::Mode default_value: 4; + Validate::Mode validate: 5; + PostValidate::Mode post_validate: 3; + DelAttr::Mode delattr: 3; + GetState::Mode getstate: 3; +}); + struct Member { PyObject_HEAD - uint64_t modes; - uint64_t extra_modes; - uint32_t index; PyObject* name; PyObject* metadata; PyObject* getattr_context; @@ -44,6 +54,8 @@ struct Member PyObject* getstate_context; ModifyGuard* modify_guard; std::vector* static_observers; + MemberModes modes; + uint32_t index; static PyType_Spec TypeObject_Spec; @@ -57,101 +69,92 @@ struct Member GetAttr::Mode get_getattr_mode() { - return static_cast( modes & 0xff ); + return modes.getattr; } void set_getattr_mode( GetAttr::Mode mode ) { - uint64_t mask = UINT64_C( 0xffffffffffffff00 ); - modes = ( modes & mask ) | ( static_cast( mode & 0xff ) ); + modes.getattr = mode; } SetAttr::Mode get_setattr_mode() { - return static_cast( ( modes >> 8 ) & 0xff ); + return modes.setattr; } void set_setattr_mode( SetAttr::Mode mode ) { - uint64_t mask = UINT64_C( 0xffffffffffff00ff ); - modes = ( modes & mask ) | ( static_cast( mode & 0xff ) << 8 ); + modes.setattr = mode; } PostGetAttr::Mode get_post_getattr_mode() { - return static_cast( ( modes >> 16 ) & 0xff ); + return modes.post_getattr; } void set_post_getattr_mode( PostGetAttr::Mode mode ) { - uint64_t mask = UINT64_C( 0xffffffffff00ffff ); - modes = ( modes & mask ) | ( static_cast( mode & 0xff ) << 16 ); + modes.post_getattr = mode; } PostSetAttr::Mode get_post_setattr_mode() { - return static_cast( ( modes >> 24 ) & 0xff ); + return modes.post_setattr; } void set_post_setattr_mode( PostSetAttr::Mode mode ) { - uint64_t mask = UINT64_C( 0xffffffff00ffffff ); - modes = ( modes & mask ) | ( static_cast( mode & 0xff ) << 24 ); + modes.post_setattr = mode; } DefaultValue::Mode get_default_value_mode() { - return static_cast( ( modes >> 32 ) & 0xff ); + return modes.default_value; } void set_default_value_mode( DefaultValue::Mode mode ) { - uint64_t mask = UINT64_C( 0xffffff00ffffffff ); - modes = ( modes & mask ) | ( static_cast( mode & 0xff ) << 32 ); + modes.default_value = mode; } Validate::Mode get_validate_mode() { - return static_cast( ( modes >> 40 ) & 0xff ); + return modes.validate; } void set_validate_mode( Validate::Mode mode ) { - uint64_t mask = UINT64_C( 0xffff00ffffffffff ); - modes = ( modes & mask ) | ( static_cast( mode & 0xff ) << 40 ); + modes.validate = mode; } PostValidate::Mode get_post_validate_mode() { - return static_cast( ( modes >> 48 ) & 0xff ); + return modes.post_validate; } void set_post_validate_mode( PostValidate::Mode mode ) { - uint64_t mask = UINT64_C( 0xff00ffffffffffff ); - modes = ( modes & mask ) | ( static_cast( mode & 0xff ) << 48 ); + modes.post_validate = mode; } DelAttr::Mode get_delattr_mode() { - return static_cast( ( modes >> 56 ) & 0xff ); + return modes.delattr; } void set_delattr_mode( DelAttr::Mode mode ) { - uint64_t mask = UINT64_C( 0x00ffffffffffffff ); - modes = ( modes & mask ) | ( static_cast( mode & 0xff ) << 56 ); + modes.delattr = mode; } GetState::Mode get_getstate_mode() { - return static_cast( ( extra_modes ) & 0xff ); + return modes.getstate; } void set_getstate_mode( GetState::Mode mode ) { - uint64_t mask = UINT64_C( 0xffffffffffffff00 ); - extra_modes = ( extra_modes & mask ) | ( static_cast( mode & 0xff ) ); + modes.getstate = mode; } PyObject* getattr( CAtom* atom ); diff --git a/atom/src/platstdint.h b/atom/src/platstdint.h index b9f94420..dfa6f1e4 100644 --- a/atom/src/platstdint.h +++ b/atom/src/platstdint.h @@ -8,7 +8,9 @@ #pragma once #ifdef _MSC_VER +#define PACK( __Declaration__ ) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop)) #include "msstdint.h" #else #include +#define PACK( __Declaration__ ) __Declaration__ __attribute__((__packed__)) #endif