From 52eb6622ee81c50dd41cfbc8ba53cc210c0e9b1e Mon Sep 17 00:00:00 2001 From: Jed Barber Date: Wed, 5 Jul 2017 21:52:49 +1000 Subject: Simplified Bundle_Containers to use an array instead of a Map --- src/election.adb | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) (limited to 'src/election.adb') diff --git a/src/election.adb b/src/election.adb index 80c846a..c7de32b 100644 --- a/src/election.adb +++ b/src/election.adb @@ -22,11 +22,17 @@ package body Election is package SU renames Ada.Strings.Unbounded; + -- These make converting back and forth easier. + -- Why are they distinct types? Because you can't pass a subtype to a generic. + subtype CanID is Candidates.CandidateID; + subtype CID_Range is Bundle_Containers.Candidate_Range; + + -- Candidate, preference data, and other information -- that's actively used by the main STV algorithm. - Pref_Data : Bundle_Containers.Bundle_Map; + Pref_Data : Bundle_Containers.Bundle_Collection; Cand_Data : Candidates.Containers.Candidate_Vector; Entries : Entry_Vectors.Vector; Exhausted : Extra_Data; @@ -73,11 +79,11 @@ package body Election is This : Entry_Data; begin Entries := Entry_Vectors.Empty_Vector; - for B in Pref_Data.Iterate loop + for CID in Bundle_Containers.Candidate_Range loop Given_Bundles.Count_Both - (Bundle_Containers.Bundle_Maps.Element (B).First_Element, Votes, Papers); + (Pref_Data (CID).First_Element, Votes, Papers); This := - (ID => Bundle_Containers.Bundle_Maps.Key (B), + (ID => CanID (CID), Vote_Change => Votes, Total_Votes => Votes, Paper_Change => Papers, @@ -415,7 +421,7 @@ package body Election is Given_Bundles.Count_Both (New_Bundle, Votes_In, Papers_In); if Votes_In > 0 then - Pref_Data.Reference (Working_ID).Append (New_Bundle); + Pref_Data (CID_Range (Working_ID)).Append (New_Bundle); declare Entry_Ref : Entry_Vectors.Reference_Type := Entries.Reference (Working_Position); @@ -457,24 +463,22 @@ package body Election is This_Transfer := Transfers.First_Element; - while Pref_Data.Reference (This_Transfer.From).Length > 0 loop + while Pref_Data (CID_Range (This_Transfer.From)).Length > 0 loop Redistribute_Papers (Still_Running => Running_Positions, Already_Excluded => Not_Considered, - Transfer_Bundle => Pref_Data.Reference (This_Transfer.From).Reference - (Pref_Data.Reference (This_Transfer.From).First_Index), + Transfer_Bundle => Pref_Data (CID_Range (This_Transfer.From)).Reference (1), Transfer => This_Transfer, Fractional_Loss => Fractional_Loss, Exhausted_Loss => Exhausted_Loss); - Pref_Data.Reference (This_Transfer.From).Delete - (Pref_Data.Reference (This_Transfer.From).First_Index); + Pref_Data (CID_Range (This_Transfer.From)).Delete (1); Fractional.Paper_Change := Fractional.Paper_Change + Fractional_Loss; Exhausted.Paper_Change := Exhausted.Paper_Change + Exhausted_Loss; end loop; - if Pref_Data.Reference (This_Transfer.From).Length = 0 then + if Pref_Data (CID_Range (This_Transfer.From)).Length = 0 then declare Entry_Ref : Entry_Vectors.Reference_Type := Entries.Reference (This_Transfer.Position); -- cgit