"Fossies" - the Fresh Open Source Software Archive  

Source code changes of the file "Common/TreeUtils.cpp" between
getdp-3.4.0-source.tgz and getdp-3.5.0-source.tgz

About: GetDP is a general finite element solver using mixed elements to discretize de Rham-type complexes in one, two and three dimensions.

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

Home  |  About  |  Features  |  All  |  Newest  |  Dox  |  Diffs  |  RSS Feeds  |  Screenshots  |  Comments  |  Imprint  |  Privacy  |  HTTP(S)