Ada Generic Stack User
-- -- A client of the G_Stack package. -- with Ada.Text_IO; use Ada.Text_IO; with Ada.Integer_Text_IO; use Ada.Integer_Text_IO; with G_Stack; procedure G_Stack_User is -- Now create two stack packages from the generic one. package Small_Int_Stack is new G_Stack(10, Integer); use Small_Int_Stack; subtype Stackable_String is String(1..60); package Big_String_Stack is new G_Stack(300, Stackable_String); use Big_String_Stack; -- We cannot not create a stack of indefinite Strings with this -- package, but we can do this: type String_Ptr is access String; package String_Ptr_Stack is new G_Stack(55, String_Ptr); use String_Ptr_Stack; -- Here are variables of those types. Since we have multiple -- instantiations, and each contains Gen_Stack, we have to qualify: IStack: Small_Int_Stack.Gen_Stack; SStack: Big_String_Stack.Gen_Stack; SPStack: String_Ptr_Stack.Gen_Stack; -- Here some exciting input variables. Exciting: Integer; Stupendous: Stackable_String; Input_Size: Integer; -- Size of string read. -- A variable for getting string pointers from Pop. Popped: String_Ptr; begin -- Read in some integers, and push 'em begin Put_Line("How about some nice integers?"); loop Put("> "); Get(Exciting); Push(IStack, Exciting); -- Note: Push is not ambiguous because of the argument types. If -- we had created and used another integer stack with a different -- size, then we would have to qualify here. end loop; exception when End_Error => -- Mostly just leave the loop, but this looks cleaner sometimes. New_Line; when Small_Int_Stack.Stack_Overflow => -- Note: The qualification on Stack_Overflow is required by the -- multiple instantiations. There are no arguments to an exception -- to tell them apart. Put_Line("Stack Overflow. Input Terminated."); when Data_Error => -- Figure user just started using strings. Next loop will read -- the data Put_Line("Okay, that'll be your first string."); end; -- Now read in some strings. After reading, strings are padded with -- blanks. begin Put_Line("How about some nice strings?"); loop -- Prompt and read. Put("> "); Get_Line(Stupendous, Input_Size); -- Exit when done. exit when Stupendous(1..Input_Size) = "quit"; -- Not done, so fill the rest of the array and push it on the stack. Stupendous(Input_Size+1..Stupendous'Last) := (Input_Size+1..Stupendous'Last => ' '); Push(SStack, Stupendous); end loop; exception when End_Error => -- Mostly just leave the loop, but this looks cleaner sometimes. New_Line; when Big_String_Stack.Stack_Overflow => Put_Line("Stack Overflow. Input Terminated."); end; -- Now read in some more strings. Dynamic copies will be made and pointers -- pushed for this bunch. begin Put_Line("How about more some nice strings?"); loop -- Prompt and read. Put("> "); Get_Line(Stupendous, Input_Size); -- Exit when done. exit when Stupendous(1..Input_Size) = "quit"; -- Not done, so fill the rest of the array and push it on the stack. Push(SPStack, new String'(Stupendous(1..Input_Size))); end loop; exception when End_Error => -- Mostly just leave the loop, but this looks cleaner sometimes. New_Line; when String_Ptr_Stack.Stack_Overflow => Put_Line("Stack Overflow. Input Terminated."); when others => -- Just because I haven't shown you when others. This catches -- any exception not caught by the others. Put_Line("Something unexpected went wrong"); end; -- Pop 'n and print the integers. loop Pop(IStack, Exciting); Put(Exciting, 1); exit when Empty(IStack); Put(" "); end loop; New_Line; -- First bunch of strings. New_Line; loop Pop(SStack, Stupendous); Put_Line("[" & Stupendous & "]"); exit when Empty(SStack); end loop; -- Second bunch of strings. New_Line; loop Pop(SPStack, Popped); Put_Line("[" & Popped.all & "]"); exit when Empty(SPSTack); end loop; end G_Stack_User;