cstack.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #ifndef __CSTACK_H__
  2. #define __CSTACK_H__
  3. #include <stddef.h>
  4. #include <stdlib.h>
  5. #include "cstackdef.h"
  6. /**
  7. * @brief primary file with declare types and functions
  8. *
  9. * @author btw i use arch
  10. *
  11. * @def CSTACK_STRUCT_ENABLE to use lib
  12. */
  13. #define CSTACK_STRUCT_ENABLE
  14. typedef void (*cstack_destructor_t) (void* adr);
  15. typedef void (*cstack_constructor_t) (void* src_stack, void* dest_stack, void* cstack_args);
  16. typedef struct __Item_cstack {
  17. size_t size_object;
  18. void* data;
  19. } cstack_Item;
  20. typedef struct __cstack_node {
  21. cstack_Item* mem;
  22. struct __cstack_node* next;
  23. } cstack_node;
  24. /**
  25. * @brief header structure for cstack
  26. *
  27. * @struct cstack_t
  28. */
  29. typedef struct __header {
  30. size_t bytes;
  31. size_t size;
  32. cstack_node* head;
  33. cstack_destructor_t destructor;
  34. cstack_constructor_t constructor;
  35. } cstack_header, *cstack_t;
  36. /**
  37. * @brief gets current size of the stack
  38. *
  39. * @param cstack your stack
  40. */
  41. #define cstack_get_size(cstack) _sf_cstack_get_size(cstack)
  42. /**
  43. * @brief checks empty of stack
  44. *
  45. * @param cstack your stack
  46. *
  47. * @return 1: if stack empty, 0: if size > 0
  48. */
  49. #define cstack_empty(cstack) _sf_cstack_empty(cstack)
  50. /**
  51. * @brief gets top stack node
  52. *
  53. * @param header your stack
  54. *
  55. * @return pointer on top element of the stack
  56. */
  57. #define cstack_unpack(header) (_sf_cstack_pointer_head(header))
  58. /**
  59. * @brief gets data in node
  60. *
  61. * @param node node in stack
  62. *
  63. * @return pointer on data segment
  64. */
  65. #define cstack_unpack_node(node) (_sf_ccstack_unpack_node(node))
  66. /**
  67. * @brief create and init stack
  68. *
  69. * @param cstack_header your declaration variable type of cstack_t
  70. * @param f_const pointer to constructor function (for allocated elemets, other case can put NULL)
  71. * @param f_dest pointer to destructor function (for allocated elemets, other case can put NULL)
  72. * @param TYPE type of objects in stack
  73. */
  74. #define cstack_create(cstack_header, f_const, f_dest, TYPE) _sf_cstack_create(&cstack_header, f_const, f_dest, sizeof(TYPE))
  75. /**
  76. * @brief data top element of stack replace to object
  77. *
  78. * @param header your stack
  79. * @param object object which accept data from stack
  80. *
  81. * @return 1: stack has not element; 0: others case
  82. */
  83. #define cstack_cget_top(header, object) _sf_cstack_cget_top(header, object)
  84. /**
  85. * @brief gets object in stack
  86. *
  87. * @param header your stack
  88. *
  89. * @return object in top node of stack
  90. */
  91. #define cstack_get_top(header) _sd_cstack_get_top(header)
  92. /**
  93. * @brief get pointer to element in stack
  94. *
  95. * @param header stack
  96. *
  97. * @return pointer to object from top node (type of void*, can require casting to your type pointer)
  98. */
  99. #define cstack_get_data_ptr(header) (_sf_cstack_get_data_ptr(header))
  100. /**
  101. * @brief erase top element in the stack
  102. *
  103. * @param cstack your stack
  104. */
  105. #define cstack_pop(cstack) _sf_cstack_pop(cstack)
  106. #define cstack_push_back(header, object) _sf_cstack_push_back(header, object)
  107. #define _sf_cstack_push_back(header, object) \
  108. do { \
  109. cstack_node* tmp = (cstack_node *) malloc(sizeof(cstack_node)); \
  110. tmp->mem = (cstack_Item *) malloc(sizeof(cstack_Item)); \
  111. tmp->mem->data = malloc(sizeof(object)); \
  112. tmp->mem->size_object = sizeof(object); \
  113. tmp->mem->data[0] = object; \
  114. tmp->next = header->head; \
  115. header->head = tmp; \
  116. ++header->size; \
  117. } while(0)
  118. #define cstack_peek(stack, count) sf_cstack_peek(stack, count)
  119. #define cstack_destroy(stack) sf_cstack_destroy(stack)
  120. #define cstack_check_destroy(stack) stack != NULL ? sf_cstack_destroy(stack) : 0
  121. /***************************************************
  122. * * * * * * * * functions segment * * * * * * * * *
  123. ***************************************************/
  124. void _sf_cstack_create(cstack_t* header, cstack_constructor_t c, cstack_destructor_t d, size_t type_size);
  125. void _sf_cstack_pop(cstack_t cs);
  126. cstack_node* sf_cstack_peek(cstack_t stack, size_t count);
  127. void sf_cstack_destroy(cstack_t st);
  128. #endif // __CSTACK_H__