xref: /petsc/src/sys/logging/utils/stack.c (revision 1ed6e3ff8437baa411029a28c2b08f047df9ad9a)
1af0996ceSBarry Smith #include <petsc/private/logimpl.h> /*I    "petscsys.h"   I*/
25c6c1daeSBarry Smith 
35c6c1daeSBarry Smith /*@C
45c6c1daeSBarry Smith   PetscIntStackDestroy - This function destroys a stack.
55c6c1daeSBarry Smith 
6*cc4c1da9SBarry Smith   Not Collective, No Fortran Support
75c6c1daeSBarry Smith 
85c6c1daeSBarry Smith   Input Parameter:
95c6c1daeSBarry Smith . stack - The stack
105c6c1daeSBarry Smith 
115c6c1daeSBarry Smith   Level: developer
125c6c1daeSBarry Smith 
13db781477SPatrick Sanan .seealso: `PetscIntStackCreate()`, `PetscIntStackEmpty()`, `PetscIntStackPush()`, `PetscIntStackPop()`, `PetscIntStackTop()`
145c6c1daeSBarry Smith @*/
PetscIntStackDestroy(PetscIntStack stack)15d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscIntStackDestroy(PetscIntStack stack)
16d71ae5a4SJacob Faibussowitsch {
175c6c1daeSBarry Smith   PetscFunctionBegin;
184f572ea9SToby Isaac   PetscAssertPointer(stack, 1);
199566063dSJacob Faibussowitsch   PetscCall(PetscFree(stack->stack));
209566063dSJacob Faibussowitsch   PetscCall(PetscFree(stack));
213ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
225c6c1daeSBarry Smith }
235c6c1daeSBarry Smith 
245c6c1daeSBarry Smith /*@C
255c6c1daeSBarry Smith   PetscIntStackEmpty - This function determines whether any items have been pushed.
265c6c1daeSBarry Smith 
27*cc4c1da9SBarry Smith   Not Collective, No Fortran Support
285c6c1daeSBarry Smith 
295c6c1daeSBarry Smith   Input Parameter:
305c6c1daeSBarry Smith . stack - The stack
315c6c1daeSBarry Smith 
325c6c1daeSBarry Smith   Output Parameter:
33811af0c4SBarry Smith . empty - `PETSC_TRUE` if the stack is empty
345c6c1daeSBarry Smith 
355c6c1daeSBarry Smith   Level: developer
365c6c1daeSBarry Smith 
37db781477SPatrick Sanan .seealso: `PetscIntStackCreate()`, `PetscIntStackDestroy()`, `PetscIntStackPush()`, `PetscIntStackPop()`, `PetscIntStackTop()`
385c6c1daeSBarry Smith @*/
PetscIntStackEmpty(PetscIntStack stack,PetscBool * empty)39d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscIntStackEmpty(PetscIntStack stack, PetscBool *empty)
40d71ae5a4SJacob Faibussowitsch {
415c6c1daeSBarry Smith   PetscFunctionBegin;
424f572ea9SToby Isaac   PetscAssertPointer(stack, 1);
434f572ea9SToby Isaac   PetscAssertPointer(empty, 2);
447a101e5eSJacob Faibussowitsch   *empty = stack->top == -1 ? PETSC_TRUE : PETSC_FALSE;
453ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
465c6c1daeSBarry Smith }
475c6c1daeSBarry Smith 
485c6c1daeSBarry Smith /*@C
495c6c1daeSBarry Smith   PetscIntStackTop - This function returns the top of the stack.
505c6c1daeSBarry Smith 
51*cc4c1da9SBarry Smith   Not Collective, No Fortran Support
525c6c1daeSBarry Smith 
535c6c1daeSBarry Smith   Input Parameter:
545c6c1daeSBarry Smith . stack - The stack
555c6c1daeSBarry Smith 
565c6c1daeSBarry Smith   Output Parameter:
575c6c1daeSBarry Smith . top - The integer on top of the stack
585c6c1daeSBarry Smith 
595c6c1daeSBarry Smith   Level: developer
605c6c1daeSBarry Smith 
61db781477SPatrick Sanan .seealso: `PetscIntStackCreate()`, `PetscIntStackDestroy()`, `PetscIntStackEmpty()`, `PetscIntStackPush()`, `PetscIntStackPop()`
625c6c1daeSBarry Smith @*/
PetscIntStackTop(PetscIntStack stack,int * top)63d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscIntStackTop(PetscIntStack stack, int *top)
64d71ae5a4SJacob Faibussowitsch {
655c6c1daeSBarry Smith   PetscFunctionBegin;
664f572ea9SToby Isaac   PetscAssertPointer(stack, 1);
674f572ea9SToby Isaac   PetscAssertPointer(top, 2);
685c6c1daeSBarry Smith   *top = stack->stack[stack->top];
693ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
705c6c1daeSBarry Smith }
715c6c1daeSBarry Smith 
725c6c1daeSBarry Smith /*@C
735c6c1daeSBarry Smith   PetscIntStackPush - This function pushes an integer on the stack.
745c6c1daeSBarry Smith 
75*cc4c1da9SBarry Smith   Not Collective, No Fortran Support
765c6c1daeSBarry Smith 
775c6c1daeSBarry Smith   Input Parameters:
785c6c1daeSBarry Smith + stack - The stack
795c6c1daeSBarry Smith - item  - The integer to push
805c6c1daeSBarry Smith 
815c6c1daeSBarry Smith   Level: developer
825c6c1daeSBarry Smith 
83db781477SPatrick Sanan .seealso: `PetscIntStackCreate()`, `PetscIntStackDestroy()`, `PetscIntStackEmpty()`, `PetscIntStackPop()`, `PetscIntStackTop()`
845c6c1daeSBarry Smith @*/
PetscIntStackPush(PetscIntStack stack,int item)85d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscIntStackPush(PetscIntStack stack, int item)
86d71ae5a4SJacob Faibussowitsch {
875c6c1daeSBarry Smith   PetscFunctionBegin;
884f572ea9SToby Isaac   PetscAssertPointer(stack, 1);
897a101e5eSJacob Faibussowitsch   if (++stack->top >= stack->max) {
905c6c1daeSBarry Smith     stack->max *= 2;
917a101e5eSJacob Faibussowitsch     PetscCall(PetscRealloc(stack->max * sizeof(*stack->stack), &stack->stack));
925c6c1daeSBarry Smith   }
935c6c1daeSBarry Smith   stack->stack[stack->top] = item;
943ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
955c6c1daeSBarry Smith }
965c6c1daeSBarry Smith 
975c6c1daeSBarry Smith /*@C
985c6c1daeSBarry Smith   PetscIntStackPop - This function pops an integer from the stack.
995c6c1daeSBarry Smith 
100*cc4c1da9SBarry Smith   Not Collective, No Fortran Support
1015c6c1daeSBarry Smith 
1025c6c1daeSBarry Smith   Input Parameter:
1035c6c1daeSBarry Smith . stack - The stack
1045c6c1daeSBarry Smith 
1055c6c1daeSBarry Smith   Output Parameter:
1065c6c1daeSBarry Smith . item - The integer popped
1075c6c1daeSBarry Smith 
1085c6c1daeSBarry Smith   Level: developer
1095c6c1daeSBarry Smith 
110db781477SPatrick Sanan .seealso: `PetscIntStackCreate()`, `PetscIntStackDestroy()`, `PetscIntStackEmpty()`, `PetscIntStackPush()`, `PetscIntStackTop()`
1115c6c1daeSBarry Smith @*/
PetscIntStackPop(PetscIntStack stack,int * item)112d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscIntStackPop(PetscIntStack stack, int *item)
113d71ae5a4SJacob Faibussowitsch {
1145c6c1daeSBarry Smith   PetscFunctionBegin;
1154f572ea9SToby Isaac   PetscAssertPointer(stack, 1);
11608401ef6SPierre Jolivet   PetscCheck(stack->top != -1, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Stack is empty");
1177a101e5eSJacob Faibussowitsch   if (item) {
1184f572ea9SToby Isaac     PetscAssertPointer(item, 2);
1197a101e5eSJacob Faibussowitsch     PetscCall(PetscIntStackTop(stack, item));
1207a101e5eSJacob Faibussowitsch   }
1217a101e5eSJacob Faibussowitsch   --stack->top;
1223ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1235c6c1daeSBarry Smith }
1245c6c1daeSBarry Smith 
1255c6c1daeSBarry Smith /*@C
1265c6c1daeSBarry Smith   PetscIntStackCreate - This function creates a stack.
1275c6c1daeSBarry Smith 
128*cc4c1da9SBarry Smith   Not Collective, No Fortran Support
1295c6c1daeSBarry Smith 
1305c6c1daeSBarry Smith   Output Parameter:
1315c6c1daeSBarry Smith . stack - The stack
1325c6c1daeSBarry Smith 
1335c6c1daeSBarry Smith   Level: developer
1345c6c1daeSBarry Smith 
135db781477SPatrick Sanan .seealso: `PetscIntStackDestroy()`, `PetscIntStackEmpty()`, `PetscIntStackPush()`, `PetscIntStackPop()`, `PetscIntStackTop()`
1365c6c1daeSBarry Smith @*/
PetscIntStackCreate(PetscIntStack * stack)137d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscIntStackCreate(PetscIntStack *stack)
138d71ae5a4SJacob Faibussowitsch {
1395c6c1daeSBarry Smith   PetscFunctionBegin;
1404f572ea9SToby Isaac   PetscAssertPointer(stack, 1);
1417a101e5eSJacob Faibussowitsch   PetscCall(PetscNew(stack));
142a297a907SKarl Rupp 
1437a101e5eSJacob Faibussowitsch   (*stack)->top = -1;
1447a101e5eSJacob Faibussowitsch   (*stack)->max = 128;
145a297a907SKarl Rupp 
1467a101e5eSJacob Faibussowitsch   PetscCall(PetscCalloc1((*stack)->max, &(*stack)->stack));
1473ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1485c6c1daeSBarry Smith }
149