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:
parent
7b9a843e2d
commit
6a99ea5de6
@ -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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user