diff --git a/matlab/@dynDates/subsref.m b/matlab/@dynDates/subsref.m index fa801b6425d785780ca3adb559e83ad4e44e79fb..0dd7eca68484a375774c96f0c9dae73a5647d124 100644 --- a/matlab/@dynDates/subsref.m +++ b/matlab/@dynDates/subsref.m @@ -49,46 +49,49 @@ function B = subsref(A,S) % You should have received a copy of the GNU General Public License % along with Dynare. If not, see <http://www.gnu.org/licenses/>. -% Original author: stephane DOT adjemian AT univ DASH lemans DOT fr - -if isequal(S(1).type,'.') +switch S(1).type + case '.' switch S(1).subs - case {'time','freq','ndat'} % Public members. + case {'time','freq','ndat'}% Access public members. B = builtin('subsref', A, S(1)); - case {'sort','append','pop','unique'} % Give "dot access" to public methods. - if length(S)==1 || (strcmp(S(2).type,'()') && isempty(S(2).subs)) - B = feval(S(1).subs,A); + case {'sort','unique'}% Public methods (without arguments) + B = feval(S(1).subs,A); + case {'append','pop'}% Public methods (with arguments). + if isequal(S(2).type,'()') + B = feval(S(1).subs,A,S(2).subs{:}); + S = shiftS(S); else - if isequal(S(2).type,'()') - B = feval(S(1).subs,A,S(2).subs{:}); - else - error('dynDates::subsref: Something is wrong in your syntax!') - end + error('dynDates::subsref: Something is wrong in your syntax!') end otherwise - error('dynDates::subsref: Unknown public method or member!') + error('dynDates::subsref: Unknown public member or method!') end -elseif isequal(S.type,'()') % Extract a sub-sample. - if isscalar(S.subs{1}) - if isint(S.subs{1}) && S.subs{1}>0 && S.subs{1}<A.ndat - B = dynDate(A.time(S.subs{1},:),A.freq); + case '()' + if isscalar(S(1).subs{1}) + if isint(S(1).subs{1}) && S(1).subs{1}>0 && S(1).subs{1}<A.ndat + B = dynDate(A.time(S(1).subs{1},:),A.freq); else - error('dynDates::subsref: Something is wrong in your syntax!') + error(['dynDates::subsref: the index have to be a positive integer less than or equal to ' int2str(A.ndat) '!']) end else - if all(isint(S.subs{1})) && all(S.subs{1}>0) && all(S.subs{1}<A.ndat) + if isvector(S(1).subs{1}) && all(isint(S(1).subs{1})) && all(S(1).subs{1}>0) && all(S(1).subs{1}<A.ndat) B = dynDates(); B.freq = A.freq; - B.time = A.time(S.subs{1},:); - B.ndat = length(S.subs{1}); + B.time = A.time(S(1).subs{1},:); + B.ndat = length(S(1).subs{1}); else - error('dynDates::subsref: Something is wrong in your syntax!') + error(['dynDates::subsref: indices have to be a vector of positive integers less than or equal to ' int2str(A.ndat) '!']) end end -else + otherwise error('dynDates::subsref: Something is wrong in your syntax!') end +S = shiftS(S); +if ~isempty(S) + B = subsref(B, S); +end + %@test:1 %$ % Define a dynDates object %$ B = dynDate('1950Q1'):dynDate('1960Q3'); @@ -108,4 +111,26 @@ end %$ t(4) = dyn_assert(d.ndat,2); %$ end %$ T = all(t); -%@eof:1 \ No newline at end of file +%@eof:1 + +%@test:2 +%$ % Define a dynDates object +%$ B = dynDate('1950Q1'):dynDate('1960Q3'); +%$ +%$ % Try to extract a sub-dynDates object and apply a method +%$ +%$ d = B(2:3).sort ; +%$ +%$ if isa(d,'dynDates') +%$ t(1) = 1; +%$ else +%$ t(1) = 0; +%$ end +%$ +%$ if t(1) +%$ t(2) = dyn_assert(d.freq,B.freq); +%$ t(3) = dyn_assert(d.time,[1950 2; 1950 3]); +%$ t(4) = dyn_assert(d.ndat,2); +%$ end +%$ T = all(t); +%@eof:2 \ No newline at end of file