TreeUtils.cpp (getdp-3.4.0-source.tgz) | : | TreeUtils.cpp (getdp-3.5.0-source.tgz) | ||
---|---|---|---|---|
// GetDP - Copyright (C) 1997-2021 P. Dular and C. Geuzaine, University of Liege | // GetDP - Copyright (C) 1997-2022 P. Dular and C. Geuzaine, University of Liege | |||
// | // | |||
// See the LICENSE.txt file for license information. Please report all | // See the LICENSE.txt file for license information. Please report all | |||
// issues on https://gitlab.onelab.info/getdp/getdp/issues. | // issues on https://gitlab.onelab.info/getdp/getdp/issues. | |||
// | // | |||
// Contributor(s): | // Contributor(s): | |||
// Marc Ume | // Marc Ume | |||
// | // | |||
#include <stdlib.h> | #include <stdlib.h> | |||
#include <string.h> | #include <string.h> | |||
#include "GetDPConfig.h" | #include "GetDPConfig.h" | |||
#include "MallocUtils.h" | #include "MallocUtils.h" | |||
#include "TreeUtils.h" | #include "TreeUtils.h" | |||
#if !defined(HAVE_GMSH) | #if !defined(HAVE_GMSH) | |||
Tree_T *Tree_Create(int size, int (*fcmp) (const void *a, const void *b)) | Tree_T *Tree_Create(int size, int (*fcmp)(const void *a, const void *b)) | |||
{ | { | |||
Tree_T *tree = (Tree_T*)Malloc(sizeof(Tree_T)); | Tree_T *tree = (Tree_T *)Malloc(sizeof(Tree_T)); | |||
tree->size = size; | tree->size = size; | |||
tree->root = avl_init_table(fcmp); | tree->root = avl_init_table(fcmp); | |||
return tree; | return tree; | |||
} | } | |||
void Tree_Delete(Tree_T * tree) | void Tree_Delete(Tree_T *tree) | |||
{ | { | |||
if(!tree) return; | if(!tree) return; | |||
avl_free_table(tree->root, Free, 0); | avl_free_table(tree->root, Free, 0); | |||
Free(tree); | Free(tree); | |||
} | } | |||
void *Tree_Add(Tree_T * tree, void *data) | void *Tree_Add(Tree_T *tree, void *data) | |||
{ | { | |||
if(!tree) return 0; | if(!tree) return 0; | |||
void *ptr = Malloc(tree->size); | void *ptr = Malloc(tree->size); | |||
memcpy(ptr, data, tree->size); | memcpy(ptr, data, tree->size); | |||
avl_insert(tree->root, ptr, ptr); | avl_insert(tree->root, ptr, ptr); | |||
return ptr; | return ptr; | |||
} | } | |||
int Tree_Nbr(Tree_T * tree) | int Tree_Nbr(Tree_T *tree) | |||
{ | { | |||
if(!tree) return 0; | if(!tree) return 0; | |||
return avl_count(tree->root); | return avl_count(tree->root); | |||
} | } | |||
int Tree_Insert(Tree_T * tree, void *data) | int Tree_Insert(Tree_T *tree, void *data) | |||
{ | { | |||
if(!Tree_Search(tree, data)){ | if(!Tree_Search(tree, data)) { | |||
Tree_Add(tree, data); | Tree_Add(tree, data); | |||
return 1; | return 1; | |||
} | } | |||
return 0; | return 0; | |||
} | } | |||
int Tree_Search(Tree_T * tree, void *data) | int Tree_Search(Tree_T *tree, void *data) | |||
{ | { | |||
if(!tree) return 0; | if(!tree) return 0; | |||
void *ptr; | void *ptr; | |||
return avl_lookup(tree->root, data, &ptr); | return avl_lookup(tree->root, data, &ptr); | |||
} | } | |||
int Tree_Query(Tree_T * tree, void *data) | int Tree_Query(Tree_T *tree, void *data) | |||
{ | { | |||
if(!tree) return 0; | if(!tree) return 0; | |||
void *ptr; | void *ptr; | |||
if(!avl_lookup(tree->root, data, &ptr)) | if(!avl_lookup(tree->root, data, &ptr)) return 0; | |||
return 0; | ||||
memcpy(data, ptr, tree->size); | memcpy(data, ptr, tree->size); | |||
return 1; | return 1; | |||
} | } | |||
void *Tree_PQuery(Tree_T * tree, void *data) | void *Tree_PQuery(Tree_T *tree, void *data) | |||
{ | { | |||
if(!tree) return 0; | if(!tree) return 0; | |||
void *ptr; | void *ptr; | |||
if(!avl_lookup(tree->root, data, &ptr)) | if(!avl_lookup(tree->root, data, &ptr)) return 0; | |||
return 0; | ||||
return ptr; | return ptr; | |||
} | } | |||
int Tree_Suppress(Tree_T * tree, void *data) | int Tree_Suppress(Tree_T *tree, void *data) | |||
{ | { | |||
if(!tree) return 0; | if(!tree) return 0; | |||
void *ptr = data; | void *ptr = data; | |||
if(!avl_delete(tree->root, &ptr, &ptr)) | if(!avl_delete(tree->root, &ptr, &ptr)) return 0; | |||
return 0; | ||||
Free(ptr); | Free(ptr); | |||
return 1; | return 1; | |||
} | } | |||
int Tree_Size(Tree_T * tree) | int Tree_Size(Tree_T *tree) | |||
{ | { | |||
if(!tree) return 0; | if(!tree) return 0; | |||
return tree->size; | return tree->size; | |||
} | } | |||
void Tree_Action(Tree_T *tree, void (*action) (void *data, void *dummy)) | void Tree_Action(Tree_T *tree, void (*action)(void *data, void *dummy)) | |||
{ | { | |||
if(!tree) return; | if(!tree) return; | |||
avl_foreach(tree->root, action, AVL_FORWARD); | avl_foreach(tree->root, action, AVL_FORWARD); | |||
} | } | |||
static List_T *pListTransfer; | static List_T *pListTransfer; | |||
void TransferList(void *a, void *b) | void TransferList(void *a, void *b) { List_Add(pListTransfer, a); } | |||
{ | ||||
List_Add(pListTransfer, a); | ||||
} | ||||
List_T *Tree2List(Tree_T * pTree) | List_T *Tree2List(Tree_T *pTree) | |||
{ | { | |||
int Nb; | int Nb; | |||
Nb = Tree_Nbr(pTree); | Nb = Tree_Nbr(pTree); | |||
if(Nb == 0) | if(Nb == 0) Nb = 1; | |||
Nb = 1; | ||||
pListTransfer = List_Create(Nb, Nb, Tree_Size(pTree)); | pListTransfer = List_Create(Nb, Nb, Tree_Size(pTree)); | |||
Tree_Action(pTree, TransferList); | Tree_Action(pTree, TransferList); | |||
return pListTransfer; | return pListTransfer; | |||
} | } | |||
#endif | #endif | |||
int Tree_Replace(Tree_T *tree, void *data) | int Tree_Replace(Tree_T *tree, void *data) | |||
{ | { | |||
void *ptr; | void *ptr; | |||
int state; | int state; | |||
state = avl_lookup(tree->root, data, &ptr); | state = avl_lookup(tree->root, data, &ptr); | |||
if (state == 0) { | if(state == 0) { | |||
Tree_Add(tree,data); | Tree_Add(tree, data); | |||
return 0; | return 0; | |||
} | } | |||
else { | else { | |||
memcpy(ptr, data, tree->size); | memcpy(ptr, data, tree->size); | |||
return 1; | return 1; | |||
} | } | |||
} | } | |||
End of changes. 21 change blocks. | ||||
29 lines changed or deleted | 22 lines changed or added |