-
Notifications
You must be signed in to change notification settings - Fork 2
/
Dictionary.m
108 lines (91 loc) · 3.07 KB
/
Dictionary.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
102
103
104
105
106
107
108
% TODO
% Documentation
% Should the storage be done in some other way?
% Cell array as keys?
% Some possibility to load and save to a matfile?
% May be load and save from outside is enough.
% Get and set functions called by subsref and subsasgn?
% Unit tests.
classdef Dictionary
properties
store
end
methods
function obj = Dictionary()
obj.store = struct();
end
function s = getStore(obj)
s = obj.store;
end
function display(obj)
if length(fieldnames(obj.store)) == 0
fprintf('%s is an empty Dictionary\n',inputname(1));
return
end
lineformat = [inputname(1) '(%s) = %s\n'];
display_impl(obj.store,'');
function display_impl(s, path)
if ~isstruct(s)
fprintf(lineformat,path(3:end), value2str(s));
% fprintf(') = %s\n', value2str(s));
% fprintf('%s(', objName);
return
end
fn = fieldnames(s);
for i = 1:length(fn)
display_impl(s.(fn{i}), [path ', ' fn{i}(2:end)]);
end
end
function str = value2str(val)
if isnumeric(val) || ischar(val)
str = mat2str(val);
else
str = class(val);
end
end
end
% B = obj(i)
function B = subsref(obj,S)
switch S.type
case '()'
Sf = obj.subs2dotSubs(S);
try
B = subsref(obj.store,Sf);
catch ME
if strcmp(ME.identifier,'MATLAB:nonExistentField')
error('Reference to non-existent entry %s',toString(S.subs));
else
throw(ME);
end
end
otherwise
B = builtin('subsref', obj, S);
% error('Unsupported indexing operator: %s',S.type);
end
end
% A(i) = B
function obj = subsasgn(obj,S,B);
switch S.type
case '()'
Sf = obj.subs2dotSubs(S);
obj.store = subsasgn(obj.store,Sf,B);
otherwise
error('Unsupported indexing operator: %s',S.type);
end
end
function Sf = subs2dotSubs(obj,S)
for i = 1:length(S.subs)
Sf(i).type = '.';
Sf(i).subs = obj.getFieldname(S.subs{i});
end
end
% Should probably use mat2str with some kind of normalization to make all variables valied fieldname
% and make it possible to recover the value
function fName = getFieldname(obj, val)
if ~ischar(val)
val = toString(val);
end
fName = matlab.lang.makeValidName(val);
end
end
end