class interface DS_LINKED_STACK[G]
creation
   make
      --  Create an empty stack.
      --  Use = as comparison criterion.
      ensure
         empty: is_empty
   make_equal
      --  Create an empty stack.
      --  Use equal as comparison criterion.
      ensure
         empty: is_empty
feature(s) from DS_CONTAINER
   --  Measurement
   count: INTEGER
      --  Number of items in stack
feature(s) from DS_CONTAINER
   --  Status report
   is_empty: BOOLEAN
      --  Is container empty?
feature(s) from DS_CONTAINER
   --  Comparison
   is_equal (other: like Current): BOOLEAN
      --  Is current stack equal to other?
      require
         other_not_void: other /= Void
      ensure
         consistent: standard_is_equal(other) implies Result;
         symmetric: Result implies other.is_equal(Current)
feature(s) from DS_CONTAINER
   --  Removal
   wipe_out
      --  Remove all items from stack.
      ensure
         wiped_out: is_empty
feature(s) from DS_SEARCHABLE
   --  Status report
   has (v: G): BOOLEAN
      --  Does stack include v?
      --  (Use equality_tester's comparison criterion
      --  if not void, use = criterion otherwise.)
      ensure
         not_empty: Result implies not is_empty
   same_items (v, u: G): BOOLEAN
      --  Are v and u considered equal?
      --  (Use equality_tester's comparison criterion
      --  if not void, use = criterion otherwise.)
   same_equality_tester (other: DS_SEARCHABLE[G]): BOOLEAN
      --  Does container use the same comparison
      --  criterion as other?
      require
         other_not_void: other /= Void
feature(s) from DS_SEARCHABLE
   --  Measurement
   occurrences (v: G): INTEGER
      --  Number of times v appears in stack
      --  (Use equality_tester's comparison criterion
      --  if not void, use = criterion otherwise.)
      ensure
         positive: Result >= 0;
         has: has(v) implies Result >= 1
feature(s) from DS_SEARCHABLE
   --  Access
   equality_tester: DS_EQUALITY_TESTER[G]
      --  Equality tester;
      --  A void equality tester means that =
      --  will be used as comparison criterion.
feature(s) from DS_SEARCHABLE
   --  Setting
   set_equality_tester (a_tester: like equality_tester)
      --  Set equality_tester to a_tester.
      --  A void equality tester means that =
      --  will be used as comparison criterion.
      ensure
         equality_tester_set: equality_tester = a_tester
feature(s) from DS_DISPENSER
   --  Status report
   extendible (n: INTEGER): BOOLEAN
      --  May stack be extended with n items?
      require
         positive_n: n >= 0
      ensure
         definition: Result = true
feature(s) from DS_DISPENSER
   --  Access
   item: G
      --  Item at top of stack
      require
         not_empty: not is_empty
feature(s) from DS_DISPENSER
   --  Element change
   put (v: G)
      --  Push v on stack.
      require
         extendible: extendible(1)
      ensure
         pushed: item = v;
         one_more: count = old count + 1
   force (v: G)
      --  Push v on stack.
      ensure
         pushed: item = v;
         one_more: count = old count + 1
   extend (other: DS_LINEAR[G])
      --  Add items of other to stack.
      --  Add other.first first, etc.
      require
         other_not_void: other /= Void;
         extendible: extendible(other.count)
      ensure
         new_count: count = old count + other.count
   append (other: DS_LINEAR[G])
      --  Add items of other to stack.
      --  Add other.first first, etc.
      require
         other_not_void: other /= Void
      ensure
         new_count: count = old count + other.count
feature(s) from DS_DISPENSER
   --  Removal
   remove
      --  Remove top item from stack.
      require
         not_empty: not is_empty
      ensure
         one_less: count = old count - 1
   prune (n: INTEGER)
      --  Remove n items from stack.
      require
         valid_n: 0 <= n and n <= count
      ensure
         new_count: count = old count - n
   keep (n: INTEGER)
      --  Keep n items in stack.
      require
         valid_n: 0 <= n and n <= count
      ensure
         new_count: count = n
feature(s) from DS_STACK
   --  Element change
   replace (v: G)
      --  Replace top item by v.
      require
         not_empty: not is_empty
      ensure
         same_count: count = old count;
         replaced: item = v
feature(s) from DS_LINKED_STACK
   --  Duplication
   copy (other: like Current)
      --  Copy other to current stack.
      require
         other_not_void: other /= Void
      ensure
         is_equal: is_equal(other)
invariant
   positive_count: count >= 0;
   empty_definition: is_empty = count = 0;
   first_cell: is_empty = first_cell = Void;
end of DS_LINKED_STACK[G]