82 lines
2.2 KiB
Ada
82 lines
2.2 KiB
Ada
package body Generic_Inverted_Index is
|
|
-- uses some of the new Ada 2012 syntax
|
|
use Source_Vecs;
|
|
|
|
procedure Store(Storage: in out Storage_Type;
|
|
Source: Source_Type;
|
|
Item: Item_Type) is
|
|
use type Maps.Cursor;
|
|
begin
|
|
if (Storage.Find(Item) = Maps.No_Element) then
|
|
Storage.Insert(Key => Item,
|
|
New_Item => Empty_Vector & Source);
|
|
else
|
|
declare
|
|
The_Vector: Vector := Storage.Element(Item);
|
|
begin
|
|
if The_Vector.Last_Element /= Source then
|
|
Storage.Replace
|
|
(Key => Item,
|
|
New_Item => Storage.Element(Item) & Source);
|
|
end if;
|
|
end;
|
|
end if;
|
|
end Store;
|
|
|
|
function Find(Storage: Storage_Type; Item: Item_Type)
|
|
return Vector is
|
|
begin
|
|
return Storage.Element(Item);
|
|
exception
|
|
when Constraint_Error => return Empty_Vector; -- found nothing
|
|
end Find;
|
|
|
|
function Is_In(S: Source_Type; V: Vector) return Boolean is
|
|
begin
|
|
for Some_Element of V loop
|
|
if Some_Element = S then
|
|
return True;
|
|
end if;
|
|
end loop;
|
|
return False;
|
|
end Is_In;
|
|
|
|
function "and"(Left, Right: Vector) return Vector is
|
|
V: Vector := Empty_Vector;
|
|
begin
|
|
for Some_Element of Left loop
|
|
if Is_In(Some_Element, Right) then
|
|
V := V & Some_Element;
|
|
end if;
|
|
end loop;
|
|
return V;
|
|
end "and";
|
|
|
|
function "or"(Left, Right: Vector) return Vector is
|
|
V: Vector := Left; -- all sources in Left
|
|
begin
|
|
for Some_Element of Right loop
|
|
if not Is_In(Some_Element, Left) then
|
|
V := V & Some_Element;
|
|
end if;
|
|
end loop;
|
|
return V;
|
|
end "or";
|
|
|
|
function Empty(Vec: Vector) return Boolean
|
|
renames Is_Empty;
|
|
|
|
procedure Iterate(The_Sources: Vector) is
|
|
begin
|
|
for Some_Element in The_Sources loop
|
|
Do_Something(Element(Some_Element));
|
|
end loop;
|
|
end Iterate;
|
|
|
|
function Same_Vector(U,V: Vector) return Boolean is
|
|
begin
|
|
raise Program_Error with "there is no need to call this function";
|
|
return False; -- this avoices a compiler warning
|
|
end Same_Vector;
|
|
|
|
end Generic_Inverted_Index;
|