xia_1.4.1_b3cee557/src/mckae-xml-xpath-node_sets.ads

  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;