Refactoring and renaming

This commit is contained in:
Leonardo committed 2019-03-22 14:17:10 -03:00
1 parent e17e1ba240
commit 137e35d998
11 files changed
+325 -317

No files matched your search

+3 -3
View File
@@ -3,11 +3,11 @@ CFLAGS = -Wall -Wextra
INCLUDE = ./
SRC = ../../src
main.exe: containers.o main.o $(SRC)/macro_containers.h
main.exe: containers.o main.o $(SRC)/macro_collections.h
$(CC) $^ -o $@
%.o: %.c $(SRC)/macro_containers.h
%.o: %.c $(SRC)/macro_collections.h
$(CC) -I $(INCLUDE) -I $(SRC) $(CFLAGS) -c $< -o $@
run: main.exe $(SRC)/macro_containers.h
run: main.exe $(SRC)/macro_collections.h
./main.exe
+1 -1
View File
@@ -1,7 +1,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "macro_containers.h"
#include "macro_collections.h"
CONTAINER_GENERATE_HEADER(LIST, PUBLIC, il, int_list, , , int)
CONTAINER_GENERATE_HEADER(STACK, PRIVATE, cs, char_stack, , , char)
+184 -184
View File
@@ -5,261 +5,261 @@
#include <inttypes.h>
#include <math.h>
#include <time.h>
#include "macro_containers.h"
#include "macro_collections.h"
#include "containers.h"
double rrandom()
{
return (double)rand() / ((double)RAND_MAX + 1.0);
return (double)rand() / ((double)RAND_MAX + 1.0);
}
int8_t random_int8_t(int8_t min, int8_t max)
{
return (int8_t)floor(rrandom() * ((double)max - (double)min + 1.0) + (double)min);
return (int8_t)floor(rrandom() * ((double)max - (double)min + 1.0) + (double)min);
}
size_t random_size_t(size_t min, size_t max)
{
return (size_t)floor(rrandom() * ((double)max - (double)min + 1.0) + (double)min);
return (size_t)floor(rrandom() * ((double)max - (double)min + 1.0) + (double)min);
}
char random_alpha()
{
const char alpha[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D',
'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
'Y', 'Z'};
return alpha[random_int8_t(0, 61)];
const char alpha[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D',
'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
'Y', 'Z'};
return alpha[random_int8_t(0, 61)];
}
int main(void)
{
srand((unsigned)time(NULL));
srand((unsigned)time(NULL));
int_list *list = il_new(10);
int_list *list = il_new(10);
for (int i = 0; i < 100; i++)
{
il_push(list, i, list->count == 0 ? list->count : i % list->count);
}
for (int i = 0; i < 100; i++)
{
il_push(list, i, list->count == 0 ? list->count : i % list->count);
}
printf("\n[ ");
printf("\n[ ");
for (size_t i = 0; i < list->count - 1; i++)
printf("%d, ", il_get(list, i));
for (size_t i = 0; i < list->count - 1; i++)
printf("%d, ", il_get(list, i));
printf("%d ]\n", il_get(list, list->count - 1));
printf("%d ]\n", il_get(list, list->count - 1));
il_free(list);
il_free(list);
list = il_new(10);
list = il_new(10);
for (int i = 0; i < 10; i++)
{
// Add elements
il_push_back(list, i);
for (int i = 0; i < 10; i++)
{
// Add elements
il_push_back(list, i);
// Print
if (!il_empty(list))
{
// Print
printf("\n[ ");
for (size_t i = 0; i < list->count - 1; i++)
{
printf("%d, ", il_get(list, i));
}
printf("%d ]\n", il_get(list, list->count - 1));
}
}
// Print
if (!il_empty(list))
{
// Print
printf("\n[ ");
for (size_t i = 0; i < list->count - 1; i++)
{
printf("%d, ", il_get(list, i));
}
printf("%d ]\n", il_get(list, list->count - 1));
}
}
for (int i = 0; i < 10; i++)
{
// Remove elements
il_pop_back(list);
for (int i = 0; i < 10; i++)
{
// Remove elements
il_pop_back(list);
if (!il_empty(list))
{
// Print
printf("\n[ ");
for (size_t i = 0; i < list->count - 1; i++)
{
printf("%d, ", il_get(list, i));
}
printf("%d ]\n", il_get(list, list->count - 1));
}
}
if (!il_empty(list))
{
// Print
printf("\n[ ");
for (size_t i = 0; i < list->count - 1; i++)
{
printf("%d, ", il_get(list, i));
}
printf("%d ]\n", il_get(list, list->count - 1));
}
}
il_free(list);
il_free(list);
list = il_new(1000);
list = il_new(1000);
for (int i = 0; i < 1000; i++)
{
il_insert_if(list, i, list->count, i % 2 == 0);
}
for (int i = 0; i < 1000; i++)
{
il_insert_if(list, i, list->count, i % 2 == 0);
}
// Print all even numbers
if (!il_empty(list))
{
// Print
printf("\n[ ");
for (size_t i = 0; i < list->count - 1; i++)
{
printf("%d, ", il_get(list, i));
}
printf("%d ]\n", il_get(list, list->count - 1));
}
// Print all even numbers
if (!il_empty(list))
{
// Print
printf("\n[ ");
for (size_t i = 0; i < list->count - 1; i++)
{
printf("%d, ", il_get(list, i));
}
printf("%d ]\n", il_get(list, list->count - 1));
}
il_free(list);
il_free(list);
char_stack *stack = cs_new(100);
char_stack *stack = cs_new(100);
for (int i = 0; i < 2000; i++)
{
cs_push(stack, random_alpha());
}
for (int i = 0; i < 2000; i++)
{
cs_push(stack, random_alpha());
}
size_t s = cs_count(stack);
size_t c = cs_capacity(stack);
printf("Stack size : %" PRIu64 "\n", s);
printf("Stack capacity : %" PRIu64 "\n", c);
size_t s = cs_count(stack);
size_t c = cs_capacity(stack);
printf("Stack size : %" PRIu64 "\n", s);
printf("Stack capacity : %" PRIu64 "\n", c);
for (size_t i = 0; i < s; i++)
{
printf("%c ", cs_top(stack));
cs_pop(stack);
}
for (size_t i = 0; i < s; i++)
{
printf("%c ", cs_top(stack));
cs_pop(stack);
}
printf("\nStack size: %" PRIu64 "", cs_count(stack));
printf("\nStack capacity : %" PRIu64 "\n", cs_capacity(stack));
printf("\nStack size: %" PRIu64 "", cs_count(stack));
printf("\nStack capacity : %" PRIu64 "\n", cs_capacity(stack));
cs_free(stack);
cs_free(stack);
index_queue *idxs = queue_new(100);
index_queue *idxs = queue_new(100);
size_t sum0 = 0, sum1 = 0, curr;
size_t sum0 = 0, sum1 = 0, curr;
printf("\nQueue size : %" PRIu64 "\n", queue_count(idxs));
printf("Queue capacity : %" PRIu64 "\n", queue_capacity(idxs));
printf("\nQueue size : %" PRIu64 "\n", queue_count(idxs));
printf("Queue capacity : %" PRIu64 "\n", queue_capacity(idxs));
for (int i = 1; i <= 600; i++)
{
curr = random_size_t(0, 100);
if (queue_enqueue(idxs, curr))
sum0 += curr;
for (int i = 1; i <= 600; i++)
{
curr = random_size_t(0, 100);
if (queue_enqueue(idxs, curr))
sum0 += curr;
if (i % 11 == 0 && queue_count(idxs) > 0)
{
sum0 -= queue_peek(idxs);
queue_dequeue(idxs);
}
}
if (i % 11 == 0 && queue_count(idxs) > 0)
{
sum0 -= queue_peek(idxs);
queue_dequeue(idxs);
}
}
printf("\nQueue size : %" PRIu64 "\n", queue_count(idxs));
printf("Queue capacity : %" PRIu64 "\n", queue_capacity(idxs));
printf("\nQueue size : %" PRIu64 "\n", queue_count(idxs));
printf("Queue capacity : %" PRIu64 "\n", queue_capacity(idxs));
while (!queue_empty(idxs))
{
sum1 += queue_peek(idxs);
while (!queue_empty(idxs))
{
sum1 += queue_peek(idxs);
queue_dequeue(idxs);
}
queue_dequeue(idxs);
}
printf("\nQueue size : %" PRIu64 "\n", queue_count(idxs));
printf("Queue capacity : %" PRIu64 "\n", queue_capacity(idxs));
printf("\nQueue size : %" PRIu64 "\n", queue_count(idxs));
printf("Queue capacity : %" PRIu64 "\n", queue_capacity(idxs));
if (sum0 == sum1)
printf("\nElements were preserved -> %" PRIu64 " : %" PRIu64 "\n", sum0, sum1);
if (sum0 == sum1)
printf("\nElements were preserved -> %" PRIu64 " : %" PRIu64 "\n", sum0, sum1);
queue_free(idxs);
queue_free(idxs);
printf("\nUsing ForEach\n\n");
printf("\nUsing ForEach\n\n");
int_list *integers = il_new(1000);
int_list *integers = il_new(1000);
for (size_t i = 0; i < il_capacity(integers); i++)
il_push_back(integers, i);
for (size_t i = 0; i < il_capacity(integers); i++)
il_push_back(integers, i);
int sum = 0;
FOR_EACH(il, int_list, , int, integers, {
printf("%d, ", var);
sum += var;
})
int sum = 0;
FOR_EACH(il, int_list, , int, integers, {
printf("%d, ", var);
sum += var;
})
printf("\n\nSUM: %d\n", sum);
printf("\n\nSUM: %d\n", sum);
il_free(integers);
il_free(integers);
deque *d = dq_new(1000);
deque *d = dq_new(1000);
int sum2 = 0, numbers = 0, r = 0;
int sum2 = 0, numbers = 0, r = 0;
for (int i = 0; numbers < 10000; i = rand())
{
if (i % 2 == 0 || dq_empty(d))
{
if (i % 4 == 0)
{
dq_push_front(d, ++numbers);
}
else
{
dq_push_back(d, ++numbers);
}
}
else
{
if (i % 3 == 0)
{
r = dq_front(d);
dq_pop_front(d);
}
else
{
r = dq_back(d);
dq_pop_back(d);
}
for (int i = 0; numbers < 10000; i = rand())
{
if (i % 2 == 0 || dq_empty(d))
{
if (i % 4 == 0)
{
dq_push_front(d, ++numbers);
}
else
{
dq_push_back(d, ++numbers);
}
}
else
{
if (i % 3 == 0)
{
r = dq_front(d);
dq_pop_front(d);
}
else
{
r = dq_back(d);
dq_pop_back(d);
}
sum2 += r;
}
}
sum2 += r;
}
}
// Emptying the queue
while (!dq_empty(d))
{
if (rand() % 2 == 0)
{
r = dq_front(d);
dq_pop_front(d);
}
else
{
r = dq_back(d);
dq_pop_back(d);
}
// Emptying the queue
while (!dq_empty(d))
{
if (rand() % 2 == 0)
{
r = dq_front(d);
dq_pop_front(d);
}
else
{
r = dq_back(d);
dq_pop_back(d);
}
sum2 += r;
}
sum2 += r;
}
printf("Theoretical Sum: 50005000\nTotal Sum: %d\n", sum2);
printf("Theoretical Sum: 50005000\nTotal Sum: %d\n", sum2);
dq_free(d);
dq_free(d);
d = dq_new(32);
d = dq_new(32);
for (int i = 1; i < 1001; i++)
i % 2 == 0 ? dq_push_front(d, i) : dq_push_back(d, i);
for (int i = 1; i < 1001; i++)
i % 2 == 0 ? dq_push_front(d, i) : dq_push_back(d, i);
int sum3 = 0;
int sum3 = 0;
FOR_EACH(dq, deque, , int, d, {
sum3 += var;
})
FOR_EACH(dq, deque, , int, d, {
sum3 += var;
})
printf("Deque sum: %d\n", sum3);
printf("Deque sum: %d\n", sum3);
return 0;
return 0;
}
+63 -55
View File
@@ -1,8 +1,9 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "../../src/macro_containers.h"
#include "../../src/macro_collections.h"
// Create containers to use only in this file
CONTAINER_GENERATE(LIST, PUBLIC, l, list, static, , int)
CONTAINER_GENERATE(STACK, PUBLIC, s, stack, static, , int)
CONTAINER_GENERATE(QUEUE, PUBLIC, q, queue, static, , int)
@@ -10,66 +11,73 @@ CONTAINER_GENERATE(DEQUE, PUBLIC, d, deque, static, , int)
int main(int argc, char const *argv[])
{
list *l = l_new(100);
stack *s = s_new(100);
queue *q = q_new(100);
deque *d = d_new(100);
// Initialize all of them with an internal capacity of 100
list *l = l_new(100);
stack *s = s_new(100);
queue *q = q_new(100);
deque *d = d_new(100);
for (int i = 0; i < 20; i++)
{
l_push_back(l, i);
s_push(s, i);
q_enqueue(q, i);
d_push_back(d, i);
}
// Add 20 elements to each of them
for (int i = 0; i < 20; i++)
{
l_push_back(l, i);
s_push(s, i);
q_enqueue(q, i);
d_push_back(d, i);
}
s_push(s, 21);
q_enqueue(q, 21);
q_enqueue(q, 22);
d_push_back(d, 21);
d_push_back(d, 22);
d_push_back(d, 23);
// Some extra elements
s_push(s, 21);
q_enqueue(q, 21);
q_enqueue(q, 22);
d_push_back(d, 21);
d_push_back(d, 22);
d_push_back(d, 23);
FOR_EACH(l, list, , int, l, {
if (index == 0)
printf("[ %d, ", var);
else if (index == l_count(l) - 1)
printf("%d ]\n", var);
else
printf("%d, ", var);
})
// All FOR_EACH macros contains three available variables:
// - var : the elements that changes with each iteration
// - index : iteration index (first iteration is 0 and last is count - 1)
// - iter : iterator struct
FOR_EACH(l, list, , int, l, {
if (index == 0)
printf("[ %d, ", var);
else if (index == l_count(l) - 1)
printf("%d ]\n", var);
else
printf("%d, ", var);
})
FOR_EACH(s, stack, , int, s, {
if (index == 0)
printf("[ %d, ", var);
else if (index == s_count(s) - 1)
printf("%d ]\n", var);
else
printf("%d, ", var);
})
FOR_EACH(s, stack, , int, s, {
if (index == 0)
printf("[ %d, ", var);
else if (index == s_count(s) - 1)
printf("%d ]\n", var);
else
printf("%d, ", var);
})
FOR_EACH(q, queue, , int, q, {
if (index == 0)
printf("[ %d, ", var);
else if (index == q_count(q) - 1)
printf("%d ]\n", var);
else
printf("%d, ", var);
})
FOR_EACH(q, queue, , int, q, {
if (index == 0)
printf("[ %d, ", var);
else if (index == q_count(q) - 1)
printf("%d ]\n", var);
else
printf("%d, ", var);
})
FOR_EACH(d, deque, , int, d, {
if (index == 0)
printf("[ %d, ", var);
else if (index == d_count(d) - 1)
printf("%d ]\n", var);
else
printf("%d, ", var);
})
FOR_EACH(d, deque, , int, d, {
if (index == 0)
printf("[ %d, ", var);
else if (index == d_count(d) - 1)
printf("%d ]\n", var);
else
printf("%d, ", var);
})
l_free(l);
s_free(s);
q_free(q);
d_free(d);
l_free(l);
s_free(s);
q_free(q);
d_free(d);
return 0;
return 0;
}
+1 -1
View File
@@ -1,5 +1,5 @@
/**
* @file deque.h
* deque.h
*
* Last Update: 22/03/2019
*
+11 -11
View File
@@ -8,15 +8,15 @@
*
*/
#define FOR_EACH(PFX, SNAME, K, T, TARGET, BODY) \
do \
{ \
size_t index; \
T var; \
SNAME##_iter _iter_; \
PFX##_iter(&_iter_, TARGET); \
while (PFX##_iter_next(&_iter_, &var, &index)) \
{ \
BODY; \
} \
#define FOR_EACH(PFX, SNAME, K, T, TARGET, BODY) \
do \
{ \
size_t index; \
T var; \
SNAME##_iter iter; \
PFX##_iter(&iter, TARGET); \
while (PFX##_iter_next(&iter, &var, &index)) \
{ \
BODY; \
} \
} while (0);
+1 -1
View File
@@ -1,5 +1,5 @@
/**
* @file list.h
* list.h
*
* Last Update: 22/03/2019
*
@@ -1,15 +1,15 @@
/**
* @file macro_containers.h
* macro_collections.h
*
* @author Leonardo Vencovsky (https://github.com/LeoVen)
* @date 11/02/2019
* Last Update: 22/03/2019
*
* Macro based generic containers.
* Authors:
* Leonardo Vencovsky (https://github.com/LeoVen)
*
*/
#ifndef MACRO_CONTAINERS
#define MACRO_CONTAINERS
#ifndef CMC_MACRO_COLLECTIONS
#define CMC_MACRO_COLLECTIONS
#include <stdlib.h>
#include <stdbool.h>
@@ -21,16 +21,16 @@
#define CONCATC(C, P) CONCATC_(C, P)
#define CONTAINER_GENERATE(C, P, PFX, SNAME, FMOD, K, V) \
CONTAINER_GENERATE_HEADER(C, P, PFX, SNAME, FMOD, K, V) \
CONTAINER_GENERATE_SOURCE(C, P, PFX, SNAME, FMOD, K, V)
CONTAINER_GENERATE_HEADER(C, P, PFX, SNAME, FMOD, K, V) \
CONTAINER_GENERATE_SOURCE(C, P, PFX, SNAME, FMOD, K, V)
#define CONTAINER_GENERATE_HEADER(C, P, PFX, SNAME, FMOD, K, V) \
CONCATH(C, P) \
(PFX, SNAME, FMOD, K, V)
CONCATH(C, P) \
(PFX, SNAME, FMOD, K, V)
#define CONTAINER_GENERATE_SOURCE(C, P, PFX, SNAME, FMOD, K, V) \
CONCATC(C, P) \
(PFX, SNAME, FMOD, K, V)
CONCATC(C, P) \
(PFX, SNAME, FMOD, K, V)
#include "list.h"
#include "stack.h"
@@ -38,4 +38,4 @@
#include "deque.h"
#include "foreach.h"
#endif /* MACRO_CONTAINERS */
#endif /* CMC_MACRO_COLLECTIONS */
+1 -1
View File
@@ -1,5 +1,5 @@
/**
* @file queue.h
* queue.h
*
* Last Update: 22/03/2019
*
+1 -1
View File
@@ -1,5 +1,5 @@
/**
* @file stack.h
* stack.h
*
* Last Update: 22/03/2019
*
+46 -46
View File
@@ -1,6 +1,6 @@
#include <stdio.h>
#include <assert.h>
#include "../src/macro_containers.h"
#include "../src/macro_collections.h"
CONTAINER_GENERATE(LIST, PUBLIC, l, list, /**/, /**/, int)
CONTAINER_GENERATE(STACK, PUBLIC, s, stack, /**/, /**/, int)
@@ -9,59 +9,59 @@ CONTAINER_GENERATE(DEQUE, PUBLIC, d, deque, /**/, /**/, int)
int main(int argc, char const *argv[])
{
list *l = l_new(1000);
stack *s = s_new(1000);
queue *q = q_new(1000);
deque *d = d_new(1000);
list *l = l_new(1000);
stack *s = s_new(1000);
queue *q = q_new(1000);
deque *d = d_new(1000);
for (int i = 1; i < 10001; i++)
{
if (i % 2 == 0)
{
d_push_front(d, i);
l_push_front(l, i);
}
else
{
d_push_back(d, i);
l_push_back(l, i);
}
for (int i = 1; i < 10001; i++)
{
if (i % 2 == 0)
{
d_push_front(d, i);
l_push_front(l, i);
}
else
{
d_push_back(d, i);
l_push_back(l, i);
}
s_push(s, i);
q_enqueue(q, i);
}
s_push(s, i);
q_enqueue(q, i);
}
int sum0 = 0, sum1 = 0, sum2 = 0, sum3 = 0;
int sum0 = 0, sum1 = 0, sum2 = 0, sum3 = 0;
FOR_EACH(l, list, , int, l, {
sum0 += var;
})
FOR_EACH(l, list, , int, l, {
sum0 += var;
})
FOR_EACH(s, stack, , int, s, {
sum1 += var;
})
FOR_EACH(s, stack, , int, s, {
sum1 += var;
})
FOR_EACH(q, queue, , int, q, {
sum2 += var;
})
FOR_EACH(q, queue, , int, q, {
sum2 += var;
})
FOR_EACH(d, deque, , int, d, {
sum3 += var;
})
FOR_EACH(d, deque, , int, d, {
sum3 += var;
})
if (sum0 == 50005000)
printf("%10s PASSED\n", "LIST");
if (sum1 == 50005000)
printf("%10s PASSED\n", "STACK");
if (sum2 == 50005000)
printf("%10s PASSED\n", "QUEUE");
if (sum3 == 50005000)
printf("%10s PASSED\n", "DEQUE");
if (sum0 == 50005000)
printf("%10s PASSED\n", "LIST");
if (sum1 == 50005000)
printf("%10s PASSED\n", "STACK");
if (sum2 == 50005000)
printf("%10s PASSED\n", "QUEUE");
if (sum3 == 50005000)
printf("%10s PASSED\n", "DEQUE");
l_free(l);
s_free(s);
q_free(q);
d_free(d);
l_free(l);
s_free(s);
q_free(q);
d_free(d);
return 0;
return 0;
}