Add ProtoOutputStream.serializeToVector
am: dcd64522f4
Change-Id: If42f8570731e96c820267ae19ad3afea918bdb2b
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <android/util/EncodedBuffer.h>
|
||||
|
||||
@@ -124,6 +125,7 @@ public:
|
||||
sp<ProtoReader> data(); // Get the reader apis of the data.
|
||||
bool flush(int fd); // Flush data directly to a file descriptor.
|
||||
bool serializeToString(std::string* out); // Serializes the proto to a string.
|
||||
bool serializeToVector(std::vector<uint8_t>* out); // Serializes the proto to a vector<uint8_t>.
|
||||
|
||||
/**
|
||||
* Clears the ProtoOutputStream so the buffer can be reused instead of deallocation/allocation again.
|
||||
|
||||
@@ -454,7 +454,6 @@ ProtoOutputStream::serializeToString(std::string* out)
|
||||
if (out == nullptr) return false;
|
||||
if (!compact()) return false;
|
||||
|
||||
|
||||
sp<ProtoReader> reader = mBuffer->read();
|
||||
out->reserve(reader->size());
|
||||
while (reader->hasNext()) {
|
||||
@@ -465,6 +464,23 @@ ProtoOutputStream::serializeToString(std::string* out)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
ProtoOutputStream::serializeToVector(std::vector<uint8_t>* out)
|
||||
{
|
||||
if (out == nullptr) return false;
|
||||
if (!compact()) return false;
|
||||
|
||||
sp<ProtoReader> reader = mBuffer->read();
|
||||
out->reserve(reader->size());
|
||||
while (reader->hasNext()) {
|
||||
const uint8_t* buf = reader->readBuffer();
|
||||
size_t size = reader->currentToRead();
|
||||
out->insert(out->end(), buf, buf + size);
|
||||
reader->move(size);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
sp<ProtoReader>
|
||||
ProtoOutputStream::data()
|
||||
{
|
||||
|
||||
@@ -132,6 +132,53 @@ TEST(ProtoOutputStreamTest, SerializeToStringPrimitives) {
|
||||
EXPECT_EQ(primitives.val_enum(), PrimitiveProto_Count_TWO);
|
||||
}
|
||||
|
||||
TEST(ProtoOutputStreamTest, SerializeToVectorPrimitives) {
|
||||
std::string s = "hello";
|
||||
const char b[5] = { 'a', 'p', 'p', 'l', 'e' };
|
||||
|
||||
ProtoOutputStream proto;
|
||||
EXPECT_TRUE(proto.write(FIELD_TYPE_INT32 | PrimitiveProto::kValInt32FieldNumber, 123));
|
||||
EXPECT_TRUE(proto.write(FIELD_TYPE_INT64 | PrimitiveProto::kValInt64FieldNumber, -1LL));
|
||||
EXPECT_TRUE(proto.write(FIELD_TYPE_FLOAT | PrimitiveProto::kValFloatFieldNumber, -23.5f));
|
||||
EXPECT_TRUE(proto.write(FIELD_TYPE_DOUBLE | PrimitiveProto::kValDoubleFieldNumber, 324.5));
|
||||
EXPECT_TRUE(proto.write(FIELD_TYPE_UINT32 | PrimitiveProto::kValUint32FieldNumber, 3424));
|
||||
EXPECT_TRUE(proto.write(FIELD_TYPE_UINT64 | PrimitiveProto::kValUint64FieldNumber, 57LL));
|
||||
EXPECT_TRUE(proto.write(FIELD_TYPE_FIXED32 | PrimitiveProto::kValFixed32FieldNumber, -20));
|
||||
EXPECT_TRUE(proto.write(FIELD_TYPE_FIXED64 | PrimitiveProto::kValFixed64FieldNumber, -37LL));
|
||||
EXPECT_TRUE(proto.write(FIELD_TYPE_BOOL | PrimitiveProto::kValBoolFieldNumber, true));
|
||||
EXPECT_TRUE(proto.write(FIELD_TYPE_STRING | PrimitiveProto::kValStringFieldNumber, s));
|
||||
EXPECT_TRUE(proto.write(FIELD_TYPE_BYTES | PrimitiveProto::kValBytesFieldNumber, b, 5));
|
||||
EXPECT_TRUE(proto.write(FIELD_TYPE_SFIXED32 | PrimitiveProto::kValSfixed32FieldNumber, 63));
|
||||
EXPECT_TRUE(proto.write(FIELD_TYPE_SFIXED64 | PrimitiveProto::kValSfixed64FieldNumber, -54));
|
||||
EXPECT_TRUE(proto.write(FIELD_TYPE_SINT32 | PrimitiveProto::kValSint32FieldNumber, -533));
|
||||
EXPECT_TRUE(proto.write(FIELD_TYPE_SINT64 | PrimitiveProto::kValSint64FieldNumber, -61224762453LL));
|
||||
EXPECT_TRUE(proto.write(FIELD_TYPE_ENUM | PrimitiveProto::kValEnumFieldNumber, 2));
|
||||
|
||||
PrimitiveProto primitives;
|
||||
std::vector<uint8_t> vec;
|
||||
ASSERT_TRUE(proto.serializeToVector(&vec));
|
||||
|
||||
std::string serialized(vec.data(), vec.data() + vec.size());
|
||||
ASSERT_TRUE(primitives.ParseFromString(serialized));
|
||||
|
||||
EXPECT_EQ(primitives.val_int32(), 123);
|
||||
EXPECT_EQ(primitives.val_int64(), -1);
|
||||
EXPECT_EQ(primitives.val_float(), -23.5f);
|
||||
EXPECT_EQ(primitives.val_double(), 324.5f);
|
||||
EXPECT_EQ(primitives.val_uint32(), 3424);
|
||||
EXPECT_EQ(primitives.val_uint64(), 57);
|
||||
EXPECT_EQ(primitives.val_fixed32(), -20);
|
||||
EXPECT_EQ(primitives.val_fixed64(), -37);
|
||||
EXPECT_EQ(primitives.val_bool(), true);
|
||||
EXPECT_THAT(primitives.val_string(), StrEq(s.c_str()));
|
||||
EXPECT_THAT(primitives.val_bytes(), StrEq("apple"));
|
||||
EXPECT_EQ(primitives.val_sfixed32(), 63);
|
||||
EXPECT_EQ(primitives.val_sfixed64(), -54);
|
||||
EXPECT_EQ(primitives.val_sint32(), -533);
|
||||
EXPECT_EQ(primitives.val_sint64(), -61224762453LL);
|
||||
EXPECT_EQ(primitives.val_enum(), PrimitiveProto_Count_TWO);
|
||||
}
|
||||
|
||||
TEST(ProtoOutputStreamTest, Complex) {
|
||||
std::string name1 = "cat";
|
||||
std::string name2 = "dog";
|
||||
|
||||
Reference in New Issue
Block a user