C Container Collection (CCC)
Loading...
Searching...
No Matches
private_doubly_linked_list.h File Reference

The Private Doubly Linked List Types and Interface. More...

#include "../types.h"
Include dependency graph for private_doubly_linked_list.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Detailed Description

The Private Doubly Linked List Types and Interface.

The doubly linked list variant of linked lists. This is good for when push and pop to front and back are needed as well as arbitrary O(1) node removal.

Data Structures

struct  CCC_Doubly_linked_list_node
 
struct  CCC_Doubly_linked_list
 

Macros

#define CCC_private_doubly_linked_list_for( private_struct_name, private_type_intruder_field)
 
#define CCC_private_doubly_linked_list_from( private_type_intruder_field, private_allocator, private_destructor, private_compound_literal_array...)
 
#define CCC_private_doubly_linked_list_emplace_back( doubly_linked_list_pointer, private_allocator_pointer, struct_initializer...)
 
#define CCC_private_doubly_linked_list_emplace_front( doubly_linked_list_pointer, private_allocator_pointer, struct_initializer...)
 

Functions

void CCC_private_doubly_linked_list_push_back (struct CCC_Doubly_linked_list *, struct CCC_Doubly_linked_list_node *)
 
void CCC_private_doubly_linked_list_push_front (struct CCC_Doubly_linked_list *, struct CCC_Doubly_linked_list_node *)
 
struct CCC_Doubly_linked_list_nodeCCC_private_doubly_linked_list_node_in (struct CCC_Doubly_linked_list const *, void const *any_struct)
 

Macro Definition Documentation

◆ CCC_private_doubly_linked_list_emplace_back

#define CCC_private_doubly_linked_list_emplace_back (   doubly_linked_list_pointer,
  private_allocator_pointer,
  struct_initializer... 
)
Value:
(__extension__({ \
typeof(struct_initializer) *private_doubly_linked_list_res = NULL; \
struct CCC_Doubly_linked_list *private_doubly_linked_list \
= (doubly_linked_list_pointer); \
CCC_Allocator const *const private_doubly_linked_list_allocator \
= (private_allocator_pointer); \
if (private_doubly_linked_list && private_doubly_linked_list_allocator \
&& private_doubly_linked_list_allocator->allocate) { \
private_doubly_linked_list_res \
= private_doubly_linked_list_allocator->allocate(( \
){ \
.input = NULL, \
.bytes = private_doubly_linked_list->sizeof_type, \
.alignment = private_doubly_linked_list->alignof_type, \
.context = private_doubly_linked_list_allocator->context, \
}); \
if (private_doubly_linked_list_res) { \
*private_doubly_linked_list_res = struct_initializer; \
CCC_private_doubly_linked_list_push_back( \
private_doubly_linked_list, \
private_doubly_linked_list, \
private_doubly_linked_list_res \
) \
); \
} \
} \
private_doubly_linked_list_res; \
}))
struct CCC_Doubly_linked_list_node * CCC_private_doubly_linked_list_node_in(struct CCC_Doubly_linked_list const *, void const *any_struct)
A bundle of arguments to pass to the user-implemented Allocator_interface function interface....
Definition: types.h:277
The type passed by reference to any container function that may need to allocate memory....
Definition: types.h:384
CCC_Allocator_interface * allocate
Definition: types.h:386
Definition: private_doubly_linked_list.h:73

◆ CCC_private_doubly_linked_list_emplace_front

#define CCC_private_doubly_linked_list_emplace_front (   doubly_linked_list_pointer,
  private_allocator_pointer,
  struct_initializer... 
)
Value:
(__extension__({ \
typeof(struct_initializer) *private_doubly_linked_list_res = NULL; \
struct CCC_Doubly_linked_list *private_doubly_linked_list \
= (doubly_linked_list_pointer); \
CCC_Allocator const *const private_doubly_linked_list_allocator \
= (private_allocator_pointer); \
if (private_doubly_linked_list && private_doubly_linked_list_allocator \
&& private_doubly_linked_list_allocator->allocate) { \
private_doubly_linked_list_res \
= private_doubly_linked_list_allocator->allocate(( \
){ \
.input = NULL, \
.bytes = private_doubly_linked_list->sizeof_type, \
.alignment = private_doubly_linked_list->alignof_type, \
.context = private_doubly_linked_list_allocator->context, \
}); \
if (private_doubly_linked_list_res) { \
*private_doubly_linked_list_res = struct_initializer; \
CCC_private_doubly_linked_list_push_front( \
private_doubly_linked_list, \
private_doubly_linked_list, \
private_doubly_linked_list_res \
) \
); \
} \
} \
private_doubly_linked_list_res; \
}))

◆ CCC_private_doubly_linked_list_for

#define CCC_private_doubly_linked_list_for (   private_struct_name,
  private_type_intruder_field 
)
Value:
.head = NULL, .tail = NULL, \
.sizeof_type = sizeof(private_struct_name), \
.alignof_type = alignof(private_struct_name), \
.type_intruder_offset \
= offsetof(private_struct_name, private_type_intruder_field), \
}
size_t alignof_type
Definition: private_doubly_linked_list.h:81

Initialization at compile time is allowed in C due to the provided name of the list being on the left hand side of the assignment operator.

◆ CCC_private_doubly_linked_list_from

#define CCC_private_doubly_linked_list_from (   private_type_intruder_field,
  private_allocator,
  private_destructor,
  private_compound_literal_array... 
)

Function Documentation

◆ CCC_private_doubly_linked_list_node_in()

struct CCC_Doubly_linked_list_node * CCC_private_doubly_linked_list_node_in ( struct CCC_Doubly_linked_list const *  ,
void const *  any_struct 
)

◆ CCC_private_doubly_linked_list_push_back()

void CCC_private_doubly_linked_list_push_back ( struct CCC_Doubly_linked_list ,
struct CCC_Doubly_linked_list_node  
)

◆ CCC_private_doubly_linked_list_push_front()

void CCC_private_doubly_linked_list_push_front ( struct CCC_Doubly_linked_list ,
struct CCC_Doubly_linked_list_node  
)