summaryrefslogtreecommitdiff
path: root/modules/overloading/macros/%st_6.sci
blob: 11cdc3f8b3db0e2ab5fe616d1017a9492a224518 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
// Copyright (C) INRIA - F.Delebcque , Serge Steer
//
// This file must be used under the terms of the CeCILL.
// This source file is licensed as described in the file COPYING, which
// you should have received as part of this distribution.  The terms
// are also available at
// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt

function s=%st_6(varargin)

    // called in the context of complex struct insertion
    // to realize partial extraction

    nind=size(varargin)-1; //the number of indexes
    s=varargin($); // the struct
    if size(varargin)==2 & type(varargin(1))==10 then  //X.b extraction assumed
        f=getfield(1,s);
        if or(varargin(1)==f(3:$)) then //field exists
            // perform standard field extraction
            s=%st_e(varargin(:));
        else //field does not exists
            // return empty struct
            //s=mlist(['st','dims'],int32([0 0]))
            // return empty matrix
            s=[]
        end

    else //X(i,j,k) extraction assumed
        //check if indexes are in the dimension bounds
        dims=s.dims
        if size(dims,"*")<nind then dims($:nind)=1;end
        if size(dims,"*")>nind then dims=[dims(1:nind-1) prod(dims(nind:$))];end

        indmax=ones(1,nind);
        for k=1:nind,indmax(k)=max(varargin(k));end

        if and(indmax<=dims) then //Yes
            // perform standard sub-matrix extraction
            s=%st_e(varargin(:));
        else // i,j,k out of bounds
            f=getfield(1,s);f=f(3:$);
            if f==[] then
                // the original struct has no field return an empty struct
                s.dims=int32([0 0]);
            else
                // return a 1x1 struct with fields set to []
                for k=1:size(f,"*"),setfield(k+2,[],s);end
                s.dims=int32([1 1]);
            end
        end
    end
endfunction