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 | -------------------------------------------------------------------------------
-- --
-- XPATH IN ADA Copyright (C) 2003, McKae Technologies --
-- XPATH IN ADA Copyright (C) 2014, Simon Wright <simon@pushface.org> --
-- --
-- XPath in Ada (XIA) is free software; you can redistribute it and/or --
-- modify it under terms of the GNU General Public License as published by --
-- the Free Software Foundation; either version 3, or (at your option) any --
-- later version. GNAT is distributed in the hope that it will be useful, --
-- but WITHOUT ANY WARRANTY; without even the implied warranty of --
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are --
-- granted additional permissions described in the GCC Runtime Library --
-- Exception, version 3.1, as published by the Free Software Foundation. --
-- --
-- You should have received a copy of the GNU General Public License and a --
-- copy of the GCC Runtime Library Exception along with this program; see --
-- the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
-- <http://www.gnu.org/licenses/>. --
-- --
-- XIA is maintained at https://github.com/simonjwright/xia --
-- --
-------------------------------------------------------------------------------
with Ada.Containers;
with Dom.Core;
use Dom.Core;
with Mckae.XML.XPath.Locations;
use Mckae.XML.XPath.Locations;
private with Ada.Containers.Ordered_Sets;
private with Ada.Containers.Vectors;
package Mckae.XML.XPath.Node_Sets is
-- Record information about node-set member nodes
type Current_Matchings (Axis : Axes := No_Axis) is record
Matching_Node : Node;
case Axis is
when Attribute_Axis =>
Owner_Node : Node; -- Work around bug in XMLAda wherein the
-- parent node of an attribute is always
-- set to null, making it impossible to
-- get the owner element
Attr_Index : Natural;
when Branched_Axes =>
Branch_Step : Location_Steps;
when others =>
null;
end case;
end record;
------------------------------------------------------------------
-- We need a container which has both vector-like properties (to
-- keep nodes in document order or, in the case of ancestor- or
-- previous- axes, reverse document order) as well as set-like
-- properties (so that each node is only entered once).
--
-- Clearly there might be some confusion if a node is entered
-- through two routes (for example, a union (node-set |
-- node-set). However, the document ordering is only important at
-- a single step, so this isn't an issue.
--
-- This code is written in the style of Ada.Containers, but with
-- only the interfaces required to support this application.
------------------------------------------------------------------
type Set is tagged private;
type Cursor is private;
No_Element : constant Cursor;
not overriding
function Length (Container : Set) return Ada.Containers.Count_Type;
not overriding
function Is_Empty (Container : Set) return Boolean;
not overriding
procedure Clear (Container : in out Set);
not overriding
function First (Container : Set) return Cursor;
function Element (Position : Cursor) return Current_Matchings;
procedure Next (Position : in out Cursor);
not overriding
procedure Insert (Container : in out Set;
New_Item : Current_Matchings);
-- Inserts New_Item (at the beginning) unless it's already present.
not overriding
procedure Append (Container : in out Set;
New_Item : Current_Matchings);
-- Appends New_Item (at the end) unless it's already present.
not overriding
procedure Union (Target : in out Set; Source : Set);
-- Union inserts into Target the elements of Source that are not
-- equivalent to some element already in Target.
private
function Equals (L, R : Current_Matchings) return Boolean;
function Less_Than (L, R : Current_Matchings) return Boolean;
package Matchings_Vectors
is new Ada.Containers.Vectors (Index_Type => Positive,
Element_Type => Current_Matchings,
"=" => Equals);
package Matchings_Sets
is new Ada.Containers.Ordered_Sets (Element_Type => Current_Matchings,
"=" => Equals,
"<" => Less_Than);
type Set is tagged record
Elements : Matchings_Vectors.Vector;
Presence : Matchings_Sets.Set;
end record;
-- Doesn't need to be controlled, since both the components are.
type Cursor is record
Elements_Cursor : Matchings_Vectors.Cursor;
end record;
No_Element : constant Cursor
:= Cursor'(Elements_Cursor => Matchings_Vectors.No_Element);
end Mckae.XML.XPath.Node_Sets;
|