#include <iostream>
class List
{
public:
constexpr List():
m_data(nullptr),
m_next(this),
m_previous(this)
{
}
List(const void *data):
m_data(data)
{
m_next = &root;
m_previous = root.m_previous;
root.m_previous = root.m_previous->m_next = this;
}
template <typename Func>
static void ForEach(Func f)
{
List *ptr = root.m_next;
while (ptr != &root)
{
f(ptr->m_data);
ptr = ptr->m_next;
}
}
private:
static List root;
private:
const void *m_data;
List *m_next;
List *m_previous;
};
List a("foo");
List b("bar");
List List::root;
int main()
{
List::ForEach([](const void* ptr)
{
std::cout << static_cast<const char*>(ptr) << std::endl;
});
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgTGlzdAp7CnB1YmxpYzoKICAgIGNvbnN0ZXhwciBMaXN0KCk6CiAgICAgICAgbV9kYXRhKG51bGxwdHIpLAogICAgICAgIG1fbmV4dCh0aGlzKSwKICAgICAgICBtX3ByZXZpb3VzKHRoaXMpCiAgICB7CiAgICB9CgogICAgTGlzdChjb25zdCB2b2lkICpkYXRhKToKICAgICAgICBtX2RhdGEoZGF0YSkKICAgIHsKICAgICAgICBtX25leHQgPSAmcm9vdDsKICAgICAgICBtX3ByZXZpb3VzID0gcm9vdC5tX3ByZXZpb3VzOwogICAgICAgIHJvb3QubV9wcmV2aW91cyA9IHJvb3QubV9wcmV2aW91cy0+bV9uZXh0ID0gdGhpczsKICAgIH0KCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuYz4KICAgIHN0YXRpYyB2b2lkIEZvckVhY2goRnVuYyBmKQogICAgewogICAgICAgIExpc3QgKnB0ciA9IHJvb3QubV9uZXh0OwogICAgICAgIHdoaWxlIChwdHIgIT0gJnJvb3QpCiAgICAgICAgewogICAgICAgICAgICBmKHB0ci0+bV9kYXRhKTsKICAgICAgICAgICAgcHRyID0gcHRyLT5tX25leHQ7CiAgICAgICAgfQogICAgfQpwcml2YXRlOgogICAgc3RhdGljIExpc3Qgcm9vdDsKcHJpdmF0ZToKICAgIGNvbnN0IHZvaWQgKm1fZGF0YTsKICAgIExpc3QgKm1fbmV4dDsKICAgIExpc3QgKm1fcHJldmlvdXM7Cn07CgoKTGlzdCBhKCJmb28iKTsKTGlzdCBiKCJiYXIiKTsKTGlzdCBMaXN0Ojpyb290OwoKaW50IG1haW4oKQp7CiAgICBMaXN0OjpGb3JFYWNoKFtdKGNvbnN0IHZvaWQqIHB0cikKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KHB0cikgPDwgc3RkOjplbmRsOwogICAgfSk7Cn0=