* Data Structures of limited private types @ 1998-08-26 0:00 rajagopalasrinivasan 1998-08-26 0:00 ` Stephen Leake ` (2 more replies) 0 siblings, 3 replies; 5+ messages in thread From: rajagopalasrinivasan @ 1998-08-26 0:00 UTC (permalink / raw) folks I have a need to build a stack / linked_list of "Text_Io.File_Type"s. This being a limited private type, I am not able to perform "assignments" of a variable of this type. Can anyone give me some pointers or an example of how this can be done? regards Srinivasan r.srinivasan@eudoramail.com -----== Posted via Deja News, The Leader in Internet Discussion ==----- http://www.dejanews.com/rg_mkgrp.xp Create Your Own Free Member Forum ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Data Structures of limited private types 1998-08-26 0:00 Data Structures of limited private types rajagopalasrinivasan @ 1998-08-26 0:00 ` Stephen Leake 1998-08-26 0:00 ` Martin C. Carlisle 1998-08-29 0:00 ` Matthew Heaney 2 siblings, 0 replies; 5+ messages in thread From: Stephen Leake @ 1998-08-26 0:00 UTC (permalink / raw) rajagopalasrinivasan@my-dejanews.com writes: > folks > > I have a need to build a stack / linked_list of "Text_Io.File_Type"s. This > being a limited private type, I am not able to perform "assignments" of a > variable of this type. > > Can anyone give me some pointers or an example of how this can be done? Use a stack/list of Ada.Text_IO.File_Access. -- Stephe ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Data Structures of limited private types 1998-08-26 0:00 Data Structures of limited private types rajagopalasrinivasan 1998-08-26 0:00 ` Stephen Leake @ 1998-08-26 0:00 ` Martin C. Carlisle 1998-08-29 0:00 ` Matthew Heaney 2 siblings, 0 replies; 5+ messages in thread From: Martin C. Carlisle @ 1998-08-26 0:00 UTC (permalink / raw) In article <6s1d17$i19$1@nnrp1.dejanews.com>, <rajagopalasrinivasan@my-dejanews.com> wrote: >I have a need to build a stack / linked_list of "Text_Io.File_Type"s. This >being a limited private type, I am not able to perform "assignments" of a >variable of this type. > >Can anyone give me some pointers or an example of how this can be done? You need to have an access type to Text_IO.File_Type, and create a stack of these. Remember to make sure the initial declarations of the file variables are aliased. --Martin -- Martin C. Carlisle, Computer Science, US Air Force Academy mcc@cs.usafa.af.mil, http://www.usafa.af.mil/dfcs/bios/carlisle.html DISCLAIMER: This content in no way reflects the opinions, standard or policy of the US Air Force Academy or the United States Government. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Data Structures of limited private types 1998-08-26 0:00 Data Structures of limited private types rajagopalasrinivasan 1998-08-26 0:00 ` Stephen Leake 1998-08-26 0:00 ` Martin C. Carlisle @ 1998-08-29 0:00 ` Matthew Heaney 1998-08-30 0:00 ` rajagopalasrinivasan 2 siblings, 1 reply; 5+ messages in thread From: Matthew Heaney @ 1998-08-29 0:00 UTC (permalink / raw) rajagopalasrinivasan@my-dejanews.com writes: > I have a need to build a stack / linked_list of > "Text_Io.File_Type"s. This being a limited private type, I am not able > to perform "assignments" of a variable of this type. > > Can anyone give me some pointers or an example of how this can be > done? Below is a stack that accepts limited private types as the stack item. You have to use functions that return a pointer to the item on the stack, and manipulate the object indirectly, through a reference. Like this Op (Get_Top (Stack'Access).all); If the syntax bothers you, then use a renames to make it more familiar: declare O : LT renames Get_Top (Stack'Access).all; begin Op (O); end; The idiosyncratic thing here is that the Push operation doesn't take an item as a parameter. You have to push the stack to open up the top slot, and then operate on the top object, which is owned by the stack. Ada95 is a huge improvement over Ada83 in this area. In Ada83 you could only use this technique if o the function was exported by a state machine package (rather than as an operation on an instance of a type); or o the data structure items were put on the heap. I don't think this is a technique many Ada programmers are familiar with, so I wanted to write a long-ish post to get the word out. Hope this helps some, Matt --STX generic type Stack_Item is limited private; Max_Depth : in Positive; package Limited_Stacks is type Stack_Type is limited private; type Stack_Item_Access is access all Stack_Item; procedure Push (Stack : in out Stack_Type); procedure Pop (Stack : in out Stack_Type); function Get_Top (Stack : access Stack_Type) return Stack_Item_Access; function Get_Depth (Stack : Stack_Type) return Natural; generic with procedure Process (Item : in out Stack_Item; Quit : in out Boolean); procedure For_Every_Item (Stack : in out Stack_Type); private type Stack_Item_Array is array (Positive range 1 .. Max_Depth) of aliased Stack_Item; type Stack_Type is limited record Items : Stack_Item_Array; Top : Natural := 0; end record; end Limited_Stacks; package body Limited_Stacks is procedure Push (Stack : in out Stack_Type) is begin Stack.Top := Stack.Top + 1; end; procedure Pop (Stack : in out Stack_Type) is begin Stack.Top := Stack.Top - 1; end; function Get_Top (Stack : access Stack_Type) return Stack_Item_Access is begin return Stack.Items (Stack.Top)'Access; end; function Get_Depth (Stack : Stack_Type) return Natural is begin return Stack.Top; end; procedure For_Every_Item (Stack : in out Stack_Type) is subtype Index_Range is Positive range 1 .. Stack.Top; Quit : Boolean := False; begin for Index in reverse Index_Range loop Process (Stack.Items (Index), Quit); exit when Quit; end loop; end For_Every_Item; end Limited_Stacks; with Limited_Stacks; with Ada.Text_IO; use Ada.Text_IO; procedure Test_Stacks is package File_Stacks is new Limited_Stacks (File_Type, 10); use File_Stacks; Stack : aliased Stack_Type; procedure Display_File (File : in out File_Type; Quit : in out Boolean) is Line : String (1 .. 80); Last : Natural; begin Put ("Contents of file "); Put (Name (File)); New_Line; Reset (File, In_File); while not End_Of_File (File) loop Get_Line (File, Line, Last); Put_Line (Line (1 .. Last)); end loop; New_Line (2); end Display_File; procedure Display_Files is new For_Every_Item (Display_File); begin Push (Stack); declare File : File_Type renames Get_Top (Stack'Access).all; begin Create (File, Out_File, "first_file.txt"); Put_Line (File, "this is the first file pushed on the stack"); end; Push (Stack); declare File : File_Type renames Get_Top (Stack'Access).all; begin Create (File, Out_File, "second_file.txt"); Put_Line (File, "this is the second file pushed on the stack"); end; Display_Files (Stack); end Test_Stacks; ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Data Structures of limited private types 1998-08-29 0:00 ` Matthew Heaney @ 1998-08-30 0:00 ` rajagopalasrinivasan 0 siblings, 0 replies; 5+ messages in thread From: rajagopalasrinivasan @ 1998-08-30 0:00 UTC (permalink / raw) To: r.srinivasan Thanks. The example helps - though in the short term I rewrote my algorithm to be recursive and thus avoid this issue. Thanks everyone for the pointers. srini In article <m367fcsngh.fsf@mheaney.ni.net>, Matthew Heaney <matthew_heaney@acm.org> wrote: > rajagopalasrinivasan@my-dejanews.com writes: > > > I have a need to build a stack / linked_list of > > "Text_Io.File_Type"s. This being a limited private type, I am not able > > to perform "assignments" of a variable of this type. > > > > Can anyone give me some pointers or an example of how this can be > > done? > > Below is a stack that accepts limited private types as the stack item. > > You have to use functions that return a pointer to the item on the > stack, and manipulate the object indirectly, through a reference. Like > this > > Op (Get_Top (Stack'Access).all); > > If the syntax bothers you, then use a renames to make it more familiar: > > declare > O : LT renames Get_Top (Stack'Access).all; > begin > Op (O); > end; > > The idiosyncratic thing here is that the Push operation doesn't take an > item as a parameter. You have to push the stack to open up the top > slot, and then operate on the top object, which is owned by the stack. > > Ada95 is a huge improvement over Ada83 in this area. In Ada83 you could > only use this technique if > > o the function was exported by a state machine package (rather than as > an operation on an instance of a type); or > > o the data structure items were put on the heap. > > I don't think this is a technique many Ada programmers are familiar > with, so I wanted to write a long-ish post to get the word out. > > Hope this helps some, > Matt > > --STX > generic > > type Stack_Item is limited private; > > Max_Depth : in Positive; > > package Limited_Stacks is > > type Stack_Type is limited private; > > type Stack_Item_Access is access all Stack_Item; > > procedure Push (Stack : in out Stack_Type); > > procedure Pop (Stack : in out Stack_Type); > > function Get_Top > (Stack : access Stack_Type) return Stack_Item_Access; > > function Get_Depth > (Stack : Stack_Type) return Natural; > > generic > with procedure Process > (Item : in out Stack_Item; > Quit : in out Boolean); > procedure For_Every_Item (Stack : in out Stack_Type); > > private > > type Stack_Item_Array is > array (Positive range 1 .. Max_Depth) of aliased Stack_Item; > > type Stack_Type is > limited record > Items : Stack_Item_Array; > Top : Natural := 0; > end record; > > end Limited_Stacks; > > package body Limited_Stacks is > > procedure Push (Stack : in out Stack_Type) is > begin > Stack.Top := Stack.Top + 1; > end; > > procedure Pop (Stack : in out Stack_Type) is > begin > Stack.Top := Stack.Top - 1; > end; > > function Get_Top > (Stack : access Stack_Type) return Stack_Item_Access is > begin > return Stack.Items (Stack.Top)'Access; > end; > > function Get_Depth > (Stack : Stack_Type) return Natural is > begin > return Stack.Top; > end; > > procedure For_Every_Item (Stack : in out Stack_Type) is > > subtype Index_Range is Positive range 1 .. Stack.Top; > > Quit : Boolean := False; > > begin > > for Index in reverse Index_Range loop > > Process (Stack.Items (Index), Quit); > > exit when Quit; > > end loop; > > end For_Every_Item; > > end Limited_Stacks; > > with Limited_Stacks; > > with Ada.Text_IO; use Ada.Text_IO; > > procedure Test_Stacks is > > package File_Stacks is new Limited_Stacks (File_Type, 10); > use File_Stacks; > > Stack : aliased Stack_Type; > > procedure Display_File > (File : in out File_Type; > Quit : in out Boolean) is > > Line : String (1 .. 80); > Last : Natural; > > begin > > Put ("Contents of file "); > Put (Name (File)); > New_Line; > > Reset (File, In_File); > > while not End_Of_File (File) loop > Get_Line (File, Line, Last); > Put_Line (Line (1 .. Last)); > end loop; > > New_Line (2); > > end Display_File; > > procedure Display_Files is > new For_Every_Item (Display_File); > > begin > > Push (Stack); > > declare > File : File_Type renames Get_Top (Stack'Access).all; > begin > Create (File, Out_File, "first_file.txt"); > Put_Line (File, "this is the first file pushed on the stack"); > end; > > Push (Stack); > > declare > File : File_Type renames Get_Top (Stack'Access).all; > begin > Create (File, Out_File, "second_file.txt"); > Put_Line (File, "this is the second file pushed on the stack"); > end; > > Display_Files (Stack); > > end Test_Stacks; > > -----== Posted via Deja News, The Leader in Internet Discussion ==----- http://www.dejanews.com/rg_mkgrp.xp Create Your Own Free Member Forum ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~1998-08-30 0:00 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 1998-08-26 0:00 Data Structures of limited private types rajagopalasrinivasan 1998-08-26 0:00 ` Stephen Leake 1998-08-26 0:00 ` Martin C. Carlisle 1998-08-29 0:00 ` Matthew Heaney 1998-08-30 0:00 ` rajagopalasrinivasan
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox