aboutsummaryrefslogtreecommitdiffhomepage
path: root/Firestore/core/src/firebase/firestore/remote
diff options
context:
space:
mode:
authorGravatar rsgowman <rgowman@google.com>2018-03-27 17:04:10 -0400
committerGravatar GitHub <noreply@github.com>2018-03-27 17:04:10 -0400
commit0e86c06f60262c013c0b653470ac59a3c4d12b46 (patch)
treef47c6b2fbbf16f419ae4dc13d3869007e573b976 /Firestore/core/src/firebase/firestore/remote
parentcb8c4b6b1f1ad213a5b3272e2c2e94f755bbabf9 (diff)
Add ObjectValue::Map alias (#967)
Diffstat (limited to 'Firestore/core/src/firebase/firestore/remote')
-rw-r--r--Firestore/core/src/firebase/firestore/remote/serializer.cc31
1 files changed, 14 insertions, 17 deletions
diff --git a/Firestore/core/src/firebase/firestore/remote/serializer.cc b/Firestore/core/src/firebase/firestore/remote/serializer.cc
index bab5856..5483e1f 100644
--- a/Firestore/core/src/firebase/firestore/remote/serializer.cc
+++ b/Firestore/core/src/firebase/firestore/remote/serializer.cc
@@ -31,22 +31,20 @@ namespace firestore {
namespace remote {
using firebase::firestore::model::FieldValue;
+using firebase::firestore::model::ObjectValue;
namespace {
class Writer;
-void EncodeObject(Writer* writer,
- const std::map<std::string, FieldValue>& object_value);
+void EncodeObject(Writer* writer, const ObjectValue& object_value);
-std::map<std::string, FieldValue> DecodeObject(pb_istream_t* stream);
+ObjectValue DecodeObject(pb_istream_t* stream);
/**
* Docs TODO(rsgowman). But currently, this just wraps the underlying nanopb
* pb_ostream_t.
*/
-// TODO(rsgowman): Define ObjectT alias (in field_value.h) and use it
-// throughout.
class Writer {
public:
/**
@@ -371,7 +369,8 @@ FieldValue DecodeFieldValueImpl(pb_istream_t* stream) {
case google_firestore_v1beta1_Value_string_value_tag:
return FieldValue::StringValue(DecodeString(stream));
case google_firestore_v1beta1_Value_map_value_tag:
- return FieldValue::ObjectValue(DecodeObject(stream));
+ return FieldValue::ObjectValueFromMap(
+ DecodeObject(stream).internal_value);
default:
// TODO(rsgowman): figure out error handling
@@ -474,8 +473,7 @@ FieldValue DecodeNestedFieldValue(pb_istream_t* stream) {
*
* @param kv The individual key/value pair to write.
*/
-void EncodeFieldsEntry(Writer* writer,
- const std::pair<std::string, FieldValue>& kv) {
+void EncodeFieldsEntry(Writer* writer, const ObjectValue::Map::value_type& kv) {
// Write the key (string)
writer->WriteTag(PB_WT_STRING,
google_firestore_v1beta1_MapValue_FieldsEntry_key_tag);
@@ -488,7 +486,7 @@ void EncodeFieldsEntry(Writer* writer,
[&kv](Writer* writer) { EncodeFieldValueImpl(writer, kv.second); });
}
-std::pair<std::string, FieldValue> DecodeFieldsEntry(pb_istream_t* stream) {
+ObjectValue::Map::value_type DecodeFieldsEntry(pb_istream_t* stream) {
pb_wire_type_t wire_type;
uint32_t tag;
bool eof;
@@ -513,11 +511,10 @@ std::pair<std::string, FieldValue> DecodeFieldsEntry(pb_istream_t* stream) {
return {key, value};
}
-void EncodeObject(Writer* writer,
- const std::map<std::string, FieldValue>& object_value) {
+void EncodeObject(Writer* writer, const ObjectValue& object_value) {
writer->WriteNestedMessage([&object_value](Writer* writer) {
// Write each FieldsEntry (i.e. key-value pair.)
- for (const auto& kv : object_value) {
+ for (const auto& kv : object_value.internal_value) {
writer->WriteTag(PB_WT_STRING,
google_firestore_v1beta1_MapValue_FieldsEntry_key_tag);
writer->WriteNestedMessage(
@@ -528,18 +525,18 @@ void EncodeObject(Writer* writer,
});
}
-std::map<std::string, FieldValue> DecodeObject(pb_istream_t* stream) {
+ObjectValue DecodeObject(pb_istream_t* stream) {
google_firestore_v1beta1_MapValue map_value =
google_firestore_v1beta1_MapValue_init_zero;
- std::map<std::string, FieldValue> result;
+ ObjectValue::Map result;
// NB: c-style callbacks can't use *capturing* lambdas, so we'll pass in the
// object_value via the arg field (and therefore need to do a bunch of
// casting).
map_value.fields.funcs.decode = [](pb_istream_t* stream, const pb_field_t*,
void** arg) -> bool {
- auto& result = *static_cast<std::map<std::string, FieldValue>*>(*arg);
+ auto& result = *static_cast<ObjectValue::Map*>(*arg);
- std::pair<std::string, FieldValue> fv = DecodeFieldsEntry(stream);
+ ObjectValue::Map::value_type fv = DecodeFieldsEntry(stream);
// Sanity check: ensure that this key doesn't already exist in the map.
// TODO(rsgowman): figure out error handling: We can do better than a failed
@@ -560,7 +557,7 @@ std::map<std::string, FieldValue> DecodeObject(pb_istream_t* stream) {
abort();
}
- return result;
+ return ObjectValue{result};
}
} // namespace