REVISED SHADOW VALUE USING INTEGRAL CONSTANT

This provides a clearer interface compared to defining a constexpr bool member.
This commit is contained in:
Nicolas Clauvelin
2018-03-11 17:34:38 -04:00
parent 058ccbf13d
commit f1d98d6bd5
3 changed files with 9 additions and 15 deletions

View File

@@ -69,7 +69,7 @@ namespace cppreg {
//! Boolean flag indicating if a shadow value is used.
constexpr static const bool has_shadow =
parent_register::shadow::use_shadow;
parent_register::shadow::value;
//! Customized overflow check implementation for Field types.
/**
@@ -124,13 +124,13 @@ namespace cppreg {
// Update shadow value.
// This assumes that reading a write-only fields return some value.
RegisterWrite<type, type, mask, offset>
::write(&parent_register::shadow::value, value);
::write(&parent_register::shadow::shadow_value, value);
// Write as a block to the register, that is, we do not use the
// mask and offset.
policy::template write<MMIO_t, type, type_mask<type>::value, 0u>(
parent_register::rw_mem_pointer(),
parent_register::shadow::value
parent_register::shadow::shadow_value
);
};

View File

@@ -60,7 +60,7 @@ namespace cppreg {
private:
// Disabled for shadow value register.
static_assert(!Register::shadow::use_shadow,
static_assert(!Register::shadow::value,
"merge write is not available for shadow value register");
// Accumulated value.
@@ -245,7 +245,7 @@ namespace cppreg {
private:
// Disabled for shadow value register.
static_assert(!Register::shadow::use_shadow,
static_assert(!Register::shadow::value,
"merge write is not available for shadow value register");
// Private default constructor.

View File

@@ -24,10 +24,7 @@ namespace cppreg {
*
* This implementation is for register which do not require shadow value.
*/
template <typename Register, bool UseShadow>
struct Shadow {
constexpr static const bool use_shadow = false;
};
template <typename Register, bool UseShadow> struct Shadow : std::false_type {};
//! Shadow value implementation.
@@ -39,15 +36,12 @@ namespace cppreg {
* See
*/
template <typename Register>
struct Shadow<Register, true> {
static typename Register::type value;
constexpr static const bool use_shadow = true;
struct Shadow<Register, true> : std::true_type {
static typename Register::type shadow_value;
};
template <typename Register>
typename Register::type Shadow<Register, true>::value =
typename Register::type Shadow<Register, true>::shadow_value =
Register::reset;
template <typename Register>
constexpr const bool Shadow<Register, true>::use_shadow;
}