1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-14 23:04:59 +00:00

AK: Add IntrusiveList::take_last()

This commit is contained in:
Andreas Kling 2020-11-24 16:37:55 +01:00
parent 3e3a72f2a2
commit c33d71c5ff
2 changed files with 25 additions and 13 deletions

View file

@ -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
{ {

View file

@ -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;