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
2040822a
Commit
2040822a
authored
Jul 10, 2017
by
Dominik Charousset
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #577
parents
338f86ad
463c97dd
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
50 additions
and
13 deletions
+50
-13
libcaf_core/caf/data_processor.hpp
libcaf_core/caf/data_processor.hpp
+50
-13
No files found.
libcaf_core/caf/data_processor.hpp
View file @
2040822a
...
...
@@ -226,27 +226,64 @@ public:
return
convert_apply
(
dref
(),
x
,
tmp
,
assign
);
}
// no better way around this abomination
error
consume_range
(
std
::
vector
<
bool
>&
xs
)
{
auto
i
=
xs
.
begin
();
auto
e
=
xs
.
end
();
using
proxy_iterator
=
decltype
(
i
);
// Special case to avoid using 1 byte per bool
error
apply
(
std
::
vector
<
bool
>&
x
)
{
// Convert vector<bool> to a vector<uint64>,
// by packing each block of 64 booleans on a 64-bits integer.
// To not waste up to 63 bits, the last uint64_t
// (ie. the last 'remainder' booleans) is encoded as a var-int
auto
remainder
=
static_cast
<
uint8_t
>
(
x
.
size
()
%
64
);
auto
err
=
apply_builtin
(
u8_v
,
&
remainder
);
if
(
err
)
return
err
;
struct
{
void
operator
()(
proxy_iterator
&
lhs
,
bool
&
rhs
)
const
{
*
lhs
=
rhs
;
void
operator
()(
std
::
vector
<
bool
>&
lhs
,
std
::
vector
<
uint64_t
>&
rhs
)
const
{
lhs
.
resize
(
rhs
.
size
()
*
64
,
false
);
size_t
cpt
=
0
;
for
(
auto
v
:
rhs
)
{
for
(
int
k
=
0
;
k
<
64
;
++
k
)
{
lhs
[
cpt
++
]
=
((
v
&
(
1ul
<<
k
))
!=
0
);
}
}
}
void
operator
()(
std
::
vector
<
uint64_t
>&
lhs
,
std
::
vector
<
bool
>&
rhs
)
const
{
if
(
rhs
.
empty
())
return
;
size_t
len
=
rhs
.
size
()
-
rhs
.
size
()
%
64
;
lhs
.
resize
(
len
/
64
,
0
);
for
(
size_t
k
=
0
;
k
<
len
;
++
k
)
{
auto
b
=
rhs
[
k
];
if
(
b
)
lhs
[
k
/
64
]
|=
(
1ul
<<
(
k
%
64
));
}
void
operator
()(
bool
&
lhs
,
proxy_iterator
&
rhs
)
const
{
lhs
=
*
rhs
;
}
}
assign
;
bool
tmp
;
for
(;
i
!=
e
;
++
i
)
{
auto
err
=
convert_apply
(
dref
(),
i
,
tmp
,
assign
);
std
::
vector
<
uint64_t
>
tmp
;
err
=
convert_apply
(
dref
(),
x
,
tmp
,
assign
);
if
(
err
||
!
remainder
)
return
err
;
// the last uint64_t for 'remainder' bits
if
(
Derived
::
reads_state
)
{
uint64_t
encoded
=
0
;
auto
len
=
x
.
size
();
for
(
int
k
=
0
;
k
<
remainder
;
++
k
)
{
auto
b
=
x
[
len
-
remainder
+
k
];
if
(
b
)
encoded
|=
(
1ul
<<
k
);
}
return
begin_sequence
(
encoded
);
}
else
{
uint64_t
encoded
=
0
;
err
=
begin_sequence
(
encoded
);
if
(
err
)
return
err
;
x
.
reserve
(
x
.
size
()
+
remainder
);
for
(
int
k
=
0
;
k
<
remainder
;
++
k
)
{
x
.
push_back
((
bool
)
(
encoded
&
(
1ul
<<
k
)));
}
return
none
;
}
}
template
<
class
T
>
error
consume_range
(
T
&
xs
)
{
...
...
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