with Ada.Containers.Vectors, Ada.Containers.Ordered_Maps, Ada.Containers.Ordered_Sets; package Candidates.Containers is -- By making this a Vector, later generics will be able to -- determine the range of valid CandidateIDs. package Candidate_Vectors is new Ada.Containers.Vectors (Index_Type => CandidateID, Element_Type => Candidate); subtype Candidate_Vector is Candidate_Vectors.Vector; procedure Read_Candidates (Filename : in String; State : in State_Name; Candidate_Data : out Candidate_Vector); -- This must be a Map so that the Index/Key doesn't have to start -- from 1, which is important for the Above_Line_Ballot type. package CandidateID_Maps is new Ada.Containers.Ordered_Maps (Key_Type => Positive, Element_Type => CandidateID); -- Technically doesn't have to be a Map, but nonetheless is, -- simply for consistency with CandidateID_Maps. package CandidateID_Map_Maps is new Ada.Containers.Ordered_Maps (Key_Type => Positive, Element_Type => CandidateID_Maps.Map, "=" => CandidateID_Maps."="); -- Possibly put some aspects here to ensure the types are as expected? subtype Above_Line_Ballot is CandidateID_Map_Maps.Map; subtype Below_Line_Ballot is CandidateID_Maps.Map; procedure Generate_Ballots (Candidate_Data : in Candidate_Vector; Above_Ballot : out Above_Line_Ballot; Below_Ballot : out Below_Line_Ballot); -- Debugging function function To_String (Above_Ballot : in Above_Line_Ballot) return String; -- Debugging function function To_String (Below_Ballot : in Below_Line_Ballot) return String; -- Used for passing the CandidateIDs that have been elected, excluded, etc, -- around to various functions when calculating the election. package CandidateID_Sets is new Ada.Containers.Ordered_Sets (Element_Type => CandidateID); subtype CandidateID_Set is CandidateID_Sets.Set; end Candidates.Containers;