mirror of
https://github.com/asmjit/asmjit.git
synced 2025-12-18 21:14:35 +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 <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <new>
|
#include <iterator>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
#include <new>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,9 @@
|
|||||||
#include "../core/logger.h"
|
#include "../core/logger.h"
|
||||||
#include "../core/support.h"
|
#include "../core/support.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <tuple>
|
||||||
|
|
||||||
ASMJIT_BEGIN_NAMESPACE
|
ASMJIT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
@@ -368,25 +371,6 @@ Error CodeHolder::reserveBuffer(CodeBuffer* cb, size_t n) noexcept {
|
|||||||
// [asmjit::CodeHolder - Sections]
|
// [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 {
|
Error CodeHolder::newSection(Section** sectionOut, const char* name, size_t nameSize, uint32_t flags, uint32_t alignment, int32_t order) noexcept {
|
||||||
*sectionOut = nullptr;
|
*sectionOut = nullptr;
|
||||||
|
|
||||||
@@ -419,13 +403,12 @@ Error CodeHolder::newSection(Section** sectionOut, const char* name, size_t name
|
|||||||
section->_order = order;
|
section->_order = order;
|
||||||
memcpy(section->_name.str, name, nameSize);
|
memcpy(section->_name.str, name, nameSize);
|
||||||
|
|
||||||
size_t n = binarySearchClosestFirst(_sectionsByOrder.data(), _sectionsByOrder.size(), section, [](const Section* a, const Section* b) -> int64_t {
|
Section** insertPosition = std::lower_bound(_sectionsByOrder.begin(), _sectionsByOrder.end(), section, [](const Section* a, const Section* b) {
|
||||||
return a->order() == b->order() ? int64_t(a->id()) - int64_t(b->id())
|
return std::make_tuple(a->order(), a->id()) < std::make_tuple(b->order(), b->id());
|
||||||
: int64_t(a->order()) - int64_t(b->order());
|
|
||||||
});
|
});
|
||||||
|
|
||||||
_sections.appendUnsafe(section);
|
_sections.appendUnsafe(section);
|
||||||
_sectionsByOrder.insertUnsafe(n, section);
|
_sectionsByOrder.insertUnsafe((size_t)(insertPosition - _sectionsByOrder.data()), section);
|
||||||
|
|
||||||
*sectionOut = section;
|
*sectionOut = section;
|
||||||
return kErrorOk;
|
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);
|
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]
|
// [asmjit::Support::Temporary]
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|||||||
@@ -155,10 +155,10 @@ public:
|
|||||||
typedef T& reference;
|
typedef T& reference;
|
||||||
typedef const T& const_reference;
|
typedef const T& const_reference;
|
||||||
|
|
||||||
typedef Support::Iterator<T> iterator;
|
typedef T* iterator;
|
||||||
typedef Support::Iterator<const T> const_iterator;
|
typedef const T* const_iterator;
|
||||||
typedef Support::ReverseIterator<T> reverse_iterator;
|
typedef std::reverse_iterator<T> reverse_iterator;
|
||||||
typedef Support::ReverseIterator<const T> const_reverse_iterator;
|
typedef std::reverse_iterator<const T> const_reverse_iterator;
|
||||||
|
|
||||||
//! \name Construction & Destruction
|
//! \name Construction & Destruction
|
||||||
//! \{
|
//! \{
|
||||||
|
|||||||
Reference in New Issue
Block a user