Skip to content
Snippets Groups Projects
SCDclass_expcodecontainer.m 6.72 KiB
Newer Older
classdef SCDclass_expcodecontainer
    % A container class for expcodes
    
    properties(Access = private)
        numexpcodes
        expcodes
    end
    
    methods
        function obj=SCDclass_expcodecontainer()
           obj.numexpcodes=0;
           obj.expcodes={};
        end
    
        function obj=insertexpcode(obj, maincode, definefunction)
           
            if(obj.numexpcodes==0)
                temp=cell(10,1);
                temp{1}=maincode;
                temp{2}=definefunction;
                
                obj.expcodes{end+1}=temp;
                obj.numexpcodes=obj.numexpcodes+1;
                
                fprintf('Expcode %d inserted (pos %d)\n', maincode, 1);
            else
                expcodepresent=false;
                expcodeindex=0;
        
                for(ii=1:numel(obj.expcodes))
                    if(obj.expcodes{ii}{1}==maincode || strcmp(char(obj.expcodes{ii}{2}),definefunction))
                        expcodepresent=true;
                        expcodeindex=ii;
                        break;
                    end
                end
        
                if(expcodepresent)
                    obj.expcodes{expcodeindex}=expcode;
                    
                    fprintf('Expcode %d already present (pos %d), skipped insertion.\n', maincode, expcodeindex);
                else 
                    temp=cell(10,1);
                    temp{1}=maincode;
                    temp{2}=definefunction;
                     
                    presentcodes=[];
                    for(ii=1:obj.numexpcodes)
                        presentcodes(ii)=obj.expcodes{ii}{1};
                    end
                    insertpos=max(find(maincode>presentcodes));
                    
                    if(insertpos==obj.numexpcodes)
                        obj.expcodes{end+1}=temp;
                        
                        fprintf('Expcode %d inserted (pos %d)\n', maincode, obj.numexpcodes+1);
                    else
                        for(jj=obj.numexpcodes:-1:insertpos)
                           obj.expcodes{jj+1}=obj.expcodes{jj};
                        end
                        obj.expcodes{insertpos}=temp;
                        fprintf('Expcode %d inserted (pos %d)\n', expcode.maincode, insertpos);
                    end    
                       
                    obj.numexpcodes=obj.numexpcodes+1;
                end 
            end
        end
            
        function printexpcodes(obj)
            if(obj.numexpcodes==0)
                disp('No configured expcodes.');
            else
                fprintf('------------------------------------------------------------------\n');
                fprintf('CODE\tSTATUS\tNAME\n');
                fprintf('------------------------------------------------------------------\n');
                for ii=1:obj.numexpcodes
                    try
                        expcode=obj.expcodes{ii}{2}();
                        if(~isa(expcode,'SCDclass_expcode'))
                            error('SCDclass_expcodecontainer.getbymaincode','Expcode defining function not returning the right object');
                        end
                        fprintf('%d\t%s\t%s\n',obj.expcodes{ii}{1},expcode.status,expcode.name);
                    
                    catch ME
                        fprintf('%d\tERROR calling conf function: %s\n', obj.expcodes{ii}{1},char(obj.expcodes{ii}{2}));
                    end
                end                
                fprintf('------------------------------------------------------------------\n');               
            end
        end
        
        function out=getbymaincode(obj,code)
           if(obj.numexpcodes==0)
               error('SCDclass_expcodecontainer.getbymaincode','Expcode container empty!');
           end
           
           presentcodes=[];
           for(ii=1:obj.numexpcodes)
               presentcodes=[presentcodes; obj.expcodes{ii}{1}];
           end
           
           if(isempty(find(code==presentcodes)))
               error('SCDclass_expcodecontainer.getbymaincode','Expcode not present in the container class');
           else
               deffunc = obj.expcodes{find(code==presentcodes)}{2};
               %expcode = eval(char(deffunc));
               expcode = deffunc();
               assert(isa(expcode,'SCDclass_expcode'),'SCDclass_expcodecontainer.getbymaincode the configured defining function doesn''t return a SCDclass_expcode object');
               expcode.maincode=code;
               out=expcode;
           end
        
        end    
    end
end


%         
%         function obj=insertexpcode_object(obj, expcode)
%             assert(isa(expcode,'SCDclass_expcode'),'SCDclass_expcodecontainer.insertexpcode only SCDclass_expcode classes accepted as input');
%             
%             if(obj.numexpcodes==0)
%                 obj.expcodes{end+1}=expcode;
%                 obj.numexpcodes=obj.numexpcodes+1;
%                 
%                 fprintf('Expcode %d inserted (pos %d)\n', expcode.maincode, 1);
%             else
%                 expcodepresent=false;
%                 expcodeindex=0;
%         
%                 for(ii=1:numel(obj.expcodes))
%                     if(obj.expcodes{ii}.maincode==expcode.maincode)
%                         expcodepresent=true;
%                         expcodeindex=ii;
%                         break;
%                     end
%                 end
%         
%                 if(expcodepresent)
%                     obj.expcodes{expcodeindex}=expcode;
%                     
%                     fprintf('Expcode %d already present (pos %d), data updated.\n', expcode.maincode, expcodeindex);
%                 else
%                     
%                     presentcodes=[];
%                     for(ii=1:obj.numexpcodes)
%                         presentcodes(ii)=obj.expcodes{ii}.maincode;
%                     end
%                     insertpos=max(find(expcode.maincode>presentcodes));
%                     
%                     if(insertpos==obj.numexpcodes)
%                         obj.expcodes{end+1}=expcode;
%                         
%                         fprintf('Expcode %d inserted (pos %d)\n', expcode.maincode, obj.numexpcodes+1);
%                     else
%                         for(jj=obj.numexpcodes:-1:insertpos)
%                            obj.expcodes{jj+1}=obj.expcodes{jj};
%                         end
%                         obj.expcodes{insertpos}=expcode;
%                         fprintf('Expcode %d inserted (pos %d)\n', expcode.maincode, insertpos);
%                     end    
%                        
%                     obj.numexpcodes=obj.numexpcodes+1;
%                 end
%                 
%             end
%         end