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
dfea897e
Commit
dfea897e
authored
Mar 16, 2011
by
neverlord
Browse files
Options
Browse Files
Download
Plain Diff
fixed conflict
parents
929da7cc
8021cd02
Changes
28
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
28 changed files
with
401 additions
and
256 deletions
+401
-256
cppa.creator.user
cppa.creator.user
+4
-4
cppa.files
cppa.files
+3
-0
cppa/actor.hpp
cppa/actor.hpp
+4
-2
cppa/detail/actor_private.hpp
cppa/detail/actor_private.hpp
+5
-0
cppa/detail/ref_counted_impl.hpp
cppa/detail/ref_counted_impl.hpp
+2
-2
cppa/intrusive_ptr.hpp
cppa/intrusive_ptr.hpp
+31
-7
cppa/match.hpp
cppa/match.hpp
+3
-1
cppa/message.hpp
cppa/message.hpp
+6
-3
cppa/message_receiver.hpp
cppa/message_receiver.hpp
+2
-0
cppa/on.hpp
cppa/on.hpp
+15
-5
cppa/uniform_type_info.hpp
cppa/uniform_type_info.hpp
+1
-1
cppa/util.hpp
cppa/util.hpp
+2
-0
cppa/util/compare_tuples.hpp
cppa/util/compare_tuples.hpp
+43
-0
cppa/util/eval_type_lists.hpp
cppa/util/eval_type_lists.hpp
+1
-1
cppa/util/singly_linked_list.hpp
cppa/util/singly_linked_list.hpp
+10
-0
libcppa.Makefile
libcppa.Makefile
+1
-0
src/actor.cpp
src/actor.cpp
+21
-0
src/deserializer.cpp
src/deserializer.cpp
+1
-1
src/message_receiver.cpp
src/message_receiver.cpp
+4
-0
src/mock_scheduler.cpp
src/mock_scheduler.cpp
+10
-4
src/uniform_type_info.cpp
src/uniform_type_info.cpp
+142
-123
unit_testing/main.cpp
unit_testing/main.cpp
+1
-0
unit_testing/test.hpp
unit_testing/test.hpp
+0
-4
unit_testing/test__a_matches_b.cpp
unit_testing/test__a_matches_b.cpp
+6
-2
unit_testing/test__atom.cpp
unit_testing/test__atom.cpp
+1
-0
unit_testing/test__local_group.cpp
unit_testing/test__local_group.cpp
+69
-95
unit_testing/test__serialization.cpp
unit_testing/test__serialization.cpp
+1
-1
unit_testing/test__tuple.cpp
unit_testing/test__tuple.cpp
+12
-0
No files found.
cppa.creator.user
View file @
dfea897e
...
...
@@ -60,15 +60,15 @@
<valuemap
type=
"QVariantMap"
>
<value
key=
"ProjectExplorer.BuildConfiguration.DisplayName"
type=
"QString"
>
all
</value>
<valuelist
key=
"abstractProcess.Environment"
type=
"QVariantList"
>
<value
type=
"QString"
>
Apple_PubSub_Socket_Render=/tmp/launch-
gSC9AO
/Render
</value>
<value
type=
"QString"
>
Apple_PubSub_Socket_Render=/tmp/launch-
Ii2KqP
/Render
</value>
<value
type=
"QString"
>
COMMAND_MODE=unix2003
</value>
<value
type=
"QString"
>
DISPLAY=/tmp/launch-
1vsPWG
/org.x:0
</value>
<value
type=
"QString"
>
DISPLAY=/tmp/launch-
6FAyZP
/org.x:0
</value>
<value
type=
"QString"
>
HOME=/Users/neverlord
</value>
<value
type=
"QString"
>
LOGNAME=neverlord
</value>
<value
type=
"QString"
>
PATH=/usr/bin:/bin:/usr/sbin:/sbin
</value>
<value
type=
"QString"
>
SHELL=/bin/bash
</value>
<value
type=
"QString"
>
SSH_AUTH_SOCK=/tmp/launch-
H5MBik
/Listeners
</value>
<value
type=
"QString"
>
TMPDIR=/var/folders/
SE/SEReyCW0H-yDPCnNCe8mN+
+++TI/-Tmp-/
</value>
<value
type=
"QString"
>
SSH_AUTH_SOCK=/tmp/launch-
vifjfO
/Listeners
</value>
<value
type=
"QString"
>
TMPDIR=/var/folders/
1p/1p6iuPgbH7GoDkrjrT20tU
+++TI/-Tmp-/
</value>
<value
type=
"QString"
>
USER=neverlord
</value>
<value
type=
"QString"
>
__CF_USER_TEXT_ENCODING=0x1F5:0:3
</value>
</valuelist>
...
...
cppa.files
View file @
dfea897e
...
...
@@ -93,3 +93,6 @@ cppa/detail/channel.hpp
cppa/message_receiver.hpp
src/message_receiver.cpp
src/actor.cpp
src/actor_private.cpp
cppa/util/eval_first_n.hpp
cppa/util/first_n.hpp
cppa/actor.hpp
View file @
dfea897e
...
...
@@ -15,11 +15,13 @@ class actor : public message_receiver
public:
typedef
cppa
::
intrusive_ptr
<
detail
::
actor_p
ublic
>
ptr_type
;
typedef
cppa
::
intrusive_ptr
<
detail
::
actor_p
rivate
>
ptr_type
;
actor
()
=
default
;
inline
actor
(
detail
::
actor_public
*
ptr
)
:
super
(
ptr
)
{
}
~
actor
();
inline
actor
(
detail
::
actor_private
*
ptr
)
:
super
(
ptr
)
{
}
inline
actor
(
const
ptr_type
&
ptr
)
:
super
(
ptr
)
{
}
...
...
cppa/detail/actor_private.hpp
View file @
dfea897e
#ifndef ACTOR_PRIVATE_HPP
#define ACTOR_PRIVATE_HPP
#include <boost/thread/thread.hpp>
#include "cppa/invoke_rules.hpp"
#include "cppa/untyped_tuple.hpp"
...
...
@@ -14,6 +16,9 @@ namespace cppa { namespace detail {
// private part of the actor interface (callable only from this_actor())
struct
actor_private
:
public
actor_public
{
boost
::
thread
*
m_thread
;
inline
actor_private
()
:
m_thread
(
0
)
{
}
virtual
~
actor_private
();
virtual
const
message
&
receive
()
=
0
;
virtual
const
message
&
last_dequeued
()
const
=
0
;
virtual
void
receive
(
invoke_rules
&
)
=
0
;
...
...
cppa/detail/ref_counted_impl.hpp
View file @
dfea897e
...
...
@@ -21,9 +21,9 @@ class ref_counted_impl
inline
void
ref
()
{
++
m_rc
;
}
inline
bool
deref
()
{
return
(
--
m_rc
>
0
)
;
}
inline
bool
deref
()
{
return
--
m_rc
>
0
;
}
inline
bool
unique
()
{
return
(
m_rc
==
1
)
;
}
inline
bool
unique
()
{
return
m_rc
==
1
;
}
};
...
...
cppa/intrusive_ptr.hpp
View file @
dfea897e
...
...
@@ -26,25 +26,39 @@ class intrusive_ptr : detail::comparable<intrusive_ptr<T>, T*>,
intrusive_ptr
()
:
m_ptr
(
0
)
{
}
template
<
typename
Y
>
intrusive_ptr
(
Y
*
raw_ptr
)
{
set_ptr
(
raw_ptr
);
}
intrusive_ptr
(
T
*
raw_ptr
)
{
set_ptr
(
raw_ptr
);
}
intrusive_ptr
(
intrusive_ptr
&&
other
)
:
m_ptr
(
other
.
m_pt
r
)
intrusive_ptr
(
const
intrusive_ptr
&
othe
r
)
{
other
.
m_ptr
=
0
;
set_ptr
(
other
.
m_ptr
)
;
}
intrusive_ptr
(
const
intrusive_ptr
&
other
)
{
set_ptr
(
other
.
m_ptr
);
}
intrusive_ptr
(
intrusive_ptr
&&
other
)
:
m_ptr
(
0
)
{
swap
(
other
);
}
template
<
typename
Y
>
intrusive_ptr
(
const
intrusive_ptr
<
Y
>&
other
)
{
static_assert
(
std
::
is_convertible
<
Y
*
,
T
*>::
value
,
"Y* is not assignable to T*"
);
set_ptr
(
const_cast
<
Y
*>
(
other
.
get
()));
}
~
intrusive_ptr
()
{
if
(
m_ptr
&&
!
m_ptr
->
deref
())
delete
m_ptr
;
}
template
<
typename
Y
>
intrusive_ptr
(
intrusive_ptr
<
Y
>&&
other
)
:
m_ptr
(
0
)
{
swap
(
other
);
}
~
intrusive_ptr
()
{
if
(
m_ptr
&&
!
m_ptr
->
deref
())
{
delete
m_ptr
;
}
}
T
*
get
()
{
return
m_ptr
;
}
...
...
@@ -91,6 +105,16 @@ class intrusive_ptr : detail::comparable<intrusive_ptr<T>, T*>,
return
*
this
;
}
template
<
typename
Y
>
intrusive_ptr
&
operator
=
(
intrusive_ptr
<
Y
>&&
other
)
{
static_assert
(
std
::
is_convertible
<
Y
*
,
T
*>::
value
,
"Y* is not assignable to T*"
);
m_ptr
=
other
.
m_ptr
;
other
.
m_ptr
=
0
;
return
*
this
;
}
T
*
operator
->
()
{
return
m_ptr
;
}
T
&
operator
*
()
{
return
*
m_ptr
;
}
...
...
cppa/match.hpp
View file @
dfea897e
...
...
@@ -8,6 +8,7 @@
#include "cppa/tuple_view.hpp"
#include "cppa/untyped_tuple.hpp"
#include "cppa/util/compare_tuples.hpp"
#include "cppa/util/type_list.hpp"
#include "cppa/util/is_comparable.hpp"
#include "cppa/util/utype_iterator.hpp"
...
...
@@ -51,7 +52,8 @@ bool match(const untyped_tuple& what, const ValuesTuple& vals,
{
std
::
vector
<
std
::
size_t
>
tmp
(
mappings
);
view_type
view
(
what
.
vals
(),
std
::
move
(
tmp
));
return
view
==
vals
;
return
compare_first_elements
(
view
,
vals
);
// return view == vals;
}
return
false
;
}
...
...
cppa/message.hpp
View file @
dfea897e
...
...
@@ -23,7 +23,10 @@ class message
const
untyped_tuple
data
;
content
(
const
actor
&
s
,
const
message_receiver
&
r
,
const
untyped_tuple
&
ut
)
:
sender
(
s
),
receiver
(
r
),
data
(
ut
)
:
ref_counted
(),
sender
(
s
),
receiver
(
r
),
data
(
ut
)
{
}
~
content
()
{
}
};
...
...
@@ -41,8 +44,8 @@ class message
message
(
const
actor
&
from
,
const
message_receiver
&
to
,
const
untyped_tuple
&
ut
)
:
m_content
(
new
content
(
from
,
to
,
ut
))
{
}
message
(
const
actor
&
from
,
const
message_receiver
&
to
,
untyped_tuple
&&
ut
)
:
m_content
(
new
content
(
from
,
to
,
std
::
move
(
ut
)))
{
}
//
message(const actor& from, const message_receiver& to, untyped_tuple&& ut)
//
: m_content(new content(from, to, std::move(ut))) { }
message
()
:
m_content
(
new
content
(
0
,
0
,
tuple
<
int
>
(
0
)))
{
}
...
...
cppa/message_receiver.hpp
View file @
dfea897e
...
...
@@ -33,6 +33,8 @@ class message_receiver :
{
}
virtual
~
message_receiver
();
message_receiver
()
=
default
;
message_receiver
(
message_receiver
&&
)
=
default
;
...
...
cppa/on.hpp
View file @
dfea897e
...
...
@@ -5,6 +5,7 @@
#include "cppa/invoke_rules.hpp"
#include "cppa/untyped_tuple.hpp"
#include "cppa/util/eval_first_n.hpp"
#include "cppa/util/filter_type_list.hpp"
#include "cppa/detail/ref_counted_impl.hpp"
...
...
@@ -36,6 +37,12 @@ struct invoke_rule_builder
template
<
typename
Arg0
,
typename
...
Args
>
invoke_rule_builder
(
const
Arg0
&
arg0
,
const
Args
&
...
args
)
{
typedef
util
::
type_list
<
Arg0
,
Args
...
>
arg_types
;
static_assert
(
arg_types
::
type_list_size
<=
filtered_types
::
type_list_size
,
"too much arguments"
);
class
helper_impl
:
public
irb_helper
{
...
...
@@ -44,7 +51,9 @@ struct invoke_rule_builder
public:
helper_impl
(
const
Arg0
&
arg0
,
const
Args
&
...
args
)
:
m_values
(
arg0
,
args
...)
{
}
:
m_values
(
arg0
,
args
...)
{
}
virtual
bool
value_cmp
(
const
untyped_tuple
&
t
,
std
::
vector
<
std
::
size_t
>&
v
)
const
...
...
@@ -56,10 +65,11 @@ struct invoke_rule_builder
m_helper
=
new
helper_impl
(
arg0
,
args
...);
static_assert
(
util
::
eval_type_lists
<
filtered_types
,
util
::
type_list
<
Arg0
,
Args
...
>
,
util
::
is_comparable
>::
value
,
"Wrong argument types"
);
static_assert
(
util
::
eval_first_n
<
arg_types
::
type_list_size
,
filtered_types
,
arg_types
,
util
::
is_comparable
>::
value
,
"wrong argument types (not comparable)"
);
}
typedef
typename
tuple_view_type_from_type_list
<
filtered_types
>::
type
...
...
cppa/uniform_type_info.hpp
View file @
dfea897e
...
...
@@ -61,7 +61,7 @@ CPPA_ANNOUNCE(std::uint64_t);
CPPA_ANNOUNCE(float);
CPPA_ANNOUNCE(double);
CPPA_ANNOUNCE(long double);
*/
CPPA_ANNOUNCE(std::string);
*/
#endif // UNIFORM_TYPE_INFO_HPP
cppa/util.hpp
View file @
dfea897e
...
...
@@ -9,9 +9,11 @@
#include "cppa/util/detach.hpp"
#include "cppa/util/disjunction.hpp"
#include "cppa/util/enable_if.hpp"
#include "cppa/util/eval_first_n.hpp"
#include "cppa/util/eval_type_list.hpp"
#include "cppa/util/eval_type_lists.hpp"
#include "cppa/util/filter_type_list.hpp"
#include "cppa/util/first_n.hpp"
#include "cppa/util/has_copy_member_fun.hpp"
#include "cppa/util/is_comparable.hpp"
#include "cppa/util/is_copyable.hpp"
...
...
cppa/util/compare_tuples.hpp
View file @
dfea897e
...
...
@@ -3,6 +3,7 @@
#include "cppa/get.hpp"
#include "cppa/util/type_list.hpp"
#include "cppa/util/eval_first_n.hpp"
#include "cppa/util/is_comparable.hpp"
#include "cppa/util/eval_type_lists.hpp"
...
...
@@ -34,6 +35,25 @@ struct cmp_helper<0, LhsTuple, RhsTuple>
}
};
template
<
bool
ALessB
,
std
::
size_t
A
,
std
::
size_t
B
>
struct
min_impl
{
static
const
std
::
size_t
value
=
A
;
};
template
<
std
::
size_t
A
,
std
::
size_t
B
>
struct
min_impl
<
false
,
A
,
B
>
{
static
const
std
::
size_t
value
=
B
;
};
template
<
std
::
size_t
A
,
std
::
size_t
B
>
struct
min_
{
static
const
std
::
size_t
value
=
min_impl
<
(
A
<
B
),
A
,
B
>::
value
;
};
}
}
// namespace cppa::detail
namespace
cppa
{
namespace
util
{
...
...
@@ -55,6 +75,29 @@ bool compare_tuples(const LhsTuple<LhsTypes...>& lhs,
RhsTuple
<
RhsTypes
...
>>::
cmp
(
lhs
,
rhs
);
}
template
<
template
<
typename
...
>
class
LhsTuple
,
typename
...
LhsTypes
,
template
<
typename
...
>
class
RhsTuple
,
typename
...
RhsTypes
>
bool
compare_first_elements
(
const
LhsTuple
<
LhsTypes
...
>&
lhs
,
const
RhsTuple
<
RhsTypes
...
>&
rhs
)
{
typedef
util
::
type_list
<
LhsTypes
...
>
lhs_types
;
typedef
util
::
type_list
<
RhsTypes
...
>
rhs_types
;
static_assert
(
util
::
eval_first_n
<
detail
::
min_
<
lhs_types
::
type_list_size
,
rhs_types
::
type_list_size
>
::
value
,
lhs_types
,
rhs_types
,
util
::
is_comparable
>::
value
,
"types of lhs are not comparable to the types of rhs"
);
return
detail
::
cmp_helper
<
(
detail
::
min_
<
lhs_types
::
type_list_size
,
rhs_types
::
type_list_size
>
::
value
-
1
),
LhsTuple
<
LhsTypes
...
>
,
RhsTuple
<
RhsTypes
...
>>::
cmp
(
lhs
,
rhs
);
}
}
}
// namespace cppa::util
#endif // COMPARE_TUPLES_HPP
cppa/util/eval_type_lists.hpp
View file @
dfea897e
...
...
@@ -4,7 +4,6 @@
#include <type_traits>
#include "cppa/util/type_list.hpp"
#include "cppa/util/concat_type_lists.hpp"
namespace
cppa
{
namespace
util
{
...
...
@@ -18,6 +17,7 @@ struct eval_type_lists
typedef
typename
ListA
::
head_type
head_type_a
;
typedef
typename
ListA
::
tail_type
tail_type_a
;
typedef
typename
ListB
::
head_type
head_type_b
;
typedef
typename
ListB
::
tail_type
tail_type_b
;
...
...
cppa/util/singly_linked_list.hpp
View file @
dfea897e
...
...
@@ -18,6 +18,16 @@ class singly_linked_list
singly_linked_list
()
:
m_head
(
0
),
m_tail
(
0
)
{
}
~
singly_linked_list
()
{
while
(
m_head
)
{
T
*
next
=
m_head
->
next
;
delete
m_head
;
m_head
=
next
;
}
}
inline
bool
empty
()
const
{
return
m_head
==
0
;
}
void
push_back
(
element_type
*
what
)
...
...
libcppa.Makefile
View file @
dfea897e
...
...
@@ -55,6 +55,7 @@ HEADERS = cppa/actor.hpp \
cppa/util/void_type.hpp
SOURCES = src/actor.cpp \
src/actor_private.cpp \
src/decorated_tuple.cpp \
src/deserializer.cpp \
src/message_receiver.cpp \
...
...
src/actor.cpp
View file @
dfea897e
#include "cppa/actor.hpp"
#include <boost/thread.hpp>
namespace
cppa
{
actor
&
actor
::
operator
=
(
const
actor
&
other
)
...
...
@@ -14,4 +16,23 @@ actor& actor::operator=(actor&& other)
return
*
this
;
}
actor
::~
actor
()
{
/*
if (m_channel && m_channel->unique())
{
detail::actor_private* ap = dynamic_cast<detail::actor_private*>(m_channel.get());
if (ap && ap->m_thread)
{
if (boost::this_thread::get_id() != ap->m_thread->get_id())
{
ap->m_thread->join();
delete ap->m_thread;
ap->m_thread = 0;
}
}
}
*/
}
}
// namespace cppa
src/deserializer.cpp
View file @
dfea897e
...
...
@@ -18,6 +18,6 @@ cppa::deserializer& operator>>(cppa::deserializer& d, std::string& str)
d
.
read
(
str_size
,
cbuf
);
cbuf
[
str_size
]
=
0
;
str
=
cbuf
;
delete
cbuf
;
delete
[]
cbuf
;
return
d
;
}
src/message_receiver.cpp
View file @
dfea897e
...
...
@@ -22,4 +22,8 @@ message_receiver::operator=(intrusive_ptr<detail::channel>&& ch_ptr)
return
*
this
;
}
message_receiver
::~
message_receiver
()
{
}
}
// namespace cppa
src/mock_scheduler.cpp
View file @
dfea897e
...
...
@@ -11,7 +11,7 @@ struct actor_message
{
actor_message
*
next
;
cppa
::
message
msg
;
actor_message
(
const
cppa
::
message
&
from
)
:
msg
(
from
)
{
}
actor_message
(
const
cppa
::
message
&
from
)
:
next
(
0
),
msg
(
from
)
{
}
};
struct
actor_impl
;
...
...
@@ -31,6 +31,11 @@ struct actor_impl : cppa::detail::actor_private
actor_impl
(
cppa
::
detail
::
behavior
*
b
=
0
)
:
m_behavior
(
b
)
{
}
~
actor_impl
()
{
if
(
m_behavior
)
delete
m_behavior
;
}
virtual
void
enqueue_msg
(
const
cppa
::
message
&
msg
)
{
mailbox
.
push_back
(
new
actor_message
(
msg
));
...
...
@@ -98,7 +103,6 @@ struct actor_ptr
{
cppa
::
intrusive_ptr
<
actor_impl
>
m_impl
;
actor_ptr
(
actor_impl
*
ai
)
:
m_impl
(
ai
)
{
}
actor_ptr
(
actor_ptr
&&
other
)
:
m_impl
(
std
::
move
(
other
.
m_impl
))
{
}
actor_ptr
(
const
actor_ptr
&
)
=
default
;
void
operator
()()
{
...
...
@@ -130,8 +134,10 @@ namespace cppa { namespace detail {
actor
spawn_impl
(
behavior
*
actor_behavior
)
{
actor_ptr
aptr
(
new
actor_impl
(
actor_behavior
));
boost
::
thread
(
aptr
).
detach
();
return
actor
(
std
::
move
(
aptr
.
m_impl
));
aptr
.
m_impl
->
m_thread
=
new
boost
::
thread
(
aptr
);
// boost::thread(aptr).detach();
return
actor
(
aptr
.
m_impl
);
// return actor(std::move(aptr.m_impl));
}
}
}
// namespace cppa::detail
src/uniform_type_info.cpp
View file @
dfea897e
This diff is collapsed.
Click to expand it.
unit_testing/main.cpp
View file @
dfea897e
...
...
@@ -26,6 +26,7 @@ using std::endl;
int
main
(
int
argc
,
char
**
c_argv
)
{
std
::
vector
<
std
::
string
>
argv
;
for
(
int
i
=
1
;
i
<
argc
;
++
i
)
{
...
...
unit_testing/test.hpp
View file @
dfea897e
...
...
@@ -34,10 +34,6 @@ if ((lhs_loc) != (rhs_loc)) \
++error_count; \
} ((void) 0)
unsigned
int
hash_of
(
const
char
*
what
,
int
what_length
);
unsigned
int
hash_of
(
const
std
::
string
&
what
);
std
::
size_t
test__type_list
();
std
::
size_t
test__a_matches_b
();
std
::
size_t
test__atom
();
...
...
unit_testing/test__a_matches_b.cpp
View file @
dfea897e
...
...
@@ -16,6 +16,8 @@ std::size_t test__a_matches_b()
typedef
type_list
<
int
,
int
,
std
::
string
>
int_int_string
;
typedef
type_list
<
int
,
int
,
const
std
::
string
&>
int_int_const_string_ref
;
typedef
typename
first_n
<
2
,
int_float_int
>::
type
int_float
;
typedef
type_list_apply
<
int_int_const_string_ref
,
remove_const_reference
>::
type
int_int_string2
;
...
...
@@ -29,8 +31,10 @@ std::size_t test__a_matches_b()
CPPA_CHECK
((
a_matches_b
<
int_int_string
,
int_int_string2
>::
value
));
CPPA_CHECK
(
!
(
a_matches_b
<
int_int_string
,
int_int_const_string_ref
>::
value
));
CPPA_CHECK_EQUAL
((
a_matches_b
<
type_list
<
float
>
,
type_list
<
int
,
float
,
int
>>::
value
),
false
);
CPPA_CHECK
(
!
(
a_matches_b
<
type_list
<
float
>
,
type_list
<
int
,
float
,
int
>>::
value
));
CPPA_CHECK
((
std
::
is_same
<
util
::
type_list
<
int
,
float
>
,
int_float
>::
value
));
CPPA_CHECK
((
a_matches_b
<
type_list
<
any_type
*
,
float
>
,
type_list
<
int
,
float
,
int
>>::
value
)
==
false
);
...
...
unit_testing/test__atom.cpp
View file @
dfea897e
...
...
@@ -3,6 +3,7 @@
#include <iostream>
#include "test.hpp"
#include "hash_of.hpp"
#include "cppa/util.hpp"
using
std
::
cout
;
...
...
unit_testing/test__local_group.cpp
View file @
dfea897e
#include "test.hpp"
#include "hash_of.hpp"
#include "cppa/on.hpp"
#include "cppa/spawn.hpp"
...
...
@@ -19,119 +20,104 @@ using std::endl;
using
namespace
cppa
;
class
group
:
public
detail
::
channel
{
boost
::
mutex
m_mtx
;
std
::
list
<
actor
>
m_subscribers
;
namespace
{
public:
struct
group
:
detail
::
channel
{
struct
subscription
// NOT thread safe
class
subscription
:
public
detail
::
ref_counted_impl
<
std
::
size_t
>
{
actor
m_self
;
intrusive_ptr
<
group
>
m_group
;
public:
subscription
()
=
delete
;
subscription
(
const
subscription
&
)
=
delete
;
subscription
&
operator
=
(
const
subscription
&
)
=
delete
;
subscription
(
const
actor
&
s
,
const
intrusive_ptr
<
group
>&
g
)
:
m_self
(
s
),
m_group
(
g
)
{
}
~
subscription
()
{
m_group
->
unsubscribe
(
m_self
);
}
};
subscription
subscribe
(
const
actor
&
who
)
{
boost
::
mutex
::
scoped_lock
guard
(
m_mtx
);
m_subscribers
.
push_back
(
who
);
return
{
who
,
this
};
}
virtual
intrusive_ptr
<
subscription
>
subscribe
(
const
actor
&
who
)
=
0
;
void
unsubscribe
(
const
actor
&
who
)
{
boost
::
mutex
::
scoped_lock
guard
(
m_mtx
);
auto
i
=
std
::
find
(
m_subscribers
.
begin
(),
m_subscribers
.
end
(),
who
);
if
(
i
!=
m_subscribers
.
end
())
{
m_subscribers
.
erase
(
i
);
}
}
void
enqueue_msg
(
const
message
&
msg
)
{
boost
::
mutex
::
scoped_lock
guard
(
m_mtx
);
for
(
auto
i
=
m_subscribers
.
begin
();
i
!=
m_subscribers
.
end
();
++
i
)
{
i
->
enqueue_msg
(
msg
);
}
}
virtual
void
unsubscribe
(
const
actor
&
who
)
=
0
;
template
<
typename
...
Args
>
void
send
(
const
Args
&
...
args
)
{
message
msg
(
this_actor
(),
this
,
args
...);
enqueue_msg
(
msg
);
enqueue_msg
(
message
(
this_actor
(),
this
,
args
...));
}
};
namespace
{
class
group_bucket
class
local_group
:
public
group
{
boost
::
mutex
m_mtx
;
std
::
map
<
std
::
string
,
intrusive_ptr
<
group
>>
m_groups
;
std
::
list
<
actor
>
m_subscribers
;
inline
std
::
list
<
actor
>::
iterator
find
(
const
actor
&
what
)
{
return
std
::
find
(
m_subscribers
.
begin
(),
m_subscribers
.
end
(),
what
);
}
public:
intrusive_ptr
<
group
>
get
(
const
std
::
string
&
group_name
)
virtual
void
enqueue_msg
(
const
message
&
msg
)
{
boost
::
mutex
::
scoped_lock
guard
(
m_mtx
);
intrusive_ptr
<
group
>&
result
=
m_groups
[
group_name
];
if
(
!
result
)
for
(
auto
i
=
m_subscribers
.
begin
();
i
!=
m_subscribers
.
end
();
++
i
)
{
result
.
reset
(
new
group
);
i
->
enqueue_msg
(
msg
);
}
return
result
;
}
};
template
<
std
::
size_t
NumBuckets
>
class
group_table
{
group_bucket
m_buckets
[
NumBuckets
];
group_bucket
&
bucket
(
const
std
::
string
&
group_name
)
virtual
intrusive_ptr
<
group
::
subscription
>
subscribe
(
const
actor
&
who
)
{
unsigned
int
gn_hash
=
hash_of
(
group_name
);
return
m_buckets
[
gn_hash
%
NumBuckets
];
boost
::
mutex
::
scoped_lock
guard
(
m_mtx
);
auto
i
=
find
(
who
);
if
(
i
==
m_subscribers
.
end
())
{
m_subscribers
.
push_back
(
who
);
return
new
group
::
subscription
(
who
,
this
);
}
return
new
group
::
subscription
(
0
,
0
);
}
public:
intrusive_ptr
<
group
>
operator
[](
const
std
::
string
&
group_name
)
virtual
void
unsubscribe
(
const
actor
&
who
)
{
return
bucket
(
group_name
).
get
(
group_name
);
boost
::
mutex
::
scoped_lock
guard
(
m_mtx
);
auto
i
=
find
(
who
);
if
(
i
!=
m_subscribers
.
end
())
{
m_subscribers
.
erase
(
i
);
}
}
};
group_table
<
100
>
m_groups
;
//local_group* m_local_group = new local_group
;
}
// namespace <anonymous>
local_group
m_local_group
;
struct
group
&
local
(
const
char
*
)
{
intrusive_ptr
<
group
>
operator
/
(
const
std
::
string
&
group_name
)
{
return
m_groups
[
group_name
];
}
return
m_local_group
;
}
local
;
}
// namespace <anonymous>
struct
storage
{
...
...
@@ -159,12 +145,19 @@ struct storage
};
/*
template<typename... Args>
void send(std::list<actor>& actors, const Args&... args)
{
for (auto i = actors.begin(); i != actors.end(); ++i)
{
i->send(args...);
}
}
*/
void
foo_actor
()
{
auto
x
=
(
local
/
"foobar"
)
->
subscribe
(
this_actor
());
receive
(
on
<
int
,
int
,
int
>
()
>>
[]()
{
reply
(
23.
f
);
});
receive
(
on
<
int
>
()
>>
[](
int
i
)
{
reply
(
i
);
});
...
...
@@ -175,42 +168,23 @@ std::size_t test__local_group()
CPPA_TEST
(
test__local_group
);
/*
storage st;
st.get<int>("foobaz") = 42;
CPPA_CHECK_EQUAL(st.get<int>("foobaz"), 42);
st.get<std::string>("_s") = "Hello World!";
CPPA_CHECK_EQUAL(st.get<std::string>("_s"), "Hello World!");
*/
auto
g
=
local
/
"foobar"
;
std
::
list
<
intrusive_ptr
<
group
::
subscription
>>
m_subscriptions
;
group
&
lg
=
local
(
"foobar"
);
for
(
int
i
=
0
;
i
<
5
;
++
i
)
{
spawn
(
foo_actor
).
send
(
1
,
2
,
3
);
m_subscriptions
.
push_back
(
lg
.
subscribe
(
spawn
(
foo_actor
))
);
}
for
(
int
i
=
0
;
i
<
5
;
++
i
)
{
receive
(
on
<
float
>
()
>>
[]()
{
});
}
g
->
send
(
1
);
lg
.
send
(
1
);
int
result
=
0
;
auto
rule
=
on
<
int
>
()
>>
[
&
result
](
int
x
)
{
result
+=
x
;
};
for
(
int
i
=
0
;
i
<
5
;
++
i
)
{
receive
(
rule
);
receive
(
on
<
int
>
()
>>
[
&
result
](
int
x
)
{
result
+=
x
;
});
}
CPPA_CHECK_EQUAL
(
result
,
5
);
...
...
unit_testing/test__serialization.cpp
View file @
dfea897e
...
...
@@ -195,7 +195,7 @@ struct obj_types : util::abstract_type_list
~
obj_types
()
{
delete
m_arr
;
delete
[]
m_arr
;
}
virtual
std
::
size_t
size
()
const
{
return
m_size
;
}
...
...
unit_testing/test__tuple.cpp
View file @
dfea897e
...
...
@@ -73,6 +73,18 @@ std::size_t test__tuple()
CPPA_CHECK
(
tv2
.
get
<
1
>
()
==
"Hello World"
);
{
tuple
<
int
>
t1_sub1
(
42
);
tuple
<
int
,
float
>
t1_sub2
(
42
,
.2
f
);
tuple
<
int
,
float
,
int
>
t1_sub3
(
42
,
.2
f
,
2
);
CPPA_CHECK
((
util
::
compare_first_elements
(
t1
,
t1_sub1
)));
CPPA_CHECK
((
match
<
int
,
any_type
*>
(
t1
,
t1_sub1
)));
CPPA_CHECK
((
util
::
compare_first_elements
(
t1
,
t1_sub2
)));
CPPA_CHECK
((
match
<
int
,
any_type
*
,
float
,
any_type
*>
(
t1
,
t1_sub2
)));
CPPA_CHECK
((
util
::
compare_first_elements
(
t1
,
t1_sub3
)));
CPPA_CHECK
((
match
<
int
,
float
,
int
,
any_type
>
(
t1
,
t1_sub3
)));
}
{
std
::
vector
<
std
::
size_t
>
tv3_mappings
;
match
<
any_type
*
,
int
,
std
::
string
>
(
t1
,
tv3_mappings
);
...
...
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