2021-08-23 23:47:29 +00:00
|
|
|
with Ada.Finalization;
|
|
|
|
|
|
|
|
generic
|
|
|
|
--type Character_Type is private;
|
|
|
|
type Character_Type is (<>);
|
|
|
|
Null_Character: Character_Type;
|
|
|
|
package H3.Strings is
|
|
|
|
|
|
|
|
type Elastic_String is private;
|
|
|
|
type Character_Array is array(System_Index range <>) of Character_Type;
|
|
|
|
--type Character_Array_Pointer is access all Character_Array;
|
|
|
|
|
|
|
|
subtype Thin_Character_Array is Character_Array(System_Index'Range);
|
|
|
|
type Thin_Character_Array_Pointer is access Thin_Character_Array;
|
|
|
|
|
|
|
|
function To_Character_Array (Str: in Elastic_String) return Character_Array;
|
|
|
|
|
|
|
|
function Get_Capacity (Str: in Elastic_String) return System_Size;
|
2021-08-24 16:07:29 +00:00
|
|
|
pragma Inline (Get_Capacity);
|
2021-08-23 23:47:29 +00:00
|
|
|
|
|
|
|
function Get_Length (Str: in Elastic_String) return System_Size;
|
2021-08-24 16:07:29 +00:00
|
|
|
pragma Inline (Get_Length);
|
2021-08-24 07:17:32 +00:00
|
|
|
|
2021-09-30 23:54:50 +00:00
|
|
|
-- the return type is System_Size for consistency with Get_Last_Index.
|
2021-08-24 07:17:32 +00:00
|
|
|
function Get_First_Index (Str: in Elastic_String) return System_Size;
|
2021-08-24 16:07:29 +00:00
|
|
|
pragma Inline (Get_First_Index);
|
2021-08-24 07:17:32 +00:00
|
|
|
|
2021-09-30 23:54:50 +00:00
|
|
|
-- the return type is System_Size because the Last index is -1 off the System_Index'First for an empty string
|
2021-08-24 07:17:32 +00:00
|
|
|
function Get_Last_Index (Str: in Elastic_String) return System_Size;
|
2021-08-24 16:07:29 +00:00
|
|
|
pragma Inline (Get_Last_index);
|
2021-08-23 23:47:29 +00:00
|
|
|
|
|
|
|
function Get_Item (Str: in Elastic_String; Pos: in System_Index) return Character_Type;
|
2021-08-24 16:07:29 +00:00
|
|
|
pragma Inline (Get_Item);
|
2021-08-23 23:47:29 +00:00
|
|
|
|
2021-08-24 07:17:32 +00:00
|
|
|
-- unsafe
|
2021-08-23 23:47:29 +00:00
|
|
|
function Get_Slot_Pointer (Str: in Elastic_String) return Thin_Character_Array_Pointer;
|
2021-08-24 16:07:29 +00:00
|
|
|
pragma Inline (Get_Slot_Pointer);
|
2021-08-23 23:47:29 +00:00
|
|
|
|
|
|
|
function Is_Shared(Str: in Elastic_String) return Standard.Boolean;
|
2021-08-24 16:07:29 +00:00
|
|
|
pragma Inline (Is_Shared);
|
2021-08-23 23:47:29 +00:00
|
|
|
|
|
|
|
procedure Purge (Str: in out Elastic_String);
|
2021-08-24 07:17:32 +00:00
|
|
|
procedure Clear (Str: in out Elastic_String);
|
2021-08-23 23:47:29 +00:00
|
|
|
|
|
|
|
procedure Append (Str: in out Elastic_String; V: in Character_Array);
|
|
|
|
procedure Append (Str: in out Elastic_String; V: in Character_Type);
|
|
|
|
|
2021-10-01 11:03:54 +00:00
|
|
|
procedure Insert (Str: in out Elastic_String; Pos: in System_Index; New_Char: in Character_Type);
|
2021-09-30 23:54:50 +00:00
|
|
|
procedure Replace (Str: in out Elastic_String; Pos: in System_Index; New_Char: in Character_Type);
|
|
|
|
|
2021-08-23 23:47:29 +00:00
|
|
|
private
|
2021-08-24 07:17:32 +00:00
|
|
|
type Buffer_Record(Capa: System_Size) is limited record
|
|
|
|
Refs: System_Size := 1;
|
|
|
|
Slot: Character_Array(1 .. Capa);
|
2021-08-23 23:47:29 +00:00
|
|
|
Last: System_Size := 0;
|
|
|
|
end record;
|
|
|
|
|
|
|
|
type Buffer_Pointer is access all Buffer_Record;
|
|
|
|
|
|
|
|
--Empty_Buffer: aliased Buffer_Record(1);
|
2021-08-24 07:17:32 +00:00
|
|
|
Empty_Buffer: aliased Buffer_Record := (Capa => 1, Refs => 0, Slot => (1 => Null_Character), Last => 0);
|
2021-08-23 23:47:29 +00:00
|
|
|
|
|
|
|
type Elastic_String is new Ada.Finalization.Controlled with record
|
|
|
|
Buffer: Buffer_Pointer := Empty_Buffer'Access;
|
|
|
|
end record;
|
|
|
|
|
|
|
|
overriding procedure Initialize (Str: in out Elastic_String);
|
|
|
|
overriding procedure Adjust (Str: in out Elastic_String);
|
|
|
|
overriding procedure Finalize (Str: in out Elastic_String);
|
|
|
|
|
|
|
|
end H3.Strings;
|