ctl

My variant of the C Template Library

View on GitHub

list - CTL - C Container Template library

Defined in header <ctl/list.h>, CTL prefix list.

SYNOPSIS

#define POD
#define T int
#include <ctl/list.h>

int i = 0;
list_int a = list_int_init ();

for (i=0; i<100; i++) {
  list_int_push_front (&a, i);
  list_int_push_back (&a, i);
  list_int_pop_front (&a, i);
  list_int_pop_back (&a, i);
}

foreach(list_int, &a, it) { printf "%d ", *it.ref); }

list_int_free(&a);

DESCRIPTION

list, a double-linked list, is a container that supports constant time insertion and removal of elements from anywhere in the container. Fast random access is not supported. It is usually implemented as a doubly-linked list. Compared to forward_list this container provides bidirectional iteration capability while being less space efficient.

The function names are composed of the prefix list_, the user-defined type T and the method name. E.g list_int with #define T int.

Adding, removing and moving the elements within the list or across several lists does not invalidate the iterators or references.

Note: Most function accepting or returning iterators, use return node* (B*) pointers instead.

Member types

T value type

A being list_T container type

B being list_T_node node type

I being list_T_it internal iterator type for loops

Member functions

A init ()

constructs an empty list.

free (A* self)

destructs the list.

A copy (A* self)

returns a copy of the container.

Element access

T* front (A* self)

access the first element

T* back (A* self)

access the last element

Iterators

I begin (A* self)

Constructs an iterator to the begin.

I end (A* self)

constructs an iterator to the end.

I* next (I* iter)

Advances the iterator by 1 forwards. There’s no prev yet.

I* advance (I* iter, long i)

All our variants accepts negative i to move back. The return value may be ignored.

See iterators for more.

Capacity

int empty (A* self)

checks whether the container is empty.

size_t size (A* self)

returns the number of elements

size_t max_size ()

returns the maximum possible number of elements, hard-coded to 2GB (32bit).

Modifiers

assign (A* self, size_t count, T value)

resizes and sets count elements to the value

assign_generic (A* self, GI* range)

resizes and sets elements to copies of values from the generic iterator.

clear (A* self)

clears the contents

I* insert (I* pos, T value)

inserts value before the element.

I* insert_count (I* pos, size_t count, T value)

inserts count copies of value before the element.

I* insert_range (I* pos, I* range2)

inserts copies of values from first to last before pos.

insert_generic (I* pos, GI* range2)

inserts copies of values from generic range2 before pos. (NYI)

I* emplace (I* pos, T* value)

Insert the value into the container before pos.

erase_node (A* self, B* node)
erase (I* pos)

erases the element.

I* erase_range (I* range)

erases elements.

erase_generic (A* self, GI* range2)

erases elements by value from another container.

push_front (A* self, T value)

inserts an element to the beginning.

B* emplace_front (A* self, T *value)

inserts a copy of the value at the beginning.

push_back (A* self, T value)

inserts an element to the end.

B* emplace_back (A* self, T* value)

adds a copy of the value at the end.

pop_front (A* self)

removes the first element

pop_back (A* self)

removes the last element

resize (A* self, size_t count, T default_value)

Resizes the container to contain count elements.

swap (A* self, A* other)

swaps the contents

Operations

merge (A* self, A* other)

merges two sorted lists.

splice (I* pos, A* other)

Moves all elements from the other list to this list before pos.

splice_it (I* pos, I* range2)

Moves the element first2 from the other list to this list before pos.

splice_range (I* pos, I* range2)

Moves a range of elements from the other list to this list before pos.

size_t remove (A* self, T value)

Removes all elements binary equal to the value.

size_t remove_if (A* self, int match(T*))

Removes all elements satisfying specific criteria.

reverse (A* self)

reverse the list elements.

sort (A* self)

sorts the list in-place.

unique (A* self)

removes consecutive duplicates.

shuffle (A* self)

randomly shuffles the list elements. Not in the STL. O(n) (via ptr swap, not value swap)

iter_swap (I* iter1, I* iter2)

swaps the two element ptrs.

Non-member functions

I find (A* self, T value, int equal(T*,T*))

finds element with specific value.

size_t erase_if (A* self, int match(T*))

erases all elements satisfying specific criteria (C++20)

int equal (A* self, A* other, int equal(T*,T*))

Returns 0 or 1 if all elements are equal.

See algorithm for more.