mirror of
https://github.com/asmjit/asmjit.git
synced 2025-12-17 12:34:35 +03:00
Improved compile times by avoiding <iterator> header
This commit is contained in:
@@ -43,7 +43,6 @@
|
||||
#include <string.h>
|
||||
|
||||
#include <initializer_list>
|
||||
#include <iterator>
|
||||
#include <limits>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
|
||||
@@ -1567,6 +1567,75 @@ static ASMJIT_INLINE_NODEBUG void qSort(T* base, size_t size, const CompareT& cm
|
||||
Internal::QSortImpl<T, CompareT>::sort(base, size, cmp);
|
||||
}
|
||||
|
||||
// Support - ReverseIterator
|
||||
// =========================
|
||||
|
||||
//! Reverse iterator to avoid including `<iterator>` header for iteration over arrays, specialized for
|
||||
//! AsmJit use (noexcept by design).
|
||||
template<typename T>
|
||||
class ArrayReverseIterator {
|
||||
public:
|
||||
//! \name Members
|
||||
//! \{
|
||||
|
||||
T* _ptr {};
|
||||
|
||||
//! \}
|
||||
|
||||
//! \name Construction & Destruction
|
||||
//! \{
|
||||
|
||||
ASMJIT_INLINE_NODEBUG constexpr ArrayReverseIterator() noexcept = default;
|
||||
ASMJIT_INLINE_NODEBUG constexpr ArrayReverseIterator(const ArrayReverseIterator& other) noexcept = default;
|
||||
ASMJIT_INLINE_NODEBUG constexpr ArrayReverseIterator(T* ptr) noexcept : _ptr(ptr) {}
|
||||
|
||||
//! \}
|
||||
|
||||
//! \name Overloaded Operators
|
||||
//! \{
|
||||
|
||||
ASMJIT_INLINE_NODEBUG ArrayReverseIterator& operator=(const ArrayReverseIterator& other) noexcept = default;
|
||||
|
||||
ASMJIT_INLINE_NODEBUG bool operator==(const T* other) const noexcept { return _ptr == other; }
|
||||
ASMJIT_INLINE_NODEBUG bool operator==(const ArrayReverseIterator& other) const noexcept { return _ptr == other._ptr; }
|
||||
|
||||
ASMJIT_INLINE_NODEBUG bool operator!=(const T* other) const noexcept { return _ptr != other; }
|
||||
ASMJIT_INLINE_NODEBUG bool operator!=(const ArrayReverseIterator& other) const noexcept { return _ptr != other._ptr; }
|
||||
|
||||
ASMJIT_INLINE_NODEBUG bool operator<(const T* other) const noexcept { return _ptr < other; }
|
||||
ASMJIT_INLINE_NODEBUG bool operator<(const ArrayReverseIterator& other) const noexcept { return _ptr < other._ptr; }
|
||||
|
||||
ASMJIT_INLINE_NODEBUG bool operator<=(const T* other) const noexcept { return _ptr <= other; }
|
||||
ASMJIT_INLINE_NODEBUG bool operator<=(const ArrayReverseIterator& other) const noexcept { return _ptr <= other._ptr; }
|
||||
|
||||
ASMJIT_INLINE_NODEBUG bool operator>(const T* other) const noexcept { return _ptr > other; }
|
||||
ASMJIT_INLINE_NODEBUG bool operator>(const ArrayReverseIterator& other) const noexcept { return _ptr > other._ptr; }
|
||||
|
||||
ASMJIT_INLINE_NODEBUG bool operator>=(const T* other) const noexcept { return _ptr >= other; }
|
||||
ASMJIT_INLINE_NODEBUG bool operator>=(const ArrayReverseIterator& other) const noexcept { return _ptr >= other._ptr; }
|
||||
|
||||
ASMJIT_INLINE_NODEBUG ArrayReverseIterator& operator++() noexcept { _ptr--; return *this; }
|
||||
ASMJIT_INLINE_NODEBUG ArrayReverseIterator& operator++(int) noexcept { ArrayReverseIterator prev(*this); _ptr--; return prev; }
|
||||
|
||||
ASMJIT_INLINE_NODEBUG ArrayReverseIterator& operator--() noexcept { _ptr++; return *this; }
|
||||
ASMJIT_INLINE_NODEBUG ArrayReverseIterator& operator--(int) noexcept { ArrayReverseIterator prev(*this); _ptr++; return prev; }
|
||||
|
||||
template<typename Diff> ASMJIT_INLINE_NODEBUG ArrayReverseIterator operator+(const Diff& n) noexcept { return ArrayReverseIterator(_ptr -= n); }
|
||||
template<typename Diff> ASMJIT_INLINE_NODEBUG ArrayReverseIterator operator-(const Diff& n) noexcept { return ArrayReverseIterator(_ptr += n); }
|
||||
|
||||
template<typename Diff> ASMJIT_INLINE_NODEBUG ArrayReverseIterator& operator+=(const Diff& n) noexcept { _ptr -= n; return *this; }
|
||||
template<typename Diff> ASMJIT_INLINE_NODEBUG ArrayReverseIterator& operator-=(const Diff& n) noexcept { _ptr += n; return *this; }
|
||||
|
||||
ASMJIT_INLINE_NODEBUG constexpr T& operator*() const noexcept { return _ptr[-1]; }
|
||||
ASMJIT_INLINE_NODEBUG constexpr T* operator->() const noexcept { return &_ptr[-1]; }
|
||||
|
||||
template<typename Diff> ASMJIT_INLINE_NODEBUG T& operator[](const Diff& n) noexcept { return *(_ptr - n - 1); }
|
||||
|
||||
ASMJIT_INLINE_NODEBUG operator T*() const noexcept { return _ptr; }
|
||||
|
||||
//! \}
|
||||
};
|
||||
|
||||
// Support - Array
|
||||
// ===============
|
||||
|
||||
|
||||
@@ -289,9 +289,22 @@ static void test_zone_vector(ZoneAllocator* allocator, const char* typeName) {
|
||||
}
|
||||
EXPECT_FALSE(vec.empty());
|
||||
EXPECT_EQ(vec.size(), uint32_t(kMax));
|
||||
EXPECT_EQ(vec.indexOf(T(0)), uint32_t(0));
|
||||
EXPECT_EQ(vec.indexOf(T(kMax - 1)), uint32_t(kMax - 1));
|
||||
|
||||
EXPECT_EQ(vec.begin()[0], 0);
|
||||
EXPECT_EQ(vec.end()[-1], kMax - 1);
|
||||
|
||||
EXPECT_EQ(vec.rbegin()[0], kMax - 1);
|
||||
EXPECT_EQ(vec.rend()[-1], 0);
|
||||
|
||||
int64_t fsum = 0;
|
||||
int64_t rsum = 0;
|
||||
|
||||
for (const T& item : vec) { fsum += item; }
|
||||
for (auto it = vec.rbegin(); it != vec.rend(); ++it) { rsum += *it; }
|
||||
|
||||
EXPECT_EQ(fsum, rsum);
|
||||
|
||||
vec.release(allocator);
|
||||
}
|
||||
|
||||
@@ -128,8 +128,8 @@ public:
|
||||
|
||||
typedef T* iterator;
|
||||
typedef const T* const_iterator;
|
||||
typedef std::reverse_iterator<iterator> reverse_iterator;
|
||||
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
|
||||
typedef Support::ArrayReverseIterator<T> reverse_iterator;
|
||||
typedef Support::ArrayReverseIterator<const T> const_reverse_iterator;
|
||||
|
||||
//! \name Construction & Destruction
|
||||
//! \{
|
||||
|
||||
Reference in New Issue
Block a user