septum_0.0.7_88e658ca/src/common/sp-cache.ads

 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
-------------------------------------------------------------------------------
-- Copyright 2021, The Septum Developers (see AUTHORS file)

-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at

--     http://www.apache.org/licenses/LICENSE-2.0

-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
-------------------------------------------------------------------------------

with SP.Strings;
with Ada.Containers.Ordered_Maps;
with Ada.Strings.Unbounded;

-- Super simple text file caching.
--
-- While `Async_File_Cache` provides parallel loading, access to the cache
-- itself is protected.
--
-- Provides a means to load entire directory structures into memory and then
-- use it as needed. This is intended for text files only, in particular, to
-- speed text searches of large read-only code bases.
--
-- This is super simple and straightforward, but works well enough.
-- It probably better done with mmap to load files directly to memory.  It
-- eliminates line-splitting when printing output.  If this were in C++,
-- it would be possible to do something like store the file as a huge byte
-- block with mmap and then replace newlines with '\0' and store byte counts
-- to the initial part of every string.
--
package SP.Cache is

    use Ada.Strings.Unbounded;
    use SP.Strings;

    package File_Maps is new Ada.Containers.Ordered_Maps (
        Key_Type     => Ada.Strings.Unbounded.Unbounded_String,
        Element_Type => String_Vectors.Vector,
         "<"         => Ada.Strings.Unbounded."<", "=" => String_Vectors."=");

    -- The available in-memory contents of files loaded from files.
    --
    -- Files are stored by full path name, with the OS's preference for path
    -- separators.
    --
    -- TODO: Add monitoring of files for changes.
    protected type Async_File_Cache is

        procedure Clear;

        -- Cache the contents of a file, replacing any existing contents.
        procedure Cache_File (File_Name : Unbounded_String; Lines : String_Vectors.Vector);

        -- The total number of loaded files in the file cache.
        function Num_Files return Natural;

        -- The total number of loaded lines in the file cache.
        function Num_Lines return Natural;

        function Lines (File_Name : Unbounded_String) return String_Vectors.Vector;

        function Files return String_Vectors.Vector;

        function File_Line (File_Name : Unbounded_String; Line : Positive) return Unbounded_String;

    private

        -- A list of all top level directories which need to be searched.
        Top_Level_Directories : SP.Strings.String_Sets.Set;

        Contents : File_Maps.Map;
    end Async_File_Cache;

    -- Adds a directory and all of its recursive subdirectories into the file cache.
    function Add_Directory_Recursively (A : in out Async_File_Cache; Dir : String) return Boolean;

end SP.Cache;