mirror of
https://github.com/RGBCube/serenity
synced 2025-05-14 17:44:58 +00:00
AK: Add IntrusiveList::take_last()
This commit is contained in:
parent
3e3a72f2a2
commit
c33d71c5ff
2 changed files with 25 additions and 13 deletions
|
@ -56,6 +56,7 @@ public:
|
||||||
T* last() const;
|
T* last() const;
|
||||||
|
|
||||||
T* take_first();
|
T* take_first();
|
||||||
|
T* take_last();
|
||||||
|
|
||||||
class Iterator {
|
class Iterator {
|
||||||
public:
|
public:
|
||||||
|
@ -233,6 +234,16 @@ inline T* IntrusiveList<T, member>::take_first()
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<class T, IntrusiveListNode T::*member>
|
||||||
|
inline T* IntrusiveList<T, member>::take_last()
|
||||||
|
{
|
||||||
|
if (auto* ptr = last()) {
|
||||||
|
remove(*ptr);
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
template<class T, IntrusiveListNode T::*member>
|
template<class T, IntrusiveListNode T::*member>
|
||||||
inline T* IntrusiveList<T, member>::last() const
|
inline T* IntrusiveList<T, member>::last() const
|
||||||
{
|
{
|
||||||
|
|
|
@ -96,9 +96,9 @@ public:
|
||||||
bool read_LEB128_unsigned(size_t& result)
|
bool read_LEB128_unsigned(size_t& result)
|
||||||
{
|
{
|
||||||
const auto backup = m_offset;
|
const auto backup = m_offset;
|
||||||
result = 0;
|
|
||||||
|
|
||||||
size_t shift = 0;
|
result = 0;
|
||||||
|
size_t num_bytes = 0;
|
||||||
while (true) {
|
while (true) {
|
||||||
if (eof()) {
|
if (eof()) {
|
||||||
m_offset = backup;
|
m_offset = backup;
|
||||||
|
@ -106,11 +106,12 @@ public:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const u8 byte = m_bytes[m_offset++];
|
const u8 byte = m_bytes[m_offset];
|
||||||
result |= (byte & 0x7f) << shift;
|
result = (result) | (static_cast<size_t>(byte & ~(1 << 7)) << (num_bytes * 7));
|
||||||
if ((byte & 0x80) == 0)
|
++m_offset;
|
||||||
|
if (!(byte & (1 << 7)))
|
||||||
break;
|
break;
|
||||||
shift += 7;
|
++num_bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -121,11 +122,9 @@ public:
|
||||||
const auto backup = m_offset;
|
const auto backup = m_offset;
|
||||||
|
|
||||||
result = 0;
|
result = 0;
|
||||||
size_t shift = 0;
|
size_t num_bytes = 0;
|
||||||
u8 byte = 0;
|
u8 byte = 0;
|
||||||
|
|
||||||
size_t size = sizeof(ssize_t) * 8;
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (eof()) {
|
if (eof()) {
|
||||||
m_offset = backup;
|
m_offset = backup;
|
||||||
|
@ -133,13 +132,15 @@ public:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte = m_bytes[m_offset++];
|
byte = m_bytes[m_offset];
|
||||||
result |= (byte & 0x7f) << shift;
|
result = (result) | (static_cast<size_t>(byte & ~(1 << 7)) << (num_bytes * 7));
|
||||||
|
++m_offset;
|
||||||
|
++num_bytes;
|
||||||
} while (byte & (1 << 7));
|
} while (byte & (1 << 7));
|
||||||
|
|
||||||
if (shift < size && (byte & 0x40)) {
|
if (num_bytes * 7 < sizeof(size_t) * 4 && (byte & 0x40)) {
|
||||||
// sign extend
|
// sign extend
|
||||||
result |= (0xffffffffu << shift);
|
result |= ((size_t)(-1) << (num_bytes * 7));
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue