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
+