1classdef foo_subsref_subsasgn < handle
2  properties
3    x
4  end
5
6  methods
7    function obj = foo_subsref_subsasgn (dims)
8      switch (dims)
9        case 1
10          obj.x = 1:4;
11        case 2
12          obj.x = eye (4);
13        otherwise
14          error ('foo_subsref_subsasgn:SyntaxError', ...
15            'foo_subsref_subsasgn: Invalid syntax');
16      end
17    end
18
19    function ind = end (obj, k, n)
20      sz = size (obj.x);
21      if k < n
22        ind = sz(k);
23      else
24        ind = prod (sz(k:end));
25      end
26    end
27
28    function varargout = subsref (obj, S)
29      switch (length (S))
30        case 1
31          if (S(1).type == "()")
32            varargout = {obj.x(S(1).subs{1})};
33          elseif (S(1).type == "{}")
34            % Note in ML R2018b "x{1:3}" expects "nargout == 3".
35            varargout = num2cell (obj.x(S(1).subs{1}));
36          elseif (S(1).type == "." && S(1).subs == 'x')
37            varargout = {obj.x};
38          else
39            error ('foo_subsref_subsasgn:SyntaxError', ...
40              'foo_subsref_subsasgn: Invalid syntax');
41          end
42        case 2
43          % Note in ML R2018b "x(1)(1)" is not allowed.
44          if (S(1).type == "{}" && (S(2).type == "{}" || S(2).type == "()"))
45            varargout = {obj.x(S(1).subs{1}, S(2).subs{1})};
46          elseif (S(1).type == "." && S(1).subs == 'x' ...
47              && (S(2).type == "{}" || S(2).type == "()"))
48            varargout = {obj.x(S(2).subs{1})};
49          else
50            error ('foo_subsref_subsasgn:SyntaxError', ...
51              'foo_subsref_subsasgn: Invalid syntax');
52          end
53        otherwise
54          error ('foo_subsref_subsasgn:SyntaxError', ...
55            'foo_subsref_subsasgn: Invalid syntax');
56      end
57    end
58
59    function obj = subsasgn (obj, S, varargin)
60      switch (length (S))
61        case 1
62          if (S(1).type == "{}" || S(1).type == "()")
63            obj.x(S(1).subs{1}) = varargin{1};
64          elseif (S(1).type == "." && S(1).subs == 'x')
65            obj.x = varargin{1};
66          else
67            error ('foo_subsref_subsasgn:SyntaxError', ...
68              'foo_subsref_subsasgn: Invalid syntax');
69          end
70        case 2
71          % Note in ML R2018b "x(1)(1)" is not allowed.
72          if (S(1).type == "{}" && (S(2).type == "{}" || S(2).type == "()"))
73            obj.x(S(1).subs{1}, S(2).subs{1}) = varargin{1};
74          elseif (S(1).type == "." && S(1).subs == 'x' ...
75              && (S(2).type == "{}" || S(2).type == "()"))
76            obj.x(S(2).subs{1}) = varargin{1};
77          else
78            error ('foo_subsref_subsasgn:SyntaxError', ...
79              'foo_subsref_subsasgn: Invalid syntax');
80          end
81        otherwise
82          error ('foo_subsref_subsasgn:SyntaxError', ...
83            'foo_subsref_subsasgn: Invalid syntax');
84      end
85    end
86
87  end
88end
89