diff options
author | Petteri Aimonen <jpa@git.mail.kapsi.fi> | 2014-04-05 11:26:39 +0300 |
---|---|---|
committer | Petteri Aimonen <jpa@git.mail.kapsi.fi> | 2014-04-05 11:26:39 +0300 |
commit | b63e582bdb34b4727a8eb551fc72ee0476047a46 (patch) | |
tree | 37e19df37e51132052c54ce9b46d1cc9b16b0698 | |
parent | e5b855fec5d2977971f96d817728c7a3ee8077b2 (diff) |
Add a convenience function pb_get_encoded_size()
There is minimal size penalty from this, and it is probably much more
intuitive to use than PB_OSTREAM_SIZING itself.
This has been suggested before also, but I ended up refusing it back
them. Reconsidering it now, I see that an intuitive API is much better
than any amount of documentation explaining a non-intuitive API.
Update issue 16
Status: FixedInGit
-rw-r--r-- | pb_encode.c | 11 | ||||
-rw-r--r-- | pb_encode.h | 4 | ||||
-rw-r--r-- | tests/encode_unittests/encode_unittests.c | 9 |
3 files changed, 24 insertions, 0 deletions
diff --git a/pb_encode.c b/pb_encode.c index 1eb9473a..dc5a2734 100644 --- a/pb_encode.c +++ b/pb_encode.c @@ -378,6 +378,17 @@ bool pb_encode_delimited(pb_ostream_t *stream, const pb_field_t fields[], const return pb_encode_submessage(stream, fields, src_struct); } +bool pb_get_encoded_size(size_t *size, const pb_field_t fields[], const void *src_struct) +{ + pb_ostream_t stream = PB_OSTREAM_SIZING; + + if (!pb_encode(&stream, fields, src_struct)) + return false; + + *size = stream.bytes_written; + return true; +} + /******************** * Helper functions * ********************/ diff --git a/pb_encode.h b/pb_encode.h index 900994aa..f82bac8f 100644 --- a/pb_encode.h +++ b/pb_encode.h @@ -71,6 +71,10 @@ bool pb_encode(pb_ostream_t *stream, const pb_field_t fields[], const void *src_ */ bool pb_encode_delimited(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct); +/* Encode the message to get the size of the encoded data, but do not store + * the data. */ +bool pb_get_encoded_size(size_t *size, const pb_field_t fields[], const void *src_struct); + /************************************** * Functions for manipulating streams * **************************************/ diff --git a/tests/encode_unittests/encode_unittests.c b/tests/encode_unittests/encode_unittests.c index edbc10a9..06935f9a 100644 --- a/tests/encode_unittests/encode_unittests.c +++ b/tests/encode_unittests/encode_unittests.c @@ -281,6 +281,15 @@ int main() TEST(WRITES(pb_encode_delimited(&s, IntegerContainer_fields, &msg), "\x09\x0A\x07\x0A\x05\x01\x02\x03\x04\x05")) } + + { + IntegerContainer msg = {{5, {1,2,3,4,5}}}; + size_t size; + + COMMENT("Test pb_get_encoded_size.") + TEST(pb_get_encoded_size(&size, IntegerContainer_fields, &msg) && + size == 9); + } { uint8_t buffer[10]; |