0001 function varargout = eidors_default(varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027 optargin = size(varargin,2);
0028 s = dbstack;
0029
0030
0031 if optargin == 1 && ischar(varargin{1}) && strcmp(varargin{1},'UNIT_TEST')
0032 do_unit_test;
0033 return;
0034 end
0035
0036
0037 if optargin > 0 && ischar(varargin{1})
0038 switch varargin{1}
0039 case 'get'
0040 varargout{1} = get_default(varargin{2});
0041 return
0042 case 'set'
0043 if optargin ~= 3
0044 error('Wrong number of inputs');
0045 end
0046 set_default(varargin{2},varargin{3});
0047 return
0048 case 'list'
0049 varargout{1} = list_defaults;
0050 return
0051 end
0052 end
0053
0054 caller = get_caller( s );
0055
0056
0057 if nargout>0
0058 output = mk_varargout_str(nargout);
0059 cmd= sprintf('%s = %s', output, 'call_default(caller,varargin{:});');
0060 eval(cmd)
0061 else
0062 call_default(caller,varargin{:});
0063 end
0064
0065 function list = list_defaults
0066 global eidors_objects
0067 try
0068 list = eidors_objects.defaults;
0069 catch
0070 list = [];
0071 end
0072
0073 function caller = get_caller(s)
0074 caller = s(2).name;
0075 if length(caller) >= 15 && strcmp(caller(end-14:end),'cache_shorthand')
0076 caller = s(4).name;
0077 end
0078
0079
0080 function caller = octave_caller(caller)
0081 if exist('OCTAVE_VERSION')
0082
0083 ff= find(caller == '>');
0084 if length(ff)>=1; ff= ff(end); else ff=0; end
0085 caller = caller(ff+1:end);
0086 end
0087
0088
0089 function set_default(caller, default)
0090 global eidors_objects
0091 caller = octave_caller( caller );
0092 eidors_objects.defaults.(caller) = default;
0093
0094
0095 function default = get_default(caller)
0096 if exist('OCTAVE_VERSION')
0097
0098 ff= find(caller == '>');
0099 if length(ff)>=1; ff= ff(end); else ff=0; end
0100 caller = caller(ff+1:end);
0101 end
0102 global eidors_objects
0103 try
0104 default = eidors_objects.defaults.(caller);
0105 catch
0106 error(['No default implementation of ' caller '.']);
0107 end
0108
0109 function varargout = call_default(caller,varargin);
0110 default = get_default(caller);
0111
0112
0113 if nargout>0
0114 output = mk_varargout_str(nargout);
0115 cmd= sprintf('%s = %s', output, 'feval(default,varargin{:});');
0116 eval(cmd)
0117 else
0118 feval(default,varargin{:});
0119 end
0120
0121 function output = mk_varargout_str(N)
0122 output = '[';
0123 for i = 1:N
0124 output = [ output sprintf('varargout{%d} ',i)];
0125 end
0126 output = [ output ']' ];
0127
0128
0129 function do_unit_test
0130 fid = fopen('test_def.m','w');
0131 fprintf(fid, 'function out = test_def(in);');
0132 fprintf(fid, 'disp(''test_def'');');
0133 fprintf(fid, 'disp(in);');
0134 fprintf(fid, 'out = in;');
0135 fclose(fid);
0136 eidors_default('set','do_unit_test','test_def');
0137 name = eidors_default(5);
0138 unit_test_cmp('dut1', name, 5);
0139
0140 val = eidors_default(6);
0141 unit_test_cmp('dut2', val, 6);
0142
0143 name = eidors_default('get','do_unit_test');
0144 unit_test_cmp('dut3', name, 'test_def');
0145 delete('test_def.m');