File tree 3 files changed +76
-0
lines changed 3 files changed +76
-0
lines changed Original file line number Diff line number Diff line change
1
+ /* ******************************************************************\
2
+
3
+ Module: Util
4
+
5
+ Author: Romain Brenguier, [email protected]
6
+
7
+ \*******************************************************************/
8
+
9
+ #ifndef CPROVER_UTIL_LAZY_H
10
+ #define CPROVER_UTIL_LAZY_H
11
+
12
+ #include < functional>
13
+ #include < util/optional.h>
14
+
15
+ template <typename valuet>
16
+ class lazyt
17
+ {
18
+ public:
19
+ // / Delay the computation of \p fun to the next time the \c force method
20
+ // / is called.
21
+ static lazyt from_fun (std::function<valuet()> fun)
22
+ {
23
+ return lazyt{std::move (fun)};
24
+ }
25
+
26
+ // / Force the computation of the value. If it was already computed,
27
+ // / return the same result.
28
+ valuet force ()
29
+ {
30
+ if (value)
31
+ return *value;
32
+ value = evaluation_function ();
33
+ return *value;
34
+ }
35
+
36
+ private:
37
+ optionalt<valuet> value;
38
+ std::function<valuet()> evaluation_function;
39
+
40
+ explicit lazyt (std::function<valuet()> fun)
41
+ : evaluation_function(std::move(fun))
42
+ {
43
+ }
44
+ };
45
+
46
+ #endif // CPROVER_UTIL_LAZY_H
Original file line number Diff line number Diff line change @@ -74,6 +74,7 @@ SRC += analyses/ai/ai.cpp \
74
74
util/irep_sharing.cpp \
75
75
util/json_array.cpp \
76
76
util/json_object.cpp \
77
+ util/lazy.cpp \
77
78
util/memory_info.cpp \
78
79
util/message.cpp \
79
80
util/optional.cpp \
Original file line number Diff line number Diff line change
1
+ /* ******************************************************************\
2
+
3
+ Module: Unit tests for lazy
4
+
5
+ Author: Romain Brenguier, [email protected]
6
+
7
+ \*******************************************************************/
8
+
9
+ #include < testing-utils/use_catch.h>
10
+ #include < util/lazy.h>
11
+
12
+ SCENARIO (" lazy test" , " [core][util][lazy]" )
13
+ {
14
+ std::size_t call_counter = 0 ;
15
+ auto length_with_counter = [&call_counter](const std::string &s) {
16
+ ++call_counter;
17
+ return s.length ();
18
+ };
19
+ auto lazy_length =
20
+ lazyt<int >::from_fun ([&]() { return length_with_counter (" foo" ); });
21
+
22
+ REQUIRE (call_counter == 0 );
23
+ auto result = lazy_length.force ();
24
+ REQUIRE (call_counter == 1 );
25
+ REQUIRE (result == 3 );
26
+ result = lazy_length.force ();
27
+ REQUIRE (call_counter == 1 );
28
+ REQUIRE (result == 3 );
29
+ }
You can’t perform that action at this time.
0 commit comments