function F0 = subsasgn(F,Y,Z)
%subasgn           Overloaded indexing

% Author Johan Löfberg 
% $Id: subsasgn.m,v 1.4 2005/04/29 16:28:03 joloef Exp $   

% TODO : Implement lmi/subsasgn...
%error('set/subsasgn not fully implemented yet. Contact author if you need this functionality')
switch Y(1).type
    case '()'
        thelmi = Y.subs{1};
        
        if ~isa(F,'lmi')
            error('First argument should be a SET object')
        end
        
        if ~(isa(thelmi,'double') | isa(thelmi,'char'))
            error('Index should be an integer integer or tag-string')
        end
        
        if ~(isa(Z,'lmi') | isempty(Z))
            error('Right-hand side should be a SET object or empty');
        end
        
        % If indexed using handle, convert to index
        if isa(thelmi,'char')
            thelmitemp = [];
            for i = 1:size(F.clauses,2)
                if strcmp(F.clauses{i}.handle,thelmi)
                    thelmitemp=[thelmitemp i];
                end
            end
            if isempty(thelmitemp)
                em = ['LMI ''' thelmi ''' not available.'];
                error(em)
            else
                thelmi = thelmitemp;
            end
        end
        
        % Convert to linear indecicies
        if islogical(thelmi)
           thelmi = double(find(thelmi));
        end
        
        % Checks so that it exist
        if any((thelmi<1)) | any((thelmi>size(F.clauses,2)))
            em = ['LMI #' num2str(thelmi(find(thelmi>size(F.clauses,2)))) ' not available.'];
            error(em)
        end
        
        F0 = F;
        
        % Specialized for deleting constraints
        if isempty(Z)
            F0.clauses = {F0.clauses{setdiff(1:size(F.clauses,2),thelmi)}};
            F0.LMIid = F0.LMIid(setdiff(1:size(F.clauses,2),thelmi));
        else
            if length(thelmi) < length(Z.clauses)
                error('???  In an assignment  A(I) = B, the number of elements in B and I must be the same.');
            end
            for i = 1:length(thelmi)
                F0.clauses{thelmi(i)} = Z.clauses{i};
                F0.LMIid(thelmi(i)) = Z.LMIid(i);
            end
        end
        
    case '{}' 
        switch length(Y)
            case 1
                if length(Y.subs)>1
                    error('Only one-dimensional indexing of set objects allowed');  
                end
                if Y.subs{1}>length(F.clauses)
                    em = ['LMI #' num2str(Y.subs{1}) ' not available.'];
                error(em)
                    error('Index exceeds set dimension.')
                end                
                F0 = F.clauses{Y.subs{1}}.data;                
            case 2
                F0 = F.clauses{Y(1).subs{1}}.data;
                F0 = subsref(F0,Y(2));
            otherwise
                error('Indexing type not supported');   
        end
    otherwise
        error('Indexing type not supported');        
end



