← index
deque/main.c
Source: C2x.Examples/src/deque/main.c
#include "deque.h"
#include <stdio.h>
#include <stdlib.h>

void release(void *ptr) {
    free(ptr);
}

void echo(const void *p) {
    const size_t *v = p;
    printf("\tValue is: %zu\n", *v);
}

int main(void) {
    Deque *deque = nullptr;
    if (!deque_init(&deque, release)) {
        fprintf(stderr, "Error setting up deque.\n");
        return EXIT_FAILURE;
    }
    size_t value = 255;
    if (!deque_push_front(deque, &value, sizeof(value))) {
        fprintf(stderr, "Error pushing into deque.\n");
        deque_free(deque);
        return EXIT_FAILURE;
    }
    value = 100;
    if (!deque_push_front(deque, &value, sizeof(value))) {
        fprintf(stderr, "Error pushing into deque\n");
        deque_free(deque);
        return EXIT_FAILURE;
    }
    printf("backward {\n");
    deque_print_backward(deque, echo);
    printf("}\nforward {\n");
    deque_print_forward(deque, echo);
    printf("}\n");
    size_t rt_value = 0;
    size_t size_val = 0;
    if (deque_pop_back(deque, &rt_value, sizeof(rt_value), &size_val)) {
        printf("%zu off back of deque\n", rt_value);
    } else {
        fprintf(stderr, "Error getting value from back of deque.\n");
        deque_free(deque);
        return EXIT_FAILURE;
    }
    for (size_t i = 0; i < 10; ++i) {
        if (!deque_push_back(deque, &i, sizeof(i))) {
            deque_free(deque);
            return EXIT_FAILURE;
        }
    }
    printf("forward {\n");
    deque_print_forward(deque, echo);
    printf("}\n");
    for (size_t i = 0; i < 10; ++i) {
        if (deque_pop_front(deque, &rt_value, sizeof(rt_value), &size_val)) {
            printf("Front: %zu\n", rt_value);
        } else {
            fprintf(stderr, "Error getting front of deque.\n");
            deque_free(deque);
            return EXIT_FAILURE;
        }
        printf("%zu items left in deque\n", deque_count(deque));
    }
    size_t peek_value = 0;
    if (deque_peek_front(deque, &peek_value, sizeof(peek_value))) {
        printf("peeked value: %zu\n", peek_value);
    } else {
        fprintf(stderr, "Error on peek of value: \n");
        deque_free(deque);
        return EXIT_FAILURE;
    }

    if (deque_peek_back(deque, &peek_value, sizeof(peek_value))) {
        printf("peek back: %zu\n", peek_value);
    } else {
        fprintf(stderr, "Error on peek.\n");
        deque_free(deque);
        return EXIT_FAILURE;
    }
    printf("%zu items left in deque\n", deque_count(deque));
    deque_free(deque);
    return EXIT_SUCCESS;
}