Mercurial > hg > ltpda
diff m-toolbox/classes/+utils/@helper/generic_getInfo.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/classes/+utils/@helper/generic_getInfo.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,132 @@ +% GENERIC_GETINFO generic version of the getInfo function +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DESCRIPTION: GENERIC_GETINFO generic version of the getInfo function +% +% CALL: ii = generic_getInfo(varargin{:}, 'class_name'); +% +% INPUTS: varargin: Function inputs of the class version of getInfo +% class_name: Class name which calls this function. +% +% OUTPUT: minfo-class of the method +% +% EXAMPLES: Constructor call to get all sets +% specwin.getInfo() +% specwin.getInfo('specwin') +% specwin.getInfo('specwin', '') +% +% Constructor call to get a specified set +% specwin.getInfo('specwin', 'None') +% specwin.getInfo('specwin', 'set') +% +% Call for the methods in a class +% specwin.getInfo('char') +% specwin.getInfo('char', 'None') +% +% VERSION: $Id: generic_getInfo.m,v 1.7 2011/03/28 12:45:45 hewitson Exp $ +% +% HISTORY: 24-07-2008 Diepholz +% Creation. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function ii = generic_getInfo(varargin) + + class_name = varargin{end}; + + verout = feval(sprintf('%s.VEROUT', class_name)); + sets = feval(sprintf('%s.SETS', class_name)); + + if nargin == 1 || ... + (nargin == 2 && strcmp(varargin{1}, class_name)) || ... + (nargin == 3 && strcmp(varargin{1}, class_name) && isempty(varargin{2})) + + %%%%%%%%%% Get the minfo-object for the Constructor + %%% specwin.getInfo() + %%% specwin.getInfo('specwin') + %%% specwin.getInfo('specwin', '') + if ~isempty(sets) + pls(1:numel(sets)) = plist(); + for kk = 1:numel(sets) + cmd = sprintf('%s.getDefaultPlist', class_name); + pls(kk) = feval(cmd, sets{kk}); + end + else + pls = plist; + end + ii = minfo(class_name, class_name, 'ltpda', 'Constructor', verout, sets, pls); + ii.setModifier(false); + ii.setArgsmin(0); + ii.setArgsmax(-1); + ii.setOutmin(1); + ii.setOutmax(1); + + elseif nargin == 3 && (strcmp(varargin{1}, class_name)) + + %%%%%%%%%% Get the minfo-object for the Constructor with a specified set + %%% specwin.getInfo('specwin', 'None') + %%% specwin.getInfo('specwin', 'set') + if strcmpi(varargin{2}, 'None') + sets = {}; + pls = []; + else + sets = cellstr(varargin{2}); + cmd = sprintf('%s.getDefaultPlist', class_name); + pls = feval(cmd, varargin{2}); + end + + ii = minfo(class_name, class_name, 'ltpda', 'Constructor', verout, sets, pls); + ii.setModifier(false); + else + + %%%%%%%%%% Get the minfo-object for the class methods + %%% specwin.getInfo('char') + %%% specwin.getInfo('char', 'None') + if nargin == 2 + sets = ''; + elseif nargin == 3 + sets = varargin{2}; + end + + try + obj = eval([class_name '.initObjectWithSize(0,0)']); +% obj = feval(class_name); + catch + cls = utils.helper.ltpda_classes; + for jj=1:numel(cls) + cl = cls{jj}; + meta = eval(['?', cl]); + + scls = getSuperClasses ({}, meta); + if any(strcmp(class_name, scls)) && ismethod(cl, varargin{1}) + try + obj = feval(cl); + break + end + end + end + % error('### From the abstract class [%s] it is only possible to get the minfo class from the constructor.', class_name); + end + ii = feval(varargin{1}, obj, 'INFO', sets); + end + + % check we got an minfo object + if ~isa(ii, 'minfo') + error('### An minfo object was not retrieved.'); + end +end + +function scls = getSuperClasses (scls, meta) + + if ~isempty(meta.SuperClasses) + + scl = [meta.SuperClasses{:}]; + scls = [scls, {scl(:).Name}]; + + for ii = 1:numel(meta.SuperClasses) + scls = getSuperClasses(scls, meta.SuperClasses{1}); + end + end + +end +