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 @*/ 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 @*/ 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 @*/ 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 @*/ 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 @*/ 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 @*/ 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