114 void dump(
void (*emit_line)(
const char* s))
const;
124 typedef typename decltype(m_List)::ConstIterator ConstIterator;
125 typedef typename decltype(m_List)::ReverseIterator ReverseIterator;
126 typedef typename decltype(m_List)::ConstReverseIterator ConstReverseIterator;
132template <
typename T,
bool Reversed>
134 : m_List(), m_bPreferUsed(other.m_bPreferUsed) {
135 for (ConstIterator it = other.m_List.begin(); it != other.m_List.end(); ++it) {
140template <
typename T,
bool Reversed>
142 if (
this == &other) {
147 m_bPreferUsed = other.m_bPreferUsed;
149 for (ConstIterator it = other.m_List.begin(); it != other.m_List.end(); ++it) {
150 m_List.pushBack(*it);
156template <
typename T,
bool Reversed>
160 ConstIterator end = m_List.end();
163 bool needsNew =
true;
164 for (; cur != end; ++cur) {
166 if ((cur->address + cur->length) == address) {
168 cur->length += length;
173 else if (cur->address == (address + length)) {
175 cur->address -= length;
176 cur->length += length;
191 Range range(address, length);
195 bool front = Reversed;
200 m_List.pushFront(range);
202 m_List.pushBack(range);
210template <
typename T,
bool Reversed>
212 if (merge && freeWithoutAllocation(address, length)) {
215 if (!m_List.tryReserve(m_List.count() + 1)) {
218 Range range(address, length);
219 if (Reversed != m_bPreferUsed) {
220 m_List.pushFront(range);
222 m_List.pushBack(range);
227template <
typename T,
bool Reversed>
232 size_t empty = m_List.count();
233 for (
size_t i = 0; i < m_List.count(); ++i) {
234 Range* range = &m_List[i];
240 }
else if (range->
address == address + length) {
246 if (empty == m_List.count()) {
250 Range range(address, length);
251 if (Reversed != m_bPreferUsed) {
252 m_List.pushFront(range);
254 m_List.pushBack(range);
259template <
typename T,
bool Reversed>
264 for (
size_t i = 0; i < m_List.count(); ++i) {
265 Range* range = &m_List[Reversed ? m_List.count() - 1 - i : i];
266 if (range->length < length) {
269 address = Reversed ? range->address + range->length - length : range->address;
271 range->address += length;
273 range->length -= length;
279template <
typename T,
bool Reversed>
284 for (
size_t i = 0; i < m_List.count(); ++i) {
285 Range* range = &m_List[i];
286 if (address < range->address || address - range->address > range->length ||
287 length > range->length - (address - range->address)) {
290 const T prefix = address - range->address;
291 const T suffix = range->length - prefix - length;
292 if (prefix && suffix) {
293 Range* spare =
nullptr;
294 for (
size_t j = 0; j < m_List.count(); ++j) {
295 if (!m_List[j].length) {
303 spare->address = address + length;
304 spare->length = suffix;
305 range->length = prefix;
307 range->length = prefix;
309 range->address += length;
310 range->length = suffix;
317template <
typename T,
bool Reversed>
319 bool bSuccess =
false;
321 for (
int i = 0; i < 2; ++i) {
322 for (
size_t j = 0; j < m_List.count(); ++j) {
323 const size_t index = Reversed ? m_List.count() - 1 - j : j;
324 Range& range = m_List[index];
325 if (range.
length < length) {
331 T offset = range.
length - length;
332 address = range.
address + offset;
362template <
typename T,
bool Reversed>
364 bool bSuccess =
false;
365 for (
int i = 0; i < 2; ++i) {
366 for (
size_t j = 0; j < m_List.count(); ++j) {
367 Range* cur = &m_List[j];
393 const T suffix = cur->
address + cur->
length - address - length;
394 const T prefix = address - cur->
address;
395 if (!m_List.tryReserve(m_List.count() + 1)) {
399 m_List[j].length = prefix;
400 m_List.pushBack(
Range(address + length, suffix));
418template <
typename T,
bool Reversed>
421 if (index >= m_List.count())
424 range = m_List[index];
428template <
typename T,
bool Reversed>
433template <
typename T,
bool Reversed>
438template <
typename T,
bool Reversed>
440 if (m_List.count() < 2) {
446 for (
size_t i = 0; i < m_List.count(); ++i) {
447 for (
size_t j = i + 1; j < m_List.count();) {
448 Range* cur = &m_List[i];
449 Range* next = &m_List[j];
451 cur->
length += next->length;
452 }
else if (next->address + next->length == cur->
address) {
454 cur->
length += next->length;
466template <
typename T,
bool Reversed>
468 for (
size_t i = 0; i < m_List.count(); ++i) {
469 const Range* range = &m_List[i];
472 str.append(
"range ");
473 str.append(range->
address, 16, 16,
'0');
477 str.append(range->
length, 10);
478 str.append(
" bytes)");
479 emit_line(
static_cast<const char*
>(str));