/*
Copyright 2020 Google LLC

Use of this source code is governed by a BSD-style
license that can be found in the LICENSE file or at
https://developers.google.com/open-source/licenses/bsd
*/

#include "system.h"
#include "tree.h"

#include "basics.h"

struct tree_node *tree_search(void *key, struct tree_node **rootp,
			      int (*compare)(const void *, const void *),
			      int insert)
{
	int res;
	if (!*rootp) {
		if (!insert) {
			return NULL;
		} else {
			struct tree_node *n;
			REFTABLE_CALLOC_ARRAY(n, 1);
			n->key = key;
			*rootp = n;
			return *rootp;
		}
	}

	res = compare(key, (*rootp)->key);
	if (res < 0)
		return tree_search(key, &(*rootp)->left, compare, insert);
	else if (res > 0)
		return tree_search(key, &(*rootp)->right, compare, insert);
	return *rootp;
}

void infix_walk(struct tree_node *t, void (*action)(void *arg, void *key),
		void *arg)
{
	if (t->left) {
		infix_walk(t->left, action, arg);
	}
	action(arg, t->key);
	if (t->right) {
		infix_walk(t->right, action, arg);
	}
}

void tree_free(struct tree_node *t)
{
	if (!t) {
		return;
	}
	if (t->left) {
		tree_free(t->left);
	}
	if (t->right) {
		tree_free(t->right);
	}
	reftable_free(t);
}
