Files

89 lines
3.1 KiB
C

/* Based on the example of STC https://github.com/tylov/STC */
#include "m-dict.h"
#include "m-array.h"
#include "m-deque.h"
#include "m-list.h"
#include "m-rbtree.h"
#include "m-algo.h"
#include "m-tuple.h"
// NOTE: After each definition of a container, we register its oplist
// It is not mandatory, but it makes the code easier to write and read.
// Define a basic structure (POD structure) using a tuple to get the default functions
TUPLE_DEF2(Point, (x, float), (y, float))
#define M_OPL_Point_t() TUPLE_OPLIST(Point, M_BASIC_OPLIST, M_BASIC_OPLIST)
// NOTE: array, list, deque don't have a native find function.
// We'll use the algorithm header to create a find function for such containers.
// Define a set of int & register its oplist
DICT_SET_DEF(cset_i, int)
#define M_OPL_cset_i_t() DICT_SET_OPLIST(cset_i, M_BASIC_OPLIST)
// Define an array of Point, register its oplist & include some basic algorithms
ARRAY_DEF(cvec_p, Point_t)
#define M_OPL_cvec_p_t() ARRAY_OPLIST(cvec_p, M_OPL_Point_t())
ALGO_DEF(cvec_p, cvec_p_t)
// Define a deque of int, including some basic algorithms
DEQUE_DEF(cdeq_i, int)
#define M_OPL_cdeq_i_t() DEQUE_OPLIST(cdeq_i, M_BASIC_OPLIST)
ALGO_DEF(cdeq_i, cdeq_i_t)
// Define a backward list, including some basic algorithms
LIST_DEF(clist_i, int)
#define M_OPL_clist_i_t() LIST_OPLIST(clist_i, M_BASIC_OPLIST)
ALGO_DEF(clist_i, clist_i_t)
// Define an unordered map of int to int
DICT_DEF2(csmap_i, int, int)
#define M_OPL_csmap_i_t() DICT_OPLIST(csmap_i, M_BASIC_OPLIST, M_BASIC_OPLIST)
int main(void)
{
// Define, init & set the different containers.
M_LET( (set, 10, 20, 30), cset_i_t)
M_LET( (vec, (10, 1), (20, 2), (30, 3) ), cvec_p_t)
M_LET( (deq, 10, 20, 30), cdeq_i_t)
M_LET( (lst, 10, 20, 30), clist_i_t)
M_LET( (map, (20, 2), (10, 1), (30,3) ), csmap_i_t) {
// add one more element to each container
cset_i_push(set, 40);
cvec_p_push_back(vec, (Point_t) {{40, 4}} );
cdeq_i_push_front(deq, 5);
clist_i_push_back(lst, 5);
csmap_i_set_at(map, 40, 4);
M_PRINT("vec= ", (vec, cvec_p_t));
// Find an element (either native or through the algo header)
int *i1 = cset_i_get(set, 20);
cvec_p_it_t i2; cvec_p_find(i2, vec, (Point_t) {{20, 2}});
cdeq_i_it_t i3; cdeq_i_find(i3, deq, 20);
clist_i_it_t i4; clist_i_find(i4, lst, 20);
int *i5 = csmap_i_get(map, 20);
printf("\nFound: %d, (%g, %g), %d, %d, [%d: %d]\n",
*i1,
(*cvec_p_ref(i2))->x, (*cvec_p_ref(i2))->y,
*cdeq_i_ref(i3),
*clist_i_ref(i4),
20, *i5);
// Erase the elements found (through key or through iterators)
cset_i_erase(set, *i1);
cvec_p_remove(vec, i2);
cdeq_i_remove(deq, i3);
clist_i_remove(lst, i4);
csmap_i_erase(map, *i5);
// Display everything in one call by using the registered print functions of the different types.
M_PRINT("After erasing elements found:\n",
"set: ", (set, cset_i_t), "\n",
"vec: ", (vec, cvec_p_t), "\n",
"deq: ", (deq, cdeq_i_t), "\n",
"map: ", (map, csmap_i_t), "\n");
}
}