Skip to content

Commit d4275c6

Browse files
committed
reduce jsonopt calls
1 parent 82c9e91 commit d4275c6

File tree

3 files changed

+100
-68
lines changed

3 files changed

+100
-68
lines changed

loadmsgpack.m

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,14 @@
2929
else
3030
bytes=fname;
3131
end
32+
33+
opt=varargin2struct(varargin{:});
34+
opt.simplifycell=jsonopt('SimplifyCell',0,opt);
35+
3236
jsoncount=1;
3337
idx=0;
3438
while idx <= length(bytes)
35-
[obj, idx] = parse(uint8(bytes(:)), 1);
39+
[obj, idx] = parse(uint8(bytes(:)), 1, opt);
3640
data{jsoncount}=obj;
3741
jsoncount=jsoncount+1;
3842
end
@@ -44,11 +48,11 @@
4448
if(iscell(data))
4549
data=cellfun(@(x) jdatadecode(x),data,'UniformOutput',false);
4650
elseif(isstruct(data))
47-
data=jdatadecode(data,'Base64',0);
51+
data=jdatadecode(data,'Base64',0, opt);
4852
end
4953
end
5054

51-
function [obj, idx] = parse(bytes, idx)
55+
function [obj, idx] = parse(bytes, idx, varargin)
5256
% masks:
5357
b10000000 = 128;
5458
b01111111 = 127;
@@ -78,12 +82,12 @@
7882
elseif bitand(b11110000, currentbyte) == b10000000
7983
% decode fixmap
8084
len = double(bitand(b00001111, currentbyte));
81-
[obj, idx] = parsemap(len, bytes, idx+1);
85+
[obj, idx] = parsemap(len, bytes, idx+1, varargin{:});
8286
return
8387
elseif bitand(b11110000, currentbyte) == b10010000
8488
% decode fixarray
8589
len = double(bitand(b00001111, currentbyte));
86-
[obj, idx] = parsearray(len, bytes, idx+1);
90+
[obj, idx] = parsearray(len, bytes, idx+1, varargin{:});
8791
return
8892
elseif bitand(b11100000, currentbyte) == b10100000
8993
% decode fixstr
@@ -172,16 +176,16 @@
172176
[obj, idx] = parsestring(len, bytes, idx+5);
173177
case 220 % array16
174178
len = double(bytes2scalar(bytes(idx+1:idx+2), 'uint16'));
175-
[obj, idx] = parsearray(len, bytes, idx+3);
179+
[obj, idx] = parsearray(len, bytes, idx+3, varargin{:});
176180
case 221 % array32
177181
len = double(bytes2scalar(bytes(idx+1:idx+4), 'uint32'));
178-
[obj, idx] = parsearray(len, bytes, idx+5);
182+
[obj, idx] = parsearray(len, bytes, idx+5, varargin{:});
179183
case 222 % map16
180184
len = double(bytes2scalar(bytes(idx+1:idx+2), 'uint16'));
181-
[obj, idx] = parsemap(len, bytes, idx+3);
185+
[obj, idx] = parsemap(len, bytes, idx+3, varargin{:});
182186
case 223 % map32
183187
len = double(bytes2scalar(bytes(idx+1:idx+4), 'uint32'));
184-
[obj, idx] = parsemap(len, bytes, idx+5);
188+
[obj, idx] = parsemap(len, bytes, idx+5, varargin{:});
185189
otherwise
186190
error('transplant:parsemsgpack:unknowntype', ...
187191
['Unknown type "' dec2bin(currentbyte) '"']);
@@ -213,10 +217,10 @@
213217
idx = idx + len + 1;
214218
end
215219

216-
function [out, idx] = parsearray(len, bytes, idx)
217-
out = cell(1, len);
220+
function [out, idx] = parsearray(len, bytes, idx, varargin)
221+
out = cell(len,1);
218222
for n=1:len
219-
[out{n}, idx] = parse(bytes, idx);
223+
[out{n}, idx] = parse(bytes, idx, varargin{:});
220224
end
221225
if(isnumeric(out{1}))
222226
try
@@ -232,10 +236,10 @@
232236
end
233237
end
234238

235-
function [out, idx] = parsemap(len, bytes, idx)
239+
function [out, idx] = parsemap(len, bytes, idx, varargin)
236240
out = struct();
237241
for n=1:len
238-
[key, idx] = parse(bytes, idx);
239-
[out.(encodevarname(char(key))), idx] = parse(bytes, idx);
242+
[key, idx] = parse(bytes, idx, varargin{:});
243+
[out.(encodevarname(char(key))), idx] = parse(bytes, idx, varargin{:});
240244
end
241245
end

savejson.m

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
% FileName [''|string]: a file name to save the output JSON data
2626
% FloatFormat ['%.10g'|string]: format to show each numeric element
2727
% of a 1D/2D array;
28+
% IntFormat ['%d'|string]: format to display integer elements
29+
% of a 1D/2D array;
2830
% ArrayIndent [1|0]: if 1, output explicit data array with
2931
% precedent indentation; if 0, no indentation
3032
% ArrayToStruct[0|1]: when set to 0, savejson outputs 1D/2D
@@ -145,6 +147,8 @@
145147
opt.intformat=jsonopt('IntFormat','%d',opt);
146148
opt.floatformat=jsonopt('FloatFormat','%.10g',opt);
147149
opt.unpackhex=jsonopt('UnpackHex',1,opt);
150+
opt.arraytostruct=jsonopt('ArrayToStruct',0,opt);
151+
opt.num2cell_=0;
148152

149153
if(jsonopt('PreEncode',1,opt))
150154
obj=jdataencode(obj,'Base64',1,'UseArrayZipSize',0,opt);
@@ -263,7 +267,7 @@
263267
if(~iscell(item) && ~isa(item,'string'))
264268
error('input is not a cell or string array');
265269
end
266-
isnum2cell=jsonopt('num2cell_',0,varargin{:});
270+
isnum2cell=varargin{1}.num2cell_;
267271
if(isnum2cell)
268272
item=squeeze(item);
269273
else
@@ -523,7 +527,7 @@
523527
isnest=varargin{1}.nestarray;
524528

525529
if(((isnest==0) && length(size(item))>2) || issparse(item) || ~isreal(item) || ...
526-
(isempty(item) && any(size(item))) ||jsonopt('ArrayToStruct',0,varargin{:}) || (~isempty(dozip) && numel(item)>zipsize))
530+
(isempty(item) && any(size(item))) || varargin{1}.arraytostruct || (~isempty(dozip) && numel(item)>zipsize))
527531
if(isempty(name))
528532
txt=sprintf('%s{%s%s"_ArrayType_": "%s",%s%s"_ArraySize_": %s,%s',...
529533
padding1,nl,padding0,class(item),nl,padding0,regexprep(mat2str(size(item)),'\s+',','),nl);
@@ -662,13 +666,13 @@
662666
nl=ws.newline;
663667
isnest=varargin{1}.nestarray;
664668
format=varargin{1}.formatversion;
665-
isnum2cell=jsonopt('num2cell_',0,varargin{:});
669+
isnum2cell=varargin{1}.num2cell_;
666670

667671
if(~isvector(mat) && isnest==1)
668672
if(format>1.9 && isnum2cell==0)
669673
mat=permute(mat,ndims(mat):-1:1);
670674
end
671-
varargin{:}.num2cell_=1;
675+
varargin{1}.num2cell_=1;
672676
txt=cell2json('',num2cell(mat,1),level-1,varargin{:});
673677
return;
674678
else

0 commit comments

Comments
 (0)