Files
alire-index-community/src/alire-conditional_values.adb
T
2018-03-02 19:36:37 +01:00

78 lines
2.1 KiB
Ada

package body Alire.Conditional_Values is
-----------
-- "and" --
-----------
function "and" (L, R : Conditional_Value) return Conditional_Value is
begin
return Result : Conditional_Value do
if L.Is_Empty and then R.Is_Empty then
null; -- nothing to do nor return
else
declare
Inner : Vector_Inner;
begin
if not L.Is_Empty then
Inner.Values.Append (L.Constant_Reference);
end if;
if not R.Is_Empty then
Inner.Values.Append (R.Constant_Reference);
end if;
Result.Replace_Element (Inner);
end;
end if;
end return;
end "and";
--------------
-- Evaluate --
--------------
function Evaluate (This : Conditional_Value; Against : Properties.Vector) return Values is
function Evaluate (This : Inner_Value'Class) return Values is
begin
case This.Kind is
when Condition =>
declare
Cond : Conditional_Inner renames Conditional_Inner (This);
begin
if Cond.Condition.Check (Against) then
return Cond.Then_Value.Evaluate (Against);
else
return Cond.Else_Value.Evaluate (Against);
end if;
end;
when Value =>
return Value_Inner (This).Value;
when Vector =>
return Result : Values do
for Cond of Vector_Inner (This).Values loop
Result := Result & Evaluate (Cond);
end loop;
end return;
end case;
end Evaluate;
Empty_Value : Values;
begin
if This.Is_Empty then
return Empty_Value;
else
return Evaluate (This.Constant_Reference);
end if;
end Evaluate;
--------------
-- Evaluate --
--------------
function Evaluate (This : Conditional_Value; Against : Properties.Vector) return Conditional_Value is
(New_Value (This.Evaluate (Against)));
end Alire.Conditional_Values;