mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-02 04:04:19 +00:00
[c++] Add support for boolean types in flexbuffers (#4386)
* Add support for boolean types in flexbuffers * Simplify casting number <=> boolean * Added comments for tests * Add proper support for Booleans * Bad rebase * No special case for strings * Removed unused test * Simplify logic
This commit is contained in:
committed by
Wouter van Oortmerssen
parent
f2b3705c2c
commit
a2b1bfc107
@@ -1591,7 +1591,7 @@ void FlexBuffersTest() {
|
||||
flexbuffers::BUILDER_FLAG_SHARE_KEYS_AND_STRINGS);
|
||||
|
||||
// Write the equivalent of:
|
||||
// { vec: [ -100, "Fred", 4.0 ], bar: [ 1, 2, 3 ], foo: 100 }
|
||||
// { vec: [ -100, "Fred", 4.0, false ], bar: [ 1, 2, 3 ], bar3: [ 1, 2, 3 ], foo: 100, bool: true, mymap: { foo: "Fred" } }
|
||||
#ifndef FLATBUFFERS_CPP98_STL
|
||||
// It's possible to do this without std::function support as well.
|
||||
slb.Map([&]() {
|
||||
@@ -1601,10 +1601,12 @@ void FlexBuffersTest() {
|
||||
slb.IndirectFloat(4.0f);
|
||||
uint8_t blob[] = { 77 };
|
||||
slb.Blob(blob, 1);
|
||||
slb += false;
|
||||
});
|
||||
int ints[] = { 1, 2, 3 };
|
||||
slb.Vector("bar", ints, 3);
|
||||
slb.FixedTypedVector("bar3", ints, 3);
|
||||
slb.Bool("bool", true);
|
||||
slb.Double("foo", 100);
|
||||
slb.Map("mymap", [&]() {
|
||||
slb.String("foo", "Fred"); // Testing key and string reuse.
|
||||
@@ -1637,9 +1639,9 @@ void FlexBuffersTest() {
|
||||
printf("\n");
|
||||
|
||||
auto map = flexbuffers::GetRoot(slb.GetBuffer()).AsMap();
|
||||
TEST_EQ(map.size(), 5);
|
||||
TEST_EQ(map.size(), 6);
|
||||
auto vec = map["vec"].AsVector();
|
||||
TEST_EQ(vec.size(), 4);
|
||||
TEST_EQ(vec.size(), 5);
|
||||
TEST_EQ(vec[0].AsInt64(), -100);
|
||||
TEST_EQ_STR(vec[1].AsString().c_str(), "Fred");
|
||||
TEST_EQ(vec[1].AsInt64(), 0); // Number parsing failed.
|
||||
@@ -1652,17 +1654,20 @@ void FlexBuffersTest() {
|
||||
auto blob = vec[3].AsBlob();
|
||||
TEST_EQ(blob.size(), 1);
|
||||
TEST_EQ(blob.data()[0], 77);
|
||||
TEST_EQ(vec[4].IsBool(), true); // Check if type is a bool
|
||||
TEST_EQ(vec[4].AsBool(), false); // Check if value is false
|
||||
auto tvec = map["bar"].AsTypedVector();
|
||||
TEST_EQ(tvec.size(), 3);
|
||||
TEST_EQ(tvec[2].AsInt8(), 3);
|
||||
auto tvec3 = map["bar3"].AsFixedTypedVector();
|
||||
TEST_EQ(tvec3.size(), 3);
|
||||
TEST_EQ(tvec3[2].AsInt8(), 3);
|
||||
TEST_EQ(map["bool"].AsBool(), true);
|
||||
TEST_EQ(map["foo"].AsUInt8(), 100);
|
||||
TEST_EQ(map["unknown"].IsNull(), true);
|
||||
auto mymap = map["mymap"].AsMap();
|
||||
// These should be equal by pointer equality, since key and value are shared.
|
||||
TEST_EQ(mymap.Keys()[0].AsKey(), map.Keys()[2].AsKey());
|
||||
TEST_EQ(mymap.Keys()[0].AsKey(), map.Keys()[3].AsKey());
|
||||
TEST_EQ(mymap.Values()[0].AsString().c_str(), vec[1].AsString().c_str());
|
||||
// We can mutate values in the buffer.
|
||||
TEST_EQ(vec[0].MutateInt(-99), true);
|
||||
@@ -1673,11 +1678,14 @@ void FlexBuffersTest() {
|
||||
TEST_EQ(vec[2].MutateFloat(2.0f), true);
|
||||
TEST_EQ(vec[2].AsFloat(), 2.0f);
|
||||
TEST_EQ(vec[2].MutateFloat(3.14159), false); // Double does not fit in float.
|
||||
TEST_EQ(vec[4].AsBool(), false); // Is false before change
|
||||
TEST_EQ(vec[4].MutateBool(true), true); // Can change a bool
|
||||
TEST_EQ(vec[4].AsBool(), true); // Changed bool is now true
|
||||
|
||||
// Parse from JSON:
|
||||
flatbuffers::Parser parser;
|
||||
slb.Clear();
|
||||
auto jsontest = "{ a: [ 123, 456.0 ], b: \"hello\" }";
|
||||
auto jsontest = "{ a: [ 123, 456.0 ], b: \"hello\", c: true, d: false }";
|
||||
TEST_EQ(parser.ParseFlexBuffer(jsontest, nullptr, &slb),
|
||||
true);
|
||||
auto jroot = flexbuffers::GetRoot(slb.GetBuffer());
|
||||
@@ -1686,6 +1694,10 @@ void FlexBuffersTest() {
|
||||
TEST_EQ(jvec[0].AsInt64(), 123);
|
||||
TEST_EQ(jvec[1].AsDouble(), 456.0);
|
||||
TEST_EQ_STR(jmap["b"].AsString().c_str(), "hello");
|
||||
TEST_EQ(jmap["c"].IsBool(), true); // Parsed correctly to a bool
|
||||
TEST_EQ(jmap["c"].AsBool(), true); // Parsed correctly to true
|
||||
TEST_EQ(jmap["d"].IsBool(), true); // Parsed correctly to a bool
|
||||
TEST_EQ(jmap["d"].AsBool(), false); // Parsed correctly to false
|
||||
// And from FlexBuffer back to JSON:
|
||||
auto jsonback = jroot.ToString();
|
||||
TEST_EQ_STR(jsontest, jsonback.c_str());
|
||||
|
||||
Reference in New Issue
Block a user