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
e01bde19
Commit
e01bde19
authored
Nov 01, 2019
by
Dominik Charousset
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Rename fan_in{ => _responses}
parent
d2909f6a
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
32 additions
and
31 deletions
+32
-31
libcaf_core/caf/policy/fan_in_responses.hpp
libcaf_core/caf/policy/fan_in_responses.hpp
+19
-18
libcaf_core/test/policy/fan_in_responses.cpp
libcaf_core/test/policy/fan_in_responses.cpp
+13
-13
No files found.
libcaf_core/caf/policy/fan_in.hpp
→
libcaf_core/caf/policy/fan_in
_responses
.hpp
View file @
e01bde19
...
@@ -36,7 +36,7 @@ namespace caf {
...
@@ -36,7 +36,7 @@ namespace caf {
namespace
detail
{
namespace
detail
{
template
<
class
F
,
class
T
>
template
<
class
F
,
class
T
>
struct
fan_in_helper
{
struct
fan_in_
responses_
helper
{
std
::
vector
<
T
>
results
;
std
::
vector
<
T
>
results
;
std
::
shared_ptr
<
size_t
>
pending
;
std
::
shared_ptr
<
size_t
>
pending
;
F
f
;
F
f
;
...
@@ -50,7 +50,7 @@ struct fan_in_helper {
...
@@ -50,7 +50,7 @@ struct fan_in_helper {
}
}
template
<
class
Fun
>
template
<
class
Fun
>
fan_in_helper
(
size_t
pending
,
Fun
&&
f
)
fan_in_
responses_
helper
(
size_t
pending
,
Fun
&&
f
)
:
pending
(
std
::
make_shared
<
size_t
>
(
pending
)),
f
(
std
::
forward
<
Fun
>
(
f
))
{
:
pending
(
std
::
make_shared
<
size_t
>
(
pending
)),
f
(
std
::
forward
<
Fun
>
(
f
))
{
results
.
reserve
(
pending
);
results
.
reserve
(
pending
);
}
}
...
@@ -62,7 +62,7 @@ struct fan_in_helper {
...
@@ -62,7 +62,7 @@ struct fan_in_helper {
};
};
template
<
class
F
,
class
...
Ts
>
template
<
class
F
,
class
...
Ts
>
struct
fan_in_tuple_helper
{
struct
fan_in_
responses_
tuple_helper
{
using
value_type
=
std
::
tuple
<
Ts
...
>
;
using
value_type
=
std
::
tuple
<
Ts
...
>
;
std
::
vector
<
value_type
>
results
;
std
::
vector
<
value_type
>
results
;
std
::
shared_ptr
<
size_t
>
pending
;
std
::
shared_ptr
<
size_t
>
pending
;
...
@@ -77,7 +77,7 @@ struct fan_in_tuple_helper {
...
@@ -77,7 +77,7 @@ struct fan_in_tuple_helper {
}
}
template
<
class
Fun
>
template
<
class
Fun
>
fan_in_tuple_helper
(
size_t
pending
,
Fun
&&
f
)
fan_in_
responses_
tuple_helper
(
size_t
pending
,
Fun
&&
f
)
:
pending
(
std
::
make_shared
<
size_t
>
(
pending
)),
f
(
std
::
forward
<
Fun
>
(
f
))
{
:
pending
(
std
::
make_shared
<
size_t
>
(
pending
)),
f
(
std
::
forward
<
Fun
>
(
f
))
{
results
.
reserve
(
pending
);
results
.
reserve
(
pending
);
}
}
...
@@ -89,28 +89,29 @@ struct fan_in_tuple_helper {
...
@@ -89,28 +89,29 @@ struct fan_in_tuple_helper {
};
};
template
<
class
F
,
class
=
typename
detail
::
get_callable_trait
<
F
>
::
arg_types
>
template
<
class
F
,
class
=
typename
detail
::
get_callable_trait
<
F
>
::
arg_types
>
struct
select_fan_in_helper
;
struct
select_fan_in_
responses_
helper
;
template
<
class
F
,
class
...
Ts
>
template
<
class
F
,
class
...
Ts
>
struct
select_fan_in_
helper
<
F
,
struct
select_fan_in_
responses_helper
<
detail
::
type_list
<
std
::
vector
<
std
::
tuple
<
Ts
...
>>>>
{
F
,
detail
::
type_list
<
std
::
vector
<
std
::
tuple
<
Ts
...
>>>>
{
using
type
=
fan_in_tuple_helper
<
F
,
Ts
...
>
;
using
type
=
fan_in_
responses_
tuple_helper
<
F
,
Ts
...
>
;
};
};
template
<
class
F
,
class
T
>
template
<
class
F
,
class
T
>
struct
select_fan_in_helper
<
F
,
detail
::
type_list
<
std
::
vector
<
T
>>>
{
struct
select_fan_in_
responses_
helper
<
F
,
detail
::
type_list
<
std
::
vector
<
T
>>>
{
using
type
=
fan_in_helper
<
F
,
T
>
;
using
type
=
fan_in_
responses_
helper
<
F
,
T
>
;
};
};
template
<
class
F
>
template
<
class
F
>
using
fan_in_helper_t
=
typename
select_fan_in_helper
<
F
>::
type
;
using
fan_in_responses_helper_t
=
typename
select_fan_in_responses_helper
<
F
>::
type
;
// TODO: Replace with a lambda when switching to C++17 (move g into lambda).
// TODO: Replace with a lambda when switching to C++17 (move g into lambda).
template
<
class
G
>
template
<
class
G
>
class
fan_in_error_handler
{
class
fan_in_
responses_
error_handler
{
public:
public:
template
<
class
Fun
>
template
<
class
Fun
>
fan_in_error_handler
(
Fun
&&
fun
,
std
::
shared_ptr
<
size_t
>
pending
)
fan_in_
responses_
error_handler
(
Fun
&&
fun
,
std
::
shared_ptr
<
size_t
>
pending
)
:
handler
(
std
::
forward
<
Fun
>
(
fun
)),
pending
(
std
::
move
(
pending
))
{
:
handler
(
std
::
forward
<
Fun
>
(
fun
)),
pending
(
std
::
move
(
pending
))
{
// nop
// nop
}
}
...
@@ -138,9 +139,9 @@ namespace policy {
...
@@ -138,9 +139,9 @@ namespace policy {
/// @relates mixin::requester
/// @relates mixin::requester
/// @relates response_handle
/// @relates response_handle
template
<
class
ResponseType
>
template
<
class
ResponseType
>
class
fan_in
{
class
fan_in
_responses
{
public:
public:
fan_in
(
std
::
vector
<
message_id
>
ids
)
:
ids_
(
std
::
move
(
ids
))
{
fan_in
_responses
(
std
::
vector
<
message_id
>
ids
)
:
ids_
(
std
::
move
(
ids
))
{
CAF_ASSERT
(
ids_
.
size
()
CAF_ASSERT
(
ids_
.
size
()
<=
static_cast
<
size_t
>
(
std
::
numeric_limits
<
int
>::
max
()));
<=
static_cast
<
size_t
>
(
std
::
numeric_limits
<
int
>::
max
()));
}
}
...
@@ -161,7 +162,7 @@ public:
...
@@ -161,7 +162,7 @@ public:
template
<
class
Self
,
class
F
,
class
OnError
>
template
<
class
Self
,
class
F
,
class
OnError
>
void
receive
(
Self
*
self
,
F
&&
f
,
OnError
&&
g
)
{
void
receive
(
Self
*
self
,
F
&&
f
,
OnError
&&
g
)
{
using
helper_type
=
detail
::
fan_in_helper_t
<
detail
::
decay_t
<
F
>>
;
using
helper_type
=
detail
::
fan_in_
responses_
helper_t
<
detail
::
decay_t
<
F
>>
;
helper_type
helper
{
ids_
.
size
(),
std
::
forward
<
F
>
(
f
)};
helper_type
helper
{
ids_
.
size
(),
std
::
forward
<
F
>
(
f
)};
detail
::
type_checker
<
ResponseType
,
helper_type
>::
check
();
detail
::
type_checker
<
ResponseType
,
helper_type
>::
check
();
auto
error_handler
=
[
&
](
error
&
err
)
{
auto
error_handler
=
[
&
](
error
&
err
)
{
...
@@ -182,8 +183,8 @@ private:
...
@@ -182,8 +183,8 @@ private:
template
<
class
F
,
class
OnError
>
template
<
class
F
,
class
OnError
>
behavior
make_behavior
(
F
&&
f
,
OnError
&&
g
)
{
behavior
make_behavior
(
F
&&
f
,
OnError
&&
g
)
{
using
namespace
detail
;
using
namespace
detail
;
using
helper_type
=
fan_in_helper_t
<
decay_t
<
F
>>
;
using
helper_type
=
fan_in_
responses_
helper_t
<
decay_t
<
F
>>
;
using
error_handler_type
=
fan_in_error_handler
<
decay_t
<
OnError
>>
;
using
error_handler_type
=
fan_in_
responses_
error_handler
<
decay_t
<
OnError
>>
;
helper_type
helper
{
ids_
.
size
(),
std
::
move
(
f
)};
helper_type
helper
{
ids_
.
size
(),
std
::
move
(
f
)};
type_checker
<
ResponseType
,
helper_type
>::
check
();
type_checker
<
ResponseType
,
helper_type
>::
check
();
error_handler_type
err_helper
{
std
::
forward
<
OnError
>
(
g
),
helper
.
pending
};
error_handler_type
err_helper
{
std
::
forward
<
OnError
>
(
g
),
helper
.
pending
};
...
...
libcaf_core/test/policy/fan_in.cpp
→
libcaf_core/test/policy/fan_in
_responses
.cpp
View file @
e01bde19
...
@@ -16,9 +16,9 @@
...
@@ -16,9 +16,9 @@
* http://www.boost.org/LICENSE_1_0.txt. *
* http://www.boost.org/LICENSE_1_0.txt. *
******************************************************************************/
******************************************************************************/
#define CAF_SUITE policy.fan_in
#define CAF_SUITE policy.fan_in
_responses
#include "caf/policy/fan_in.hpp"
#include "caf/policy/fan_in
_responses
.hpp"
#include "caf/test/dsl.hpp"
#include "caf/test/dsl.hpp"
...
@@ -28,7 +28,7 @@
...
@@ -28,7 +28,7 @@
#include "caf/event_based_actor.hpp"
#include "caf/event_based_actor.hpp"
#include "caf/sec.hpp"
#include "caf/sec.hpp"
using
caf
::
policy
::
fan_in
;
using
caf
::
policy
::
fan_in
_responses
;
using
namespace
caf
;
using
namespace
caf
;
...
@@ -63,9 +63,9 @@ struct fixture : test_coordinator_fixture<> {
...
@@ -63,9 +63,9 @@ struct fixture : test_coordinator_fixture<> {
CAF_MESSAGE("subtest: " message); \
CAF_MESSAGE("subtest: " message); \
for (int subtest_dummy = 0; subtest_dummy < 1; ++subtest_dummy)
for (int subtest_dummy = 0; subtest_dummy < 1; ++subtest_dummy)
CAF_TEST_FIXTURE_SCOPE
(
fan_in_tests
,
fixture
)
CAF_TEST_FIXTURE_SCOPE
(
fan_in_
responses_
tests
,
fixture
)
CAF_TEST
(
fan_in
combines
two
integer
results
into
one
vector
)
{
CAF_TEST
(
fan_in
_responses
combines
two
integer
results
into
one
vector
)
{
using
int_list
=
std
::
vector
<
int
>
;
using
int_list
=
std
::
vector
<
int
>
;
auto
f
=
[](
int
x
,
int
y
)
{
return
x
+
y
;
};
auto
f
=
[](
int
x
,
int
y
)
{
return
x
+
y
;
};
auto
server1
=
make_server
(
f
);
auto
server1
=
make_server
(
f
);
...
@@ -74,7 +74,7 @@ CAF_TEST(fan_in combines two integer results into one vector) {
...
@@ -74,7 +74,7 @@ CAF_TEST(fan_in combines two integer results into one vector) {
SUBTEST
(
"vector of int"
)
{
SUBTEST
(
"vector of int"
)
{
auto
r1
=
self
->
request
(
server1
,
infinite
,
1
,
2
);
auto
r1
=
self
->
request
(
server1
,
infinite
,
1
,
2
);
auto
r2
=
self
->
request
(
server2
,
infinite
,
2
,
3
);
auto
r2
=
self
->
request
(
server2
,
infinite
,
2
,
3
);
fan_in
<
detail
::
type_list
<
int
>>
merge
{{
r1
.
id
(),
r2
.
id
()}};
fan_in
_responses
<
detail
::
type_list
<
int
>>
merge
{{
r1
.
id
(),
r2
.
id
()}};
run
();
run
();
merge
.
receive
(
merge
.
receive
(
self
.
ptr
(),
self
.
ptr
(),
...
@@ -88,7 +88,7 @@ CAF_TEST(fan_in combines two integer results into one vector) {
...
@@ -88,7 +88,7 @@ CAF_TEST(fan_in combines two integer results into one vector) {
using
std
::
make_tuple
;
using
std
::
make_tuple
;
auto
r1
=
self
->
request
(
server1
,
infinite
,
1
,
2
);
auto
r1
=
self
->
request
(
server1
,
infinite
,
1
,
2
);
auto
r2
=
self
->
request
(
server2
,
infinite
,
2
,
3
);
auto
r2
=
self
->
request
(
server2
,
infinite
,
2
,
3
);
fan_in
<
detail
::
type_list
<
int
>>
merge
{{
r1
.
id
(),
r2
.
id
()}};
fan_in
_responses
<
detail
::
type_list
<
int
>>
merge
{{
r1
.
id
(),
r2
.
id
()}};
run
();
run
();
using
results_vector
=
std
::
vector
<
std
::
tuple
<
int
>>
;
using
results_vector
=
std
::
vector
<
std
::
tuple
<
int
>>
;
merge
.
receive
(
merge
.
receive
(
...
@@ -106,7 +106,7 @@ CAF_TEST(fan_in combines two integer results into one vector) {
...
@@ -106,7 +106,7 @@ CAF_TEST(fan_in combines two integer results into one vector) {
auto
client
=
sys
.
spawn
([
=
,
&
results
](
event_based_actor
*
client_ptr
)
{
auto
client
=
sys
.
spawn
([
=
,
&
results
](
event_based_actor
*
client_ptr
)
{
auto
r1
=
client_ptr
->
request
(
server1
,
infinite
,
1
,
2
);
auto
r1
=
client_ptr
->
request
(
server1
,
infinite
,
1
,
2
);
auto
r2
=
client_ptr
->
request
(
server2
,
infinite
,
2
,
3
);
auto
r2
=
client_ptr
->
request
(
server2
,
infinite
,
2
,
3
);
fan_in
<
detail
::
type_list
<
int
>>
merge
{{
r1
.
id
(),
r2
.
id
()}};
fan_in
_responses
<
detail
::
type_list
<
int
>>
merge
{{
r1
.
id
(),
r2
.
id
()}};
merge
.
then
(
merge
.
then
(
client_ptr
,
[
&
results
](
int_list
xs
)
{
results
=
std
::
move
(
xs
);
},
client_ptr
,
[
&
results
](
int_list
xs
)
{
results
=
std
::
move
(
xs
);
},
make_error_handler
());
make_error_handler
());
...
@@ -124,7 +124,7 @@ CAF_TEST(fan_in combines two integer results into one vector) {
...
@@ -124,7 +124,7 @@ CAF_TEST(fan_in combines two integer results into one vector) {
auto
client
=
sys
.
spawn
([
=
,
&
results
](
event_based_actor
*
client_ptr
)
{
auto
client
=
sys
.
spawn
([
=
,
&
results
](
event_based_actor
*
client_ptr
)
{
auto
r1
=
client_ptr
->
request
(
server1
,
infinite
,
1
,
2
);
auto
r1
=
client_ptr
->
request
(
server1
,
infinite
,
1
,
2
);
auto
r2
=
client_ptr
->
request
(
server2
,
infinite
,
2
,
3
);
auto
r2
=
client_ptr
->
request
(
server2
,
infinite
,
2
,
3
);
fan_in
<
detail
::
type_list
<
int
>>
merge
{{
r1
.
id
(),
r2
.
id
()}};
fan_in
_responses
<
detail
::
type_list
<
int
>>
merge
{{
r1
.
id
(),
r2
.
id
()}};
merge
.
await
(
merge
.
await
(
client_ptr
,
[
&
results
](
int_list
xs
)
{
results
=
std
::
move
(
xs
);
},
client_ptr
,
[
&
results
](
int_list
xs
)
{
results
=
std
::
move
(
xs
);
},
make_error_handler
());
make_error_handler
());
...
@@ -141,7 +141,7 @@ CAF_TEST(fan_in combines two integer results into one vector) {
...
@@ -141,7 +141,7 @@ CAF_TEST(fan_in combines two integer results into one vector) {
}
}
}
}
CAF_TEST
(
fan_in
calls
the
error
handler
at
most
once
)
{
CAF_TEST
(
fan_in
_responses
calls
the
error
handler
at
most
once
)
{
using
int_list
=
std
::
vector
<
int
>
;
using
int_list
=
std
::
vector
<
int
>
;
auto
f
=
[](
int
,
int
)
->
result
<
int
>
{
return
sec
::
invalid_argument
;
};
auto
f
=
[](
int
,
int
)
->
result
<
int
>
{
return
sec
::
invalid_argument
;
};
auto
server1
=
make_server
(
f
);
auto
server1
=
make_server
(
f
);
...
@@ -149,7 +149,7 @@ CAF_TEST(fan_in calls the error handler at most once) {
...
@@ -149,7 +149,7 @@ CAF_TEST(fan_in calls the error handler at most once) {
SUBTEST
(
"request.receive"
)
{
SUBTEST
(
"request.receive"
)
{
auto
r1
=
self
->
request
(
server1
,
infinite
,
1
,
2
);
auto
r1
=
self
->
request
(
server1
,
infinite
,
1
,
2
);
auto
r2
=
self
->
request
(
server2
,
infinite
,
2
,
3
);
auto
r2
=
self
->
request
(
server2
,
infinite
,
2
,
3
);
fan_in
<
detail
::
type_list
<
int
>>
merge
{{
r1
.
id
(),
r2
.
id
()}};
fan_in
_responses
<
detail
::
type_list
<
int
>>
merge
{{
r1
.
id
(),
r2
.
id
()}};
run
();
run
();
size_t
errors
=
0
;
size_t
errors
=
0
;
merge
.
receive
(
merge
.
receive
(
...
@@ -163,7 +163,7 @@ CAF_TEST(fan_in calls the error handler at most once) {
...
@@ -163,7 +163,7 @@ CAF_TEST(fan_in calls the error handler at most once) {
auto
client
=
sys
.
spawn
([
=
,
&
errors
](
event_based_actor
*
client_ptr
)
{
auto
client
=
sys
.
spawn
([
=
,
&
errors
](
event_based_actor
*
client_ptr
)
{
auto
r1
=
client_ptr
->
request
(
server1
,
infinite
,
1
,
2
);
auto
r1
=
client_ptr
->
request
(
server1
,
infinite
,
1
,
2
);
auto
r2
=
client_ptr
->
request
(
server2
,
infinite
,
2
,
3
);
auto
r2
=
client_ptr
->
request
(
server2
,
infinite
,
2
,
3
);
fan_in
<
detail
::
type_list
<
int
>>
merge
{{
r1
.
id
(),
r2
.
id
()}};
fan_in
_responses
<
detail
::
type_list
<
int
>>
merge
{{
r1
.
id
(),
r2
.
id
()}};
merge
.
then
(
merge
.
then
(
client_ptr
,
client_ptr
,
[](
int_list
)
{
CAF_FAIL
(
"fan-in policy called the result handler"
);
},
[](
int_list
)
{
CAF_FAIL
(
"fan-in policy called the result handler"
);
},
...
@@ -181,7 +181,7 @@ CAF_TEST(fan_in calls the error handler at most once) {
...
@@ -181,7 +181,7 @@ CAF_TEST(fan_in calls the error handler at most once) {
auto
client
=
sys
.
spawn
([
=
,
&
errors
](
event_based_actor
*
client_ptr
)
{
auto
client
=
sys
.
spawn
([
=
,
&
errors
](
event_based_actor
*
client_ptr
)
{
auto
r1
=
client_ptr
->
request
(
server1
,
infinite
,
1
,
2
);
auto
r1
=
client_ptr
->
request
(
server1
,
infinite
,
1
,
2
);
auto
r2
=
client_ptr
->
request
(
server2
,
infinite
,
2
,
3
);
auto
r2
=
client_ptr
->
request
(
server2
,
infinite
,
2
,
3
);
fan_in
<
detail
::
type_list
<
int
>>
merge
{{
r1
.
id
(),
r2
.
id
()}};
fan_in
_responses
<
detail
::
type_list
<
int
>>
merge
{{
r1
.
id
(),
r2
.
id
()}};
merge
.
await
(
merge
.
await
(
client_ptr
,
client_ptr
,
[](
int_list
)
{
CAF_FAIL
(
"fan-in policy called the result handler"
);
},
[](
int_list
)
{
CAF_FAIL
(
"fan-in policy called the result handler"
);
},
...
...
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