Simplify ZoneVector iterators, use std::lower_bound() instead a custom implementation

This commit is contained in:
kobalicek
2020-09-06 22:08:04 +02:00
parent bbe6b457a1
commit 358d944bf2
4 changed files with 12 additions and 88 deletions

View File

@@ -128,8 +128,9 @@ namespace asmjit {
#include <stdlib.h>
#include <string.h>
#include <new>
#include <iterator>
#include <limits>
#include <new>
#include <type_traits>
#include <utility>

View File

@@ -26,6 +26,9 @@
#include "../core/logger.h"
#include "../core/support.h"
#include <algorithm>
#include <tuple>
ASMJIT_BEGIN_NAMESPACE
// ============================================================================
@@ -368,25 +371,6 @@ Error CodeHolder::reserveBuffer(CodeBuffer* cb, size_t n) noexcept {
// [asmjit::CodeHolder - Sections]
// ============================================================================
template<typename T, typename Compar>
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;

View File

@@ -1406,66 +1406,6 @@ static inline void qSort(T* base, size_t size, const CompareT& cmp = CompareT())
Internal::QSortImpl<T, CompareT>::sort(base, size, cmp);
}
// ============================================================================
// [asmjit::Support - Iterators]
// ============================================================================
template<typename T>
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<typename T>
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]
// ============================================================================

View File

@@ -155,10 +155,10 @@ public:
typedef T& reference;
typedef const T& const_reference;
typedef Support::Iterator<T> iterator;
typedef Support::Iterator<const T> const_iterator;
typedef Support::ReverseIterator<T> reverse_iterator;
typedef Support::ReverseIterator<const T> const_reverse_iterator;
typedef T* iterator;
typedef const T* const_iterator;
typedef std::reverse_iterator<T> reverse_iterator;
typedef std::reverse_iterator<const T> const_reverse_iterator;
//! \name Construction & Destruction
//! \{