Mercurial > repos > public > sbplib
diff Dictionary.m @ 40:54d3ab296ba0
Added Dictionary class. Added string conversions for a bunch of types. Deprecated some replaced functions.
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Mon, 12 Oct 2015 10:38:53 +0200 |
parents | |
children | 8298734b1938 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Dictionary.m Mon Oct 12 10:38:53 2015 +0200 @@ -0,0 +1,110 @@ +% 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 + 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 isnumeric(val) + valStr = num2str(val); + elseif ischar(val) + valStr = val; + else + error('Dont know what to do with val!'); + end + fName = sprintf('f%s',valStr); + end + end +end \ No newline at end of file