1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142 | --
-- Copyright (C) 2020-2022, AdaCore
--
-- SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
--
with Ada.Iterator_Interfaces;
private with Ada.Finalization;
with Ada.Streams;
package VSS.Stream_Element_Vectors is
pragma Preelaborate;
pragma Remote_Types;
type Stream_Element_Vector is tagged private
with
Constant_Indexing => Element,
Default_Iterator => Iterate,
Iterator_Element => Ada.Streams.Stream_Element;
procedure Set_Capacity
(Self : in out Stream_Element_Vector'Class;
Capacity : Ada.Streams.Stream_Element_Count);
-- Request to pre-allocate memory to store given number of stream elements.
function Is_Empty (Self : Stream_Element_Vector'Class) return Boolean;
-- Return True when stream element vector doesn't contain any elements.
function Length
(Self : Stream_Element_Vector'Class)
return Ada.Streams.Stream_Element_Count;
-- Return size of accumulated data.
function Element
(Self : Stream_Element_Vector'Class;
Index : Ada.Streams.Stream_Element_Count)
return Ada.Streams.Stream_Element;
-- Return element at given index (starting from 1).
procedure Append
(Self : in out Stream_Element_Vector'Class;
Item : Ada.Streams.Stream_Element);
-- Append stream element to the end of the buffer
procedure Append
(Self : in out Stream_Element_Vector'Class;
Item : Stream_Element_Vector'Class);
-- Append stream element vector to the end of the buffer
overriding function "="
(Left : Stream_Element_Vector;
Right : Stream_Element_Vector) return Boolean;
------------------------------------
-- Support for Ada 2012 iterators --
------------------------------------
type Cursor is private;
function Has_Element (Self : Cursor) return Boolean
with Inline;
function Element
(Self : Stream_Element_Vector'Class;
Position : Cursor)
return Ada.Streams.Stream_Element
with Inline;
package Iterator_Interfaces is new Ada.Iterator_Interfaces
(Cursor, Has_Element);
type Reversible_Iterator is
limited new Iterator_Interfaces.Reversible_Iterator with private;
overriding function First (Self : Reversible_Iterator) return Cursor;
overriding function Next
(Self : Reversible_Iterator;
Position : Cursor) return Cursor
with Inline;
overriding function Last (Self : Reversible_Iterator) return Cursor;
overriding function Previous
(Self : Reversible_Iterator;
Position : Cursor) return Cursor
with Inline;
function Iterate
(Self : Stream_Element_Vector'Class) return Reversible_Iterator;
private
type Data_Record (Size : Ada.Streams.Stream_Element_Count) is record
Length : Ada.Streams.Stream_Element_Count;
Storage : Ada.Streams.Stream_Element_Array (1 .. Size);
end record;
type Data_Access is access all Data_Record;
procedure Read
(Stream : not null access Ada.Streams.Root_Stream_Type'Class;
Item : out Stream_Element_Vector);
procedure Write
(Stream : not null access Ada.Streams.Root_Stream_Type'Class;
Item : Stream_Element_Vector);
-- function Input
-- (Stream : not null access Ada.Streams.Root_Stream_Type'Class)
-- return Stream_Element_Buffer;
--
-- procedure Output
-- (Stream : not null access Ada.Streams.Root_Stream_Type'Class;
-- Item : Stream_Element_Buffer);
type Stream_Element_Vector is new Ada.Finalization.Controlled with record
Data : Data_Access;
Capacity : Ada.Streams.Stream_Element_Count := 0;
end record;
for Stream_Element_Vector'Read use Read;
for Stream_Element_Vector'Write use Write;
-- for Stream_Element_Buffer'Input use Input;
-- for Stream_Element_Buffer'Output use Output;
overriding procedure Adjust (Self : in out Stream_Element_Vector);
overriding procedure Finalize (Self : in out Stream_Element_Vector);
type Reversible_Iterator is
limited new Iterator_Interfaces.Reversible_Iterator with
record
Last : Ada.Streams.Stream_Element_Count;
end record;
type Cursor is record
Index : Ada.Streams.Stream_Element_Count := 0;
end record;
end VSS.Stream_Element_Vectors;
|