1 classdef HandleObjectCloner<handle
2 properties (Access=
private)
3 comparisonMode=
mxberry.core.obj.ObjectComparisonMode.UserDefined;
6 methods (Access=protected)
7 function blobComparisonHook(self)
10 methods (Access=protected, Sealed)
11 function prevMode=setComparisonMode(self,comparisonMode)
13 prevMode=self.getComparisonMode();
15 [self.comparisonMode]=deal(comparisonMode);
18 function comparisonMode=getComparisonMode(self)
21 comparisonMode=self.comparisonMode;
26 isAllCompModeEq=isequal(self.comparisonMode);
28 throwerror('wrongInput',['all elements of an
object',...
29 'array are expected to have the same value',...
30 'of comparisonMode']);
32 comparisonMode=self(1).comparisonMode;
37 methods (Access=protected)
38 function propCheckCMat=getHandleClonerIsEqualPropCheckCMat(self,propNameList)
40 switch self.getComparisonMode
42 isAsHandleDefault=false;
43 isAsBlobDefault=false;
46 isAsHandleDefault=false;
48 isAsBlobDefault=false;
49 isAsHandleDefault=true;
52 propCheckCMat={
'asHandle',
'asBlob',
'propEqScalarList',
'compareClass';...
53 isAsHandleDefault,isAsBlobDefault,cell(1,0),
true;...
54 'isscalar(x)&&islogical(x)',
'isscalar(x)&&islogical(x)',...
55 'iscell(x)&&(isrow(x)||(max(size(x))<=1))',...
56 'isscalar(x)&&islogical(x)'};
58 [isThereVec,indThereVec]=
ismember(lower(propNameList),...
59 lower(propCheckCMat(1,:)));
61 throwerror(
'wrongInput',
'not all properties are know');
63 propCheckCMat=propCheckCMat(:,indThereVec);
67 methods (Access=
private,Static)
68 function isPositive=isMe(inpObj)
69 curClassName=mfilename(
'class');
70 isPositive=isa(inpObj,curClassName);
73 methods (Access=
protected,Sealed)
74 function [regArgList,propEqScalarList]=parseEqScalarProps(
self,eqPropCheckCMat,propListToParse)
78 propCheckCMat=
self.getHandleClonerIsEqualPropCheckCMat(...
80 nProps=size(eqPropCheckCMat,2);
81 [regArgList,~,eqRelatedPropValList]=...
84 'propRetMode',
'list',
'isDefaultPropSpecVec',...
87 [regArgList,~,propEqScalarList]=...
90 propEqScalarList=[propEqScalarList,eqRelatedPropValList];
95 function varargout=
ismember(leftObjVec,rightObjVec,varargin)
107 varargout=cell(1,nargout);
109 rightObjVec,varargin{:});
111 leftObjVec.setComparisonMode(prevLeftMode);
112 rightObjVec.setComparisonMode(prevRightMode);
114 leftObjVec.setComparisonMode(prevLeftMode);
115 rightObjVec.setComparisonMode(prevRightMode);
119 function varargout=
unique(inpObjVec,varargin)
122 prevMode=inpObjVec.setComparisonMode(ObjectComparisonMode.Blob);
127 varargout=cell(1,nargout);
130 inpObjVec.setComparisonMode(prevMode);
132 inpObjVec.setComparisonMode(prevMode);
136 function [resObjVec,indVec]=sort(inpObjVec)
138 prevMode=inpObjVec.setComparisonMode(ObjectComparisonMode.Blob);
141 inpObjVec.setComparisonMode(prevMode);
143 inpObjVec.setComparisonMode(prevMode);
148 function isEqArr=ne(varargin)
149 isEqArr=eq(varargin{:});
153 function isEqArr=eq(varargin)
156 varargin{1}.getHandleClonerIsEqualPropCheckCMat(...
161 isEqArr=eq@handle(regArgList{:});
163 isEqArr=isEqualElem(regArgList{:});
166 function isLeArr=le(varargin)
169 varargin{1}.getHandleClonerIsEqualPropCheckCMat(...
174 isLeArr=le@handle(regArgList{:});
176 [~,~,signOfDiffArr]=isEqualElem(regArgList{:});
177 isLeArr=signOfDiffArr<=0;
181 function isGeArr=ge(varargin)
184 varargin{1}.getHandleClonerIsEqualPropCheckCMat(...
189 isGeArr=ge@handle(regArgList{:});
191 [~,~,signOfDiffArr]=isEqualElem(regArgList{:});
192 isGeArr=signOfDiffArr>=0;
196 function isLtArr=lt(varargin)
199 varargin{1}.getHandleClonerIsEqualPropCheckCMat(...
204 isLtArr=lt@handle(regArgList{:});
206 [~,~,signOfDiffArr]=isEqualElem(regArgList{:});
207 isLtArr=signOfDiffArr<0;
211 function isGtArr=gt(varargin)
214 varargin{1}.getHandleClonerIsEqualPropCheckCMat(...
219 isGtArr=gt@handle(regArgList{:});
221 [~,~,signOfDiffArr]=isEqualElem(regArgList{:});
222 isGtArr=signOfDiffArr>0;
226 function isEq=isequal(varargin)
227 isEq=isEqual(varargin{:});
229 function isEq=isequaln(varargin)
230 isEq=isequal(varargin{:});
232 function isEq=isequalwithequalnans(varargin)
233 isEq=isequal(varargin{:});
238 function [isEq,reportStr]=isEqual(varargin)
242 NOT_EQ_STR=
'(object arrays #%d and #%d):%s';
244 indObj=find(cellfun(@(x)isa(x,mfilename(
'class')),varargin),...
247 varargin{indObj}.getHandleClonerIsEqualPropCheckCMat();
249 isReportRequired=nargout>1;
251 [objList,~,isFullCheck,isAsHandle,isAsBlob,propEqScalarList,...
254 [{
'isfullcheck';
false;
'isscalar(x)&&islogical(x)'},...
257 checkIsHandleIsBlob(isAsHandle,isAsBlob);
258 if isAsBlob&&~isClassCompared
259 throwerror(
'wrongInput',[
'isClassCompared cannot be ',...
260 'set to false when isAsBlob is true']);
263 nObj=length(objList);
265 throwerror(
'wrongInput',
'Not enough input arguments');
270 reportStrList=cell(1,nObj-1);
271 curReportCell=cell(1,1);
278 obj2=objList{iObj+1};
279 if isequal(size(obj1),size(obj2))
280 if ~isClassCompared||isequal(
class(obj1),
class(obj2))
282 isEqCur=obj1.eq(obj2,
'asHandle',
true);
285 reportStrCur=
'handles are different';
292 [isEqCur,curReportCell{:}]=...
293 obj1.isEqualScalarAsBlobInternal(...
294 obj2,propEqScalarList{:});
296 [isEqCurMat,curReportCell{:}]=...
298 obj2,
'propEqScalarList',...
299 propEqScalarList,
'compareClass',...
302 isEqCur=all(isEqCurMat(:));
305 reportStrCur=curReportCell{1};
309 isEqCur=all(isEqCur(:));
310 if isReportRequired&&~isempty(reportStrCur)
311 reportStrList{iObj}=sprintf(...
313 iObj,iObj+1,reportStrCur);
318 reportStrList{iObj}=sprintf(...
320 iObj,iObj+1,
'classes are not equal');
326 reportStrList{iObj}=sprintf(...
328 iObj,iObj+1,
'sizes are not equal');
332 if ~(isEq||isFullCheck)
337 reportStrList(cellfun(
'isempty',reportStrList))=[];
338 if length(reportStrList)>1
341 elseif ~isempty(reportStrList)
342 reportStr=reportStrList{:};
347 function [isEqArr,reportStr,signOfDiffArr]=isEqualElem(selfArr,otherArr,varargin)
352 selfArr.getHandleClonerIsEqualPropCheckCMat();
354 [~,~,isAsHandle,isAsBlob,propEqScalarList,isClassCompared]=...
357 checkIsHandleIsBlob(isAsHandle,isAsBlob);
359 isReportRequired=nargout>1;
360 isSignOfDiffRequired=nargout>2;
362 sizeVec=size(selfArr);
363 if ~isequal(sizeVec,size(otherArr))
365 sizeVec=size(otherArr);
366 selfArr=
repmat(selfArr,sizeVec);
367 elseif numel(otherArr)==1
368 otherArr=
repmat(otherArr,sizeVec);
370 error(
'MATLAB:dimagree',...
371 'Matrix dimensions must agree.');
374 nElems=numel(selfArr);
377 reportStrList=cell(1,nElems);
378 curExtraOutArgList=cell(1,nargout-1);
380 curExtraOutArgList={};
383 isEqHandleMat=selfArr.eq(otherArr,
'asHandle',
true);
385 if isSignOfDiffRequired
386 signOfDiffArr=nan(size(isEqHandleMat));
387 signOfDiffArr(isEqHandleMat)=0;
390 if ~all(isEqHandleMat(:))
391 isEqArr=true(sizeVec);
392 if isClassCompared&&(~isa(otherArr,class(selfArr)))
395 reportStr='Not equal classes of objects';
401 isEqCur=isEqHandleMat(iElem);
406 reportStrCur='handles are different'; end
409 [isEqCur,curExtraOutArgList{:}]=...
410 selfArr(iElem).isEqualScalarAsBlobInternal(...
411 otherArr(iElem),propEqScalarList{:});
413 if isSignOfDiffRequired
414 signOfDiffArr(iElem)=curExtraOutArgList{2};
417 [isEqCur,curExtraOutArgList{:}]=...
418 selfArr(iElem).isEqualScalarInternal(...
419 otherArr(iElem),propEqScalarList{:});
422 reportStrCur=curExtraOutArgList{1};
427 if (nargout>1)&&~isempty(reportStrCur)
428 reportStrList{iElem}=sprintf(...
429 '(element #%d):%s',iElem,...
432 isEqArr(iElem)=isEqCur;
436 cellfun(
'isempty',reportStrList))=[];
437 if length(reportStrList)>1
439 reportStrList,sprintf(
'\n'));
440 elseif ~isempty(reportStrList)
441 reportStr=reportStrList{:};
447 isEqArr=isEqHandleMat;
449 if isSignOfDiffRequired
450 if any(isnan(signOfDiffArr(:)))
451 throwerror('wrongInput:signNotDefForAllElems',...
452 ['sign of difference is ',...
453 'not assigned for all elements']);
458 methods (Access=private)
459 function [isEq,reportStr,signOfDiff]=isEqualScalarAsBlobInternal(leftObj,rightObj)
460 leftObj.blobComparisonHook();
463 isEqSize=isequal(size(leftObj),size(rightObj));
465 isEqClass=isequal(class(leftObj),class(rightObj));
467 reportStr='classes are different';
473 reportStr='sizes are different';
481 leftBlobVec=getByteStreamFromArray(leftObj);
482 rightBlobVec=getByteStreamFromArray(rightObj);
483 nLeftElems=numel(leftBlobVec);
484 nRightElems=numel(rightBlobVec);
486 isEqBlobSize=nLeftElems==nRightElems;
487 isEq=isEqBlobSize&&isequal(leftBlobVec,rightBlobVec);
493 reportStr='blobs are different';
495 reportStr='blob sizes are different';
501 if nLeftElems<nRightElems
502 leftBlobVec=[leftBlobVec,...
503 zeros(1,nRightElems-nLeftElems)];
505 leftBlobVec=[rightBlobVec,...
506 zeros(1,nLeftElems)-nRightElems];
509 [~,indSortedVec]=sortrows([leftBlobVec;rightBlobVec]);
510 signOfDiff=indSortedVec(2)-indSortedVec(1);
520 methods (Access=protected)
521 function [isOk,reportStr,signOfDiff]=isEqualScalarInternal(self,otherObj,varargin)
522 isOk=self.eq(otherObj,'asHandle',true);
527 reportStr='handles are different';
536 function obj=clone(self,varargin)
538 %Performance optimization
539 obj = getArrayFromByteStream(getByteStreamFromArray(self));
541 obj=self.createInstance(self,varargin{:});
544 function resObj=createInstance(
self,varargin)
546 resObj=feval(p.Name,varargin{:});
550 function checkIsHandleIsBlob(isAsHandle,isAsBlob)
552 if isAsBlob&&isAsHandle
553 throwerror(
'wrongInput:blobAndHandleIncompatible',[
'isAsBlob and isAsHandle ',...
554 'cannot both be true']);
function uniquesortableobj(in inpVec)
UNIQUE implementation strictly for sortable entities i.e. for those that have 1) full order defined b...
function throwerror(in msgTag, in varargin)
THROWERROR works similarly to built-in ERROR function in case when there is no output arguments but s...
function ismembersortableobj(in firstVec, in secVec)
ISMEMBER implementation strictly for sortable entities i.e. for those that have 1) full order defined...
function parseparext(in args, in propNameValMat, in varargin)
PARSEPAREXT behaves in the same way as mxberry.core.parseparams but returns property values in a more...
function repmat(in inpArray, in varargin)
function unique(in inpVec)
UNIQUE for arrays of any type.
function ismember(in leftVec, in rightVec, in varargin)
ISMEMBER - ismember implementation for arrays of any type.