Actual source code: stack.c

petsc-3.6.4 2016-04-12
Report Typos and Errors
  2: /*
  3:      This defines part of the private API for logging performance information. It is intended to be used only by the
  4:    PETSc PetscLog...() interface and not elsewhere, nor by users. Hence the prototypes for these functions are NOT
  5:    in the public PETSc include files.

  7: */
  8: #include <petsc/private/logimpl.h> /*I    "petscsys.h"   I*/

 12: /*@C
 13:   PetscIntStackDestroy - This function destroys a stack.

 15:   Not Collective

 17:   Input Parameter:
 18: . stack - The stack

 20:   Level: developer

 22: .keywords: log, stack, destroy
 23: .seealso: PetscIntStackCreate(), PetscIntStackEmpty(), PetscIntStackPush(), PetscIntStackPop(), PetscIntStackTop()
 24: @*/
 25: PetscErrorCode PetscIntStackDestroy(PetscIntStack stack)
 26: {

 30:   PetscFree(stack->stack);
 31:   PetscFree(stack);
 32:   return(0);
 33: }

 37: /*@C
 38:   PetscIntStackEmpty - This function determines whether any items have been pushed.

 40:   Not Collective

 42:   Input Parameter:
 43: . stack - The stack

 45:   Output Parameter:
 46: . empty - PETSC_TRUE if the stack is empty

 48:   Level: developer

 50: .keywords: log, stack, empty
 51: .seealso: PetscIntStackCreate(), PetscIntStackDestroy(), PetscIntStackPush(), PetscIntStackPop(), PetscIntStackTop()
 52: @*/
 53: PetscErrorCode PetscIntStackEmpty(PetscIntStack stack, PetscBool  *empty)
 54: {
 57:   if (stack->top == -1) *empty = PETSC_TRUE;
 58:   else *empty = PETSC_FALSE;
 59:   return(0);
 60: }

 64: /*@C
 65:   PetscIntStackTop - This function returns the top of the stack.

 67:   Not Collective

 69:   Input Parameter:
 70: . stack - The stack

 72:   Output Parameter:
 73: . top - The integer on top of the stack

 75:   Level: developer

 77: .keywords: log, stack, top
 78: .seealso: PetscIntStackCreate(), PetscIntStackDestroy(), PetscIntStackEmpty(), PetscIntStackPush(), PetscIntStackPop()
 79: @*/
 80: PetscErrorCode PetscIntStackTop(PetscIntStack stack, int *top)
 81: {
 84:   *top = stack->stack[stack->top];
 85:   return(0);
 86: }

 90: /*@C
 91:   PetscIntStackPush - This function pushes an integer on the stack.

 93:   Not Collective

 95:   Input Parameters:
 96: + stack - The stack
 97: - item  - The integer to push

 99:   Level: developer

101: .keywords: log, stack, push
102: .seealso: PetscIntStackCreate(), PetscIntStackDestroy(), PetscIntStackEmpty(), PetscIntStackPop(), PetscIntStackTop()
103: @*/
104: PetscErrorCode PetscIntStackPush(PetscIntStack stack, int item)
105: {
106:   int            *array;

110:   stack->top++;
111:   if (stack->top >= stack->max) {
112:     PetscMalloc1(stack->max*2, &array);
113:     PetscMemcpy(array, stack->stack, stack->max * sizeof(int));
114:     PetscFree(stack->stack);

116:     stack->stack = array;
117:     stack->max  *= 2;
118:   }
119:   stack->stack[stack->top] = item;
120:   return(0);
121: }

125: /*@C
126:   PetscIntStackPop - This function pops an integer from the stack.

128:   Not Collective

130:   Input Parameter:
131: . stack - The stack

133:   Output Parameter:
134: . item  - The integer popped

136:   Level: developer

138: .keywords: log, stack, pop
139: .seealso: PetscIntStackCreate(), PetscIntStackDestroy(), PetscIntStackEmpty(), PetscIntStackPush(), PetscIntStackTop()
140: @*/
141: PetscErrorCode PetscIntStackPop(PetscIntStack stack, int *item)
142: {
145:   if (stack->top == -1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE, "Stack is empty");
146:   *item = stack->stack[stack->top--];
147:   return(0);
148: }

152: /*@C
153:   PetscIntStackCreate - This function creates a stack.

155:   Not Collective

157:   Output Parameter:
158: . stack - The stack

160:   Level: developer

162: .keywords: log, stack, pop
163: .seealso: PetscIntStackDestroy(), PetscIntStackEmpty(), PetscIntStackPush(), PetscIntStackPop(), PetscIntStackTop()
164: @*/
165: PetscErrorCode PetscIntStackCreate(PetscIntStack *stack)
166: {
167:   PetscIntStack  s;

172:   PetscNew(&s);

174:   s->top = -1;
175:   s->max = 128;

177:   PetscCalloc1(s->max, &s->stack);
178:   *stack = s;
179:   return(0);
180: }