From dfef28de887eba43747bca52584f8310450e243a Mon Sep 17 00:00:00 2001 From: Jacob Erlbeck Date: Mon, 11 May 2015 14:13:47 +0200 Subject: llist: Add a C++ wrapper for linux_list This commit adds the LListHead class which is a wrapper around the linuxlist. It adds an additional member to refer to the container, since the container_of macro doesn't work properly with C++ classes. All functions and macros from linuxlist.h are support except for the entry macros (e.g. llist_entry, llist_for_each_entry, ...). To access the container (entry), an entry() method is provided instead: llist_for_each(pos, &elems) { pos->entry()->do_something(); } Sponsored-by: On-Waves ehf --- tests/llist/LListTest.cpp | 87 +++++++++++++++++++++++++++++++++++++++++++++++ tests/llist/LListTest.err | 0 tests/llist/LListTest.ok | 10 ++++++ 3 files changed, 97 insertions(+) create mode 100644 tests/llist/LListTest.cpp create mode 100644 tests/llist/LListTest.err create mode 100644 tests/llist/LListTest.ok (limited to 'tests/llist') diff --git a/tests/llist/LListTest.cpp b/tests/llist/LListTest.cpp new file mode 100644 index 00000000..04f741cf --- /dev/null +++ b/tests/llist/LListTest.cpp @@ -0,0 +1,87 @@ +/* + * LListTest.cpp + * + * Copyright (C) 2015 by Sysmocom s.f.m.c. GmbH + * + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +#include "cxx_linuxlist.h" + +extern "C" { +#include +#include +#include +} + +#include + + +struct TestElem { + const char *str; + LListHead list; + + TestElem(const char *s) : str(s), list(this) {}; +}; + +static void test_linux_list() +{ + LListHead elems, *pos, *tmp; + TestElem elem1("number one"); + TestElem elem2("number two"); + TestElem elem3("number three"); + int count = 0; + + printf("=== start %s ===\n", __func__); + + llist_add_tail(&elem1.list, &elems); + llist_add_tail(&elem2.list, &elems); + llist_add_tail(&elem3.list, &elems); + + llist_for_each(pos, &elems) { + count += 1; + printf(" %i -> %s\n", count, pos->entry()->str); + } + OSMO_ASSERT(count == 3); + + count = 0; + llist_for_each_safe(pos, tmp, &elems) { + count += 1; + if (count == 2) + llist_del(pos); + + printf(" %i -> %s\n", count, pos->entry()->str); + } + OSMO_ASSERT(count == 3); + + count = 0; + llist_for_each(pos, &elems) { + count += 1; + OSMO_ASSERT(pos != &elem2.list); + printf(" %i -> %s\n", count, pos->entry()->str); + } + OSMO_ASSERT(count == 2); + + printf("=== end %s ===\n", __func__); +} + +int main(int argc, char **argv) +{ + test_linux_list(); + + return EXIT_SUCCESS; +} diff --git a/tests/llist/LListTest.err b/tests/llist/LListTest.err new file mode 100644 index 00000000..e69de29b diff --git a/tests/llist/LListTest.ok b/tests/llist/LListTest.ok new file mode 100644 index 00000000..375e9a64 --- /dev/null +++ b/tests/llist/LListTest.ok @@ -0,0 +1,10 @@ +=== start test_linux_list === + 1 -> number one + 2 -> number two + 3 -> number three + 1 -> number one + 2 -> number two + 3 -> number three + 1 -> number one + 2 -> number three +=== end test_linux_list === -- cgit v1.2.3