Skip to content

Commit

Permalink
added structural equality test 'equal'
Browse files Browse the repository at this point in the history
  • Loading branch information
VincentToups committed May 11, 2012
1 parent 8c24463 commit 1d5534b
Show file tree
Hide file tree
Showing 7 changed files with 168 additions and 3 deletions.
29 changes: 29 additions & 0 deletions cellEqual.m
@@ -0,0 +1,29 @@
function [r] = cellEqual(c1, c2)
%
if ~(all(equalequal(size(c2), size(c1))))
r = 0;
return;
else
[];
end
;
c1 = flatAcross(c1);
c2 = flatAcross(c2);
forLoopValueminus122663 = flatAcross(c1);
for i = ((1):(length(forLoopValueminus122663)))
c1El = forLoopValueminus122663(i);
c1El = c1El{1};
c2El = c2{i};
if ~(equal(c1El, c2El))
r = 0;
return;
else
[];
end
;
end
clear 'forLoopValueminus122663';
;
r = 1;

end
5 changes: 5 additions & 0 deletions countOf.m
@@ -0,0 +1,5 @@
function [r] = countOf(o)
%
r = length(flatAcross(o));

end
6 changes: 3 additions & 3 deletions directoryFiles.m
Expand Up @@ -9,7 +9,7 @@
end
;
if ~(exist('postFilter'))
postFilter = @lambdaminus105655;
postFilter = @lambdaminus122661;
else
[];
end
Expand All @@ -26,9 +26,9 @@
;
end
;
function [retvalminus105656] = lambdaminus105655(x)
function [retvalminus122662] = lambdaminus122661(x)
%
retvalminus105656 = 1;
retvalminus122662 = 1;

end

Expand Down
19 changes: 19 additions & 0 deletions equal.m
@@ -0,0 +1,19 @@
function [r] = equal(a, b)
%Generalized, structural equality.
if strcmp(class(a), class(b))
if isclass('cell', a)
r = cellEqual(a, b);
elseif isclass('struct', a)
r = structEqual(a, b);
elseif andFunction(@()isnumeric(a), @()isnumeric(b))
r = all(equalequal(a, b));
end
;
elseif andFunction(@()isnumeric(a), @()isnumeric(b))
r = all(equalequal(a, b));
elseif 'otherwise'
r = 0;
end
;

end
5 changes: 5 additions & 0 deletions isclass.m
@@ -0,0 +1,5 @@
function [r] = isclass(className, object)
%
r = strcmp(class(object), className);

end
62 changes: 62 additions & 0 deletions parenlab.el
Expand Up @@ -858,6 +858,68 @@ is by default always true."
(funcall post-filter name))
(:= ({} files (+ end 1)) name))))

(pl:defun (r) cell-equal (c1 c2)
(flat-when (not (all (== (size c2) (size c1))))
(:= r 0)
return)
(:= c1 (flat-across c1)
c2 (flat-across c2))
(forcell (i c1-el) c1
(:= c2-el ({} c2 i))
(flat-when (not (equal c1-el c2-el))
(:= r 0)
return))
(:= r 1))

(pl:defun (r) count-of (o)
(setq r (length (flat-across o))))

(pl:defun (r) struct-equal (s1 s2)
(setq fields1 (sort (fieldnames s1))
fields2 (sort (fieldnames s2)))
(flat-cond
((and (all (== (size s1) (size s2)))
(== (length (fieldnames s1))
(length (fieldnames s2)))
(all (strcmp fields1 fields2)))
(flat-cond
((== (count-of s1) 1)
(forcell (i f) fields1
(flat-when (not (equal (.. s1 f)
(.. s2 f)))
(:= r 0)
return))
(:= r 1))
(:otherwise
(for (i ss1) s1
(:= ss2 (s2 i))
(flat-when (not (equal ss1 ss2))
(:= r 0)
return))
(:= r 1))))
(:otherwise (:= r 0))))

(pl:defun (r) isclass (class-name object)
(:= r (strcmp (class object) class-name)))

(pl:defun (r) equal (a b)
"Generalized, structural equality."
(flat-cond
((strcmp (class a) (class b))
(flat-cond
((isclass "cell" a)
(setq r (cell-equal a b)))
((isclass "struct" a)
(setq r (struct-equal a b)))
((and (isnumeric a)
(isnumeric b))
(setq r (all (== a b))))))
((and (isnumeric a)
(isnumeric b))
(setq r (all (== a b))))
(:otherwise
(setq r 0))))


(provide 'parenlab)

45 changes: 45 additions & 0 deletions structEqual.m
@@ -0,0 +1,45 @@
function [r] = structEqual(s1, s2)
%
fields1 = sort(fieldnames(s1));
fields2 = sort(fieldnames(s2));
if andFunction(@()all(equalequal(size(s1), size(s2))), @()equalequal(length(fieldnames(s1)), length(fieldnames(s2))), @()all(strcmp(fields1, fields2)))
if equalequal(countOf(s1), 1)
forLoopValueminus122664 = flatAcross(fields1);
for i = ((1):(length(forLoopValueminus122664)))
f = forLoopValueminus122664(i);
f = f{1};
if ~(equal(s1.(f), s2.(f)))
r = 0;
return;
else
[];
end
;
end
clear 'forLoopValueminus122664';
;
r = 1;
elseif 'otherwise'
forLoopValueminus122665 = s1;
for i = ((1):(length(forLoopValueminus122665)))
ss1 = forLoopValueminus122665(i);
ss2 = s2(i);
if ~(equal(ss1, ss2))
r = 0;
return;
else
[];
end
;
end
clear 'forLoopValueminus122665';
;
r = 1;
end
;
elseif 'otherwise'
r = 0;
end
;

end

0 comments on commit 1d5534b

Please sign in to comment.