forked from EliaCereda/chess_recognition
-
Notifications
You must be signed in to change notification settings - Fork 0
/
create_cache.m
101 lines (80 loc) · 2.61 KB
/
create_cache.m
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
function C = create_cache(base_path)
% Fornisci una sintassi semplice per disattivare la cache.
if base_path ~= false
C = @cache;
else
C = @nocache;
end
function L = cache(id, type, fn, varargin)
output_path = path_for_asset(base_path, id, type);
% Supporta varie strategie per la memorizzazione del risultato su
% disco.
if ischar(type) || isstring(type)
switch type
case 'jpg'
type_handler = image_type({}, {'Quality', 85});
case 'png'
type_handler = image_type();
case 'mat'
type_handler = mat_type();
otherwise
error('cached non è in grado di gestire il tipo richiesto.');
end
else
type_handler = type;
end
% Se la funzione non è ancora stata eseguita.
if ~exist(output_path, 'file')
from_cache = false;
% Esegui la funzione.
result = execute(fn, varargin{:});
% Crea la directory di output se necessario, sopprimendo il
% messaggio di avviso se questa esiste già.
output_dir = fileparts(output_path);
[~, ~] = mkdir(output_dir);
% Salva il risultato su disco.
type_handler.save(result, output_path);
else
from_cache = true;
end
function out = resolve()
if from_cache
out = type_handler.load(output_path);
else
out = result;
end
end
% Utilizza lazy per caricare da disco solo i risultati
% effettivamente richiesti.
L = lazy(@resolve);
end
function out = nocache(~, ~, fn, varargin)
% Esegui direttamente la funzione.
out = execute(fn, varargin{:});
end
function out = execute(fn, varargin)
% Risolvi eventuali argomenti lazy.
varargin = lazy.gather(varargin);
out = fn(varargin{:});
end
end
function t = image_type(readopts, writeopts)
if nargin < 2
readopts = {};
writeopts = {};
end
t.load = @(path) imread(path, readopts{:});
t.save = @(out, path) imwrite(out, path, writeopts{:});
end
function t = mat_type()
t.load = @load_mat;
t.save = @save_mat;
function out = load_mat(path)
m = matfile(path);
out = m.data;
end
function save_mat(out, path)
m = matfile(path, 'Writable', true);
m.data = out;
end
end