all: yet more cleanups

Changes include:
  - use standard names for PE constants
  - add some more "noexcept"
  - improve upx_is_integral type-trait
  - introduce is_same_all and is_same_any type-traits
  - prepare TE-size checks in packer.h
  - CI updates
This commit is contained in:
Markus F.X.J. Oberhumer
2023-04-18 17:02:13 +02:00
parent 15484aa296
commit 320e5b850f
33 changed files with 493 additions and 362 deletions
+43 -6
View File
@@ -278,12 +278,49 @@ protected:
unsigned image_size, int bits, bool bswap);
// Target Endianness abstraction
unsigned get_te16(const void *p) const { return bele->get16(p); }
unsigned get_te32(const void *p) const { return bele->get32(p); }
upx_uint64_t get_te64(const void *p) const { return bele->get64(p); }
void set_te16(void *p, unsigned v) { bele->set16(p, v); }
void set_te32(void *p, unsigned v) { bele->set32(p, v); }
void set_te64(void *p, upx_uint64_t v) { bele->set64(p, v); }
#if 0
// try to detect TE16 vs TE32 vs TE64 size mismatches; note that "byte" is explicitly allowed
template <class T>
static inline constexpr bool is_te16_type = is_same_any_v<T, byte, upx_uint16_t, BE16, LE16>;
template <class T>
static inline constexpr bool is_te32_type = is_same_any_v<T, byte, unsigned, BE32, LE32>;
template <class T>
static inline constexpr bool is_te64_type = is_same_any_v<T, byte, upx_uint64_t, BE64, LE64>;
template <class T, class = std::enable_if_t<is_te16_type<T>, T> >
inline unsigned get_te16(const T *p) const noexcept {
return bele->get16(p);
}
template <class T, class = std::enable_if_t<is_te32_type<T>, T> >
inline unsigned get_te32(const T *p) const noexcept {
return bele->get32(p);
}
template <class T, class = std::enable_if_t<is_te64_type<T>, T> >
inline upx_uint64_t get_te64(const T *p) const noexcept {
return bele->get64(p);
}
template <class T, class = std::enable_if_t<is_te16_type<T>, T> >
inline void set_te16(T *p, unsigned v) noexcept {
bele->set16(p, v);
}
template <class T, class = std::enable_if_t<is_te32_type<T>, T> >
inline void set_te32(T *p, unsigned v) noexcept {
bele->set32(p, v);
}
template <class T, class = std::enable_if_t<is_te64_type<T>, T> >
inline void set_te64(T *p, upx_uint64_t v) noexcept {
bele->set64(p, v);
}
#else
// permissive version using "void *"
inline unsigned get_te16(const void *p) const noexcept { return bele->get16(p); }
inline unsigned get_te32(const void *p) const noexcept { return bele->get32(p); }
inline upx_uint64_t get_te64(const void *p) const noexcept { return bele->get64(p); }
inline void set_te16(void *p, unsigned v) noexcept { bele->set16(p, v); }
inline void set_te32(void *p, unsigned v) noexcept { bele->set32(p, v); }
inline void set_te64(void *p, upx_uint64_t v) noexcept { bele->set64(p, v); }
#endif
protected:
const N_BELE_RTP::AbstractPolicy *bele = nullptr; // target endianness