1
0
mirror of https://github.com/sendyne/cppreg.git synced 2025-05-11 05:33:52 +00:00

UPDATED SINGLE HEADER

This commit is contained in:
Nicolas Clauvelin 2018-03-13 17:44:47 -04:00
parent 7b9a843e2d
commit 6a99ea5de6

View File

@ -167,10 +167,7 @@ namespace internals {
typename RegisterType<W>::type value, typename RegisterType<W>::type value,
typename RegisterType<W>::type limit typename RegisterType<W>::type limit
> >
struct check_overflow { struct check_overflow : std::integral_constant<bool, value <= limit> {};
using result =
typename std::integral_constant<bool, value <= limit>::type;
};
} }
} }
#endif #endif
@ -263,7 +260,7 @@ namespace cppreg {
typename std::enable_if< typename std::enable_if<
(internals::check_overflow< (internals::check_overflow<
Register::size, new_value, (F::mask >> F::offset) Register::size, new_value, (F::mask >> F::offset)
>::result::value), >::value),
T T
>::type&& >::type&&
with() const && noexcept { with() const && noexcept {
@ -372,7 +369,7 @@ namespace cppreg {
typename std::enable_if< typename std::enable_if<
internals::check_overflow< internals::check_overflow<
size, value, (F::mask >> F::offset) size, value, (F::mask >> F::offset)
>::result::value, >::value,
T T
>::type&& >::type&&
merge_write() noexcept { merge_write() noexcept {
@ -446,30 +443,47 @@ namespace cppreg {
static_assert(( static_assert((
(BitOffset % RegWidth) == 0 (BitOffset % RegWidth) == 0
&& &&
(RegisterPack::pack_address % (RegWidth / 8u) == 0) (RegisterPack::pack_base % (RegWidth / 8u) == 0)
), ),
"register mis-alignment with respect to pack base"); "register mis-alignment with respect to pack base");
}; };
template <typename... T> template <typename... T>
struct PackIndexing { struct PackIndexing {
using tuple_t = typename std::tuple<T...>;
template <std::size_t N> template <std::size_t N>
using regs = typename std::tuple_element<N, std::tuple<T...>>::type; using regs = typename std::tuple_element<N, tuple_t>::type;
}; };
template <std::size_t start, std::size_t end> template <std::size_t start, std::size_t end>
struct for_loop { struct for_loop {
template <template <std::size_t> class Op, typename T = void> template <typename Func>
inline static void loop( inline static void loop() {
typename std::enable_if<start < end, T>::type* = nullptr Func().template operator()<start>();
) {
Op<start>()();
if (start < end) if (start < end)
for_loop<start + 1, end>::template iterate<Op>(); for_loop<start + 1, end>::template loop<Func>();
}; };
template <template <std::size_t> class Op, typename T = void> #if __cplusplus >= 201402L
inline static void loop( template <typename Op>
typename std::enable_if<start >= end, T>::type* = nullptr inline static void apply(Op& f) {
) {}; if (start < end) {
f(std::integral_constant<std::size_t, start>{});
for_loop<start + 1, end>::apply(f);
};
};
#endif
}; };
template <std::size_t end>
struct for_loop<end, end> {
template <typename Func>
inline static void loop() {};
#if __cplusplus >= 201402L
template <typename Op>
inline static void apply(Op& f) {};
#endif
};
template <typename IndexedPack>
struct range_loop : for_loop<
0, std::tuple_size<typename IndexedPack::tuple_t>::value
> {};
} }
#endif #endif
@ -495,14 +509,11 @@ namespace cppreg {
constexpr static const bool has_shadow = constexpr static const bool has_shadow =
parent_register::shadow::value; parent_register::shadow::value;
template <type value> template <type value>
struct check_overflow { struct check_overflow : internals::check_overflow<
constexpr static const bool result = parent_register::size,
internals::check_overflow< value,
parent_register::size, (mask >> offset)
value, > {};
(mask >> offset)
>::result::value;
};
inline static type read() noexcept { inline static type read() noexcept {
return policy::template read<MMIO_t, type, mask, offset>( return policy::template read<MMIO_t, type, mask, offset>(
parent_register::ro_mem_device() parent_register::ro_mem_device()
@ -533,7 +544,7 @@ namespace cppreg {
typename std::enable_if< typename std::enable_if<
!has_shadow !has_shadow
&& &&
check_overflow<value>::result, check_overflow<value>::value,
T T
>::type >::type
write() noexcept { write() noexcept {
@ -546,7 +557,7 @@ namespace cppreg {
typename std::enable_if< typename std::enable_if<
has_shadow has_shadow
&& &&
check_overflow<value>::result, check_overflow<value>::value,
T T
>::type >::type
write() noexcept { write() noexcept {