-
Notifications
You must be signed in to change notification settings - Fork 0
/
CountedFunction.m
101 lines (88 loc) · 2.99 KB
/
CountedFunction.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
%==========================================================================
%
% CountedFunction Class defining a counted function.
%
% Copyright © 2022 Tamas Kis
% Last Update: 2022-12-20
% Website: https://tamaskis.github.io
% Contact: tamas.a.kis@outlook.com
%
%==========================================================================
classdef CountedFunction < handle
% -----------
% Properties.
% -----------
properties
f % (1×1 function_handle) function handle
count % (1×1 double) number of function calls
end
% ---------------
% Public methods.
% ---------------
methods (Access = public)
function obj = CountedFunction(f)
% obj = CountedFunction(f)
%
% Constructor.
%--------------------------------------------------------------
%
% ------
% INPUT:
% ------
% f - (1×1 function_handle) function handle
%
% -------
% OUTPUT:
% -------
% obj - (1×1 CountedFunction) CountedFunction object
%
%--------------------------------------------------------------
obj.f = f;
obj.count = 0;
end
function f_eval = eval(obj,varargin)
% CountedFunction.eval(varargin)
%
% Evaluates the function, incrementing the count of function
% calls.
%--------------------------------------------------------------
%
% ------
% INPUT:
% ------
% varargin - (any) input argument(s)
%
%--------------------------------------------------------------
f_eval = obj.f(varargin{:});
obj.count = obj.count+1;
end
end
% ---------------
% Static methods.
% ---------------
methods(Static)
function [fc,count] = count_function_calls(f)
% [fc,count] = CountedFunction.count_function_calls(f)
%
% Returns a function handle that evaluates a CountedFunction.
%--------------------------------------------------------------
%
% ------
% INPUT:
% ------
% f - (1×1 function_handle) original function
%
% -------
% OUTPUT:
% -------
% fc - (1×1 function_handle) same function that now
% calls a CountedFunction internally so that we can
% track the number of times it's evaluated
%
%--------------------------------------------------------------
counted_function = CountedFunction(f);
fc = @(varargin) counted_function.eval(varargin{:});
count = @counted_function.count;
end
end
end