forked from boostorg/log
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathattr_value_extraction.cpp
More file actions
134 lines (112 loc) · 3.67 KB
/
Copy pathattr_value_extraction.cpp
File metadata and controls
134 lines (112 loc) · 3.67 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
/*
* Copyright Andrey Semashev 2007 - 2015.
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
*/
#include <cstddef>
#include <string>
#include <utility>
#include <iostream>
#include <boost/mpl/vector.hpp>
#include <boost/log/attributes/value_extraction.hpp>
#include <boost/log/attributes/attribute_value_impl.hpp>
#include <boost/log/utility/value_ref.hpp>
namespace logging = boost::log;
namespace attrs = boost::log::attributes;
//[ example_attr_value_extraction
void print_value(logging::attribute_value const& attr)
{
// Extract a reference to the stored value
logging::value_ref< int > val = logging::extract< int >(attr);
// Check the result
if (val)
std::cout << "Extraction succeeded: " << val.get() << std::endl;
else
std::cout << "Extraction failed" << std::endl;
}
//]
//[ example_attr_value_extraction_multiple_types
void print_value_multiple_types(logging::attribute_value const& attr)
{
// Define the set of expected types of the stored value
typedef boost::mpl::vector< int, std::string > types;
// Extract a reference to the stored value
logging::value_ref< types > val = logging::extract< types >(attr);
// Check the result
if (val)
{
std::cout << "Extraction succeeded" << std::endl;
switch (val.which())
{
case 0:
std::cout << "int: " << val.get< int >() << std::endl;
break;
case 1:
std::cout << "string: " << val.get< std::string >() << std::endl;
break;
}
}
else
std::cout << "Extraction failed" << std::endl;
}
//]
//[ example_attr_value_extraction_visitor
struct hash_visitor
{
typedef std::size_t result_type;
result_type operator() (int val) const
{
std::size_t h = val;
h = (h << 15) + h;
h ^= (h >> 6) + (h << 7);
return h;
}
result_type operator() (std::string const& val) const
{
std::size_t h = 0;
for (std::string::const_iterator it = val.begin(), end = val.end(); it != end; ++it)
h += *it;
h = (h << 15) + h;
h ^= (h >> 6) + (h << 7);
return h;
}
};
void hash_value(logging::attribute_value const& attr)
{
// Define the set of expected types of the stored value
typedef boost::mpl::vector< int, std::string > types;
// Extract the stored value
logging::value_ref< types > val = logging::extract< types >(attr);
// Check the result
if (val)
std::cout << "Extraction succeeded, hash value: " << val.apply_visitor(hash_visitor()) << std::endl;
else
std::cout << "Extraction failed" << std::endl;
}
//]
#if 0
//[ example_attr_value_extraction_visitor_rec
void hash_value(logging::record_view const& rec, logging::attribute_name name)
{
// Define the set of expected types of the stored value
typedef boost::mpl::vector< int, std::string > types;
// Extract the stored value
logging::value_ref< types > val = logging::extract< types >(name, rec);
// Check the result
if (val)
std::cout << "Extraction succeeded, hash value: " << val.apply_visitor(hash_visitor()) << std::endl;
else
std::cout << "Extraction failed" << std::endl;
}
//]
#endif
int main(int, char*[])
{
print_value(attrs::make_attribute_value(10));
print_value_multiple_types(attrs::make_attribute_value(10));
print_value_multiple_types(attrs::make_attribute_value(std::string("Hello")));
hash_value(attrs::make_attribute_value(10));
hash_value(attrs::make_attribute_value(std::string("Hello")));
return 0;
}