mirror of
https://github.com/asmjit/asmjit.git
synced 2025-12-17 04:24:37 +03:00
Improved compile times by avoiding <iterator> header
This commit is contained in:
@@ -43,7 +43,6 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <initializer_list>
|
#include <initializer_list>
|
||||||
#include <iterator>
|
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <utility>
|
#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);
|
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
|
// Support - Array
|
||||||
// ===============
|
// ===============
|
||||||
|
|
||||||
|
|||||||
@@ -289,9 +289,22 @@ static void test_zone_vector(ZoneAllocator* allocator, const char* typeName) {
|
|||||||
}
|
}
|
||||||
EXPECT_FALSE(vec.empty());
|
EXPECT_FALSE(vec.empty());
|
||||||
EXPECT_EQ(vec.size(), uint32_t(kMax));
|
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.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.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);
|
vec.release(allocator);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -128,8 +128,8 @@ public:
|
|||||||
|
|
||||||
typedef T* iterator;
|
typedef T* iterator;
|
||||||
typedef const T* const_iterator;
|
typedef const T* const_iterator;
|
||||||
typedef std::reverse_iterator<iterator> reverse_iterator;
|
typedef Support::ArrayReverseIterator<T> reverse_iterator;
|
||||||
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
|
typedef Support::ArrayReverseIterator<const T> const_reverse_iterator;
|
||||||
|
|
||||||
//! \name Construction & Destruction
|
//! \name Construction & Destruction
|
||||||
//! \{
|
//! \{
|
||||||
|
|||||||
Reference in New Issue
Block a user