1
0
mirror of https://github.com/upx/upx synced 2025-09-28 19:06:07 +08:00

src/util: minor xspan enhancements

This commit is contained in:
Markus F.X.J. Oberhumer 2023-10-14 05:58:47 +02:00
parent 005e39871b
commit 2b371e99bd
6 changed files with 44 additions and 17 deletions

View File

@ -173,6 +173,7 @@ typedef upx_int64_t upx_off_t;
#else #else
#define noinline __acc_noinline #define noinline __acc_noinline
#endif #endif
#define forceinline_constexpr forceinline constexpr
#define likely __acc_likely #define likely __acc_likely
#define unlikely __acc_unlikely #define unlikely __acc_unlikely
#define very_likely __acc_very_likely #define very_likely __acc_very_likely

View File

@ -95,6 +95,11 @@ using XSPAN_NAMESPACE_NAME::raw_index_bytes; // overloaded for all classes
#define XSPAN_P_VAR(type, var, first, ...) XSPAN_P(type) var((first), ##__VA_ARGS__) #define XSPAN_P_VAR(type, var, first, ...) XSPAN_P(type) var((first), ##__VA_ARGS__)
#define XSPAN_S_VAR(type, var, first, ...) XSPAN_S(type) var((first), ##__VA_ARGS__) #define XSPAN_S_VAR(type, var, first, ...) XSPAN_S(type) var((first), ##__VA_ARGS__)
// cast to a different type (creates a new value)
#define XSPAN_0_CAST(type, var) ((var).type_cast<type>())
#define XSPAN_P_CAST(type, var) ((var).type_cast<type>())
#define XSPAN_S_CAST(type, var) ((var).type_cast<type>())
#elif WITH_XSPAN >= 1 #elif WITH_XSPAN >= 1
// unchecked - just a no-op pointer wrapper, no extra functionality // unchecked - just a no-op pointer wrapper, no extra functionality
@ -114,6 +119,11 @@ using XSPAN_NAMESPACE_NAME::raw_index_bytes; // overloaded for all classes
#define XSPAN_P_VAR(type, var, first, ...) XSPAN_P(type) var((first)) #define XSPAN_P_VAR(type, var, first, ...) XSPAN_P(type) var((first))
#define XSPAN_S_VAR(type, var, first, ...) XSPAN_S(type) var((first)) #define XSPAN_S_VAR(type, var, first, ...) XSPAN_S(type) var((first))
// cast to a different type (creates a new value)
#define XSPAN_0_CAST(type, var) ((var).type_cast<type>())
#define XSPAN_P_CAST(type, var) ((var).type_cast<type>())
#define XSPAN_S_CAST(type, var) ((var).type_cast<type>())
#else // WITH_XSPAN #else // WITH_XSPAN
// unchecked regular pointers // unchecked regular pointers
@ -147,6 +157,11 @@ inline R *xspan_make_helper__(R * /*dummy*/, MemBuffer &mb) noexcept {
#define XSPAN_P_VAR(type, var, first, ...) type *var = XSPAN_P_MAKE(type, (first)) #define XSPAN_P_VAR(type, var, first, ...) type *var = XSPAN_P_MAKE(type, (first))
#define XSPAN_S_VAR(type, var, first, ...) type *var = XSPAN_S_MAKE(type, (first)) #define XSPAN_S_VAR(type, var, first, ...) type *var = XSPAN_S_MAKE(type, (first))
// cast to a different type (creates a new value)
#define XSPAN_0_CAST(type, var) ((type *) (var))
#define XSPAN_P_CAST(type, var) ((type *) (var))
#define XSPAN_S_CAST(type, var) ((type *) (var))
#endif // WITH_XSPAN #endif // WITH_XSPAN
/************************************************************************* /*************************************************************************
@ -166,6 +181,10 @@ inline R *xspan_make_helper__(R * /*dummy*/, MemBuffer &mb) noexcept {
#define SPAN_0_VAR XSPAN_0_VAR #define SPAN_0_VAR XSPAN_0_VAR
#define SPAN_P_VAR XSPAN_P_VAR #define SPAN_P_VAR XSPAN_P_VAR
#define SPAN_S_VAR XSPAN_S_VAR #define SPAN_S_VAR XSPAN_S_VAR
// cast to a different type (creates a new value)
#define SPAN_0_CAST XSPAN_0_CAST
#define SPAN_P_CAST XSPAN_P_CAST
#define SPAN_S_CAST XSPAN_S_CAST
#endif #endif
/* vim:set ts=4 sw=4 et: */ /* vim:set ts=4 sw=4 et: */

View File

@ -179,6 +179,11 @@ XSPAN_FWD_TU(unsigned) ptr_udiff_bytes(const C<T> &a, const E<U> &b) {
#ifdef UPX_VERSION_HEX #ifdef UPX_VERSION_HEX
template <class T>
inline unsigned upx_adler32(const C<T> &a, unsigned n, unsigned adler = 1) {
return upx_adler32(a.raw_bytes(n), n, adler);
}
template <class T> template <class T>
unsigned get_ne16(const C<T> &a) { unsigned get_ne16(const C<T> &a) {
return get_ne16(a.raw_bytes(2)); return get_ne16(a.raw_bytes(2));

View File

@ -53,11 +53,11 @@ void xspan_check_range(const void *ptr, const void *base, ptrdiff_t size_in_byte
// help constructor to distinguish between number of elements and bytes // help constructor to distinguish between number of elements and bytes
struct XSpanCount final { struct XSpanCount final {
explicit forceinline constexpr XSpanCount(size_t n) noexcept : count(n) {} explicit forceinline_constexpr XSpanCount(size_t n) noexcept : count(n) {}
size_t count; // public size_t count; // public
}; };
struct XSpanSizeInBytes final { struct XSpanSizeInBytes final {
explicit forceinline constexpr XSpanSizeInBytes(size_t bytes) noexcept : size_in_bytes(bytes) {} explicit forceinline_constexpr XSpanSizeInBytes(size_t bytes) noexcept : size_in_bytes(bytes) {}
size_t size_in_bytes; // public size_t size_in_bytes; // public
}; };
@ -199,29 +199,22 @@ struct Ptr;
class XSpanInternalDummyArgFake; // not implemented on purpose class XSpanInternalDummyArgFake; // not implemented on purpose
typedef XSpanInternalDummyArgFake *XSpanInternalDummyArg; typedef XSpanInternalDummyArgFake *XSpanInternalDummyArg;
#define XSpanInternalDummyArgInit nullptr #define XSpanInternalDummyArgInit nullptr
#elif 1 #elif __cplusplus >= 201103L && 1
// use an enum // use an enum
struct XSpanInternalDummyArg final { struct XSpanInternalDummyArg final {
enum DummyEnum {}; enum DummyEnum {};
explicit forceinline constexpr XSpanInternalDummyArg(DummyEnum &&) noexcept {} explicit forceinline_constexpr XSpanInternalDummyArg(DummyEnum &&) noexcept {}
}; };
#define XSpanInternalDummyArgInit \ #define XSpanInternalDummyArgInit \
(XSPAN_NS(XSpanInternalDummyArg)(XSPAN_NS(XSpanInternalDummyArg)::DummyEnum{})) (XSPAN_NS(XSpanInternalDummyArg)(XSPAN_NS(XSpanInternalDummyArg)::DummyEnum{}))
#else #else
// use a class with a private constructor // use a class with a private constructor
struct XSpanInternalDummyArg final { struct XSpanInternalDummyArg final {
static forceinline constexpr XSpanInternalDummyArg make() noexcept { static forceinline_constexpr XSpanInternalDummyArg make() noexcept {
return XSpanInternalDummyArg{}; return XSpanInternalDummyArg();
} }
private: private:
explicit forceinline constexpr XSpanInternalDummyArg() noexcept {} explicit forceinline_constexpr XSpanInternalDummyArg() noexcept {}
#if !(ACC_CC_MSC) // MSVC wants to use the copy and move constructors; correct or compiler bug?
// @COMPILER_BUG @MSVC_BUG
XSpanInternalDummyArg(const XSpanInternalDummyArg &) = delete;
XSpanInternalDummyArg(XSpanInternalDummyArg &&) noexcept = delete;
XSpanInternalDummyArg &operator=(const XSpanInternalDummyArg &) = delete;
XSpanInternalDummyArg &operator=(XSpanInternalDummyArg &&) noexcept = delete;
#endif
}; };
#define XSpanInternalDummyArgInit \ #define XSpanInternalDummyArgInit \
(XSPAN_NS(XSpanInternalDummyArg)(XSPAN_NS(XSpanInternalDummyArg)::make())) (XSPAN_NS(XSpanInternalDummyArg)(XSPAN_NS(XSpanInternalDummyArg)::make()))

View File

@ -29,6 +29,7 @@
**************************************************************************/ **************************************************************************/
#if CLANG_FORMAT_DUMMY_CLASS #if CLANG_FORMAT_DUMMY_CLASS
template <class T>
class CSelf { class CSelf {
#endif #endif
@ -68,7 +69,7 @@ private:
xspan_check_range(ptr, base, size_in_bytes); xspan_check_range(ptr, base, size_in_bytes);
} }
#else #else
forceinline constexpr void assertInvariants() const noexcept {} forceinline_constexpr void assertInvariants() const noexcept {}
#endif #endif
static inline pointer makeNotNull(pointer p) { static inline pointer makeNotNull(pointer p) {
@ -272,7 +273,7 @@ public:
Self &operator=(MemBuffer &mb) { return assign(Self(mb)); } Self &operator=(MemBuffer &mb) { return assign(Self(mb)); }
#endif #endif
Self subspan(ptrdiff_t offset, ptrdiff_t count) { Self subspan(ptrdiff_t offset, ptrdiff_t count) const {
pointer begin = check_add(ptr, offset); pointer begin = check_add(ptr, offset);
pointer end = check_add(begin, count); pointer end = check_add(begin, count);
if (begin <= end) if (begin <= end)
@ -281,6 +282,14 @@ public:
return Self(Unchecked, end, (begin - end) * sizeof(T), end); return Self(Unchecked, end, (begin - end) * sizeof(T), end);
} }
template <class U>
CSelf<U> type_cast() const {
assertInvariants();
typedef CSelf<U> R;
return R(R::Unchecked, reinterpret_cast<typename R::pointer>(ptr), size_in_bytes,
reinterpret_cast<typename R::pointer>(base));
}
bool operator==(pointer other) const { return ptr == other; } bool operator==(pointer other) const { return ptr == other; }
template <class U> template <class U>
XSPAN_REQUIRES_CONVERTIBLE_R(bool) XSPAN_REQUIRES_CONVERTIBLE_R(bool)

View File

@ -55,7 +55,7 @@ private:
// inverse logic for ensuring valid pointers from existing objects // inverse logic for ensuring valid pointers from existing objects
inline pointer ensurePtr() const { return ptr; } inline pointer ensurePtr() const { return ptr; }
// debug // debug
forceinline constexpr void assertInvariants() const noexcept {} forceinline_constexpr void assertInvariants() const noexcept {}
public: public:
#if XSPAN_CONFIG_ENABLE_IMPLICIT_CONVERSION || 1 #if XSPAN_CONFIG_ENABLE_IMPLICIT_CONVERSION || 1