19 size_t count()
const {
20 return m_Objects.
count();
23 return m_Objects.
begin();
26 return m_Objects.
end();
28 ReverseIterator rbegin() {
31 ReverseIterator rend() {
32 return m_Objects.
rend();
35 bool tryPushBack(Object*
object) {
36 assert(
object && !m_HasReservation);
45 assert(!m_HasReservation);
46 m_LastMatch =
nullptr;
53 m_ReservedAddress = address;
54 m_HasReservation =
true;
58 void publishBack(Object*
object) {
59 assert(m_HasReservation &&
object && object->address() == m_ReservedAddress);
60 m_LastMatch =
nullptr;
61 Object** slot = m_Index.
find(m_ReservedAddress);
62 assert(slot && !*slot);
64 *m_Objects.
rbegin() = object;
65 m_HasReservation =
false;
69 m_LastMatch =
nullptr;
70 Object*
object = m_Objects.
popBack();
71 if (m_HasReservation) {
73 m_Index.
remove(m_ReservedAddress);
74 m_HasReservation =
false;
76 m_Index.
remove(object->address());
82 assert(!m_HasReservation && *it);
83 m_LastMatch =
nullptr;
84 m_Index.
remove((*it)->address());
85 return m_Objects.
erase(it);
87 ReverseIterator erase(ReverseIterator& it) {
88 assert(!m_HasReservation && *it);
89 m_LastMatch =
nullptr;
90 m_Index.
remove((*it)->address());
91 return m_Objects.
erase(it);
94 Object* find(uintptr_t address,
size_t* objectVisits =
nullptr)
const {
104 if (m_LastMatch->matches(address)) {
110 if (!m_Index.
floorBound(address, start,
object))
114 if (!
object && (!start || !m_Index.
floorBound(start - 1, start,
object)))
121 if (!object->matches(address)) {
124 m_LastMatch = object;
133 mutable Object* m_LastMatch =
nullptr;
134 uintptr_t m_ReservedAddress = 0;
135 bool m_HasReservation =
false;