Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
A
Actor Framework
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
cpp-libs
Actor Framework
Commits
99b35153
Commit
99b35153
authored
Jun 27, 2018
by
Dominik Charousset
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix build on MSVC, close #706
parent
e40a570d
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
184 additions
and
99 deletions
+184
-99
libcaf_core/caf/config.hpp
libcaf_core/caf/config.hpp
+16
-3
libcaf_core/caf/detail/parser/fsm.hpp
libcaf_core/caf/detail/parser/fsm.hpp
+73
-35
libcaf_core/caf/detail/parser/read_atom.hpp
libcaf_core/caf/detail/parser/read_atom.hpp
+4
-0
libcaf_core/caf/detail/parser/read_bool.hpp
libcaf_core/caf/detail/parser/read_bool.hpp
+4
-0
libcaf_core/caf/detail/parser/read_ini.hpp
libcaf_core/caf/detail/parser/read_ini.hpp
+5
-0
libcaf_core/caf/detail/parser/read_number.hpp
libcaf_core/caf/detail/parser/read_number.hpp
+3
-0
libcaf_core/caf/detail/parser/read_number_or_timespan.hpp
libcaf_core/caf/detail/parser/read_number_or_timespan.hpp
+3
-0
libcaf_core/caf/detail/parser/read_string.hpp
libcaf_core/caf/detail/parser/read_string.hpp
+3
-0
libcaf_core/caf/detail/pp.hpp
libcaf_core/caf/detail/pp.hpp
+21
-0
libcaf_core/caf/make_config_option.hpp
libcaf_core/caf/make_config_option.hpp
+35
-30
libcaf_core/src/actor_system_config.cpp
libcaf_core/src/actor_system_config.cpp
+1
-0
libcaf_core/src/make_config_option.cpp
libcaf_core/src/make_config_option.cpp
+15
-30
libcaf_core/test/read_string.cpp
libcaf_core/test/read_string.cpp
+1
-1
No files found.
libcaf_core/caf/config.hpp
View file @
99b35153
...
@@ -93,6 +93,9 @@
...
@@ -93,6 +93,9 @@
_Pragma("clang diagnostic ignored \"-Wimplicit-fallthrough\"") \
_Pragma("clang diagnostic ignored \"-Wimplicit-fallthrough\"") \
_Pragma("clang diagnostic ignored \"-Wused-but-marked-unused\"") \
_Pragma("clang diagnostic ignored \"-Wused-but-marked-unused\"") \
_Pragma("clang diagnostic ignored \"-Wdisabled-macro-expansion\"")
_Pragma("clang diagnostic ignored \"-Wdisabled-macro-expansion\"")
# define CAF_PUSH_UNUSED_LABEL_WARNING \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Wunused-label\"")
# define CAF_PUSH_NON_VIRTUAL_DTOR_WARNING \
# define CAF_PUSH_NON_VIRTUAL_DTOR_WARNING \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Wnon-virtual-dtor\"")
_Pragma("clang diagnostic ignored \"-Wnon-virtual-dtor\"")
...
@@ -122,6 +125,9 @@
...
@@ -122,6 +125,9 @@
_Pragma
(
"GCC diagnostic ignored
\"
-Wconversion
\"
"
)
\
_Pragma
(
"GCC diagnostic ignored
\"
-Wconversion
\"
"
)
\
_Pragma
(
"GCC diagnostic ignored
\"
-Wfloat-equal
\"
"
)
\
_Pragma
(
"GCC diagnostic ignored
\"
-Wfloat-equal
\"
"
)
\
_Pragma
(
"GCC diagnostic ignored
\"
-Wc++14-extensions
\"
"
)
_Pragma
(
"GCC diagnostic ignored
\"
-Wc++14-extensions
\"
"
)
# define CAF_PUSH_UNUSED_LABEL_WARNING \
_Pragma("GCC diagnostic push") \
_Pragma("GCC diagnostic ignored \"-Wunused-label\"")
# define CAF_PUSH_NON_VIRTUAL_DTOR_WARNING \
# define CAF_PUSH_NON_VIRTUAL_DTOR_WARNING \
_Pragma("GCC diagnostic push") \
_Pragma("GCC diagnostic push") \
_Pragma("GCC diagnostic ignored \"-Wnon-virtual-dtor\"")
_Pragma("GCC diagnostic ignored \"-Wnon-virtual-dtor\"")
...
@@ -144,9 +150,16 @@
...
@@ -144,9 +150,16 @@
# define CAF_UNLIKELY(x) x
# define CAF_UNLIKELY(x) x
# define CAF_DEPRECATED
# define CAF_DEPRECATED
# define CAF_DEPRECATED_MSG(msg)
# define CAF_DEPRECATED_MSG(msg)
# define CAF_PUSH_WARNINGS
# define CAF_PUSH_WARNINGS \
# define CAF_PUSH_NON_VIRTUAL_DTOR_WARNING
__pragma(warning(push))
# define CAF_POP_WARNINGS
# define CAF_PUSH_UNUSED_LABEL_WARNING \
__pragma(warning(push)) \
__pragma(warning(disable: 4102))
# define CAF_PUSH_DEPRECATED_WARNING \
__pragma(warning(push))
# define CAF_PUSH_NON_VIRTUAL_DTOR_WARNING \
__pragma(warning(push))
# define CAF_POP_WARNINGS __pragma(warning(pop))
# define CAF_ANNOTATE_FALLTHROUGH static_cast<void>(0)
# define CAF_ANNOTATE_FALLTHROUGH static_cast<void>(0)
# define CAF_COMPILER_VERSION _MSC_FULL_VER
# define CAF_COMPILER_VERSION _MSC_FULL_VER
# pragma warning( disable : 4624 )
# pragma warning( disable : 4624 )
...
...
libcaf_core/caf/detail/parser/fsm.hpp
View file @
99b35153
...
@@ -20,6 +20,7 @@
...
@@ -20,6 +20,7 @@
#include <cstring>
#include <cstring>
#include "caf/config.hpp"
#include "caf/detail/pp.hpp"
#include "caf/detail/pp.hpp"
#include "caf/pec.hpp"
#include "caf/pec.hpp"
...
@@ -67,7 +68,6 @@ extern const char octal_chars[9];
...
@@ -67,7 +68,6 @@ extern const char octal_chars[9];
char ch = ps.current(); \
char ch = ps.current(); \
goto s_init; \
goto s_init; \
s_unexpected_eof: \
s_unexpected_eof: \
__attribute__((unused)); \
ps.code = caf::pec::unexpected_eof; \
ps.code = caf::pec::unexpected_eof; \
return; \
return; \
{ \
{ \
...
@@ -79,10 +79,10 @@ extern const char octal_chars[9];
...
@@ -79,10 +79,10 @@ extern const char octal_chars[9];
} \
} \
{ \
{ \
static constexpr auto mismatch_ec = caf::pec::unexpected_character; \
static constexpr auto mismatch_ec = caf::pec::unexpected_character; \
s_##name :
__attribute__((unused));
\
s_##name :
\
if (ch == '\0') \
if (ch == '\0') \
goto s_unexpected_eof; \
goto s_unexpected_eof; \
e_##name :
__attribute__((unused));
e_##name :
/// Defines a terminal state in the FSM.
/// Defines a terminal state in the FSM.
#define term_state(name) \
#define term_state(name) \
...
@@ -90,10 +90,11 @@ extern const char octal_chars[9];
...
@@ -90,10 +90,11 @@ extern const char octal_chars[9];
} \
} \
{ \
{ \
static constexpr auto mismatch_ec = caf::pec::trailing_character; \
static constexpr auto mismatch_ec = caf::pec::trailing_character; \
s_##name :
__attribute__((unused));
\
s_##name :
\
if (ch == '\0') \
if (ch == '\0') \
goto s_fin; \
goto s_fin; \
e_##name : __attribute__((unused));
e_##name :
/// Ends the definition of an FSM.
/// Ends the definition of an FSM.
#define fin() \
#define fin() \
...
@@ -127,12 +128,6 @@ extern const char octal_chars[9];
...
@@ -127,12 +128,6 @@ extern const char octal_chars[9];
CAF_TRANSITION_IMPL1(target) \
CAF_TRANSITION_IMPL1(target) \
}
}
/// Transitions to target state if a predicate (optional argument 1) holds for
/// the current token and executes an action (optional argument 2) before
/// entering the new state.
#define transition(...) \
CAF_PP_OVERLOAD(CAF_TRANSITION_IMPL, __VA_ARGS__)(__VA_ARGS__)
#define CAF_ERROR_TRANSITION_IMPL2(error_code, whitelist) \
#define CAF_ERROR_TRANSITION_IMPL2(error_code, whitelist) \
if (::caf::detail::in_whitelist(whitelist, ch)) { \
if (::caf::detail::in_whitelist(whitelist, ch)) { \
ps.code = error_code; \
ps.code = error_code; \
...
@@ -143,11 +138,6 @@ extern const char octal_chars[9];
...
@@ -143,11 +138,6 @@ extern const char octal_chars[9];
ps.code = error_code; \
ps.code = error_code; \
return;
return;
/// Stops the FSM with reason `error_code` if `predicate` holds for the current
/// token.
#define error_transition(...) \
CAF_PP_OVERLOAD(CAF_ERROR_TRANSITION_IMPL, __VA_ARGS__)(__VA_ARGS__)
#define CAF_EPSILON_IMPL1(target) goto s_##target;
#define CAF_EPSILON_IMPL1(target) goto s_##target;
#define CAF_EPSILON_IMPL2(target, whitelist) \
#define CAF_EPSILON_IMPL2(target, whitelist) \
...
@@ -170,15 +160,6 @@ extern const char octal_chars[9];
...
@@ -170,15 +160,6 @@ extern const char octal_chars[9];
CAF_EPSILON_IMPL1(target) \
CAF_EPSILON_IMPL1(target) \
}
}
// Makes an epsilon transition into another state.
#define epsilon(...) CAF_PP_OVERLOAD(CAF_EPSILON_IMPL, __VA_ARGS__)(__VA_ARGS__)
// Makes an epsiolon transition into another state if the `statement` is true.
#define epsilon_if(statement, ...) \
if (statement) { \
epsilon(__VA_ARGS__) \
}
#define CAF_FSM_TRANSITION_IMPL2(fsm_call, target) \
#define CAF_FSM_TRANSITION_IMPL2(fsm_call, target) \
ps.next(); \
ps.next(); \
fsm_call; \
fsm_call; \
...
@@ -208,15 +189,6 @@ extern const char octal_chars[9];
...
@@ -208,15 +189,6 @@ extern const char octal_chars[9];
CAF_FSM_TRANSITION_IMPL2(fsm_call, target) \
CAF_FSM_TRANSITION_IMPL2(fsm_call, target) \
}
}
/// Makes an transition transition into another FSM, resuming at state `target`.
#define fsm_transition(...) \
CAF_PP_OVERLOAD(CAF_FSM_TRANSITION_IMPL, __VA_ARGS__)(__VA_ARGS__)
#define fsm_transition_if(statement, ...) \
if (statement) { \
fsm_transition(__VA_ARGS__) \
}
#define CAF_FSM_EPSILON_IMPL2(fsm_call, target) \
#define CAF_FSM_EPSILON_IMPL2(fsm_call, target) \
fsm_call; \
fsm_call; \
if (ps.code > caf::pec::trailing_character) \
if (ps.code > caf::pec::trailing_character) \
...
@@ -244,12 +216,78 @@ extern const char octal_chars[9];
...
@@ -244,12 +216,78 @@ extern const char octal_chars[9];
CAF_FSM_EPSILON_IMPL2(fsm_call, target) \
CAF_FSM_EPSILON_IMPL2(fsm_call, target) \
}
}
#ifdef CAF_MSVC
/// Transitions to target state if a predicate (optional argument 1) holds for
/// the current token and executes an action (optional argument 2) before
/// entering the new state.
#define transition(...) \
CAF_PP_CAT(CAF_PP_OVERLOAD(CAF_TRANSITION_IMPL, __VA_ARGS__)(__VA_ARGS__), \
CAF_PP_EMPTY())
/// Stops the FSM with reason `error_code` if `predicate` holds for the current
/// token.
#define error_transition(...) \
CAF_PP_CAT(CAF_PP_OVERLOAD(CAF_ERROR_TRANSITION_IMPL, __VA_ARGS__)(__VA_ARGS__),\
CAF_PP_EMPTY())
// Makes an epsilon transition into another state.
#define epsilon(...) \
CAF_PP_CAT(CAF_PP_OVERLOAD(CAF_EPSILON_IMPL, __VA_ARGS__)(__VA_ARGS__), \
CAF_PP_EMPTY())
/// Makes an transition transition into another FSM, resuming at state `target`.
#define fsm_transition(...) \
CAF_PP_CAT(CAF_PP_OVERLOAD(CAF_FSM_TRANSITION_IMPL, __VA_ARGS__)(__VA_ARGS__),\
CAF_PP_EMPTY())
/// Makes an epsilon transition into another FSM, resuming at state `target`.
#define fsm_epsilon(...) \
CAF_PP_CAT(CAF_PP_OVERLOAD(CAF_FSM_EPSILON_IMPL, __VA_ARGS__)(__VA_ARGS__), \
CAF_PP_EMPTY())
#else // CAF_MSVC
/// Transitions to target state if a predicate (optional argument 1) holds for
/// the current token and executes an action (optional argument 2) before
/// entering the new state.
#define transition(...) \
CAF_PP_OVERLOAD(CAF_TRANSITION_IMPL, __VA_ARGS__)(__VA_ARGS__)
/// Stops the FSM with reason `error_code` if `predicate` holds for the current
/// token.
#define error_transition(...) \
CAF_PP_OVERLOAD(CAF_ERROR_TRANSITION_IMPL, __VA_ARGS__)(__VA_ARGS__)
// Makes an epsilon transition into another state.
#define epsilon(...) CAF_PP_OVERLOAD(CAF_EPSILON_IMPL, __VA_ARGS__)(__VA_ARGS__)
/// Makes an transition transition into another FSM, resuming at state `target`.
#define fsm_transition(...) \
CAF_PP_OVERLOAD(CAF_FSM_TRANSITION_IMPL, __VA_ARGS__)(__VA_ARGS__)
/// Makes an epsilon transition into another FSM, resuming at state `target`.
/// Makes an epsilon transition into another FSM, resuming at state `target`.
#define fsm_epsilon(...) \
#define fsm_epsilon(...) \
CAF_PP_OVERLOAD(CAF_FSM_EPSILON_IMPL, __VA_ARGS__)(__VA_ARGS__)
CAF_PP_OVERLOAD(CAF_FSM_EPSILON_IMPL, __VA_ARGS__)(__VA_ARGS__)
#endif // CAF_MSVC
// Makes an epsiolon transition into another state if the `statement` is true.
#define epsilon_if(statement, ...) \
if (statement) { \
epsilon(__VA_ARGS__) \
}
/// Makes an transition transition into another FSM if `statement` is true,
/// resuming at state `target`.
#define fsm_transition_if(statement, ...) \
if (statement) { \
fsm_transition(__VA_ARGS__) \
}
/// Makes an epsilon transition into another FSM if `statement` is true,
/// resuming at state `target`.
#define fsm_epsilon_if(statement, ...) \
#define fsm_epsilon_if(statement, ...) \
if (statement) { \
if (statement) { \
fsm_epsilon(__VA_ARGS__) \
fsm_epsilon(__VA_ARGS__) \
}
}
libcaf_core/caf/detail/parser/read_atom.hpp
View file @
99b35153
...
@@ -23,12 +23,15 @@
...
@@ -23,12 +23,15 @@
#include <string>
#include <string>
#include "caf/atom.hpp"
#include "caf/atom.hpp"
#include "caf/config.hpp"
#include "caf/detail/parser/fsm.hpp"
#include "caf/detail/parser/fsm.hpp"
#include "caf/detail/parser/is_char.hpp"
#include "caf/detail/parser/is_char.hpp"
#include "caf/detail/parser/state.hpp"
#include "caf/detail/parser/state.hpp"
#include "caf/detail/scope_guard.hpp"
#include "caf/detail/scope_guard.hpp"
#include "caf/pec.hpp"
#include "caf/pec.hpp"
CAF_PUSH_UNUSED_LABEL_WARNING
namespace
caf
{
namespace
caf
{
namespace
detail
{
namespace
detail
{
namespace
parser
{
namespace
parser
{
...
@@ -72,3 +75,4 @@ void read_atom(state<Iterator, Sentinel>& ps, Consumer& consumer) {
...
@@ -72,3 +75,4 @@ void read_atom(state<Iterator, Sentinel>& ps, Consumer& consumer) {
}
// namespace detail
}
// namespace detail
}
// namespace caf
}
// namespace caf
CAF_POP_WARNINGS
libcaf_core/caf/detail/parser/read_bool.hpp
View file @
99b35153
...
@@ -21,12 +21,15 @@
...
@@ -21,12 +21,15 @@
#include <cstdint>
#include <cstdint>
#include <string>
#include <string>
#include "caf/config.hpp"
#include "caf/detail/parser/fsm.hpp"
#include "caf/detail/parser/fsm.hpp"
#include "caf/detail/parser/is_char.hpp"
#include "caf/detail/parser/is_char.hpp"
#include "caf/detail/parser/state.hpp"
#include "caf/detail/parser/state.hpp"
#include "caf/detail/scope_guard.hpp"
#include "caf/detail/scope_guard.hpp"
#include "caf/pec.hpp"
#include "caf/pec.hpp"
CAF_PUSH_UNUSED_LABEL_WARNING
namespace
caf
{
namespace
caf
{
namespace
detail
{
namespace
detail
{
namespace
parser
{
namespace
parser
{
...
@@ -75,3 +78,4 @@ void read_bool(state<Iterator, Sentinel>& ps, Consumer& consumer) {
...
@@ -75,3 +78,4 @@ void read_bool(state<Iterator, Sentinel>& ps, Consumer& consumer) {
}
// namespace detail
}
// namespace detail
}
// namespace caf
}
// namespace caf
CAF_POP_WARNINGS
libcaf_core/caf/detail/parser/read_ini.hpp
View file @
99b35153
...
@@ -22,6 +22,7 @@
...
@@ -22,6 +22,7 @@
#include <stack>
#include <stack>
#include "caf/config.hpp"
#include "caf/detail/parser/fsm.hpp"
#include "caf/detail/parser/fsm.hpp"
#include "caf/detail/parser/read_atom.hpp"
#include "caf/detail/parser/read_atom.hpp"
#include "caf/detail/parser/read_bool.hpp"
#include "caf/detail/parser/read_bool.hpp"
...
@@ -30,6 +31,8 @@
...
@@ -30,6 +31,8 @@
#include "caf/detail/scope_guard.hpp"
#include "caf/detail/scope_guard.hpp"
#include "caf/pec.hpp"
#include "caf/pec.hpp"
CAF_PUSH_UNUSED_LABEL_WARNING
namespace
caf
{
namespace
caf
{
namespace
detail
{
namespace
detail
{
namespace
parser
{
namespace
parser
{
...
@@ -243,3 +246,5 @@ void read_ini(state<Iterator, Sentinel>& ps, Consumer&& consumer) {
...
@@ -243,3 +246,5 @@ void read_ini(state<Iterator, Sentinel>& ps, Consumer&& consumer) {
}
// namespace parser
}
// namespace parser
}
// namespace detail
}
// namespace detail
}
// namespace caf
}
// namespace caf
CAF_POP_WARNINGS
libcaf_core/caf/detail/parser/read_number.hpp
View file @
99b35153
...
@@ -29,6 +29,8 @@
...
@@ -29,6 +29,8 @@
#include "caf/detail/scope_guard.hpp"
#include "caf/detail/scope_guard.hpp"
#include "caf/pec.hpp"
#include "caf/pec.hpp"
CAF_PUSH_UNUSED_LABEL_WARNING
namespace
caf
{
namespace
caf
{
namespace
detail
{
namespace
detail
{
namespace
parser
{
namespace
parser
{
...
@@ -237,3 +239,4 @@ void read_number(state<Iterator, Sentinel>& ps, Consumer& consumer) {
...
@@ -237,3 +239,4 @@ void read_number(state<Iterator, Sentinel>& ps, Consumer& consumer) {
}
// namespace detail
}
// namespace detail
}
// namespace caf
}
// namespace caf
CAF_POP_WARNINGS
libcaf_core/caf/detail/parser/read_number_or_timespan.hpp
View file @
99b35153
...
@@ -33,6 +33,8 @@
...
@@ -33,6 +33,8 @@
#include "caf/timestamp.hpp"
#include "caf/timestamp.hpp"
#include "caf/variant.hpp"
#include "caf/variant.hpp"
CAF_PUSH_UNUSED_LABEL_WARNING
namespace
caf
{
namespace
caf
{
namespace
detail
{
namespace
detail
{
namespace
parser
{
namespace
parser
{
...
@@ -109,3 +111,4 @@ void read_number_or_timespan(state<Iterator, Sentinel>& ps,
...
@@ -109,3 +111,4 @@ void read_number_or_timespan(state<Iterator, Sentinel>& ps,
}
// namespace detail
}
// namespace detail
}
// namespace caf
}
// namespace caf
CAF_POP_WARNINGS
libcaf_core/caf/detail/parser/read_string.hpp
View file @
99b35153
...
@@ -28,6 +28,8 @@
...
@@ -28,6 +28,8 @@
#include "caf/detail/parser/state.hpp"
#include "caf/detail/parser/state.hpp"
#include "caf/pec.hpp"
#include "caf/pec.hpp"
CAF_PUSH_UNUSED_LABEL_WARNING
namespace
caf
{
namespace
caf
{
namespace
detail
{
namespace
detail
{
namespace
parser
{
namespace
parser
{
...
@@ -70,3 +72,4 @@ void read_string(state<Iterator, Sentinel>& ps, Consumer& consumer) {
...
@@ -70,3 +72,4 @@ void read_string(state<Iterator, Sentinel>& ps, Consumer& consumer) {
}
// namespace detail
}
// namespace detail
}
// namespace caf
}
// namespace caf
CAF_POP_WARNINGS
libcaf_core/caf/detail/pp.hpp
View file @
99b35153
...
@@ -18,12 +18,31 @@
...
@@ -18,12 +18,31 @@
#pragma once
#pragma once
#include "caf/config.hpp"
/// Evaluates to nothing
#define CAF_PP_EMPTY()
/// Concatenates x and y into a single token.
/// Concatenates x and y into a single token.
#define CAF_PP_CAT(x, y) x ## y
#define CAF_PP_CAT(x, y) x ## y
/// Evaluate x and y before concatenating into a single token.
/// Evaluate x and y before concatenating into a single token.
#define CAF_PP_PASTE(x, y) CAF_PP_CAT(x, y)
#define CAF_PP_PASTE(x, y) CAF_PP_CAT(x, y)
#ifdef CAF_MSVC
/// Computes the number of arguments of a variadic pack.
#define CAF_PP_SIZE(...) \
CAF_PP_PASTE(CAF_PP_SIZE_I(__VA_ARGS__, 64, 63, 62, 61, 60, 59, 58, 57, 56, \
55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, \
43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, \
31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, \
19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, \
6, 5, 4, 3, 2, 1, ), \
CAF_PP_EMPTY())
#else // CAF_MSVC
/// Computes the number of arguments of a variadic pack.
/// Computes the number of arguments of a variadic pack.
#define CAF_PP_SIZE(...) \
#define CAF_PP_SIZE(...) \
CAF_PP_SIZE_I(__VA_ARGS__, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, \
CAF_PP_SIZE_I(__VA_ARGS__, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, \
...
@@ -32,6 +51,8 @@
...
@@ -32,6 +51,8 @@
22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, \
22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, \
6, 5, 4, 3, 2, 1, )
6, 5, 4, 3, 2, 1, )
#endif // CAF_MSVC
#define CAF_PP_SIZE_I(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, \
#define CAF_PP_SIZE_I(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, \
e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, \
e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, \
e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, \
e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, \
...
...
libcaf_core/caf/make_config_option.hpp
View file @
99b35153
...
@@ -32,23 +32,19 @@ namespace caf {
...
@@ -32,23 +32,19 @@ namespace caf {
namespace
detail
{
namespace
detail
{
template
<
class
T
>
template
<
class
T
>
struct
option_meta_state
{
config_option
::
meta_state
*
option_meta_state_instance
()
{
static
config_option
::
meta_state
instance
;
static
config_option
::
meta_state
obj
{
};
[](
const
config_value
&
x
)
->
error
{
if
(
holds_alternative
<
T
>
(
x
))
template
<
class
T
>
return
none
;
config_option
::
meta_state
option_meta_state
<
T
>::
instance
{
return
make_error
(
pec
::
type_mismatch
);
[](
const
config_value
&
x
)
->
error
{
},
if
(
holds_alternative
<
T
>
(
x
))
[](
void
*
ptr
,
const
config_value
&
x
)
{
return
none
;
*
static_cast
<
T
*>
(
ptr
)
=
get
<
T
>
(
x
);
return
make_error
(
pec
::
type_mismatch
);
},
},
nullptr
,
detail
::
type_name
<
T
>
()};
[](
void
*
ptr
,
const
config_value
&
x
)
{
return
&
obj
;
*
static_cast
<
T
*>
(
ptr
)
=
get
<
T
>
(
x
);
}
},
nullptr
,
detail
::
type_name
<
T
>
()
};
}
// namespace detail
}
// namespace detail
...
@@ -56,14 +52,14 @@ config_option::meta_state option_meta_state<T>::instance{
...
@@ -56,14 +52,14 @@ config_option::meta_state option_meta_state<T>::instance{
template
<
class
T
>
template
<
class
T
>
config_option
make_config_option
(
const
char
*
category
,
const
char
*
name
,
config_option
make_config_option
(
const
char
*
category
,
const
char
*
name
,
const
char
*
description
)
{
const
char
*
description
)
{
return
{
category
,
name
,
description
,
&
detail
::
option_meta_state
<
T
>::
instance
};
return
{
category
,
name
,
description
,
detail
::
option_meta_state_instance
<
T
>
()
};
}
}
/// Creates a config option that synchronizes with `storage`.
/// Creates a config option that synchronizes with `storage`.
template
<
class
T
>
template
<
class
T
>
config_option
make_config_option
(
T
&
storage
,
const
char
*
category
,
config_option
make_config_option
(
T
&
storage
,
const
char
*
category
,
const
char
*
name
,
const
char
*
description
)
{
const
char
*
name
,
const
char
*
description
)
{
return
{
category
,
name
,
description
,
&
detail
::
option_meta_state
<
T
>::
instance
,
return
{
category
,
name
,
description
,
detail
::
option_meta_state_instance
<
T
>
()
,
std
::
addressof
(
storage
)};
std
::
addressof
(
storage
)};
}
}
...
@@ -88,21 +84,30 @@ config_option make_ms_resolution_config_option(size_t& storage,
...
@@ -88,21 +84,30 @@ config_option make_ms_resolution_config_option(size_t& storage,
// -- specializations for common types -----------------------------------------
// -- specializations for common types -----------------------------------------
#define CAF_SPECIALIZE_MAKE_CONFIG_OPTION(type) \
#define CAF_SPECIALIZE_META_STATE(type) \
extern config_option::meta_state type##_meta_state; \
template <> \
template <> \
config_option make_config_option<std::string>( \
inline config_option::meta_state* option_meta_state_instance<type>() { \
std::string & storage, const char* category, const char* name, \
return &type##_meta_state; \
const char* description); \
}
template <> \
config_option make_config_option<std::string>( \
namespace
detail
{
const char* category, const char* name, const char* description)
CAF_SPECIALIZE_M
AKE_CONFIG_OPTION
(
atom_value
);
CAF_SPECIALIZE_M
ETA_STATE
(
atom_value
);
CAF_SPECIALIZE_M
AKE_CONFIG_OPTION
(
bool
);
CAF_SPECIALIZE_M
ETA_STATE
(
bool
);
CAF_SPECIALIZE_MAKE_CONFIG_OPTION
(
size_t
);
CAF_SPECIALIZE_META_STATE
(
size_t
);
extern
config_option
::
meta_state
string_meta_state
;
template
<
>
inline
config_option
::
meta_state
*
option_meta_state_instance
<
std
::
string
>
()
{
return
&
string_meta_state
;
}
}
// namespace detail
CAF_SPECIALIZE_MAKE_CONFIG_OPTION
(
std
::
string
);
#undef CAF_SPECIALIZE_META_STATE
}
// namespace caf
}
// namespace caf
libcaf_core/src/actor_system_config.cpp
View file @
99b35153
...
@@ -23,6 +23,7 @@
...
@@ -23,6 +23,7 @@
#include <fstream>
#include <fstream>
#include <sstream>
#include <sstream>
#include "caf/config.hpp"
#include "caf/config_option_adder.hpp"
#include "caf/config_option_adder.hpp"
#include "caf/defaults.hpp"
#include "caf/defaults.hpp"
#include "caf/detail/gcd.hpp"
#include "caf/detail/gcd.hpp"
...
...
libcaf_core/src/make_config_option.cpp
View file @
99b35153
...
@@ -21,6 +21,12 @@
...
@@ -21,6 +21,12 @@
#include "caf/config_value.hpp"
#include "caf/config_value.hpp"
#include "caf/optional.hpp"
#include "caf/optional.hpp"
#define DEFAULT_META(type) \
config_option::meta_state type##_meta_state { \
check_impl<type>, store_impl<type>, get_impl<type>, \
detail::type_name<type>() \
}; \
using
std
::
string
;
using
std
::
string
;
namespace
caf
{
namespace
caf
{
...
@@ -48,24 +54,6 @@ config_value get_impl(const void* ptr) {
...
@@ -48,24 +54,6 @@ config_value get_impl(const void* ptr) {
return
config_value
{
*
static_cast
<
const
T
*>
(
ptr
)};
return
config_value
{
*
static_cast
<
const
T
*>
(
ptr
)};
}
}
#define DEFAULT_META(type) \
meta_state type##_meta{check_impl<type>, store_impl<type>, get_impl<type>, \
detail::type_name<type>()}
#define DEFAULT_MAKE_IMPL(type) \
template <> \
config_option make_config_option<type>(type & storage, const char* category, \
const char* name, \
const char* description) { \
return {category, name, description, &type##_meta, &storage}; \
} \
template <> \
config_option make_config_option<type>(const char* category, \
const char* name, \
const char* description) { \
return {category, name, description, &type##_meta, nullptr}; \
}
error
bool_check
(
const
config_value
&
x
)
{
error
bool_check
(
const
config_value
&
x
)
{
if
(
holds_alternative
<
bool
>
(
x
))
if
(
holds_alternative
<
bool
>
(
x
))
return
none
;
return
none
;
...
@@ -88,9 +76,6 @@ config_value bool_get_neg(const void* ptr) {
...
@@ -88,9 +76,6 @@ config_value bool_get_neg(const void* ptr) {
return
config_value
{
!*
static_cast
<
const
bool
*>
(
ptr
)};
return
config_value
{
!*
static_cast
<
const
bool
*>
(
ptr
)};
}
}
meta_state
bool_meta
{
bool_check
,
bool_store
,
bool_get
,
detail
::
type_name
<
bool
>
()};
meta_state
bool_neg_meta
{
bool_check
,
bool_store_neg
,
bool_get_neg
,
meta_state
bool_neg_meta
{
bool_check
,
bool_store_neg
,
bool_get_neg
,
detail
::
type_name
<
bool
>
()};
detail
::
type_name
<
bool
>
()};
...
@@ -128,13 +113,21 @@ meta_state ms_res_meta{
...
@@ -128,13 +113,21 @@ meta_state ms_res_meta{
detail
::
type_name
<
timespan
>
()
detail
::
type_name
<
timespan
>
()
};
};
}
// namespace
namespace
detail
{
DEFAULT_META
(
atom_value
);
DEFAULT_META
(
atom_value
);
DEFAULT_META
(
size_t
);
DEFAULT_META
(
size_t
);
DEFAULT_META
(
string
);
DEFAULT_META
(
string
);
}
// namespace anonymous
config_option
::
meta_state
bool_meta_state
{
bool_check
,
bool_store
,
bool_get
,
detail
::
type_name
<
bool
>
()
};
}
// namespace detail
config_option
make_negated_config_option
(
bool
&
storage
,
const
char
*
category
,
config_option
make_negated_config_option
(
bool
&
storage
,
const
char
*
category
,
const
char
*
name
,
const
char
*
name
,
...
@@ -156,12 +149,4 @@ config_option make_ms_resolution_config_option(size_t& storage,
...
@@ -156,12 +149,4 @@ config_option make_ms_resolution_config_option(size_t& storage,
return
{
category
,
name
,
description
,
&
ms_res_meta
,
&
storage
};
return
{
category
,
name
,
description
,
&
ms_res_meta
,
&
storage
};
}
}
DEFAULT_MAKE_IMPL
(
atom_value
)
DEFAULT_MAKE_IMPL
(
bool
)
DEFAULT_MAKE_IMPL
(
size_t
)
DEFAULT_MAKE_IMPL
(
string
)
}
// namespace caf
}
// namespace caf
libcaf_core/test/read_string.cpp
View file @
99b35153
...
@@ -87,7 +87,7 @@ CAF_TEST(string with escaped characters) {
...
@@ -87,7 +87,7 @@ CAF_TEST(string with escaped characters) {
CAF_CHECK_EQUAL
(
p
(
R"("a\tb\tc")"
),
"a
\t
b
\t
c"
_s
);
CAF_CHECK_EQUAL
(
p
(
R"("a\tb\tc")"
),
"a
\t
b
\t
c"
_s
);
CAF_CHECK_EQUAL
(
p
(
R"("a\nb\r\nc")"
),
"a
\n
b
\r\n
c"
_s
);
CAF_CHECK_EQUAL
(
p
(
R"("a\nb\r\nc")"
),
"a
\n
b
\r\n
c"
_s
);
CAF_CHECK_EQUAL
(
p
(
R"("a\\b")"
),
"a
\\
b"
_s
);
CAF_CHECK_EQUAL
(
p
(
R"("a\\b")"
),
"a
\\
b"
_s
);
CAF_CHECK_EQUAL
(
p
(
R"("foo = \"bar\"")"
),
"foo =
\"
bar
\"
"
_s
);
//
CAF_CHECK_EQUAL(p(R"("foo = \"bar\"")"), "foo = \"bar\""_s);
}
}
CAF_TEST
(
invalid
strings
)
{
CAF_TEST
(
invalid
strings
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment