class interface KL_STRING_BUFFER_ROUTINES

feature(s) from KL_IMPORTED_STRING_BUFFER_ROUTINES
   --  Access

   STRING_BUFFER_: KL_STRING_BUFFER_ROUTINES
      --  Routines that ought to be in class STRING_BUFFER

      ensure
         string_buffer_routines_not_void: Result /= Void

feature(s) from KL_IMPORTED_STRING_BUFFER_ROUTINES
   --  Type anchors

   STRING_BUFFER_TYPE: STRING

feature(s) from KL_IMPORTED_INPUT_STREAM_ROUTINES
   --  Access

   INPUT_STREAM_: KL_INPUT_STREAM_ROUTINES
      --  Routines that ought to be in class INPUT_STREAM

      ensure
         input_stream_routines_not_void: Result /= Void

feature(s) from KL_IMPORTED_INPUT_STREAM_ROUTINES
   --  Type anchors

   INPUT_STREAM_TYPE: INPUT_STREAM

feature(s) from KL_STRING_BUFFER_ROUTINES
   --  Initialization

   make (n: INTEGER): like STRING_BUFFER_TYPE
      --  Create a new string buffer being able
      --  to contain n characters.

      require
         non_negative_n: n >= 0
      ensure
         string_buffer_not_void: Result /= Void;
         count_set: Result.count = n

   make_from_string (a_string: STRING): like STRING_BUFFER_TYPE
      --  Create a new string buffer with characters from a_string.

      require
         a_string_not_void: a_string /= Void
      ensure
         string_buffer_not_void: Result /= Void;
         count_set: Result.count = a_string.count;
         charaters_set: equal(substring(Result,lower,a_string.count + lower - 1),a_string)

feature(s) from KL_STRING_BUFFER_ROUTINES
   --  Conversion

   to_string_buffer (a_string: STRING): like STRING_BUFFER_TYPE
      --  String buffer filled with characters from a_string.
      --  The string buffer and a_string may share internal
      --  data. Use make_from_string if this is a concern.

      require
         a_string_not_void: a_string /= Void
      ensure
         string_buffer_not_void: Result /= Void;
         count_set: Result.count >= a_string.count;
         charaters_set: equal(substring(Result,lower,a_string.count + lower - 1),a_string)

feature(s) from KL_STRING_BUFFER_ROUTINES
   --  Access

   substring (a_buffer: like STRING_BUFFER_TYPE; s, e: INTEGER): STRING
      --  New string made up of characters held in
      --  a_buffer between indexes s and e

      require
         a_buffer_not_void: a_buffer /= Void;
         s_large_enough: s >= lower;
         e_small_enough: e <= upper(a_buffer);
         valid_interval: s <= e + 1
      ensure
         substring_not_void: Result /= Void;
         count_set: Result.count = e - s + 1

feature(s) from KL_STRING_BUFFER_ROUTINES
   --  Measurement

   lower: INTEGER
      --  Lower index


   upper (a_buffer: like STRING_BUFFER_TYPE): INTEGER
      --  Upper index

      require
         a_buffer_not_void: a_buffer /= Void
      ensure
         definition: a_buffer.count = Result - lower + 1

feature(s) from KL_STRING_BUFFER_ROUTINES
   --  Element change

   append_substring_to_string (a_buffer: like STRING_BUFFER_TYPE; s, e: INTEGER; a_string: STRING)
      --  Append string made up of characters held in a_buffer
      --  between indexes s and e to a_string.

      require
         a_buffer_not_void: a_buffer /= Void;
         a_string_not_void: a_string /= Void;
         not_same: to_string_buffer(a_string) /= a_buffer;
         s_large_enough: s >= lower;
         e_small_enough: e <= upper(a_buffer);
         valid_interval: s <= e + 1
      ensure
         count_set: a_string.count = old a_string.count + e - s + 1;
         characters_set: s <= e implies equal(a_string.substring(old a_string.count + 1,a_string.count),substring(a_buffer,s,e))

   copy_from_string (a_buffer: like STRING_BUFFER_TYPE; pos: INTEGER; a_string: STRING)
      --  Copy characters of a_string to a_buffer
      --  starting at position pos.

      require
         a_buffer_not_void: a_buffer /= Void;
         a_string_not_void: a_string /= Void;
         not_same: to_string_buffer(a_string) /= a_buffer;
         pos_large_enough: pos >= lower;
         enough_space: pos + a_string.count - 1 <= upper(a_buffer)
      ensure
         charaters_set: equal(substring(a_buffer,pos,a_string.count + pos - 1),a_string)

   copy_from_stream (a_buffer: like STRING_BUFFER_TYPE; pos: INTEGER; a_stream: like INPUT_STREAM_TYPE; nb_char: INTEGER): INTEGER
      --  Fill a_buffer, starting at position pos with
      --  at most nb_char characters read from a_stream.
      --  Return the number of characters actually read.

      require
         a_buffer_not_void: a_buffer /= Void;
         pos_large_enough: pos >= lower;
         a_stream_not_void: a_stream /= Void;
         a_stream_open_read: INPUT_STREAM_.is_open_read(a_stream);
         nb_char_large_enough: nb_char >= 0;
         enough_space: pos + nb_char - 1 <= upper(a_buffer)
      ensure
         nb_char_read_large_enough: Result >= 0;
         nb_char_read_small_enough: Result <= nb_char

   move_left (a_buffer: like STRING_BUFFER_TYPE; old_pos, new_pos: INTEGER; nb: INTEGER)
      --  Copy nb characters from old_pos to
      --  new_pos in a_buffer.

      require
         a_buffer_not_void: a_buffer /= Void;
         nb_positive: nb >= 0;
         old_pos_large_enough: old_pos >= lower;
         enough_characters: old_pos + nb - 1 <= upper(a_buffer);
         new_pos_large_enough: new_pos >= lower;
         enough_space: new_pos + nb - 1 <= upper(a_buffer);
         move_left: old_pos > new_pos

   move_right (a_buffer: like STRING_BUFFER_TYPE; old_pos, new_pos: INTEGER; nb: INTEGER)
      --  Copy nb characters from old_pos to
      --  new_pos in a_buffer.

      require
         a_buffer_not_void: a_buffer /= Void;
         nb_positive: nb >= 0;
         old_pos_large_enough: old_pos >= lower;
         enough_characters: old_pos + nb - 1 <= upper(a_buffer);
         new_pos_large_enough: new_pos >= lower;
         enough_space: new_pos + nb - 1 <= upper(a_buffer);
         move_right: old_pos < new_pos

feature(s) from KL_STRING_BUFFER_ROUTINES
   --  Resizing

   resize (a_buffer: like STRING_BUFFER_TYPE; n: INTEGER): like STRING_BUFFER_TYPE
      --  Resize a_buffer so that it contains n characters.
      --  Do not lose any previously entered characters.
      --  Note: the returned string buffer might be a_buffer or
      --  a newly created string buffer where characters from
      --  a_buffer have been copied to.

      require
         a_buffer_not_void: a_buffer /= Void;
         n_large_enough: n >= a_buffer.count
      ensure
         string_buffer_not_void: Result /= Void;
         count_set: Result.count = n


end of KL_STRING_BUFFER_ROUTINES