summaryrefslogtreecommitdiff
path: root/src/election.adb
diff options
context:
space:
mode:
Diffstat (limited to 'src/election.adb')
-rw-r--r--src/election.adb26
1 files changed, 15 insertions, 11 deletions
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);