Files
alire-index-community/src/alire-properties.ads
T
Alejandro R Mosteo cf1da607e8 checkpoint 1
2018-05-06 17:05:20 +02:00

92 lines
3.0 KiB
Ada

with Ada.Containers.Indefinite_Vectors;
with Alire.Utils;
package Alire.Properties with Preelaborate is
-- Properties are the general mechanism used to store all info about a release.
-- They can be specialized (e.g. in version, platform, compiler) but that can be transparent to the user.
-- Since a property can be checked against a variety of conditions, this would require fully fledged
-- multiple inheritance for the simplest design.
-- Instead, a first check of matching tags is done and then the checks can proceed.
type Property is interface;
function Image (P : Property) return String is abstract;
function Image_Classwide (P : Property'Class) return String is (P.Image);
package Vectors is new Ada.Containers.Indefinite_Vectors (Positive, Property'Class);
type Vector is new Vectors.Vector with null record;
-- New type so using all it sees "and" below
No_Properties : constant Vector;
function Empty_Properties return Vector;
-- function "and" (L, R : Property'Class) return Vector;
-- function "and" (L : Vector; R : Property'Class) return Vector;
function "and" (L, R : Vector) return Vector;
function "+" (P : Property'Class) return Vector;
function Image_One_Line (V : Vector) return String;
-- A generic helper to simply store/retrieve e.g. an enumerated type
generic
type Value is private;
with function Image (V : Value) return String is <>;
package Values is
type Property is new Properties.Property with private;
function New_Property (V : Value) return Property;
function New_Vector (V : Value) return Vector;
function Element (P : Property) return Value;
private
overriding function Image (P : Property) return String;
type Property is new Properties.Property with record
V : Value;
end record;
function New_Property (V : Value) return Property is (V => V);
function New_Vector (V : Value) return Vector is (+New_Property (V));
function Element (P : Property) return Value is (P.V);
overriding function Image (P : Property) return String is (Image (P.V));
end Values;
private
No_Properties : constant Vector := (Vectors.Empty_Vector with null record);
function Empty_Properties return Vector is (No_Properties);
function "and" (L, R : Vector) return Vector is (L & R);
function "+" (P : Property'Class) return Vector is (To_Vector (P, 1));
-- function "and" (L, R : Property'Class) return Vector is (L & R);
-- function "and" (L : Vector; R : Property'Class) return Vector is (L & R);
package Non_Primitives is
function Image_One_Line_Instance is
new Utils.Image_One_Line (Vectors,
Vector,
Image_Classwide,
" and ",
"(no properties");
end Non_Primitives;
function Image_One_Line (V : Vector) return String renames Non_Primitives.Image_One_Line_Instance;
end Alire.Properties;