-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathch31.ixx
More file actions
160 lines (131 loc) · 3.41 KB
/
ch31.ixx
File metadata and controls
160 lines (131 loc) · 3.41 KB
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
export module ch31;
import std;
export namespace ch31 {
namespace exercises {
namespace ex2 {
using namespace std;
int* getData(int value) { return new int{ value * 2 }; }
void test()
{
int* data{ getData(21) };
println("{}", *data);
delete data;
data = nullptr;
data = getData(42);
println("{}", *data);
delete data;
data = nullptr;
}
}
namespace ex3 {
using namespace std;
int sum(int* values, int count)
{
int total{ 0 };
for (int i{ 0 }; i < count; ++i) { total += values[i]; }
return total;
}
void test()
{
int values[]{ 1, 2, 3 };
//int total{ sum(values, sizeof(values)/sizeof(int)) };
int total{ sum(values, size(values)) };
println("{}", total);
}
}
namespace ex4 {
using namespace std;
class Logger
{
public:
static void enableLogging(bool enable) { ms_loggingEnabled = enable; }
static bool isLoggingEnabled() { return ms_loggingEnabled; }
template<typename... Args>
static void log(const source_location& location, const Args&... args)
{
if (!ms_loggingEnabled) { return; }
ofstream logfile{ ms_debugFilename, ios_base::app };
if (logfile.fail()) {
println(cerr, "Unable to open debug file!");
return;
}
print(logfile, "{:L} UTC: ", chrono::system_clock::now());
print(logfile, "{}({}): {}: ", location.file_name(),
location.line(), location.function_name());
// Use a fold-expression; see Chapter 26.
(logfile << ... << args);
logfile << endl;
}
private:
static inline const string ms_debugFilename{ "debugfile.out" };
static inline bool ms_loggingEnabled{ false };
};
struct log {
source_location loc = source_location::current();
template<class... Args>
explicit log(Args&&... args) {
Logger::log(loc, forward<Args>(args)...);
}
};
bool isDebugSet(int argc, char** argv)
{
auto parameters{ views::counted(argv, argc) };
return ranges::contains(parameters, string_view{ "-d" });
}
class ComplicatedClass
{
// Class details omitted for brevity.
};
ostream& operator<<(ostream& outStream, const ComplicatedClass& /* src */)
{
outStream << "ComplicatedClass";
return outStream;
}
class UserCommand
{
// Class details not shown for brevity.
};
ostream& operator<<(ostream& outStream, const UserCommand& /* src */)
{
outStream << "UserCommand";
return outStream;
}
UserCommand getNextCommand(ComplicatedClass* /* obj */)
{
UserCommand cmd;
return cmd;
}
void processUserCommand(const UserCommand& /* cmd */)
{
// Details omitted for brevity.
}
void trickyFunction(ComplicatedClass* obj)
{
log("given argument: ", *obj);
for (size_t i{ 0 }; i < 100; ++i) {
UserCommand cmd{ getNextCommand(obj) };
log("retrieved cmd ", i, ": ", cmd);
try {
processUserCommand(cmd);
}
catch (const exception& e) {
log("exception from processUserCommand(): ", e.what());
}
}
}
void test(int argc, char** argv)
{
Logger::enableLogging(isDebugSet(argc, argv));
if (Logger::isLoggingEnabled()) {
// Print the command-line arguments to the trace.
for (size_t i{ 0 }; i < argc; ++i) {
log("Argument: ", argv[i]);
}
}
ComplicatedClass obj;
trickyFunction(&obj);
// Rest of the function not shown.
}
}
}
}