Actual source code: stack.c
1: #include <petsc/private/logimpl.h>
3: /*@C
4: PetscIntStackDestroy - This function destroys a stack.
6: Not Collective, No Fortran Support
8: Input Parameter:
9: . stack - The stack
11: Level: developer
13: .seealso: `PetscIntStackCreate()`, `PetscIntStackEmpty()`, `PetscIntStackPush()`, `PetscIntStackPop()`, `PetscIntStackTop()`
14: @*/
15: PetscErrorCode PetscIntStackDestroy(PetscIntStack stack)
16: {
17: PetscFunctionBegin;
18: PetscAssertPointer(stack, 1);
19: PetscCall(PetscFree(stack->stack));
20: PetscCall(PetscFree(stack));
21: PetscFunctionReturn(PETSC_SUCCESS);
22: }
24: /*@C
25: PetscIntStackEmpty - This function determines whether any items have been pushed.
27: Not Collective, No Fortran Support
29: Input Parameter:
30: . stack - The stack
32: Output Parameter:
33: . empty - `PETSC_TRUE` if the stack is empty
35: Level: developer
37: .seealso: `PetscIntStackCreate()`, `PetscIntStackDestroy()`, `PetscIntStackPush()`, `PetscIntStackPop()`, `PetscIntStackTop()`
38: @*/
39: PetscErrorCode PetscIntStackEmpty(PetscIntStack stack, PetscBool *empty)
40: {
41: PetscFunctionBegin;
42: PetscAssertPointer(stack, 1);
43: PetscAssertPointer(empty, 2);
44: *empty = stack->top == -1 ? PETSC_TRUE : PETSC_FALSE;
45: PetscFunctionReturn(PETSC_SUCCESS);
46: }
48: /*@C
49: PetscIntStackTop - This function returns the top of the stack.
51: Not Collective, No Fortran Support
53: Input Parameter:
54: . stack - The stack
56: Output Parameter:
57: . top - The integer on top of the stack
59: Level: developer
61: .seealso: `PetscIntStackCreate()`, `PetscIntStackDestroy()`, `PetscIntStackEmpty()`, `PetscIntStackPush()`, `PetscIntStackPop()`
62: @*/
63: PetscErrorCode PetscIntStackTop(PetscIntStack stack, int *top)
64: {
65: PetscFunctionBegin;
66: PetscAssertPointer(stack, 1);
67: PetscAssertPointer(top, 2);
68: *top = stack->stack[stack->top];
69: PetscFunctionReturn(PETSC_SUCCESS);
70: }
72: /*@C
73: PetscIntStackPush - This function pushes an integer on the stack.
75: Not Collective, No Fortran Support
77: Input Parameters:
78: + stack - The stack
79: - item - The integer to push
81: Level: developer
83: .seealso: `PetscIntStackCreate()`, `PetscIntStackDestroy()`, `PetscIntStackEmpty()`, `PetscIntStackPop()`, `PetscIntStackTop()`
84: @*/
85: PetscErrorCode PetscIntStackPush(PetscIntStack stack, int item)
86: {
87: PetscFunctionBegin;
88: PetscAssertPointer(stack, 1);
89: if (++stack->top >= stack->max) {
90: stack->max *= 2;
91: PetscCall(PetscRealloc(stack->max * sizeof(*stack->stack), &stack->stack));
92: }
93: stack->stack[stack->top] = item;
94: PetscFunctionReturn(PETSC_SUCCESS);
95: }
97: /*@C
98: PetscIntStackPop - This function pops an integer from the stack.
100: Not Collective, No Fortran Support
102: Input Parameter:
103: . stack - The stack
105: Output Parameter:
106: . item - The integer popped
108: Level: developer
110: .seealso: `PetscIntStackCreate()`, `PetscIntStackDestroy()`, `PetscIntStackEmpty()`, `PetscIntStackPush()`, `PetscIntStackTop()`
111: @*/
112: PetscErrorCode PetscIntStackPop(PetscIntStack stack, int *item)
113: {
114: PetscFunctionBegin;
115: PetscAssertPointer(stack, 1);
116: PetscCheck(stack->top != -1, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Stack is empty");
117: if (item) {
118: PetscAssertPointer(item, 2);
119: PetscCall(PetscIntStackTop(stack, item));
120: }
121: --stack->top;
122: PetscFunctionReturn(PETSC_SUCCESS);
123: }
125: /*@C
126: PetscIntStackCreate - This function creates a stack.
128: Not Collective, No Fortran Support
130: Output Parameter:
131: . stack - The stack
133: Level: developer
135: .seealso: `PetscIntStackDestroy()`, `PetscIntStackEmpty()`, `PetscIntStackPush()`, `PetscIntStackPop()`, `PetscIntStackTop()`
136: @*/
137: PetscErrorCode PetscIntStackCreate(PetscIntStack *stack)
138: {
139: PetscFunctionBegin;
140: PetscAssertPointer(stack, 1);
141: PetscCall(PetscNew(stack));
143: (*stack)->top = -1;
144: (*stack)->max = 128;
146: PetscCall(PetscCalloc1((*stack)->max, &(*stack)->stack));
147: PetscFunctionReturn(PETSC_SUCCESS);
148: }