f399bc2a0e206a51095af9c18ec980450b6141b4
5 #ifndef CGDS_BUFFER_TOP_H
6 #define CGDS_BUFFER_TOP_H
10 #include "cgds/types.h"
11 #include "cgds/Heap.h"
12 #include "cgds/List.h"
13 #include "cgds/safe_alloc.h"
16 * @brief Data structure to store top (MAX or MIN) elements in a buffer.
18 typedef struct BufferTop
{
19 UInt capacity
; ///< Buffer capacity (in items count).
20 OrderType bType
; ///< Type of buffer: keep max or min items (MAX_T or MIN_T).
21 Heap
* heap
; ///< Item-ValueS are internally organized into a heap.
25 * @brief Return an allocated and initialized buffer.
27 BufferTop
* _buffertop_new(
28 size_t dataSize
, ///< Size in bytes of a buffer element.
29 UInt capacity
, ///< Maximum number of elements that the buffer can contain.
30 OrderType bType
, ///< Type of buffer: keep max or min items (MAX_T or MIN_T).
31 UInt arity
///< Arity of the wrapped heap: any integer >=2.
35 * @brief Return an allocated and initialized buffer.
36 * @param type Type of a buffer item (int, char*, ...).
37 * @param capacity Maximum number of elements that the buffer can contain.
38 * @param bType type of buffer: keep max or min items (MAX_T or MIN_T).
39 * @param arity Arity of the wrapped heap: any integer >=2.
41 * Usage: BufferTop* buffertop_new(<Type> type, UInt capacity, OrderTypebType, UInt arity)
43 #define buffertop_new(type, capacity, bType, arity) \
45 _buffertop_new(sizeof(type), capacity, bType, arity); \
49 * @brief Copy constructor (shallow copy, ok for basic types).
51 BufferTop
* buffertop_copy(
52 BufferTop
* bufferTop
///< "this" pointer.
56 * @brief Turn the buffer into a list to scan its content linearly.
58 List
* buffertop_2list(
59 BufferTop
* bufferTop
///< "this" pointer.
63 * @brief Check if the buffer is empty.
66 BufferTop
* bufferTop
///< "this" pointer.
70 * @brief Return the size of current buffer (<= capacity).
73 BufferTop
* bufferTop
///< "this" pointer.
77 * @brief (Try to) add an item-value in the buffer.
79 void _buffertop_tryadd(
80 BufferTop
* bufferTop
, ///< "this" pointer.
81 void* item
, ///< Pointer to an item of type as defined in the constructor.
82 Real value
///< Value associated with the item.
86 * @brief (Try to) add an item-value in the buffer.
87 * @param bufferTop "this" pointer.
88 * @param item Item of type as defined in the constructor.
89 * @param value Value associated with the item.
91 * Usage: void buffertop_tryadd(BufferTop* bufferTop, void item, Real value)
93 #define buffertop_tryadd(bufferTop, item, value) \
95 typeof((item)) tmp = item; \
96 _buffertop_tryadd(bufferTop, &tmp, value); \
100 * @brief Return the top ("worst among best") ItemValue inside current buffer.
102 ItemValue
* buffertop_first_raw(
103 BufferTop
* bufferTop
///< "this" pointer.
107 * @brief Set item_ to the top ("worst among best") item inside current buffer.
108 * @param bufferTop "this" pointer.
109 * @param item_ Variable to be assigned.
111 * Usage: void buffertop_first(BufferTop* bufferTop, void item)
113 #define buffertop_first(bufferTop, item_) \
115 void* pItem = buffertop_first_raw(bufferTop)->item; \
116 item_ = *((typeof(&item_))pItem); \
120 * @brief Remove the top ("worst among best") item-value inside the buffer.
123 BufferTop
* bufferTop
///< "this" pointer.
127 * @brief Clear the entire buffer.
129 void buffertop_clear(
130 BufferTop
* bufferTop
///< "this" pointer.
134 * @brief Destroy the buffer: clear it, and free 'bufferTop' pointer.
136 void buffertop_destroy(
137 BufferTop
* bufferTop
///< "this" pointer.