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
7290e438
Commit
7290e438
authored
Aug 13, 2019
by
Jakob Otto
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Rework binary_deserializer to work with other data_types.
parent
e48d80e7
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
63 additions
and
54 deletions
+63
-54
libcaf_core/caf/binary_deserializer.hpp
libcaf_core/caf/binary_deserializer.hpp
+30
-11
libcaf_core/src/binary_deserializer.cpp
libcaf_core/src/binary_deserializer.cpp
+3
-25
libcaf_core/test/serializer_impl.cpp
libcaf_core/test/serializer_impl.cpp
+30
-18
No files found.
libcaf_core/caf/binary_deserializer.hpp
View file @
7290e438
...
@@ -22,6 +22,7 @@
...
@@ -22,6 +22,7 @@
#include <cstdint>
#include <cstdint>
#include <vector>
#include <vector>
#include "caf/byte.hpp"
#include "caf/deserializer.hpp"
#include "caf/deserializer.hpp"
namespace
caf
{
namespace
caf
{
...
@@ -33,17 +34,36 @@ public:
...
@@ -33,17 +34,36 @@ public:
using
super
=
deserializer
;
using
super
=
deserializer
;
using
buffer
=
std
::
vector
<
char
>
;
// -- constructors, destructors, and assignment operators --------------------
// -- constructors, destructors, and assignment operators --------------------
binary_deserializer
(
actor_system
&
sys
,
const
char
*
buf
,
size_t
buf_size
);
template
<
class
ValueType
>
binary_deserializer
(
actor_system
&
sys
,
const
ValueType
*
buf
,
size_t
buf_size
)
:
super
(
sys
),
current_
(
reinterpret_cast
<
const
byte
*>
(
buf
)),
end_
(
reinterpret_cast
<
const
byte
*>
(
buf
)
+
buf_size
)
{
static_assert
(
sizeof
(
ValueType
)
==
1
,
"sizeof(Value type) > 1"
);
}
binary_deserializer
(
execution_unit
*
ctx
,
const
char
*
buf
,
size_t
buf_size
);
template
<
class
ValueType
>
binary_deserializer
(
execution_unit
*
ctx
,
const
ValueType
*
buf
,
size_t
buf_size
)
:
super
(
ctx
),
current_
(
reinterpret_cast
<
const
byte
*>
(
buf
)),
end_
(
reinterpret_cast
<
const
byte
*>
(
buf
)
+
buf_size
)
{
static_assert
(
sizeof
(
ValueType
)
==
1
,
"sizeof(Value type) > 1"
);
}
binary_deserializer
(
actor_system
&
sys
,
const
buffer
&
buf
);
template
<
class
BufferType
>
binary_deserializer
(
actor_system
&
sys
,
const
BufferType
&
buf
)
:
binary_deserializer
(
sys
,
buf
.
data
(),
buf
.
size
())
{
// nop
}
binary_deserializer
(
execution_unit
*
ctx
,
const
buffer
&
buf
);
template
<
class
BufferType
>
binary_deserializer
(
execution_unit
*
ctx
,
const
BufferType
&
buf
)
:
binary_deserializer
(
ctx
,
buf
.
data
(),
buf
.
size
())
{
// nop
}
// -- overridden member functions --------------------------------------------
// -- overridden member functions --------------------------------------------
...
@@ -60,12 +80,12 @@ public:
...
@@ -60,12 +80,12 @@ public:
// -- properties -------------------------------------------------------------
// -- properties -------------------------------------------------------------
/// Returns the current read position.
/// Returns the current read position.
const
char
*
current
()
const
{
const
byte
*
current
()
const
{
return
current_
;
return
current_
;
}
}
/// Returns the past-the-end iterator.
/// Returns the past-the-end iterator.
const
char
*
end
()
const
{
const
byte
*
end
()
const
{
return
end_
;
return
end_
;
}
}
...
@@ -78,7 +98,6 @@ public:
...
@@ -78,7 +98,6 @@ public:
current_
+=
num_bytes
;
current_
+=
num_bytes
;
}
}
protected:
protected:
error
apply_impl
(
int8_t
&
)
override
;
error
apply_impl
(
int8_t
&
)
override
;
...
@@ -113,8 +132,8 @@ private:
...
@@ -113,8 +132,8 @@ private:
return
current_
+
read_size
<=
end_
;
return
current_
+
read_size
<=
end_
;
}
}
const
char
*
current_
;
const
byte
*
current_
;
const
char
*
end_
;
const
byte
*
end_
;
};
};
}
// namespace caf
}
// namespace caf
libcaf_core/src/binary_deserializer.cpp
View file @
7290e438
...
@@ -26,7 +26,6 @@
...
@@ -26,7 +26,6 @@
#include "caf/detail/network_order.hpp"
#include "caf/detail/network_order.hpp"
#include "caf/sec.hpp"
#include "caf/sec.hpp"
namespace
caf
{
namespace
caf
{
namespace
{
namespace
{
...
@@ -49,29 +48,7 @@ error apply_float(binary_deserializer& bs, T& x) {
...
@@ -49,29 +48,7 @@ error apply_float(binary_deserializer& bs, T& x) {
return
none
;
return
none
;
}
}
}
// namespace <anonmyous>
}
// namespace
binary_deserializer
::
binary_deserializer
(
actor_system
&
sys
,
const
char
*
buf
,
size_t
buf_size
)
:
super
(
sys
),
current_
(
buf
),
end_
(
buf
+
buf_size
)
{
// nop
}
binary_deserializer
::
binary_deserializer
(
execution_unit
*
ctx
,
const
char
*
buf
,
size_t
buf_size
)
:
super
(
ctx
),
current_
(
buf
),
end_
(
buf
+
buf_size
)
{
// nop
}
binary_deserializer
::
binary_deserializer
(
actor_system
&
sys
,
const
buffer
&
buf
)
:
binary_deserializer
(
sys
,
buf
.
data
(),
buf
.
size
())
{
// nop
}
binary_deserializer
::
binary_deserializer
(
execution_unit
*
ctx
,
const
buffer
&
buf
)
:
binary_deserializer
(
ctx
,
buf
.
data
(),
buf
.
size
())
{
// nop
}
error
binary_deserializer
::
begin_object
(
uint16_t
&
nr
,
std
::
string
&
name
)
{
error
binary_deserializer
::
begin_object
(
uint16_t
&
nr
,
std
::
string
&
name
)
{
if
(
auto
err
=
apply
(
nr
))
if
(
auto
err
=
apply
(
nr
))
...
@@ -172,7 +149,8 @@ error binary_deserializer::apply_impl(std::string& x) {
...
@@ -172,7 +149,8 @@ error binary_deserializer::apply_impl(std::string& x) {
return
err
;
return
err
;
if
(
!
range_check
(
str_size
))
if
(
!
range_check
(
str_size
))
return
sec
::
end_of_stream
;
return
sec
::
end_of_stream
;
x
.
assign
(
current_
,
current_
+
str_size
);
x
.
assign
(
reinterpret_cast
<
char
*>
(
const_cast
<
byte
*>
(
current_
)),
reinterpret_cast
<
char
*>
(
const_cast
<
byte
*>
(
current_
))
+
str_size
);
current_
+=
str_size
;
current_
+=
str_size
;
return
end_sequence
();
return
end_sequence
();
}
}
...
...
libcaf_core/test/serializer_impl.cpp
View file @
7290e438
...
@@ -88,8 +88,8 @@ typename Inspector::result_type inspect(Inspector& f, test_data& x) {
...
@@ -88,8 +88,8 @@ typename Inspector::result_type inspect(Inspector& f, test_data& x) {
struct
serialization_fixture
{
struct
serialization_fixture
{
caf
::
actor_system_config
cfg
;
caf
::
actor_system_config
cfg
;
caf
::
actor_system
sys
{
cfg
};
caf
::
actor_system
sys
{
cfg
};
test_data
sourc
e
;
test_data
data_to_serializ
e
;
test_data
sink
{
0
,
test_data
deserialized_data
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
...
@@ -103,52 +103,64 @@ struct serialization_fixture {
...
@@ -103,52 +103,64 @@ struct serialization_fixture {
CAF_TEST_FIXTURE_SCOPE
(
serializer_impl_tests
,
serialization_fixture
)
CAF_TEST_FIXTURE_SCOPE
(
serializer_impl_tests
,
serialization_fixture
)
CAF_TEST
(
serialize
to
std
::
vector
<
char
>
)
{
CAF_TEST
(
serialize
and
deserialize
with
std
::
vector
<
char
>
)
{
using
container_type
=
std
::
vector
<
char
>
;
using
container_type
=
std
::
vector
<
char
>
;
std
::
vector
<
char
>
binary_serializer_buffer
;
std
::
vector
<
char
>
binary_serializer_buffer
;
container_type
serializer_impl_buffer
;
container_type
serializer_impl_buffer
;
binary_serializer
sink1
{
sys
,
binary_serializer_buffer
};
binary_serializer
sink1
{
sys
,
binary_serializer_buffer
};
serializer_impl
<
container_type
>
sink2
{
sys
,
serializer_impl_buffer
};
serializer_impl
<
container_type
>
sink2
{
sys
,
serializer_impl_buffer
};
if
(
auto
err
=
sink1
(
sourc
e
))
if
(
auto
err
=
sink1
(
data_to_serializ
e
))
CAF_FAIL
(
"serialization failed: "
<<
sys
.
render
(
err
));
CAF_FAIL
(
"serialization failed: "
<<
sys
.
render
(
err
));
if
(
auto
err
=
sink2
(
sourc
e
))
if
(
auto
err
=
sink2
(
data_to_serializ
e
))
CAF_FAIL
(
"serialization failed: "
<<
sys
.
render
(
err
));
CAF_FAIL
(
"serialization failed: "
<<
sys
.
render
(
err
));
CAF_CHECK_EQUAL
(
memcmp
(
binary_serializer_buffer
.
data
(),
CAF_CHECK_EQUAL
(
memcmp
(
binary_serializer_buffer
.
data
(),
serializer_impl_buffer
.
data
(),
serializer_impl_buffer
.
data
(),
binary_serializer_buffer
.
size
()),
binary_serializer_buffer
.
size
()),
0
);
0
);
binary_deserializer
source
(
sys
,
serializer_impl_buffer
);
if
(
auto
err
=
source
(
deserialized_data
))
CAF_FAIL
(
"deserialization failed: "
<<
sys
.
render
(
err
));
CAF_CHECK_EQUAL
(
data_to_serialize
,
deserialized_data
);
}
}
CAF_TEST
(
serialize
to
std
::
vector
<
byte
>
)
{
CAF_TEST
(
serialize
and
deserialize
with
std
::
vector
<
byte
>
)
{
using
container_type
=
std
::
vector
<
byte
>
;
using
container_type
=
std
::
vector
<
byte
>
;
std
::
vector
<
char
>
binary_serializer_buffer
;
std
::
vector
<
char
>
binary_serializer_buffer
;
container_type
serializer_impl_buffer
;
container_type
serializer_impl_buffer
;
binary_serializer
sink1
{
sys
,
binary_serializer_buffer
};
binary_serializer
sink1
{
sys
,
binary_serializer_buffer
};
serializer_impl
<
container_type
>
sink2
{
sys
,
serializer_impl_buffer
};
serializer_impl
<
container_type
>
sink2
{
sys
,
serializer_impl_buffer
};
if
(
auto
err
=
sink1
(
sourc
e
))
if
(
auto
err
=
sink1
(
data_to_serializ
e
))
CAF_FAIL
(
"serialization failed: "
<<
sys
.
render
(
err
));
CAF_FAIL
(
"serialization failed: "
<<
sys
.
render
(
err
));
if
(
auto
err
=
sink2
(
sourc
e
))
if
(
auto
err
=
sink2
(
data_to_serializ
e
))
CAF_FAIL
(
"serialization failed: "
<<
sys
.
render
(
err
));
CAF_FAIL
(
"serialization failed: "
<<
sys
.
render
(
err
));
CAF_CHECK_EQUAL
(
memcmp
(
binary_serializer_buffer
.
data
(),
CAF_CHECK_EQUAL
(
memcmp
(
binary_serializer_buffer
.
data
(),
serializer_impl_buffer
.
data
(),
serializer_impl_buffer
.
data
(),
binary_serializer_buffer
.
size
()),
binary_serializer_buffer
.
size
()),
0
);
0
);
binary_deserializer
source
(
sys
,
serializer_impl_buffer
);
if
(
auto
err
=
source
(
deserialized_data
))
CAF_FAIL
(
"deserialization failed: "
<<
sys
.
render
(
err
));
CAF_CHECK_EQUAL
(
data_to_serialize
,
deserialized_data
);
}
}
CAF_TEST
(
serialize
to
std
::
vector
<
uint8_t
>
)
{
CAF_TEST
(
serialize
and
deserialize
with
std
::
vector
<
uint8_t
>
)
{
using
container_type
=
std
::
vector
<
uint8_t
>
;
using
container_type
=
std
::
vector
<
uint8_t
>
;
std
::
vector
<
char
>
binary_serializer_buffer
;
std
::
vector
<
char
>
binary_serializer_buffer
;
container_type
serializer_impl_buffer
;
container_type
serializer_impl_buffer
;
binary_serializer
sink1
{
sys
,
binary_serializer_buffer
};
binary_serializer
sink1
{
sys
,
binary_serializer_buffer
};
serializer_impl
<
container_type
>
sink2
{
sys
,
serializer_impl_buffer
};
serializer_impl
<
container_type
>
sink2
{
sys
,
serializer_impl_buffer
};
if
(
auto
err
=
sink1
(
sourc
e
))
if
(
auto
err
=
sink1
(
data_to_serializ
e
))
CAF_FAIL
(
"serialization failed: "
<<
sys
.
render
(
err
));
CAF_FAIL
(
"serialization failed: "
<<
sys
.
render
(
err
));
if
(
auto
err
=
sink2
(
sourc
e
))
if
(
auto
err
=
sink2
(
data_to_serializ
e
))
CAF_FAIL
(
"serialization failed: "
<<
sys
.
render
(
err
));
CAF_FAIL
(
"serialization failed: "
<<
sys
.
render
(
err
));
CAF_CHECK_EQUAL
(
memcmp
(
binary_serializer_buffer
.
data
(),
CAF_CHECK_EQUAL
(
memcmp
(
binary_serializer_buffer
.
data
(),
serializer_impl_buffer
.
data
(),
serializer_impl_buffer
.
data
(),
binary_serializer_buffer
.
size
()),
binary_serializer_buffer
.
size
()),
0
);
0
);
binary_deserializer
source
(
sys
,
serializer_impl_buffer
);
if
(
auto
err
=
source
(
deserialized_data
))
CAF_FAIL
(
"deserialization failed: "
<<
sys
.
render
(
err
));
CAF_CHECK_EQUAL
(
data_to_serialize
,
deserialized_data
);
}
}
CAF_TEST_FIXTURE_SCOPE_END
();
CAF_TEST_FIXTURE_SCOPE_END
();
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