2024-03-10 20:52:50 -04:00
|
|
|
/*
|
2025-11-17 10:11:05 -05:00
|
|
|
* Copyright (c) 2024-2025, Tim Flynn <trflynn89@ladybird.org>
|
2024-03-10 20:52:50 -04:00
|
|
|
*
|
|
|
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <AK/StdLibExtras.h>
|
|
|
|
|
|
|
|
|
|
namespace AK {
|
|
|
|
|
|
|
|
|
|
namespace Detail {
|
2025-05-13 07:06:33 -04:00
|
|
|
|
2024-03-10 20:52:50 -04:00
|
|
|
template<typename Iterable>
|
2025-11-17 10:11:05 -05:00
|
|
|
struct Enumerator {
|
2024-03-10 20:52:50 -04:00
|
|
|
using IteratorType = decltype(declval<Iterable>().begin());
|
|
|
|
|
using ValueType = decltype(*declval<IteratorType>());
|
|
|
|
|
|
|
|
|
|
struct Enumeration {
|
|
|
|
|
size_t index { 0 };
|
|
|
|
|
ValueType value;
|
|
|
|
|
};
|
|
|
|
|
|
2025-11-17 10:11:05 -05:00
|
|
|
struct Iterator {
|
|
|
|
|
Enumeration operator*() { return { index, *iterator }; }
|
|
|
|
|
Enumeration operator*() const { return { index, *iterator }; }
|
2024-03-10 20:52:50 -04:00
|
|
|
|
2025-11-17 10:11:05 -05:00
|
|
|
bool operator!=(Iterator const& other) const { return iterator != other.iterator; }
|
2024-03-10 20:52:50 -04:00
|
|
|
|
2025-11-17 10:11:05 -05:00
|
|
|
void operator++()
|
|
|
|
|
{
|
|
|
|
|
++index;
|
|
|
|
|
++iterator;
|
|
|
|
|
}
|
2024-03-10 20:52:50 -04:00
|
|
|
|
2025-11-17 10:11:05 -05:00
|
|
|
size_t index { 0 };
|
|
|
|
|
IteratorType iterator;
|
|
|
|
|
};
|
2024-03-10 20:52:50 -04:00
|
|
|
|
2025-11-17 10:11:05 -05:00
|
|
|
Iterator begin() { return { 0, iterable.begin() }; }
|
|
|
|
|
Iterator end() { return { 0, iterable.end() }; }
|
2024-03-10 20:52:50 -04:00
|
|
|
|
2025-11-17 10:11:05 -05:00
|
|
|
Iterable iterable;
|
2024-03-10 20:52:50 -04:00
|
|
|
};
|
2025-05-13 07:06:33 -04:00
|
|
|
|
2024-03-10 20:52:50 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
|
auto enumerate(T&& range)
|
|
|
|
|
{
|
|
|
|
|
return Detail::Enumerator<T> { forward<T>(range) };
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef USING_AK_GLOBALLY
|
|
|
|
|
using AK::enumerate;
|
|
|
|
|
#endif
|