2026-09-12 12:54:20 -05:00
|
|
|
#include "malunal/assert.h"
|
2026-08-17 04:16:46 -05:00
|
|
|
#include "malunal/container.h"
|
|
|
|
|
|
2026-08-24 05:16:09 -05:00
|
|
|
const uuid_t UUID_CONTAINER_T = {
|
|
|
|
|
.tl = 0xF4784CF5,
|
|
|
|
|
.tm = 0xFE95,
|
|
|
|
|
.thv = 0x4529,
|
|
|
|
|
.csr = 0xBD,
|
|
|
|
|
.csl = 0x6D,
|
|
|
|
|
.nbs = {
|
|
|
|
|
0x82, 0x53, 0x70,
|
|
|
|
|
0x85, 0xC4, 0xAE
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static
|
|
|
|
|
malunal_cstr_t
|
|
|
|
|
describe(malunal_int32_t code) {
|
|
|
|
|
switch (code) {
|
|
|
|
|
case CONTAINER_ERROR_FAILURE:
|
|
|
|
|
return "Generic container error";
|
|
|
|
|
case CONTAINER_ERROR_NULL_CONTAINER:
|
|
|
|
|
return "Container provided was null";
|
|
|
|
|
case CONTAINER_ERROR_OUT_OF_BOUNDS:
|
|
|
|
|
return "Index into container was out of bounds";
|
|
|
|
|
}
|
|
|
|
|
return "Unknown container error";
|
|
|
|
|
}
|
2026-08-17 04:16:46 -05:00
|
|
|
|
2026-08-24 05:16:09 -05:00
|
|
|
const error_domain_t ERROR_DOMAIN_CONTAINER_T = {
|
|
|
|
|
.describe = &describe,
|
|
|
|
|
.name = "malunal.container.error"
|
|
|
|
|
};
|
2026-08-17 04:16:46 -05:00
|
|
|
|
2026-09-12 12:54:20 -05:00
|
|
|
|
2026-08-24 05:16:09 -05:00
|
|
|
error_t
|
2026-08-17 04:16:46 -05:00
|
|
|
container_allocator(
|
|
|
|
|
container_iptr_t container,
|
|
|
|
|
allocator_mptr_t* out
|
|
|
|
|
) {
|
2026-09-12 12:54:20 -05:00
|
|
|
assert(container != null);
|
|
|
|
|
assert(out != null);
|
|
|
|
|
return container->vtable->allocator(container, out);
|
2026-08-17 04:16:46 -05:00
|
|
|
}
|
|
|
|
|
|
2026-08-24 05:16:09 -05:00
|
|
|
error_t
|
2026-08-17 04:16:46 -05:00
|
|
|
container_stride(
|
|
|
|
|
container_iptr_t container,
|
|
|
|
|
malunal_size_t* out
|
|
|
|
|
) {
|
2026-09-12 12:54:20 -05:00
|
|
|
assert(container != null);
|
|
|
|
|
assert(out != null);
|
|
|
|
|
return container->vtable->stride(container, out);
|
2026-08-17 04:16:46 -05:00
|
|
|
}
|
|
|
|
|
|
2026-08-24 05:16:09 -05:00
|
|
|
error_t
|
2026-08-17 04:16:46 -05:00
|
|
|
container_count(
|
|
|
|
|
container_iptr_t container,
|
|
|
|
|
malunal_size_t* out
|
|
|
|
|
) {
|
2026-09-12 12:54:20 -05:00
|
|
|
assert(container != null);
|
|
|
|
|
assert(out != null);
|
|
|
|
|
return container->vtable->count(container, out);
|
2026-08-17 04:16:46 -05:00
|
|
|
}
|
|
|
|
|
|
2026-08-24 05:16:09 -05:00
|
|
|
error_t
|
2026-08-17 04:16:46 -05:00
|
|
|
container_capacity(
|
|
|
|
|
container_iptr_t container,
|
|
|
|
|
malunal_size_t* out
|
|
|
|
|
) {
|
2026-09-12 12:54:20 -05:00
|
|
|
assert(container != null);
|
|
|
|
|
assert(out != null);
|
|
|
|
|
return container->vtable->capacity(container, out);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
error_t
|
|
|
|
|
container_resize(
|
|
|
|
|
container_mptr_t container,
|
|
|
|
|
malunal_size_t capacity
|
|
|
|
|
) {
|
|
|
|
|
assert(container != null);
|
|
|
|
|
return container->vtable->resize(container, capacity);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
error_t
|
|
|
|
|
container_reserve(
|
|
|
|
|
container_mptr_t container,
|
|
|
|
|
malunal_size_t capacity
|
|
|
|
|
) {
|
|
|
|
|
assert(container != null);
|
|
|
|
|
return container->vtable->reserve(container, capacity);
|
2026-08-17 04:16:46 -05:00
|
|
|
}
|
|
|
|
|
|
2026-08-24 05:16:09 -05:00
|
|
|
error_t
|
2026-08-17 04:16:46 -05:00
|
|
|
container_append(
|
|
|
|
|
container_mptr_t container,
|
|
|
|
|
malunal_iptr_t element
|
|
|
|
|
) {
|
2026-09-12 12:54:20 -05:00
|
|
|
assert(container != null);
|
|
|
|
|
assert(element != null);
|
|
|
|
|
return container->vtable->append(container, element);
|
2026-08-17 04:16:46 -05:00
|
|
|
}
|
|
|
|
|
|
2026-08-24 05:16:09 -05:00
|
|
|
error_t
|
2026-08-17 04:16:46 -05:00
|
|
|
container_remove(
|
|
|
|
|
container_mptr_t container,
|
|
|
|
|
malunal_iptr_t element
|
|
|
|
|
) {
|
2026-09-12 12:54:20 -05:00
|
|
|
assert(container != null);
|
|
|
|
|
assert(element != null);
|
|
|
|
|
return container->vtable->remove(container, element);
|
2026-08-17 04:16:46 -05:00
|
|
|
}
|
|
|
|
|
|
2026-08-24 05:16:09 -05:00
|
|
|
error_t
|
2026-08-17 04:16:46 -05:00
|
|
|
container_contains(
|
|
|
|
|
container_iptr_t container,
|
|
|
|
|
malunal_iptr_t element
|
|
|
|
|
) {
|
2026-09-12 12:54:20 -05:00
|
|
|
assert(container != null);
|
|
|
|
|
assert(element != null);
|
|
|
|
|
return container->vtable->contains(container, element);
|
2026-08-24 05:16:09 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
error_t
|
|
|
|
|
container_clear(
|
|
|
|
|
container_mptr_t container
|
|
|
|
|
) {
|
2026-09-12 12:54:20 -05:00
|
|
|
assert(container != null);
|
|
|
|
|
return container->vtable->clear(container);
|
2026-08-17 04:16:46 -05:00
|
|
|
}
|