mirror of
https://github.com/asmjit/asmjit.git
synced 2025-12-16 20:17:05 +03:00
Simplify ZoneVector iterators, use std::lower_bound() instead a custom implementation
This commit is contained in:
@@ -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>
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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]
|
||||
// ============================================================================
|
||||
|
||||
@@ -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
|
||||
//! \{
|
||||
|
||||
Reference in New Issue
Block a user