From 358d944bf201c9f20d378024d8d091baa41e22b6 Mon Sep 17 00:00:00 2001 From: kobalicek Date: Sun, 6 Sep 2020 22:08:04 +0200 Subject: [PATCH] Simplify ZoneVector iterators, use std::lower_bound() instead a custom implementation --- src/asmjit/core/api-config.h | 3 +- src/asmjit/core/codeholder.cpp | 29 ++++------------ src/asmjit/core/support.h | 60 ---------------------------------- src/asmjit/core/zonevector.h | 8 ++--- 4 files changed, 12 insertions(+), 88 deletions(-) diff --git a/src/asmjit/core/api-config.h b/src/asmjit/core/api-config.h index 3b896e9..a133584 100644 --- a/src/asmjit/core/api-config.h +++ b/src/asmjit/core/api-config.h @@ -128,8 +128,9 @@ namespace asmjit { #include #include -#include +#include #include +#include #include #include diff --git a/src/asmjit/core/codeholder.cpp b/src/asmjit/core/codeholder.cpp index 2a53b20..4a94d98 100644 --- a/src/asmjit/core/codeholder.cpp +++ b/src/asmjit/core/codeholder.cpp @@ -26,6 +26,9 @@ #include "../core/logger.h" #include "../core/support.h" +#include +#include + ASMJIT_BEGIN_NAMESPACE // ============================================================================ @@ -368,25 +371,6 @@ Error CodeHolder::reserveBuffer(CodeBuffer* cb, size_t n) noexcept { // [asmjit::CodeHolder - Sections] // ============================================================================ -template -static inline size_t binarySearchClosestFirst(const T* array, size_t size, const T& value, const Compar& compar) noexcept { - if (!size) - return 0; - - const T* base = array; - while (size_t half = size / 2u) { - const T* middle = base + half; - size -= half; - if (compar(middle[0], value) < 0) - base = middle; - } - - if (compar(base[0], value) < 0) - base++; - - return size_t(base - array); -} - Error CodeHolder::newSection(Section** sectionOut, const char* name, size_t nameSize, uint32_t flags, uint32_t alignment, int32_t order) noexcept { *sectionOut = nullptr; @@ -419,13 +403,12 @@ Error CodeHolder::newSection(Section** sectionOut, const char* name, size_t name section->_order = order; memcpy(section->_name.str, name, nameSize); - size_t n = binarySearchClosestFirst(_sectionsByOrder.data(), _sectionsByOrder.size(), section, [](const Section* a, const Section* b) -> int64_t { - return a->order() == b->order() ? int64_t(a->id()) - int64_t(b->id()) - : int64_t(a->order()) - int64_t(b->order()); + Section** insertPosition = std::lower_bound(_sectionsByOrder.begin(), _sectionsByOrder.end(), section, [](const Section* a, const Section* b) { + return std::make_tuple(a->order(), a->id()) < std::make_tuple(b->order(), b->id()); }); _sections.appendUnsafe(section); - _sectionsByOrder.insertUnsafe(n, section); + _sectionsByOrder.insertUnsafe((size_t)(insertPosition - _sectionsByOrder.data()), section); *sectionOut = section; return kErrorOk; diff --git a/src/asmjit/core/support.h b/src/asmjit/core/support.h index 9e2bee4..c5df00a 100644 --- a/src/asmjit/core/support.h +++ b/src/asmjit/core/support.h @@ -1406,66 +1406,6 @@ static inline void qSort(T* base, size_t size, const CompareT& cmp = CompareT()) Internal::QSortImpl::sort(base, size, cmp); } -// ============================================================================ -// [asmjit::Support - Iterators] -// ============================================================================ - -template -class Iterator { -public: - constexpr Iterator(T* p) noexcept : _p(p) {} - constexpr Iterator(const Iterator& other) noexcept = default; - - inline Iterator& operator=(const Iterator& other) noexcept = default; - - inline Iterator operator+(size_t n) const noexcept { return Iterator(_p + n); } - inline Iterator operator-(size_t n) const noexcept { return Iterator(_p - n); } - - inline Iterator& operator+=(size_t n) noexcept { _p += n; return *this; } - inline Iterator& operator-=(size_t n) noexcept { _p -= n; return *this; } - - inline Iterator& operator++() noexcept { return operator+=(1); } - inline Iterator& operator--() noexcept { return operator-=(1); } - - inline Iterator operator++(int) noexcept { T* prev = _p; operator+=(1); return Iterator(prev); } - inline Iterator operator--(int) noexcept { T* prev = _p; operator-=(1); return Iterator(prev); } - - inline bool operator==(const Iterator& other) noexcept { return _p == other._p; } - inline bool operator!=(const Iterator& other) noexcept { return _p != other._p; } - - inline T& operator*() const noexcept { return _p[0]; } - - T* _p; -}; - -template -class ReverseIterator { -public: - constexpr ReverseIterator(T* p) noexcept : _p(p) {} - constexpr ReverseIterator(const ReverseIterator& other) noexcept = default; - - inline ReverseIterator& operator=(const ReverseIterator& other) noexcept = default; - - inline ReverseIterator operator+(size_t n) const noexcept { return ReverseIterator(_p + n); } - inline ReverseIterator operator-(size_t n) const noexcept { return ReverseIterator(_p - n); } - - inline ReverseIterator& operator+=(size_t n) noexcept { _p -= n; return *this; } - inline ReverseIterator& operator-=(size_t n) noexcept { _p += n; return *this; } - - inline ReverseIterator& operator++() noexcept { return operator+=(1); } - inline ReverseIterator& operator--() noexcept { return operator-=(1); } - - inline ReverseIterator operator++(int) noexcept { T* prev = _p; operator+=(1); return ReverseIterator(prev); } - inline ReverseIterator operator--(int) noexcept { T* prev = _p; operator-=(1); return ReverseIterator(prev); } - - inline bool operator==(const ReverseIterator& other) noexcept { return _p == other._p; } - inline bool operator!=(const ReverseIterator& other) noexcept { return _p != other._p; } - - inline T& operator*() const noexcept { return _p[-1]; } - - T* _p; -}; - // ============================================================================ // [asmjit::Support::Temporary] // ============================================================================ diff --git a/src/asmjit/core/zonevector.h b/src/asmjit/core/zonevector.h index b7288b0..2765a3a 100644 --- a/src/asmjit/core/zonevector.h +++ b/src/asmjit/core/zonevector.h @@ -155,10 +155,10 @@ public: typedef T& reference; typedef const T& const_reference; - typedef Support::Iterator iterator; - typedef Support::Iterator const_iterator; - typedef Support::ReverseIterator reverse_iterator; - typedef Support::ReverseIterator const_reverse_iterator; + typedef T* iterator; + typedef const T* const_iterator; + typedef std::reverse_iterator reverse_iterator; + typedef std::reverse_iterator const_reverse_iterator; //! \name Construction & Destruction //! \{