diff --git a/docs/api.rst b/docs/api.rst index 25e0b633c..c2ad209d0 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -336,6 +336,8 @@ Primitives .. autocfunction:: primitives.h::z_slice_empty .. autocfunction:: primitives.h::z_slice_is_empty .. autocfunction:: serialization.h::ze_deserializer_from_bytes +.. autocfunction:: serialization.h::ze_deserializer_from_bytes_reader +.. autocfunction:: serialization.h::ze_deserializer_to_bytes_reader .. autocfunction:: serialization.h::ze_deserializer_deserialize_int8 .. autocfunction:: serialization.h::ze_deserializer_deserialize_int16 .. autocfunction:: serialization.h::ze_deserializer_deserialize_int32 @@ -351,7 +353,8 @@ Primitives .. autocfunction:: serialization.h::ze_deserializer_deserialize_sequence_begin .. autocfunction:: serialization.h::ze_deserializer_deserialize_sequence_end .. autocfunction:: serialization.h::ze_serializer_empty -.. autocfunction:: serialization.h::ze_serializer_from_bytes +.. autocfunction:: serialization.h::ze_serializer_from_bytes_writer +.. autocfunction:: serialization.h::ze_serializer_to_byte_writer .. autocfunction:: serialization.h::ze_serializer_finish .. autocfunction:: serialization.h::ze_serializer_serialize_int8 .. autocfunction:: serialization.h::ze_serializer_serialize_int16 diff --git a/include/zenoh-pico.h b/include/zenoh-pico.h index bd5b2fad1..b34291ca4 100644 --- a/include/zenoh-pico.h +++ b/include/zenoh-pico.h @@ -28,7 +28,6 @@ #include "zenoh-pico/api/handlers.h" #include "zenoh-pico/api/macros.h" #include "zenoh-pico/api/primitives.h" -#include "zenoh-pico/api/serialization.h" #include "zenoh-pico/api/types.h" #include "zenoh-pico/config.h" diff --git a/include/zenoh-pico/api/serialization.h b/include/zenoh-pico/api/serialization.h index 99491009c..f3c188b7a 100644 --- a/include/zenoh-pico/api/serialization.h +++ b/include/zenoh-pico/api/serialization.h @@ -40,16 +40,28 @@ typedef struct _ze_serializer_t { _Z_OWNED_TYPE_VALUE_PREFIX(ze, _ze_serializer_t, serializer) /** - * Constructs serializer. + * Constructs serializer from a `bytes_writer`. * * Parameters: * serializer: An uninitialized memory location where serializer is to be constructed. - * bytes: Data container to initiate serializer with. + * writer: A writer to initialize serializer with. * * Return: * ``0`` in case of success, ``negative value`` otherwise. */ -z_result_t ze_serializer_from_bytes(ze_owned_serializer_t *serializer, z_moved_bytes_t *bytes); +z_result_t ze_serializer_from_bytes_writer(ze_owned_serializer_t *serializer, z_moved_bytes_writer_t *writer); + +/** + * Converts serializer into 'z_owned_bytes_writer_t'. This corresponds to initializing writer with serializer data. + * + * Parameters: + * serializer: A serializer instance. + * writer: An uninitialized memory location where 'z_owned_bytes_writer_t' is to be constructed. + * + * Return: + * ``0`` in case of success, ``negative value`` otherwise. + */ +z_result_t ze_serializer_to_bytes_writer(ze_moved_serializer_t *serializer, z_owned_bytes_writer_t *writer); /** * Constructs an empty serializer. @@ -81,10 +93,36 @@ void ze_serializer_finish(ze_moved_serializer_t *serializer, z_owned_bytes_t *by * bytes: Data to deserialize. * * Return: - * The constructed :c:type:`z_bytes_reader_t`. + * The constructed :c:type:`ze_deserializer_t`. */ ze_deserializer_t ze_deserializer_from_bytes(const z_loaned_bytes_t *bytes); +/** + * Constructs deserializer from a `z_bytes_reader_t`.. The state of deserializer (i.e. underlying data and read + * position) will be initiated with the reader's state. + * + * + * Parameters: + * reader: A reader to initialize deserializer with. + * + * Return: + * The constructed :c:type:`ze_bytes_deserializer_t`. + */ +ze_deserializer_t ze_deserializer_from_bytes_reader(const z_bytes_reader_t *reader); + +/** + * Converts deserializer into a `z_bytes_reader_t`. The state of reader (i.e. underlying data and read position) will be + * initiated with the serializer's state. + * + * + * Parameters: + * deserializer: A deserializer to initialize reader with. + * + * Return: + * The constructed :c:type:`z_bytes_reader_t`. + */ +z_bytes_reader_t ze_deserializer_to_bytes_reader(const ze_deserializer_t *deserializer); + /** * Writes a serialized :c:type:`uint8_t` into underlying :c:type:`z_owned_bytes_t`. * diff --git a/include/zenoh-pico/collections/bytes.h b/include/zenoh-pico/collections/bytes.h index 20a4e6f96..3d9e3137b 100644 --- a/include/zenoh-pico/collections/bytes.h +++ b/include/zenoh-pico/collections/bytes.h @@ -91,5 +91,6 @@ z_result_t _z_bytes_writer_append_z_bytes(_z_bytes_writer_t *writer, _z_bytes_t z_result_t _z_bytes_writer_append_slice(_z_bytes_writer_t *writer, _z_arc_slice_t *bytes); _z_bytes_t _z_bytes_writer_finish(_z_bytes_writer_t *writer); void _z_bytes_writer_clear(_z_bytes_writer_t *writer); +void _z_bytes_writer_move(_z_bytes_writer_t *dst, _z_bytes_writer_t *src); #endif /* ZENOH_PICO_COLLECTIONS_BYTES_H */ diff --git a/include/zenoh-pico/config.h b/include/zenoh-pico/config.h index eda3441d5..a59ca6e68 100644 --- a/include/zenoh-pico/config.h +++ b/include/zenoh-pico/config.h @@ -21,7 +21,7 @@ #define Z_BATCH_MULTICAST_SIZE 2048 #define Z_CONFIG_SOCKET_TIMEOUT 100 -/* #undef Z_FEATURE_UNSTABLE_API */ +#define Z_FEATURE_UNSTABLE_API #define Z_FEATURE_MULTI_THREAD 1 #define Z_FEATURE_PUBLICATION 1 #define Z_FEATURE_SUBSCRIPTION 1 diff --git a/src/api/serialization.c b/src/api/serialization.c index 6e9de5728..fb8b343d2 100644 --- a/src/api/serialization.c +++ b/src/api/serialization.c @@ -30,8 +30,13 @@ void _ze_serializer_clear(_ze_serializer_t *serializer) { _z_bytes_writer_clear( _Z_OWNED_FUNCTIONS_VALUE_NO_COPY_IMPL_PREFIX(ze, _ze_serializer_t, serializer, _ze_serializer_check, _ze_serializer_empty, _ze_serializer_clear) -z_result_t ze_serializer_from_bytes(ze_owned_serializer_t *serializer, z_moved_bytes_t *bytes) { - serializer->_val._writer = _z_bytes_writer_from_bytes(&bytes->_this._val); +z_result_t ze_serializer_from_bytes_writer(ze_owned_serializer_t *serializer, z_moved_bytes_writer_t *writer) { + _z_bytes_writer_move(&serializer->_val._writer, &writer->_this._val); + return _Z_RES_OK; +} + +z_result_t ze_serializer_to_writer(ze_moved_serializer_t *serializer, z_owned_bytes_writer_t *writer) { + _z_bytes_writer_move(&writer->_val, &serializer->_this._val._writer); return _Z_RES_OK; } @@ -50,6 +55,16 @@ ze_deserializer_t ze_deserializer_from_bytes(const z_loaned_bytes_t *bytes) { return d; } +ze_deserializer_t ze_deserializer_from_bytes_reader(const z_bytes_reader_t *reader) { + ze_deserializer_t d; + d._reader = *reader; + return d; +} + +z_bytes_reader_t ze_deserializer_to_bytes_reader(const ze_deserializer_t *deserializer) { + return deserializer->_reader; +} + z_result_t __read_single_byte(uint8_t *b, void *context) { z_bytes_reader_t *reader = (z_bytes_reader_t *)context; return _z_bytes_reader_read(reader, b, 1) == 1 ? _Z_RES_OK : _Z_ERR_DID_NOT_READ; diff --git a/src/collections/bytes.c b/src/collections/bytes.c index b82b8daaf..4e3816964 100644 --- a/src/collections/bytes.c +++ b/src/collections/bytes.c @@ -410,3 +410,9 @@ void _z_bytes_writer_clear(_z_bytes_writer_t *writer) { _z_bytes_drop(&writer->bytes); writer->cache = NULL; } + +void _z_bytes_writer_move(_z_bytes_writer_t *dst, _z_bytes_writer_t *src) { + dst->cache = src->cache; + _z_bytes_move(&dst->bytes, &src->bytes); + src->cache = NULL; +} diff --git a/zenohpico.pc b/zenohpico.pc index 844700c07..4284afb96 100644 --- a/zenohpico.pc +++ b/zenohpico.pc @@ -3,6 +3,6 @@ prefix=/usr/local Name: zenohpico Description: URL: -Version: 1.0.20240925dev +Version: 1.0.20240929dev Cflags: -I${prefix}/include Libs: -L${prefix}/lib -lzenohpico