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
afdcaf79
Commit
afdcaf79
authored
Feb 19, 2015
by
Dominik Charousset
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
More cppcheck fixes, reimplement `test_match_expr`
parent
b47702ee
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
123 additions
and
130 deletions
+123
-130
libcaf_core/src/uniform_type_info_map.cpp
libcaf_core/src/uniform_type_info_map.cpp
+3
-5
libcaf_io/src/default_multiplexer.cpp
libcaf_io/src/default_multiplexer.cpp
+4
-5
unit_testing/CMakeLists.txt
unit_testing/CMakeLists.txt
+1
-0
unit_testing/test_match_expr.cpp
unit_testing/test_match_expr.cpp
+115
-120
No files found.
libcaf_core/src/uniform_type_info_map.cpp
View file @
afdcaf79
...
...
@@ -226,7 +226,6 @@ void deserialize_impl(channel& ptrref, deserializer* source) {
}
void
serialize_impl
(
const
message
&
tup
,
serializer
*
sink
)
{
std
::
string
dynamic_name
;
// used if tup holds an object_array
// ttn can be nullptr even if tuple is not empty (in case of object_array)
std
::
string
tname
=
tup
.
empty
()
?
"@<>"
:
tup
.
tuple_type_names
();
auto
uti_map
=
detail
::
singletons
::
get_uniform_type_info_map
();
...
...
@@ -485,8 +484,7 @@ protected:
class
default_meta_message
:
public
uniform_type_info
{
public:
default_meta_message
(
const
std
::
string
&
tname
)
{
m_name
=
tname
;
default_meta_message
(
const
std
::
string
&
tname
)
:
m_name
(
tname
)
{
std
::
vector
<
std
::
string
>
elements
;
split
(
elements
,
tname
,
is_any_of
(
"+"
));
auto
uti_map
=
detail
::
singletons
::
get_uniform_type_info_map
();
...
...
@@ -555,11 +553,11 @@ template <class Iterator>
struct
builtin_types_helper
{
Iterator
pos
;
builtin_types_helper
(
Iterator
first
)
:
pos
(
first
)
{}
inline
void
operator
()()
{
void
operator
()()
const
{
// end of recursion
}
template
<
class
T
,
class
...
Ts
>
inline
void
operator
()(
T
&
arg
,
Ts
&
...
args
)
{
void
operator
()(
T
&
arg
,
Ts
&
...
args
)
{
*
pos
++
=
&
arg
;
(
*
this
)(
args
...);
}
...
...
libcaf_io/src/default_multiplexer.cpp
View file @
afdcaf79
...
...
@@ -406,10 +406,9 @@ namespace network {
// altering the pollset while traversing it is not exactly a
// bright idea ...
struct
fd_event
{
native_socket
fd
;
// our file descriptor
short
mask
;
// the event mask returned by poll()
short
fd_mask
;
// the mask associated with fd
event_handler
*
ptr
;
// nullptr in case of a pipe event
native_socket
fd
;
// our file descriptor
short
mask
;
// the event mask returned by poll()
event_handler
*
ptr
;
// nullptr in case of a pipe event
};
std
::
vector
<
fd_event
>
poll_res
;
while
(
!
m_pollset
.
empty
())
{
...
...
@@ -449,7 +448,7 @@ namespace network {
if
(
pfd
.
revents
!=
0
)
{
CAF_LOG_DEBUG
(
"event on socket "
<<
pfd
.
fd
<<
", revents = "
<<
pfd
.
revents
);
poll_res
.
push_back
({
pfd
.
fd
,
pfd
.
revents
,
pfd
.
events
,
m_shadow
[
i
]});
poll_res
.
push_back
({
pfd
.
fd
,
pfd
.
revents
,
m_shadow
[
i
]});
pfd
.
revents
=
0
;
--
presult
;
// stop as early as possible
}
...
...
unit_testing/CMakeLists.txt
View file @
afdcaf79
...
...
@@ -21,6 +21,7 @@ add_unit_test(atom)
add_unit_test
(
metaprogramming
)
add_unit_test
(
intrusive_containers
)
add_unit_test
(
match
)
add_unit_test
(
match_expr
)
add_unit_test
(
message
)
add_unit_test
(
serialization
)
add_unit_test
(
uniform_type
)
...
...
unit_testing/test_match_expr.cpp
View file @
afdcaf79
#include "test.hpp"
#include "cppa/variant.hpp"
#include "cppa/all.hpp"
#include "cppa/detail/demangle.hpp"
#include "caf/all.hpp"
#include "caf/detail/safe_equal.hpp"
using
std
::
cout
;
using
std
::
endl
;
using
boost
::
get
;
using
boost
::
none
;
using
boost
::
none_t
;
using
boost
::
variant
;
using
namespace
cppa
;
#define CPPA_CHECK_VARIANT(Call, Type, Expected) \
{ \
auto res = Call; \
if (get<Type>(&res) == nullptr) { \
CPPA_FAILURE("result has invalid type"); \
} else if (*get<Type>(&res) != Expected) { \
CPPA_FAILURE("expected " << Expected << " found " \
<< *get<Type>(&res)); \
} else { \
CPPA_CHECKPOINT(); \
} \
} \
using
namespace
caf
;
#define CAF_CHECK_VARIANT(Handler, Message, Type, Expected) \
{ \
auto msg = Message; \
auto res = Handler(msg); \
if (get<Type>(&res) == nullptr) { \
CAF_FAILURE("result has invalid type"); \
} else if (!caf::detail::safe_equal(*get<Type>(&res), Expected)) { \
CAF_FAILURE("expected " << Expected << " found " << *get<Type>(&res)); \
} else { \
CAF_CHECKPOINT(); \
} \
} \
static_cast<void>(0)
#define CPPA_CHECK_VARIANT_UNIT(Call) \
{ \
auto res = Call; \
if (get<unit_t>(&res) == nullptr) { \
CPPA_FAILURE("result has invalid type"); \
} else { \
CPPA_CHECKPOINT(); \
} \
} \
#define CAF_CHECK_VARIANT_UNIT(Handler, Message) \
{ \
auto msg = Message; \
auto res = Handler(msg); \
if (get<unit_t>(&res) == nullptr) { \
CAF_FAILURE("result has invalid type"); \
} else { \
CAF_CHECKPOINT(); \
} \
} \
static_cast<void>(0)
#define C
PPA_CHECK_OPT_MSG(Call, Type, Expected)
\
{ \
auto
res = Call;
\
if (!res) {
\
CPPA_FAILURE("result is none");
\
} else if (res->type_at(0) != uniform_typeid<Type>()) {
\
CPPA_FAILURE("result has invalid type: expected: "
\
<< cppa::detail::demangle(typeid(Expected).name())
\
<< ", found: "
\
<< cppa::detail::demangle(typeid(Type).name()));
\
} else if (
res->get_as<Type>(0) != Expected) {
\
C
PPA_FAILURE("expected " << Expected << " found "
\
<< res->get_as<Type>(0));
\
} else { \
C
PPA_CHECKPOINT();
\
} \
} \
#define C
AF_CHECK_OPT_MSG(Handler, Message, Type, Expected)
\
{
\
auto
msg = Message;
\
auto res = Handler(msg);
\
if (!res) {
\
CAF_FAILURE("result is none");
\
} else if (!res->match_element<Type>(0)) {
\
CAF_FAILURE("result has invalid type: expected: "
\
<< typeid(Expected).name()
\
<< ", found: " << typeid(Type).name());
\
} else if (
!caf::detail::safe_equal(res->get_as<Type>(0), Expected)) {
\
C
AF_FAILURE("expected " << Expected << " found "
\
<< res->get_as<Type>(0));
\
} else {
\
C
AF_CHECKPOINT();
\
}
\
}
\
static_cast<void>(0)
#define C
PPA_CHECK_OPT_MSG_VOID(Call)
\
{ \
auto res = Call; \
if (!res) { \
C
PPA_FAILURE("result has invalid type: optional is none");
\
} else if (!res->empty()) { \
C
PPA_FAILURE("result has invalid type: tuple is not empty");
\
} else { \
C
PPA_CHECKPOINT();
\
} \
} \
#define C
AF_CHECK_OPT_MSG_VOID(Call)
\
{
\
auto res = Call;
\
if (!res) {
\
C
AF_FAILURE("result has invalid type: optional is none");
\
} else if (!res->empty()) {
\
C
AF_FAILURE("result has invalid type: tuple is not empty");
\
} else {
\
C
AF_CHECKPOINT();
\
}
\
}
\
static_cast<void>(0)
#define CPPA_CHECK_OPT_MSG_NONE(Call) \
{ \
auto res = Call; \
if (res) { \
if (res->empty()) { \
CPPA_FAILURE("result has invalid type: expected none, " \
<< "found: an empty tuple"); \
} else { \
CPPA_FAILURE("result has invalid type: expected none, " \
<< "found: " \
<< detail::demangle(res->type_token()->name())); \
} \
} else { \
CPPA_CHECKPOINT(); \
} \
} \
#define CAF_CHECK_OPT_MSG_NONE(Call) \
{ \
auto res = Call; \
if (res) { \
if (res->empty()) { \
CAF_FAILURE("result has invalid type: expected none, " \
<< "found an empty tuple"); \
} else { \
CAF_FAILURE("result has invalid type: expected none, " \
<< "found a non-empty tuple "); \
} \
} else { \
CAF_CHECKPOINT(); \
} \
} \
static_cast<void>(0)
struct
printer
{
inline
void
operator
()()
{
cout
<<
endl
;
}
template
<
typename
T
,
typename
...
Ts
>
void
operator
()(
const
boost
::
optional
<
T
>&
v
,
const
Ts
&
...
vs
)
{
if
(
v
)
inline
void
operator
()()
const
{
cout
<<
endl
;
}
template
<
typename
V
,
typename
...
Vs
>
void
operator
()(
const
optional
<
V
>&
v
,
const
Vs
&
...
vs
)
const
{
if
(
v
)
{
cout
<<
*
v
<<
" "
;
else
}
else
{
cout
<<
"[none] "
;
}
(
*
this
)(
vs
...);
}
template
<
typename
T
,
typename
...
T
s
>
void
operator
()(
const
T
&
v
,
const
Ts
&
...
vs
)
{
template
<
typename
V
,
typename
...
V
s
>
void
operator
()(
const
V
&
v
,
const
Vs
&
...
vs
)
const
{
cout
<<
v
<<
" "
;
(
*
this
)(
vs
...);
}
...
...
@@ -109,7 +105,7 @@ struct printer {
};
int
main
()
{
C
PPA
_TEST
(
test_match_expr
);
C
AF
_TEST
(
test_match_expr
);
auto
g
=
guarded
(
std
::
equal_to
<
int
>
{},
5
);
auto
t0
=
std
::
make_tuple
(
unit
,
g
,
unit
);
...
...
@@ -118,7 +114,6 @@ int main() {
detail
::
lifted_fun_zipper
zip
;
auto
is
=
detail
::
get_indices
(
t2
);
auto
r0
=
detail
::
tuple_zip
(
zip
,
is
,
t0
,
t1
);
cout
<<
"typeid(r0) = "
<<
detail
::
demangle
(
typeid
(
r0
).
name
())
<<
endl
;
printer
p
;
detail
::
apply_args
(
p
,
is
,
r0
);
...
...
@@ -126,80 +121,80 @@ int main() {
// check on() usage
auto
m0
=
on
<
int
>
()
>>
[](
int
)
{};
// auto m0r0 = m0(make_message(1));
C
PPA_CHECK_VARIANT_UNIT
(
m0
(
make_message
(
1
)
));
C
AF_CHECK_VARIANT_UNIT
(
m0
,
make_message
(
1
));
// check lifted functor
auto
m1
=
detail
::
lift_to_match_expr
([](
float
)
{});
C
PPA_CHECK_VARIANT_UNIT
(
m1
(
make_message
(
1.
f
)
));
C
AF_CHECK_VARIANT_UNIT
(
m1
,
make_message
(
1.
f
));
// check _.or_else(_)
auto
m2
=
m0
.
or_else
(
m1
);
C
PPA_CHECK_VARIANT_UNIT
(
m2
(
make_message
(
1
)
));
C
PPA_CHECK_VARIANT_UNIT
(
m2
(
make_message
(
1.
f
)
));
C
AF_CHECK_VARIANT_UNIT
(
m2
,
make_message
(
1
));
C
AF_CHECK_VARIANT_UNIT
(
m2
,
make_message
(
1.
f
));
// check use of match_expr_concat
auto
m3
=
detail
::
match_expr_concat
(
m0
,
m1
,
detail
::
lift_to_match_expr
([](
double
)
{}));
C
PPA
_CHECK_OPT_MSG_VOID
(
m3
->
invoke
(
make_message
(
1
)));
C
PPA
_CHECK_OPT_MSG_VOID
(
m3
->
invoke
(
make_message
(
1.
f
)));
C
PPA
_CHECK_OPT_MSG_VOID
(
m3
->
invoke
(
make_message
(
1.
)));
C
PPA
_CHECK_OPT_MSG_NONE
(
m3
->
invoke
(
make_message
(
"1"
)));
C
AF
_CHECK_OPT_MSG_VOID
(
m3
->
invoke
(
make_message
(
1
)));
C
AF
_CHECK_OPT_MSG_VOID
(
m3
->
invoke
(
make_message
(
1.
f
)));
C
AF
_CHECK_OPT_MSG_VOID
(
m3
->
invoke
(
make_message
(
1.
)));
C
AF
_CHECK_OPT_MSG_NONE
(
m3
->
invoke
(
make_message
(
"1"
)));
}
{
// --- same with guards ---
auto
m0
=
on
(
1
)
>>
[](
int
i
)
{
C
PPA
_CHECK_EQUAL
(
i
,
1
);
};
C
PPA_CHECK_VARIANT_UNIT
(
m0
(
make_message
(
1
)
));
auto
m0
=
on
(
1
)
>>
[](
int
i
)
{
C
AF
_CHECK_EQUAL
(
i
,
1
);
};
C
AF_CHECK_VARIANT_UNIT
(
m0
,
make_message
(
1
));
// check lifted functor
auto
m1
=
on
(
1.
f
)
>>
[](
float
)
{};
C
PPA_CHECK_VARIANT_UNIT
(
m1
(
make_message
(
1.
f
)
));
C
AF_CHECK_VARIANT_UNIT
(
m1
,
make_message
(
1.
f
));
// check _.or_else(_)
auto
m2
=
m0
.
or_else
(
m1
);
C
PPA_CHECK_VARIANT_UNIT
(
m2
(
make_message
(
1
)
));
C
PPA_CHECK_VARIANT_UNIT
(
m2
(
make_message
(
1.
f
)
));
C
AF_CHECK_VARIANT_UNIT
(
m2
,
make_message
(
1
));
C
AF_CHECK_VARIANT_UNIT
(
m2
,
make_message
(
1.
f
));
// check use of match_expr_concat
auto
m3
=
detail
::
match_expr_concat
(
m0
,
m1
,
on
(
1.
)
>>
[](
double
)
{});
C
PPA
_CHECK_OPT_MSG_VOID
(
m3
->
invoke
(
make_message
(
1
)));
C
PPA
_CHECK_OPT_MSG_NONE
(
m3
->
invoke
(
make_message
(
2
)));
C
PPA
_CHECK_OPT_MSG_VOID
(
m3
->
invoke
(
make_message
(
1.
f
)));
C
PPA
_CHECK_OPT_MSG_NONE
(
m3
->
invoke
(
make_message
(
2.
f
)));
C
PPA
_CHECK_OPT_MSG_VOID
(
m3
->
invoke
(
make_message
(
1.
)));
C
PPA
_CHECK_OPT_MSG_NONE
(
m3
->
invoke
(
make_message
(
2.
)));
C
PPA
_CHECK_OPT_MSG_NONE
(
m3
->
invoke
(
make_message
(
"1"
)));
C
AF
_CHECK_OPT_MSG_VOID
(
m3
->
invoke
(
make_message
(
1
)));
C
AF
_CHECK_OPT_MSG_NONE
(
m3
->
invoke
(
make_message
(
2
)));
C
AF
_CHECK_OPT_MSG_VOID
(
m3
->
invoke
(
make_message
(
1.
f
)));
C
AF
_CHECK_OPT_MSG_NONE
(
m3
->
invoke
(
make_message
(
2.
f
)));
C
AF
_CHECK_OPT_MSG_VOID
(
m3
->
invoke
(
make_message
(
1.
)));
C
AF
_CHECK_OPT_MSG_NONE
(
m3
->
invoke
(
make_message
(
2.
)));
C
AF
_CHECK_OPT_MSG_NONE
(
m3
->
invoke
(
make_message
(
"1"
)));
}
{
// --- mixin it up with message_handler
// check on() usage
message_handler
m0
{
on
<
int
>
()
>>
[](
int
)
{}};
C
PPA
_CHECK_OPT_MSG_VOID
(
m0
(
make_message
(
1
)));
C
AF
_CHECK_OPT_MSG_VOID
(
m0
(
make_message
(
1
)));
// check lifted functor
auto
m1
=
detail
::
lift_to_match_expr
([](
float
)
{});
C
PPA_CHECK_VARIANT_UNIT
(
m1
(
make_message
(
1.
f
)
));
C
AF_CHECK_VARIANT_UNIT
(
m1
,
make_message
(
1.
f
));
// check _.or_else(_)
auto
m2
=
m0
.
or_else
(
m1
);
C
PPA
_CHECK_OPT_MSG_VOID
(
m2
(
make_message
(
1
)));
C
PPA
_CHECK_OPT_MSG_VOID
(
m2
(
make_message
(
1.
f
)));
C
AF
_CHECK_OPT_MSG_VOID
(
m2
(
make_message
(
1
)));
C
AF
_CHECK_OPT_MSG_VOID
(
m2
(
make_message
(
1.
f
)));
// check use of match_expr_concat
auto
m3
=
detail
::
match_expr_concat
(
m0
,
m1
,
detail
::
lift_to_match_expr
([](
double
)
{}));
C
PPA
_CHECK_OPT_MSG_VOID
(
m3
->
invoke
(
make_message
(
1
)));
C
PPA
_CHECK_OPT_MSG_VOID
(
m3
->
invoke
(
make_message
(
1.
)));
C
PPA
_CHECK_OPT_MSG_VOID
(
m3
->
invoke
(
make_message
(
1.
f
)));
C
AF
_CHECK_OPT_MSG_VOID
(
m3
->
invoke
(
make_message
(
1
)));
C
AF
_CHECK_OPT_MSG_VOID
(
m3
->
invoke
(
make_message
(
1.
)));
C
AF
_CHECK_OPT_MSG_VOID
(
m3
->
invoke
(
make_message
(
1.
f
)));
}
{
// --- use match_expr with result ---
auto
m4
=
on
<
int
>
()
>>
[](
int
i
)
{
return
i
;
};
C
PPA_CHECK_VARIANT
(
m4
(
make_message
(
42
)
),
int
,
42
);
C
AF_CHECK_VARIANT
(
m4
,
make_message
(
42
),
int
,
42
);
auto
m5
=
on
<
float
>
()
>>
[](
float
f
)
{
return
f
;
};
C
PPA_CHECK_VARIANT
(
m5
(
make_message
(
4.2
f
)
),
float
,
4.2
f
);
C
AF_CHECK_VARIANT
(
m5
,
make_message
(
4.2
f
),
float
,
4.2
f
);
auto
m6
=
m4
.
or_else
(
m5
);
C
PPA_CHECK_VARIANT
(
m6
(
make_message
(
4.2
f
)
),
float
,
4.2
f
);
C
PPA_CHECK_VARIANT
(
m6
(
make_message
(
42
)
),
int
,
42
);
C
AF_CHECK_VARIANT
(
m6
,
make_message
(
4.2
f
),
float
,
4.2
f
);
C
AF_CHECK_VARIANT
(
m6
,
make_message
(
42
),
int
,
42
);
}
{
// --- storing some match_expr in a behavior ---
behavior
m5
{
on
(
1
)
>>
[]
{
return
2
;
},
on
(
1.
f
)
>>
[]
{
return
2.
f
;
},
on
(
1.
)
>>
[]
{
return
2.
;
}};
C
PPA_CHECK_OPT_MSG
(
m5
(
make_message
(
1
)
),
int
,
2
);
C
PPA_CHECK_OPT_MSG
(
m5
(
make_message
(
1.
)
),
double
,
2.
);
C
PPA_CHECK_OPT_MSG
(
m5
(
make_message
(
1.
f
)
),
float
,
2.
f
);
C
AF_CHECK_OPT_MSG
(
m5
,
make_message
(
1
),
int
,
2
);
C
AF_CHECK_OPT_MSG
(
m5
,
make_message
(
1.
),
double
,
2.
);
C
AF_CHECK_OPT_MSG
(
m5
,
make_message
(
1.
f
),
float
,
2.
f
);
}
return
C
PPA
_TEST_RESULT
();
return
C
AF
_TEST_RESULT
();
}
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