class interface P_STACK[G]

creation
   make
      --  Create stack


feature(s) from P_CONTAINER
   --  Status

   count: INTEGER
      --  Number of items in the container.

      ensure
         positive: Result >= 0

   is_empty: BOOLEAN
      --  Is the container empty?


   is_readable: BOOLEAN
      --  Is the container currently readable?


   is_writable: BOOLEAN
      --  Is the container currently writable?


   item: G
      --  Current item.

      require
         readable: is_readable;
         not_empty: not is_empty

feature(s) from P_CONTAINER
   --  Update

   reset
      --  Create stack

      require
         writable: is_writable
      ensure
         done: is_empty

feature(s) from P_CONTAINER
   --  Output

   out: STRING
      --  String representation.

      ensure
         is_copy:  --  new string

feature(s) from P_CONTAINER
   --  Utility

   is_void (x: ANY): BOOLEAN
      --  Void assertion for generic parameters.


feature(s) from P_DISPENSER
   --  Update

   add (it: G)
      --  Add an item to the dispenser (push).

      ensure
         keep_reference:  --  keep a copy of the item.

   remove
      --  Remove an item from the dispenser and update 
      --  the current item (pop).

      require
         meaningful: not is_empty

feature(s) from P_DISPENSER
   --  Conversion

   to_list: P_LIST[G]
      --  Items in stack (bottom of stack first).

      ensure
         valid_result: Result /= Void; --  new list but old items.
         is_shallow_copy: 

feature(s) from P_STACK
   make
      --  Create stack


feature(s) from P_STACK
   --  from ANY

   copy (other: like Current)
      require
         other_not_void: other /= Void
      ensure
         is_equal: is_equal(other)

   is_equal (other: like Current): BOOLEAN
      require
         other_not_void: other /= Void
      ensure
         consistent: standard_is_equal(other) implies Result;
         symmetric: Result implies other.is_equal(Current)

invariant
   empty: is_empty = count = 0;

end of P_STACK[G]