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