summaryrefslogtreecommitdiff
path: root/src/bundles-containers.adb
blob: 8ba0d3082ed7a12231431e7dbbbe1df4d8bcba69 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86


with Ada.Strings.Unbounded;
with Ada.Text_IO;
with CSV;


package body Bundles.Containers is


    package SU renames Ada.Strings.Unbounded;




    procedure Add_To_Map
           (BMap : in out Bundle_Maps.Map;
            Item : in     Given_Prefs.Preference_Array)
    is
        use type Bundle_Maps.Cursor;
        use type Bundle_Vectors.Vector;

        procedure Update_Bundle
               (B : in out Bundle) is
        begin
            Add (B, Item);
        end Update_Bundle;

        procedure Update_Vector
               (C : in     Candidates.CandidateID;
                V : in out Bundle_Vectors.Vector) is
        begin
            V.Update_Element (V.First_Index, Update_Bundle'Access);
        end Update_Vector;

        Place : Candidates.CandidateID := Item (Given_Prefs.Preference_Range'First);
        Current_Cursor : Bundle_Maps.Cursor := BMap.Find (Place);
    begin
        if Current_Cursor /= Bundle_Maps.No_Element then
            BMap.Update_Element (Current_Cursor, Update_Vector'Access);
        else
            declare
                New_Bundle : Bundle := Empty_Bundle;
            begin
                Add (New_Bundle, Item);
                BMap.Insert (Place, Bundle_Vectors.Empty_Vector & New_Bundle);
            end;
        end if;
    end Add_To_Map;




    procedure Read_Bundles
           (Filename : in     String;
            Result   :    out Bundle_Maps.Map)
    is
        package My_CSV is new CSV;
        use Ada.Text_IO;
        use type Ada.Containers.Count_Type;
        use type Candidates.CandidateID;

        Input_File : File_Type;
        Current_Record : My_CSV.CSV_Record;
        Current_Prefs : Given_Prefs.Preference_Array;
    begin
        Open (Input_File, In_File, Filename);

        Result := Bundle_Maps.Empty_Map;
        while not End_Of_File (Input_File) loop
            Current_Record := My_CSV.Parse_Line (Get_Line (Input_File));
            if Current_Record.Length > 0 then
                Current_Prefs := Given_Prefs.Parse_Preferences (SU.To_String (Current_Record.Last_Element));
                if Current_Prefs (Given_Prefs.Preference_Range'First) /= Candidates.No_Candidate then
                    Add_To_Map (Result, Current_Prefs);
                end if;
            end if;
        end loop;

        Close (Input_File);
    end Read_Bundles;


end Bundles.Containers;