GNUnet debian-0.24.3-29-g453fda2cf
 
Loading...
Searching...
No Matches
Doubly-linked list
Collaboration diagram for Doubly-linked list:

Macros

#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
 Insert an element at the head of a DLL.
 
#define GNUNET_CONTAINER_DLL_insert_tail(head, tail, element)
 Insert an element at the tail of a DLL.
 
#define GNUNET_CONTAINER_DLL_insert_after(head, tail, other, element)
 Insert an element into a DLL after the given other element.
 
#define GNUNET_CONTAINER_DLL_insert_before(head, tail, other, element)
 Insert an element into a DLL before the given other element.
 
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
 Remove an element from a DLL.
 
#define GNUNET_CONTAINER_MDLL_insert(mdll, head, tail, element)
 Insert an element at the head of a MDLL.
 
#define GNUNET_CONTAINER_MDLL_insert_tail(mdll, head, tail, element)
 Insert an element at the tail of a MDLL.
 
#define GNUNET_CONTAINER_MDLL_insert_after(mdll, head, tail, other, element)
 Insert an element into a MDLL after the given other element.
 
#define GNUNET_CONTAINER_MDLL_insert_before(mdll, head, tail, other, element)
 Insert an element into a MDLL before the given other element.
 
#define GNUNET_CONTAINER_MDLL_remove(mdll, head, tail, element)
 Remove an element from a MDLL.
 

Detailed Description

See also
Documentation

Macro Definition Documentation

◆ GNUNET_CONTAINER_DLL_insert

#define GNUNET_CONTAINER_DLL_insert (   head,
  tail,
  element 
)
Value:
do \
{ \
GNUNET_assert ((NULL == (head)) == (NULL == (tail))); \
GNUNET_assert ((NULL == (element)->prev) && ((head) != (element))); \
GNUNET_assert ((NULL == (element)->next) && ((tail) != (element))); \
(element)->next = (head); \
(element)->prev = NULL; \
if (NULL == (tail)) \
(tail) = element; \
else \
(head)->prev = element; \
(head) = (element); \
} while (0)

Insert an element at the head of a DLL.

Assumes that head, tail and element are structs with prev and next fields.

Parameters
headpointer to the head of the DLL
tailpointer to the tail of the DLL
elementelement to insert

Definition at line 1797 of file gnunet_container_lib.h.

1799 { \
1800 GNUNET_assert ((NULL == (head)) == (NULL == (tail))); \
1801 GNUNET_assert ((NULL == (element)->prev) && ((head) != (element))); \
1802 GNUNET_assert ((NULL == (element)->next) && ((tail) != (element))); \
1803 (element)->next = (head); \
1804 (element)->prev = NULL; \
1805 if (NULL == (tail)) \
1806 (tail) = element; \
1807 else \
1808 (head)->prev = element; \
1809 (head) = (element); \
1810 } while (0)

◆ GNUNET_CONTAINER_DLL_insert_tail

#define GNUNET_CONTAINER_DLL_insert_tail (   head,
  tail,
  element 
)
Value:
do \
{ \
GNUNET_assert ((NULL == (head)) == (NULL == (tail))); \
GNUNET_assert ((NULL == (element)->prev) && ((head) != (element))); \
GNUNET_assert ((NULL == (element)->next) && ((tail) != (element))); \
(element)->prev = (tail); \
(element)->next = NULL; \
if (NULL == (head)) \
(head) = element; \
else \
(tail)->next = element; \
(tail) = (element); \
} while (0)

Insert an element at the tail of a DLL.

Assumes that head, tail and element are structs with prev and next fields.

Parameters
headpointer to the head of the DLL
tailpointer to the tail of the DLL
elementelement to insert

Definition at line 1822 of file gnunet_container_lib.h.

1824 { \
1825 GNUNET_assert ((NULL == (head)) == (NULL == (tail))); \
1826 GNUNET_assert ((NULL == (element)->prev) && ((head) != (element))); \
1827 GNUNET_assert ((NULL == (element)->next) && ((tail) != (element))); \
1828 (element)->prev = (tail); \
1829 (element)->next = NULL; \
1830 if (NULL == (head)) \
1831 (head) = element; \
1832 else \
1833 (tail)->next = element; \
1834 (tail) = (element); \
1835 } while (0)

◆ GNUNET_CONTAINER_DLL_insert_after

#define GNUNET_CONTAINER_DLL_insert_after (   head,
  tail,
  other,
  element 
)
Value:
do \
{ \
GNUNET_assert ((NULL == (head)) == (NULL == (tail))); \
GNUNET_assert ((NULL == (element)->prev) && ((head) != (element))); \
GNUNET_assert ((NULL == (element)->next) && ((tail) != (element))); \
(element)->prev = (other); \
if (NULL == other) \
{ \
(element)->next = (head); \
(head) = (element); \
} \
else \
{ \
(element)->next = (other)->next; \
(other)->next = (element); \
} \
if (NULL == (element)->next) \
(tail) = (element); \
else \
(element)->next->prev = (element); \
} while (0)

Insert an element into a DLL after the given other element.

Insert at the head if the other element is NULL.

Parameters
headpointer to the head of the DLL
tailpointer to the tail of the DLL
otherprior element, NULL for insertion at head of DLL
elementelement to insert

Definition at line 1848 of file gnunet_container_lib.h.

1850 { \
1851 GNUNET_assert ((NULL == (head)) == (NULL == (tail))); \
1852 GNUNET_assert ((NULL == (element)->prev) && ((head) != (element))); \
1853 GNUNET_assert ((NULL == (element)->next) && ((tail) != (element))); \
1854 (element)->prev = (other); \
1855 if (NULL == other) \
1856 { \
1857 (element)->next = (head); \
1858 (head) = (element); \
1859 } \
1860 else \
1861 { \
1862 (element)->next = (other)->next; \
1863 (other)->next = (element); \
1864 } \
1865 if (NULL == (element)->next) \
1866 (tail) = (element); \
1867 else \
1868 (element)->next->prev = (element); \
1869 } while (0)

◆ GNUNET_CONTAINER_DLL_insert_before

#define GNUNET_CONTAINER_DLL_insert_before (   head,
  tail,
  other,
  element 
)
Value:
do \
{ \
GNUNET_assert ((NULL == (head)) == (NULL == (tail))); \
GNUNET_assert ((NULL == (element)->prev) && ((head) != (element))); \
GNUNET_assert ((NULL == (element)->next) && ((tail) != (element))); \
(element)->next = (other); \
if (NULL == other) \
{ \
(element)->prev = (tail); \
(tail) = (element); \
} \
else \
{ \
(element)->prev = (other)->prev; \
(other)->prev = (element); \
} \
if (NULL == (element)->prev) \
(head) = (element); \
else \
(element)->prev->next = (element); \
} while (0)

Insert an element into a DLL before the given other element.

Insert at the tail if the other element is NULL.

Parameters
headpointer to the head of the DLL
tailpointer to the tail of the DLL
otherprior element, NULL for insertion at head of DLL
elementelement to insert

Definition at line 1882 of file gnunet_container_lib.h.

1884 { \
1885 GNUNET_assert ((NULL == (head)) == (NULL == (tail))); \
1886 GNUNET_assert ((NULL == (element)->prev) && ((head) != (element))); \
1887 GNUNET_assert ((NULL == (element)->next) && ((tail) != (element))); \
1888 (element)->next = (other); \
1889 if (NULL == other) \
1890 { \
1891 (element)->prev = (tail); \
1892 (tail) = (element); \
1893 } \
1894 else \
1895 { \
1896 (element)->prev = (other)->prev; \
1897 (other)->prev = (element); \
1898 } \
1899 if (NULL == (element)->prev) \
1900 (head) = (element); \
1901 else \
1902 (element)->prev->next = (element); \
1903 } while (0)

◆ GNUNET_CONTAINER_DLL_remove

#define GNUNET_CONTAINER_DLL_remove (   head,
  tail,
  element 
)
Value:
do \
{ \
GNUNET_assert ((NULL != (element)->prev) || ((head) == (element))); \
GNUNET_assert ((NULL != (element)->next) || ((tail) == (element))); \
if (NULL == (element)->prev) \
(head) = (element)->next; \
else \
(element)->prev->next = (element)->next; \
if (NULL == (element)->next) \
(tail) = (element)->prev; \
else \
(element)->next->prev = (element)->prev; \
(element)->next = NULL; \
(element)->prev = NULL; \
} while (0)

Remove an element from a DLL.

Assumes that head, tail and element point to structs with prev and next fields.

Using the head or tail pointer as the element argument does NOT work with this macro. Make sure to store head/tail in another pointer and use it to remove the head or tail of the list.

Parameters
headpointer to the head of the DLL
tailpointer to the tail of the DLL
elementelement to remove

Definition at line 1920 of file gnunet_container_lib.h.

1922 { \
1923 GNUNET_assert ((NULL != (element)->prev) || ((head) == (element))); \
1924 GNUNET_assert ((NULL != (element)->next) || ((tail) == (element))); \
1925 if (NULL == (element)->prev) \
1926 (head) = (element)->next; \
1927 else \
1928 (element)->prev->next = (element)->next; \
1929 if (NULL == (element)->next) \
1930 (tail) = (element)->prev; \
1931 else \
1932 (element)->next->prev = (element)->prev; \
1933 (element)->next = NULL; \
1934 (element)->prev = NULL; \
1935 } while (0)

◆ GNUNET_CONTAINER_MDLL_insert

#define GNUNET_CONTAINER_MDLL_insert (   mdll,
  head,
  tail,
  element 
)
Value:
do \
{ \
GNUNET_assert ((NULL == (head)) == (NULL == (tail))); \
GNUNET_assert ((NULL == (element)->prev_ ## mdll) && ((head) != (element))); \
GNUNET_assert ((NULL == (element)->next_ ## mdll) && ((tail) != (element))); \
(element)->next_ ## mdll = (head); \
(element)->prev_ ## mdll = NULL; \
if (NULL == (tail)) \
(tail) = element; \
else \
(head)->prev_ ## mdll = element; \
(head) = (element); \
} while (0)

Insert an element at the head of a MDLL.

Assumes that head, tail and element are structs with prev and next fields.

Parameters
mdllsuffix name for the next and prev pointers in the element
headpointer to the head of the MDLL
tailpointer to the tail of the MDLL
elementelement to insert

Definition at line 1951 of file gnunet_container_lib.h.

1953 { \
1954 GNUNET_assert ((NULL == (head)) == (NULL == (tail))); \
1955 GNUNET_assert ((NULL == (element)->prev_ ## mdll) && ((head) != (element))); \
1956 GNUNET_assert ((NULL == (element)->next_ ## mdll) && ((tail) != (element))); \
1957 (element)->next_ ## mdll = (head); \
1958 (element)->prev_ ## mdll = NULL; \
1959 if (NULL == (tail)) \
1960 (tail) = element; \
1961 else \
1962 (head)->prev_ ## mdll = element; \
1963 (head) = (element); \
1964 } while (0)

◆ GNUNET_CONTAINER_MDLL_insert_tail

#define GNUNET_CONTAINER_MDLL_insert_tail (   mdll,
  head,
  tail,
  element 
)
Value:
do \
{ \
GNUNET_assert ((NULL == (head)) == (NULL == (tail))); \
GNUNET_assert ((NULL == (element)->prev_ ## mdll) && ((head) != (element))); \
GNUNET_assert ((NULL == (element)->next_ ## mdll) && ((tail) != (element))); \
(element)->prev_ ## mdll = (tail); \
(element)->next_ ## mdll = NULL; \
if (NULL == (head)) \
(head) = element; \
else \
(tail)->next_ ## mdll = element; \
(tail) = (element); \
} while (0)

Insert an element at the tail of a MDLL.

Assumes that head, tail and element are structs with prev and next fields.

Parameters
mdllsuffix name for the next and prev pointers in the element
headpointer to the head of the MDLL
tailpointer to the tail of the MDLL
elementelement to insert

Definition at line 1977 of file gnunet_container_lib.h.

1979 { \
1980 GNUNET_assert ((NULL == (head)) == (NULL == (tail))); \
1981 GNUNET_assert ((NULL == (element)->prev_ ## mdll) && ((head) != (element))); \
1982 GNUNET_assert ((NULL == (element)->next_ ## mdll) && ((tail) != (element))); \
1983 (element)->prev_ ## mdll = (tail); \
1984 (element)->next_ ## mdll = NULL; \
1985 if (NULL == (head)) \
1986 (head) = element; \
1987 else \
1988 (tail)->next_ ## mdll = element; \
1989 (tail) = (element); \
1990 } while (0)

◆ GNUNET_CONTAINER_MDLL_insert_after

#define GNUNET_CONTAINER_MDLL_insert_after (   mdll,
  head,
  tail,
  other,
  element 
)
Value:
do \
{ \
GNUNET_assert ((NULL == (head)) == (NULL == (tail))); \
GNUNET_assert ((NULL == (element)->prev_ ## mdll) && ((head) != (element))); \
GNUNET_assert ((NULL == (element)->next_ ## mdll) && ((tail) != (element))); \
(element)->prev_ ## mdll = (other); \
if (NULL == other) \
{ \
(element)->next_ ## mdll = (head); \
(head) = (element); \
} \
else \
{ \
(element)->next_ ## mdll = (other)->next_ ## mdll; \
(other)->next_ ## mdll = (element); \
} \
if (NULL == (element)->next_ ## mdll) \
(tail) = (element); \
else \
(element)->next_ ## mdll->prev_ ## mdll = (element); \
} while (0)

Insert an element into a MDLL after the given other element.

Insert at the head if the other element is NULL.

Parameters
mdllsuffix name for the next and prev pointers in the element
headpointer to the head of the MDLL
tailpointer to the tail of the MDLL
otherprior element, NULL for insertion at head of MDLL
elementelement to insert

Definition at line 2004 of file gnunet_container_lib.h.

2006 { \
2007 GNUNET_assert ((NULL == (head)) == (NULL == (tail))); \
2008 GNUNET_assert ((NULL == (element)->prev_ ## mdll) && ((head) != (element))); \
2009 GNUNET_assert ((NULL == (element)->next_ ## mdll) && ((tail) != (element))); \
2010 (element)->prev_ ## mdll = (other); \
2011 if (NULL == other) \
2012 { \
2013 (element)->next_ ## mdll = (head); \
2014 (head) = (element); \
2015 } \
2016 else \
2017 { \
2018 (element)->next_ ## mdll = (other)->next_ ## mdll; \
2019 (other)->next_ ## mdll = (element); \
2020 } \
2021 if (NULL == (element)->next_ ## mdll) \
2022 (tail) = (element); \
2023 else \
2024 (element)->next_ ## mdll->prev_ ## mdll = (element); \
2025 } while (0)

◆ GNUNET_CONTAINER_MDLL_insert_before

#define GNUNET_CONTAINER_MDLL_insert_before (   mdll,
  head,
  tail,
  other,
  element 
)
Value:
do \
{ \
GNUNET_assert ((NULL == (head)) == (NULL == (tail))); \
GNUNET_assert (((element)->prev_ ## mdll == NULL) && ((head) != (element))); \
GNUNET_assert (((element)->next_ ## mdll == NULL) && ((tail) != (element))); \
(element)->next_ ## mdll = (other); \
if (NULL == other) \
{ \
(element)->prev = (tail); \
(tail) = (element); \
} \
else \
{ \
(element)->prev_ ## mdll = (other)->prev_ ## mdll; \
(other)->prev_ ## mdll = (element); \
} \
if (NULL == (element)->prev_ ## mdll) \
(head) = (element); \
else \
(element)->prev_ ## mdll->next_ ## mdll = (element); \
} while (0)

Insert an element into a MDLL before the given other element.

Insert at the tail if the other element is NULL.

Parameters
mdllsuffix name for the next and prev pointers in the element
headpointer to the head of the MDLL
tailpointer to the tail of the MDLL
otherprior element, NULL for insertion at head of MDLL
elementelement to insert

Definition at line 2039 of file gnunet_container_lib.h.

2041 { \
2042 GNUNET_assert ((NULL == (head)) == (NULL == (tail))); \
2043 GNUNET_assert (((element)->prev_ ## mdll == NULL) && ((head) != (element))); \
2044 GNUNET_assert (((element)->next_ ## mdll == NULL) && ((tail) != (element))); \
2045 (element)->next_ ## mdll = (other); \
2046 if (NULL == other) \
2047 { \
2048 (element)->prev = (tail); \
2049 (tail) = (element); \
2050 } \
2051 else \
2052 { \
2053 (element)->prev_ ## mdll = (other)->prev_ ## mdll; \
2054 (other)->prev_ ## mdll = (element); \
2055 } \
2056 if (NULL == (element)->prev_ ## mdll) \
2057 (head) = (element); \
2058 else \
2059 (element)->prev_ ## mdll->next_ ## mdll = (element); \
2060 } while (0)

◆ GNUNET_CONTAINER_MDLL_remove

#define GNUNET_CONTAINER_MDLL_remove (   mdll,
  head,
  tail,
  element 
)
Value:
do \
{ \
GNUNET_assert ((NULL != (element)->prev_ ## mdll) || ((head) == (element))); \
GNUNET_assert ((NULL != (element)->next_ ## mdll) || ((tail) == (element))); \
if (NULL == (element)->prev_ ## mdll) \
(head) = (element)->next_ ## mdll; \
else \
(element)->prev_ ## mdll->next_ ## mdll = (element)->next_ ## mdll; \
if (NULL == (element)->next_ ## mdll) \
(tail) = (element)->prev_ ## mdll; \
else \
(element)->next_ ## mdll->prev_ ## mdll = (element)->prev_ ## mdll; \
(element)->next_ ## mdll = NULL; \
(element)->prev_ ## mdll = NULL; \
} while (0)

Remove an element from a MDLL.

Assumes that head, tail and element are structs with prev and next fields.

Parameters
mdllsuffix name for the next and prev pointers in the element
headpointer to the head of the MDLL
tailpointer to the tail of the MDLL
elementelement to remove

Definition at line 2074 of file gnunet_container_lib.h.

2076 { \
2077 GNUNET_assert ((NULL != (element)->prev_ ## mdll) || ((head) == (element))); \
2078 GNUNET_assert ((NULL != (element)->next_ ## mdll) || ((tail) == (element))); \
2079 if (NULL == (element)->prev_ ## mdll) \
2080 (head) = (element)->next_ ## mdll; \
2081 else \
2082 (element)->prev_ ## mdll->next_ ## mdll = (element)->next_ ## mdll; \
2083 if (NULL == (element)->next_ ## mdll) \
2084 (tail) = (element)->prev_ ## mdll; \
2085 else \
2086 (element)->next_ ## mdll->prev_ ## mdll = (element)->prev_ ## mdll; \
2087 (element)->next_ ## mdll = NULL; \
2088 (element)->prev_ ## mdll = NULL; \
2089 } while (0)