Files
Cesarus85--ringfall-mjolnir-vr/source/math/vector_tree.c
T
Jonas Volman f3aadeab98 Reconcile five Halo functions and approved declaration batches
Integrate coherent B3, P2/K17 prerequisites, completed K1-K16 + S, and the independent profile/effects rulings. Five gains and two explicitly approved B3 debits: net +3 strict functions, +2770 meaningful/+2800 padded bytes (+2774 progress credit). No additional losses; Halo objects 394 to 396 and data unchanged.

Clean rebuild, identical 8252-row stable sweep, 68 valid parks, admission/provider checks, 467-unit warning comparison, unchanged fake scan, and 1318 tests passed. Preserve canonical helper recoveries and unrelated work. Full evidence and disclosures in docs/object_matching_logs/astra_five_function_reconciliation_20260928.md.
2026-09-28 23:17:10 -07:00

147 lines
3.6 KiB
C

/*
VECTOR_TREE.C
symbols in this file:
000FFF50 00d0:
_vector_tree_new (0000)
00100020 0020:
_vector_tree_delete (0000)
00100040 0040:
_code_00100040 (0000)
00100080 0050:
_code_00100080 (0000)
001000D0 0160:
_vector_tree_find (0000)
*/
#include "cseries/cseries.h"
#include "memory/array.h"
struct vector_tree_node
{
long value;
long lower_child_index;
long equal_child_index;
long upper_child_index;
};
typedef void *(*vector_tree_get_vector)(void *context, long value);
typedef long (*vector_tree_compare_component)(void *context, const void *vector, const void *other_vector, short component_index);
struct vector_tree
{
long root_index;
struct dynamic_array nodes;
short component_count;
short pad;
void *context;
vector_tree_get_vector get_vector;
vector_tree_compare_component compare_component;
};
void vector_tree_new(
struct vector_tree *tree,
short component_count,
void *context,
vector_tree_get_vector get_vector,
vector_tree_compare_component compare_component)
{
match_assert("c:\\halo\\SOURCE\\math\\vector_tree.c", 43, tree);
match_assert("c:\\halo\\SOURCE\\math\\vector_tree.c", 44, get_vector);
match_assert("c:\\halo\\SOURCE\\math\\vector_tree.c", 45, compare_component);
match_assert("c:\\halo\\SOURCE\\math\\vector_tree.c", 46, component_count>0);
dynamic_array_new(&tree->nodes, sizeof(struct vector_tree_node));
tree->component_count = component_count;
tree->compare_component = compare_component;
tree->root_index = NONE;
tree->context = context;
tree->get_vector = get_vector;
}
void vector_tree_delete(
struct vector_tree *tree)
{
dynamic_array_delete(&tree->nodes);
}
static boolean vectors_equal(
struct vector_tree *tree,
const void *vector,
const void *other_vector,
short component_index)
{
while (component_index < tree->component_count)
{
if (tree->compare_component(tree->context, vector, other_vector, component_index))
return FALSE;
component_index++;
}
return TRUE;
}
static void vector_tree_add_node(
struct vector_tree *tree,
struct vector_tree_node **node_reference)
{
long node_index = dynamic_array_add_element(&tree->nodes);
if (node_index != NONE)
{
struct vector_tree_node *node = dynamic_array_get_element(&tree->nodes, node_index, sizeof(struct vector_tree_node));
node->lower_child_index = NONE;
node->equal_child_index = NONE;
node->upper_child_index = NONE;
*node_reference = node;
}
else
{
*node_reference = NULL;
}
}
boolean vector_tree_find(
struct vector_tree *tree,
const void *vector,
struct vector_tree_node **index_reference)
{
long *node_index_reference = &tree->root_index;
short component_index = 0;
match_assert("c:\\halo\\SOURCE\\math\\vector_tree.c", 74, tree);
match_assert("c:\\halo\\SOURCE\\math\\vector_tree.c", 75, vector);
match_assert("c:\\halo\\SOURCE\\math\\vector_tree.c", 76, index_reference);
while (*node_index_reference != NONE)
{
struct vector_tree_node *node = dynamic_array_get_element(&tree->nodes, *node_index_reference, sizeof(struct vector_tree_node));
const void *other_vector = tree->get_vector(tree->context, node->value);
long comparison = tree->compare_component(tree->context, vector, other_vector, component_index);
if (comparison < 0)
{
node_index_reference = &node->lower_child_index;
}
else if (comparison > 0)
{
node_index_reference = &node->upper_child_index;
}
else
{
component_index++;
if (vectors_equal(tree, vector, other_vector, component_index))
{
*index_reference = node;
return TRUE;
}
node_index_reference = &node->equal_child_index;
}
}
*node_index_reference = tree->nodes.count;
vector_tree_add_node(tree, index_reference);
return FALSE;
}