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
40b92b4c
Commit
40b92b4c
authored
Sep 03, 2013
by
Joseph Noir
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'unstable' of github.com:Neverlord/libcppa into unstable
parents
a3970749
2b9b52af
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
123 additions
and
56 deletions
+123
-56
cppa/detail/projection.hpp
cppa/detail/projection.hpp
+2
-0
src/to_uniform_name.cpp
src/to_uniform_name.cpp
+121
-56
No files found.
cppa/detail/projection.hpp
View file @
40b92b4c
...
...
@@ -83,6 +83,8 @@ class projection {
typedef
typename
tdata_from_type_list
<
ProjectionFuns
>::
type
fun_container
;
typedef
util
::
type_list
<
typename
util
::
rm_const_and_ref
<
Ts
>::
type
...
>
arg_types
;
projection
()
=
default
;
projection
(
fun_container
&&
args
)
:
m_funs
(
std
::
move
(
args
))
{
}
...
...
src/to_uniform_name.cpp
View file @
40b92b4c
...
...
@@ -104,9 +104,16 @@ class parse_tree {
string
compile
()
const
{
string
result
;
if
(
has_children
())
{
for
(
auto
&
c
:
m_children
)
{
if
(
!
result
.
empty
())
result
+=
"::"
;
result
+=
map2decorated
(
c
.
compile
().
c_str
());
}
}
else
{
if
(
m_volatile
)
result
+=
"volatile "
;
if
(
m_const
)
result
+=
"const "
;
if
(
!
m_template
)
{
if
(
!
is_template
()
)
{
result
+=
map2decorated
(
m_name
.
c_str
());
}
else
{
...
...
@@ -114,16 +121,17 @@ class parse_tree {
full_name
+=
"<"
;
for
(
auto
&
tparam
:
m_template_parameters
)
{
// decorate each single template parameter
if
(
full_name
.
back
()
!=
'<'
)
full_name
+=
','
;
full_name
+=
tparam
.
compile
(
);
if
(
full_name
.
back
()
!=
'<'
)
full_name
+=
","
;
full_name
+=
map2decorated
(
tparam
.
compile
().
c_str
()
);
}
full_name
+=
">"
;
// decorate full name
result
+=
map2decorated
(
full_name
.
c_str
());
}
if
(
m_pointer
)
result
+=
'*'
;
if
(
m_lvalue_ref
)
result
+=
'&'
;
if
(
m_pointer
)
result
+=
"*"
;
if
(
m_lvalue_ref
)
result
+=
"&"
;
if
(
m_rvalue_ref
)
result
+=
"&&"
;
}
return
result
;
}
...
...
@@ -132,21 +140,68 @@ class parse_tree {
template
<
typename
Iterator
>
static
parse_tree
parse
(
Iterator
first
,
Iterator
last
)
{
typedef
reverse_iterator
<
Iterator
>
rev_iter
;
parse_tree
result
;
typedef
std
::
pair
<
Iterator
,
Iterator
>
range
;
std
::
vector
<
range
>
subranges
;
/* lifetime scope of temporary variables needed to fill 'subranges' */
{
auto
find_end
=
[
&
](
Iterator
from
)
{
auto
open
=
1
;
for
(
auto
i
=
from
+
1
;
i
!=
last
&&
open
>
0
;
++
i
)
{
switch
(
*
i
)
{
default:
break
;
case
'<'
:
++
open
;
break
;
case
'>'
:
if
(
--
open
==
0
)
return
i
;
break
;
}
}
return
last
;
};
auto
sub_first
=
find
(
first
,
last
,
'<'
);
auto
sub_last
=
find
(
rev_iter
(
last
),
rev_iter
(
first
),
'>'
).
base
()
-
1
;
if
(
sub_last
<
sub_first
)
{
sub_first
=
sub_last
=
last
;
while
(
sub_first
!=
last
)
{
subranges
.
emplace_back
(
sub_first
,
find_end
(
sub_first
));
sub_first
=
find
(
sub_first
+
1
,
last
,
'<'
);
}
}
auto
islegal
=
[](
char
c
)
{
return
isalnum
(
c
)
||
c
==
':'
||
c
==
'_'
;
};
vector
<
string
>
tokens
;
tokens
.
push_back
(
""
);
for
(
auto
i
=
first
;
i
!=
last
;)
{
if
(
i
==
sub_first
)
{
tokens
.
push_back
(
""
);
i
=
sub_last
;
vector
<
Iterator
>
scope_resolution_ops
;
auto
is_in_subrange
=
[
&
](
Iterator
i
)
{
for
(
auto
&
r
:
subranges
)
{
i
f
(
i
>=
r
.
first
&&
i
<
r
.
second
)
return
true
;
}
else
{
return
false
;
};
auto
add_child
=
[
&
](
Iterator
ch_first
,
Iterator
ch_last
)
{
result
.
m_children
.
push_back
(
parse
(
ch_first
,
ch_last
));
};
// scan string for "::" separators
const
char
*
scope_resultion
=
"::"
;
auto
sr_first
=
scope_resultion
;
auto
sr_last
=
sr_first
+
2
;
auto
scope_iter
=
search
(
first
,
last
,
sr_first
,
sr_last
);
if
(
scope_iter
!=
last
)
{
Iterator
itermediate
=
first
;
if
(
!
is_in_subrange
(
scope_iter
))
{
add_child
(
first
,
scope_iter
);
itermediate
=
scope_iter
+
2
;
}
while
(
scope_iter
!=
last
)
{
scope_iter
=
find_first_of
(
scope_iter
+
2
,
last
,
sr_first
,
sr_last
);
if
(
scope_iter
!=
last
&&
!
is_in_subrange
(
scope_iter
))
{
add_child
(
itermediate
,
scope_iter
);
itermediate
=
scope_iter
+
2
;
}
}
if
(
!
result
.
m_children
.
empty
())
{
add_child
(
itermediate
,
last
);
}
}
if
(
result
.
m_children
.
empty
())
{
// no children -> leaf node; parse non-template part now
CPPA_REQUIRE
(
subranges
.
size
()
<
2
);
auto
non_template_last
=
subranges
.
empty
()
?
last
:
subranges
[
0
].
first
;
for
(
auto
i
=
first
;
i
!=
non_template_last
;
++
i
)
{
char
c
=
*
i
;
if
(
islegal
(
c
))
{
if
(
!
tokens
.
back
().
empty
()
&&
!
islegal
(
tokens
.
back
().
back
()))
{
...
...
@@ -168,13 +223,11 @@ class parse_tree {
else
if
(
c
==
'*'
)
{
tokens
.
push_back
(
"*"
);
}
++
i
;
}
}
parse_tree
result
;
if
(
sub_first
!=
sub_last
)
{
result
.
m_template
=
true
;
result
.
m_template_parameters
=
parse_tpl_args
(
sub_first
+
1
,
sub_last
);
if
(
!
subranges
.
empty
())
{
auto
&
range0
=
subranges
.
front
();
result
.
m_template_parameters
=
parse_tpl_args
(
range0
.
first
+
1
,
range0
.
second
);
}
for
(
auto
&
token
:
tokens
)
{
if
(
token
==
"const"
)
{
...
...
@@ -200,25 +253,37 @@ class parse_tree {
result
.
m_name
+=
token
;
}
}
}
return
result
;
}
inline
bool
has_children
()
const
{
return
!
m_children
.
empty
();
}
inline
bool
is_template
()
const
{
return
!
m_template_parameters
.
empty
();
}
private:
parse_tree
()
:
m_const
(
false
),
m_pointer
(
false
),
m_volatile
(
false
)
,
m_template
(
false
)
:
m_const
(
false
),
m_pointer
(
false
),
m_volatile
(
false
)
,
m_lvalue_ref
(
false
),
m_rvalue_ref
(
false
)
{
}
bool
m_const
;
bool
m_pointer
;
bool
m_volatile
;
bool
m_template
;
bool
m_lvalue_ref
;
bool
m_rvalue_ref
;
bool
m_nested_type
;
string
m_name
;
vector
<
parse_tree
>
m_template_parameters
;
vector
<
parse_tree
>
m_children
;
};
template
<
typename
Iterator
>
...
...
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