WITH CC3019B0_LIST_CLASS ;
GENERIC
TYPE ELEMENT IS LIMITED PRIVATE ;
WITH PROCEDURE ASSIGN (SOURCE : IN OUT ELEMENT ;
DESTINATION : IN OUT ELEMENT) ;
WITH FUNCTION "=" (LEFT : IN ELEMENT ;
RIGHT : IN ELEMENT) RETURN BOOLEAN ;
PACKAGE CC3019B1_STACK_CLASS IS
TYPE STACK IS LIMITED PRIVATE ;
OVERFLOW : EXCEPTION ;
UNDERFLOW : EXCEPTION ;
PROCEDURE PUSH (THIS_ELEMENT : IN OUT ELEMENT ;
ON_TO_THIS_STACK : IN OUT STACK) ;
PROCEDURE POP (THIS_ELEMENT : IN OUT ELEMENT ;
OFF_THIS_STACK : IN OUT STACK) ;
PROCEDURE COPY (THIS_STACK : IN OUT STACK ;
TO_THIS_STACK : IN OUT STACK) ;
PROCEDURE CLEAR (THIS_STACK : IN OUT STACK) ;
GENERIC
WITH PROCEDURE PROCESS (THIS_ELEMENT : IN ELEMENT ;
CONTINUE : OUT BOOLEAN) ;
PROCEDURE ITERATE (OVER_THIS_STACK : IN STACK) ;
FUNCTION NUMBER_OF_ELEMENTS (ON_THIS_STACK : IN STACK)
RETURN NATURAL ;
FUNCTION "=" (LEFT : IN STACK ;
RIGHT : IN STACK) RETURN BOOLEAN ;
PRIVATE
PACKAGE NEW_LIST_CLASS IS
NEW CC3019B0_LIST_CLASS (ELEMENT => ELEMENT,
ASSIGN => ASSIGN,
"=" => "=") ;
TYPE STACK IS NEW NEW_LIST_CLASS.LIST ;
END CC3019B1_STACK_CLASS ;
PACKAGE BODY CC3019B1_STACK_CLASS IS
PROCEDURE PUSH (THIS_ELEMENT : IN OUT ELEMENT ;
ON_TO_THIS_STACK : IN OUT STACK) IS
BEGIN
NEW_LIST_CLASS.ADD (
THIS_ELEMENT => THIS_ELEMENT,
TO_THIS_LIST =>
NEW_LIST_CLASS.LIST (ON_TO_THIS_STACK)) ;
EXCEPTION
WHEN NEW_LIST_CLASS.OVERFLOW => RAISE OVERFLOW ;
END PUSH ;
PROCEDURE POP (THIS_ELEMENT : IN OUT ELEMENT ;
OFF_THIS_STACK : IN OUT STACK) IS
BEGIN
NEW_LIST_CLASS.DELETE (
THIS_ELEMENT => THIS_ELEMENT,
FROM_THIS_LIST =>
NEW_LIST_CLASS.LIST (OFF_THIS_STACK)) ;
EXCEPTION
WHEN NEW_LIST_CLASS.UNDERFLOW => RAISE UNDERFLOW ;
END POP ;
PROCEDURE COPY (THIS_STACK : IN OUT STACK ;
TO_THIS_STACK : IN OUT STACK) IS
BEGIN
NEW_LIST_CLASS.COPY (
THIS_LIST => NEW_LIST_CLASS.LIST (THIS_STACK),
TO_THIS_LIST => NEW_LIST_CLASS.LIST (TO_THIS_STACK)) ;
END COPY ;
PROCEDURE CLEAR (THIS_STACK : IN OUT STACK) IS
BEGIN
NEW_LIST_CLASS.CLEAR (NEW_LIST_CLASS.LIST (THIS_STACK)) ;
END CLEAR ;
PROCEDURE ITERATE (OVER_THIS_STACK : IN STACK) IS
PROCEDURE STACK_ITERATE IS NEW NEW_LIST_CLASS.ITERATE
(PROCESS => PROCESS) ;
BEGIN
STACK_ITERATE (NEW_LIST_CLASS.LIST (OVER_THIS_STACK)) ;
END ITERATE ;
FUNCTION NUMBER_OF_ELEMENTS (ON_THIS_STACK : IN STACK)
RETURN NATURAL IS
BEGIN
RETURN NEW_LIST_CLASS.NUMBER_OF_ELEMENTS
(IN_THIS_LIST => NEW_LIST_CLASS.LIST (ON_THIS_STACK)) ;
END NUMBER_OF_ELEMENTS ;
FUNCTION "=" (LEFT : IN STACK ;
RIGHT : IN STACK) RETURN BOOLEAN IS
BEGIN
RETURN NEW_LIST_CLASS."=" (
LEFT => NEW_LIST_CLASS.LIST (LEFT),
RIGHT => NEW_LIST_CLASS.LIST (RIGHT)) ;
END "=" ;
END CC3019B1_STACK_CLASS ;