Skip to content

Commit c6f6ddc

Browse files
committed
Follow-up to previous commit: Added static_queue which has fixed capacity
1 parent cc9ab94 commit c6f6ddc

File tree

2 files changed

+84
-0
lines changed

2 files changed

+84
-0
lines changed

static_queue.c

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#include "static_queue.h"
2+
#include <stdlib.h> // malloc
3+
#include <string.h> // memset
4+
5+
static_queue_t* static_queue_create(int element_size, int capacity)
6+
{
7+
static_queue_t* queue = (static_queue_t*)malloc(sizeof(static_queue_t));
8+
memset(queue, 0, sizeof(static_queue_t));
9+
queue->capacity = capacity;
10+
queue->element_size = element_size;
11+
queue->buffer = malloc(queue->element_size * queue->capacity);
12+
memset(queue->buffer, 0, queue->element_size * queue->capacity);
13+
// points to the next vacant place at which new element can be pushed
14+
queue->front = 0;
15+
// points to the next filled place from which an element can be popped
16+
queue->back = 0;
17+
return queue;
18+
}
19+
20+
void static_queue_destroy(static_queue_t* queue)
21+
{
22+
free(queue->buffer);
23+
free(queue);
24+
}
25+
26+
void static_queue_push(static_queue_t* queue, void* value)
27+
{
28+
if(queue->front >= queue->capacity)
29+
{
30+
// make a vacant place on the left most side
31+
if(queue->back == 0)
32+
queue->back = 1;
33+
34+
// shift all the elements to the left most to fill the vacant places on the back side
35+
memmove(queue->buffer, queue->buffer + queue->back, queue->element_size * (queue->front - queue->back));
36+
queue->front -= queue->back;
37+
queue->back = 0;
38+
}
39+
memcpy(queue->buffer + queue->front * queue->element_size, value, queue->element_size);
40+
queue->front += 1;
41+
}
42+
43+
bool static_queue_pop(static_queue_t* queue, void* value)
44+
{
45+
if(static_queue_get_count(queue) > 0)
46+
{
47+
memcpy(value, queue->buffer + queue->back * queue->element_size, queue->element_size);
48+
queue->back += 1;
49+
return true;
50+
}
51+
return false;
52+
}
53+
54+
bool static_queue_is_empty(static_queue_t* queue)
55+
{
56+
return static_queue_get_count(queue) <= 0;
57+
}
58+
59+
int static_queue_get_count(static_queue_t* queue)
60+
{
61+
return queue->front - queue->back;
62+
}

static_queue.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#pragma once
2+
3+
#include <stdbool.h>
4+
5+
typedef struct static_queue_t
6+
{
7+
void* buffer;
8+
int capacity;
9+
int front;
10+
int back;
11+
int element_size;
12+
} static_queue_t;
13+
14+
// constructors and destructors
15+
static_queue_t* static_queue_create(int element_size, int capacity);
16+
void static_queue_destroy(static_queue_t* queue);
17+
18+
// algorithms
19+
void static_queue_push(static_queue_t* queue, void* value);
20+
bool static_queue_pop(static_queue_t* queue, void* value);
21+
bool static_queue_is_empty(static_queue_t* queue);
22+
int static_queue_get_count(static_queue_t* queue);

0 commit comments

Comments
 (0)