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

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

int compare(const void *a, const void *b) {
    const size_t *one = a;
    const size_t *two = b;
    if (*one < *two)
        return 1;
    else if (*one > *two)
        return -1;
    return 0;
}

void echo(const void *ptr) {
    if (ptr == nullptr)
        return;

    const size_t *s = ptr;
    printf("value is: %zu\n", *s);
}

int main(void) {
    Set *set_value1 = nullptr;
    if (!set_init(&set_value1, destroy, compare)) {
        fprintf(stderr, "Error allcoating set.\n");
        return EXIT_FAILURE;
    }
    size_t data = 25;
    if (!set_insert(set_value1, &data, sizeof(data))) {
        fprintf(stderr, "Error on insert.\n");
        set_free(set_value1);
        return EXIT_FAILURE;
    }
    data = 50;

    if (!set_insert(set_value1, &data, sizeof(data))) {
        fprintf(stderr, "Error on insert.\n");
        set_free(set_value1);
        return EXIT_FAILURE;
    }

    if (!set_insert(set_value1, &data, sizeof(data))) {
        fprintf(stderr, "Error on insert.\n");
        set_free(set_value1);
        return EXIT_FAILURE;
    }
    data = 255;
    if (!set_insert(set_value1, &data, sizeof(data))) {
        fprintf(stderr, "Error on insert.\n");
        set_free(set_value1);
        return EXIT_FAILURE;
    }
    printf("with value 255:\n");
    set_print(set_value1, echo);
    if (!set_remove(set_value1, &data)) {
        fprintf(stderr, "Error on remove.\n");
        set_free(set_value1);
        return EXIT_FAILURE;
    }

    printf("After remove:\n");
    set_print(set_value1, echo);

    Set *set_value2 = nullptr;
    if (!set_init(&set_value2, destroy, compare)) {
        fprintf(stderr, "Error allcoating set.\n");
        set_free(set_value1);
        return EXIT_FAILURE;
    }
    data = 251;
    if (!set_insert(set_value2, &data, sizeof(data))) {
        fprintf(stderr, "Error on insert.\n");
        set_free(set_value2);
        set_free(set_value1);
        return EXIT_FAILURE;
    }
    data = 50;
    if (!set_insert(set_value2, &data, sizeof(data))) {
        fprintf(stderr, "Error on insert.\n");
        set_free(set_value2);
        set_free(set_value1);
        return EXIT_FAILURE;
    }
    printf("Set #2\n");
    set_print(set_value2, echo);
    Set *set_u = nullptr;
    if (!set_union(&set_u, set_value1, set_value2, destroy, compare)) {
        set_free(set_value1);
        set_free(set_value2);
        fprintf(stderr, "Error on union of two sets.\n");
        return EXIT_FAILURE;
    }
    printf("union of two sets.\n");
    set_print(set_u, echo);

    Set *set_i = nullptr;
    if (!set_intersection(&set_i, set_value1, set_value2, destroy, compare)) {
        set_free(set_value1);
        set_free(set_value2);
        set_free(set_u);
        fprintf(stderr, "Error on intersection.\n");
        return EXIT_FAILURE;
    }
    printf("Intersection: \n");
    set_print(set_i, echo);
    Set *set_d = nullptr;
    if (!set_difference(&set_d, set_value1, set_value2, destroy, compare)) {
        set_free(set_value1);
        set_free(set_value2);
        set_free(set_i);
        set_free(set_u);
        fprintf(stderr, "Error on diference.\n");
        return EXIT_FAILURE;
    }
    printf("Set1: {\n");
    set_print(set_value1, echo);
    printf("}\n");
    printf("Set2: {\n");
    set_print(set_value2, echo);
    printf("}\n");
    Set *sub_i = nullptr;
    if (!set_init(&sub_i, destroy, compare)) {
        fprintf(stderr, "Error on init of set.\n");
        set_free(set_d);
        set_free(set_i);
        set_free(set_value1);
        set_free(set_value2);
        set_free(set_u);
        return EXIT_FAILURE;
    }

    data = 25;
    if (!set_insert(sub_i, &data, sizeof(data))) {
        set_free(set_d);
        set_free(set_i);
        set_free(set_value1);
        set_free(set_value2);
        set_free(set_u);
        return EXIT_FAILURE;
    }
    printf("Set3: (Sub) {\n");
    set_print(sub_i, echo);
    printf("}\n");

    printf("Difference: {\n");
    set_print(set_d, echo);
    printf("}\n");
    if (!set_is_subset(set_value1, set_value2)) {
        printf("Set value1 is not a subset of set value2.\n");
    } else {
        printf("Set value` is a subset of set value2.\n");
    }
    if (!set_is_subset(sub_i, set_value1)) {
        printf("Set sub_i, is not a subset of set value 1\n");
    } else {
        printf("Set sub_i, is a subset of set value 1\n");
    }
    if (!set_is_equal(set_value1, set_value2)) {
        printf("Set value1 not equal to set value2\n");
    } else {
        printf("Set value1 is equal to set value2\n");
    }
    set_free(sub_i);
    set_free(set_d);
    set_free(set_i);
    set_free(set_value1);
    set_free(set_value2);
    set_free(set_u);
    return EXIT_SUCCESS;
}