indexing
description: "[
Sequences of characters, accessible through integer indices
in a contiguous range.
]"
library: "Free implementation of ELKS library"
copyright: "Copyright (c) 1986-2008, Eiffel Software and others"
license: "Eiffel Forum License v2 (see forum.txt)"
date: "$Date: $"
revision: "$Revision: $"
class interface
STRING_32
create
make (n: INTEGER_32)
`n'
require
non_negative_size: n >= 0
ensure
empty_string: count = 0
area_allocated: capacity >= n
make_empty
ensure
empty: count = 0
area_allocated: capacity >= 0
make_filled (c: CHARACTER_32; n: INTEGER_32)
`n'`c'
require
valid_count: n >= 0
ensure
count_set: count = n
area_allocated: capacity >= n
filled: occurrences (c) = count
make_from_string (s: STRING_32)
`s'
require
string_exists: s /= Void
ensure
not_shared_implementation: Current /= s implies not shared_with (s)
initialized: same_string (s)
make_from_c (c_string: POINTER)
`c_string'
require
c_string_exists: c_string /= default_pointer
make_from_cil (a_system_string: SYSTEM_STRING)
`a_system_string'
require
is_dotnet: {PLATFORM}.is_dotnet
convert
make_from_cil: {SYSTEM_STRING},
make_from_cil ({SYSTEM_STRING}),
make_from_cil: {STRING_8}
feature
adapt (s: STRING_32): like Current
`s'
`s'
ensure
adapt_not_void: Result /= Void
shared_implementation: Result.shared_with (s)
from_c (c_string: POINTER)
`c_string'
require
c_string_exists: c_string /= default_pointer
ensure
no_zero_byte: not has ('%U')
from_c_substring (c_string: POINTER; start_pos, end_pos: INTEGER_32)
`c_string'
require
c_string_exists: c_string /= default_pointer
start_position_big_enough: start_pos >= 1
end_position_big_enough: start_pos <= end_pos + 1
ensure
valid_count: count = end_pos - start_pos + 1
make (n: INTEGER_32)
`n'
require
non_negative_size: n >= 0
ensure
empty_string: count = 0
area_allocated: capacity >= n
make_empty
ensure
empty: count = 0
area_allocated: capacity >= 0
make_filled (c: CHARACTER_32; n: INTEGER_32)
`n'`c'
require
valid_count: n >= 0
ensure
count_set: count = n
area_allocated: capacity >= n
filled: occurrences (c) = count
make_from_c (c_string: POINTER)
`c_string'
require
c_string_exists: c_string /= default_pointer
make_from_cil (a_system_string: SYSTEM_STRING)
`a_system_string'
require
is_dotnet: {PLATFORM}.is_dotnet
make_from_string (s: STRING_32)
`s'
require
string_exists: s /= Void
ensure
not_shared_implementation: Current /= s implies not shared_with (s)
initialized: same_string (s)
feature
area: SPECIAL [CHARACTER_32]
TO_SPECIAL
code (i: INTEGER_32): NATURAL_32
`i'
require STRING_GENERAL
valid_index: valid_index (i)
false_constant: STRING_8 is "false"
fuzzy_index (other: STRING_32; start: INTEGER_32; fuzz: INTEGER_32): INTEGER_32
`other'`start'
`fuzz'`other'
require
other_exists: other /= Void
other_valid_string_8: other.is_valid_as_string_8
other_not_empty: not other.is_empty
start_large_enough: start >= 1
start_small_enough: start <= count
acceptable_fuzzy: fuzz <= other.count
generating_type: STRING_8
ANY
ensure ANY
generating_type_not_void: Result /= Void
generating_type_not_empty: not Result.is_empty
generator: STRING_8
ANY
ensure ANY
generator_not_void: Result /= Void
generator_not_empty: not Result.is_empty
hash_code: INTEGER_32
ensure HASHABLE
good_hash_value: Result >= 0
index_of (c: CHARACTER_32; start_index: INTEGER_32): INTEGER_32
`c'`start_index'
require
start_large_enough: start_index >= 1
start_small_enough: start_index <= count + 1
ensure
valid_result: Result = 0 or (start_index <= Result and Result <= count)
zero_if_absent: (Result = 0) = not substring (start_index, count).has (c)
found_if_present: substring (start_index, count).has (c) implies item (Result) = c
none_before: substring (start_index, count).has (c) implies not substring (start_index, Result - 1).has (c)
index_of_code (c: like code; start_index: INTEGER_32): INTEGER_32
`c'`start_index'
STRING_GENERAL
require STRING_GENERAL
start_large_enough: start_index >= 1
start_small_enough: start_index <= count + 1
ensure STRING_GENERAL
valid_result: Result = 0 or (start_index <= Result and Result <= count)
zero_if_absent: (Result = 0) = not substring (start_index, count).has_code (c)
found_if_present: substring (start_index, count).has_code (c) implies code (Result) = c
none_before: substring (start_index, count).has_code (c) implies not substring (start_index, Result - 1).has_code (c)
item (i: INTEGER_32): CHARACTER_32 assign put
`i'
STRING_32infix "@"
require TABLE
valid_key: valid_index (i)
require TO_SPECIAL
valid_index: valid_index (i)
item_code (i: INTEGER_32): INTEGER_32
`i'
require
index_small_enough: i <= count
index_large_enough: i > 0
last_index_of (c: CHARACTER_32; start_index_from_end: INTEGER_32): INTEGER_32
`c'
require
start_index_small_enough: start_index_from_end <= count
start_index_large_enough: start_index_from_end >= 1
ensure
last_index_of_non_negative: Result >= 0
correct_place: Result > 0 implies item (Result) = c
shared_with (other: STRING_32): BOOLEAN
`other'
string: STRING_32
`Current'
ensure
string_not_void: Result /= Void
string_type: Result.same_type (create {STRING_32}.make_empty)
first_item: count > 0 implies Result.item (1) = item (1)
recurse: count > 1 implies Result.substring (2, count).is_equal (substring (2, count).string)
string_representation: STRING_32
string`Current'STRING_32
ensure
result_not_void: Result /= Void
correct_type: Result.same_type (create {STRING_32}.make_empty)
first_item: count > 0 implies Result.item (1) = item (1)
recurse: count > 1 implies Result.substring (2, count).is_equal (substring (2, count).string)
substring_index (other: STRING_32; start_index: INTEGER_32): INTEGER_32
require
other_not_void: other /= Void
other_valid_string_8: other.is_valid_as_string_8
valid_start_index: start_index >= 1 and start_index <= count + 1
ensure
valid_result: Result = 0 or else (start_index <= Result and Result <= count - other.count + 1)
zero_if_absent: (Result = 0) = not substring (start_index, count).has_substring (other)
at_this_index: Result >= start_index implies other.same_string (substring (Result, Result + other.count - 1))
none_before: Result > start_index implies not substring (start_index, Result + other.count - 2).has_substring (other)
substring_index_in_bounds (other: STRING_32; start_pos, end_pos: INTEGER_32): INTEGER_32
`other'`start_pos'
`end_pos'
require
other_nonvoid: other /= Void
other_valid_string_8: other.is_valid_as_string_8
other_notempty: not other.is_empty
start_pos_large_enough: start_pos >= 1
start_pos_small_enough: start_pos <= count
end_pos_large_enough: end_pos >= start_pos
end_pos_small_enough: end_pos <= count
ensure
correct_place: Result > 0 implies other.is_equal (substring (Result, Result + other.count - 1))
true_constant: STRING_8 is "true"
infix "@" (i: INTEGER_32): CHARACTER_32 assign put
`i'
STRING_32item
require TABLE
valid_key: valid_index (i)
require TO_SPECIAL
valid_index: valid_index (i)
feature
additional_space: INTEGER_32
RESIZABLE
ensure RESIZABLE
at_least_one: Result >= 1
capacity: INTEGER_32
require STRING_GENERAL
True
require BOUNDED
True
ensure STRING_GENERAL
capacity_non_negative: Result >= 0
count: INTEGER_32
growth_percentage: INTEGER_32 is 50
RESIZABLE
index_set: INTEGER_INTERVAL
require INDEXABLE
True
ensure INDEXABLE
not_void: Result /= Void
ensure then
Result.count = count
minimal_increase: INTEGER_32 is 5
RESIZABLE
occurrences (c: CHARACTER_32): INTEGER_32
`c'
require BAG
True
ensure BAG
non_negative_occurrences: Result >= 0
ensure then
zero_if_empty: count = 0 implies Result = 0
recurse_if_not_found_at_first_position: (count > 0 and then item (1) /= c) implies Result = substring (2, count).occurrences (c)
recurse_if_found_at_first_position: (count > 0 and then item (1) = c) implies Result = 1 + substring (2, count).occurrences (c)
feature
frozen deep_equal (some: ?ANY; other: like arg #1): BOOLEAN
`some'`other'
ANY
ensure ANY
shallow_implies_deep: standard_equal (some, other) implies Result
both_or_none_void: (some = Void) implies (Result = (other = Void))
same_type: (Result and (some /= Void)) implies (other /= Void and then some.same_type (other))
symmetric: Result implies deep_equal (other, some)
frozen equal (some: ?ANY; other: like arg #1): BOOLEAN
`some'`other'
ANY
ensure ANY
definition: Result = (some = Void and other = Void) or else ((some /= Void and other /= Void) and then some.is_equal (other))
is_case_insensitive_equal (other: like Current): BOOLEAN
`other'
require
is_valid_as_string_8: is_valid_as_string_8
other_not_void: other /= Void
other_is_valid_as_string_8: other.is_valid_as_string_8
ensure
symmetric: Result implies other.is_case_insensitive_equal (Current)
consistent: standard_is_equal (other) implies Result
valid_result: as_lower.is_equal (other.as_lower) implies Result
frozen is_deep_equal (other: STRING_32): BOOLEAN
`Current'`other'
ANY
require ANY
other_not_void: other /= Void
ensure ANY
shallow_implies_deep: standard_is_equal (other) implies Result
same_type: Result implies same_type (other)
symmetric: Result implies other.is_deep_equal (Current)
is_equal (other: like Current): BOOLEAN
`other'
require ANY
other_not_void: other /= Void
ensure ANY
symmetric: Result implies other.is_equal (Current)
consistent: standard_is_equal (other) implies Result
ensure then COMPARABLE
trichotomy: Result = (not (Current < other) and not (other < Current))
max (other: STRING_32): STRING_32
`other'
COMPARABLE
require COMPARABLE
other_exists: other /= Void
ensure COMPARABLE
current_if_not_smaller: Current >= other implies Result = Current
other_if_smaller: Current < other implies Result = other
min (other: STRING_32): STRING_32
`other'
COMPARABLE
require COMPARABLE
other_exists: other /= Void
ensure COMPARABLE
current_if_not_greater: Current <= other implies Result = Current
other_if_greater: Current > other implies Result = other
same_string (other: STRING_32): BOOLEAN
`Current'`other'
require
other_not_void: other /= Void
ensure
definition: Result = string.is_equal (other.string)
frozen standard_equal (some: ?ANY; other: like arg #1): BOOLEAN
`some'`other'
ANY
ensure ANY
definition: Result = (some = Void and other = Void) or else ((some /= Void and other /= Void) and then some.standard_is_equal (other))
frozen standard_is_equal (other: STRING_32): BOOLEAN
`other'
ANY
require ANY
other_not_void: other /= Void
ensure ANY
same_type: Result implies same_type (other)
symmetric: Result implies other.standard_is_equal (Current)
three_way_comparison (other: STRING_32): INTEGER_32
`other'
COMPARABLE
require COMPARABLE
other_exists: other /= Void
ensure COMPARABLE
equal_zero: (Result = 0) = is_equal (other)
smaller_negative: (Result = -1) = (Current < other)
greater_positive: (Result = 1) = (Current > other)
infix "<" (other: like Current): BOOLEAN
`other'
require PART_COMPARABLE
other_exists: other /= Void
ensure then COMPARABLE
asymmetric: Result implies not (other < Current)
infix "<=" (other: STRING_32): BOOLEAN
`other'
COMPARABLE
require PART_COMPARABLE
other_exists: other /= Void
ensure then COMPARABLE
definition: Result = ((Current < other) or is_equal (other))
infix ">" (other: STRING_32): BOOLEAN
`other'
COMPARABLE
require PART_COMPARABLE
other_exists: other /= Void
ensure then COMPARABLE
definition: Result = (other < Current)
infix ">=" (other: STRING_32): BOOLEAN
`other'
COMPARABLE
require PART_COMPARABLE
other_exists: other /= Void
ensure then COMPARABLE
definition: Result = (other <= Current)
feature
changeable_comparison_criterion: BOOLEAN is False
conforms_to (other: ANY): BOOLEAN
`other'
ANY
require ANY
other_not_void: other /= Void
ends_with (s: STRING_32): BOOLEAN
`s'
require
argument_not_void: s /= Void
ensure
definition: Result = s.same_string (substring (count - s.count + 1, count))
extendible: BOOLEAN is True
full: BOOLEAN
BOUNDED
has (c: CHARACTER_32): BOOLEAN
`c'
require CONTAINER
True
ensure CONTAINER
not_found_in_empty: Result implies not is_empty
ensure then
false_if_empty: count = 0 implies not Result
true_if_first: count > 0 and then item (1) = c implies Result
recurse: (count > 0 and then item (1) /= c) implies (Result = substring (2, count).has (c))
has_code (c: like code): BOOLEAN
`c'
STRING_GENERAL
ensure then STRING_GENERAL
false_if_empty: count = 0 implies not Result
true_if_first: count > 0 and then code (1) = c implies Result
recurse: (count > 0 and then code (1) /= c) implies (Result = substring (2, count).has_code (c))
has_substring (other: STRING_32)