-
Notifications
You must be signed in to change notification settings - Fork 1
/
example.cpp
84 lines (60 loc) · 1.82 KB
/
example.cpp
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
#include <contextual.h>
#include <algorithm>
#define eval [&](auto resource)
using namespace Contextual;
namespace Contextual {
struct IData {
std::string username;
std::string password;
bool logged_in = false;
};
class Resource : public IResource<IData> {
private:
std::string _password = "xxxxxxxxx";
IData _data;
void enter() override {
std::swap(_password, resources->password);
}
void exit(std::optional<std::exception> e) override {
std::swap(_password, resources->password);
resources->logged_in = true;
}
public:
Resource(IData* resources): IResource<IData>(resources){};
Resource(IData &resources): IResource<IData>(resources){};
Resource(IData &&resources): IResource<IData>(&resources){};
Resource(std::string username, std::string password) : IResource<IData>(_data),
_data(IData{username, password})
{};
};
};
int main(){
IData first_user{"admin", "password123"};
std::cout << "Logged in: " << first_user.logged_in << "\n\n";
{
With PasswordHidden {
Resource(first_user)(
eval {
std::cout << "Username: " << resource->username << "\n";
std::cout << "Password: " << resource->password << "\n";
resource->logged_in = true;
}
)
};
}
std::cout << "Username: " << first_user.username << "\n";
std::cout << "Password: " << first_user.password << "\n";
std::cout << "Logged in: " << first_user.logged_in << "\n";
std::cout << "\n====================================\n\n";
with {
Resource("admin", "password123")(
eval {
std::cout << "Username: " << resource->username << "\n";
std::cout << "Password: " << resource->password << "\n";
resource->logged_in = true;
}
)
};
std::cout << "Username: " << first_user.username << "\n";
std::cout << "Password: " << first_user.password << "\n";
}