From 0e86c06f60262c013c0b653470ac59a3c4d12b46 Mon Sep 17 00:00:00 2001 From: rsgowman Date: Tue, 27 Mar 2018 17:04:10 -0400 Subject: Add ObjectValue::Map alias (#967) --- .../src/firebase/firestore/remote/serializer.cc | 31 ++++++++++------------ 1 file changed, 14 insertions(+), 17 deletions(-) (limited to 'Firestore/core/src/firebase/firestore/remote') 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& object_value); +void EncodeObject(Writer* writer, const ObjectValue& object_value); -std::map 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& 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 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 DecodeFieldsEntry(pb_istream_t* stream) { return {key, value}; } -void EncodeObject(Writer* writer, - const std::map& 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 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 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*>(*arg); + auto& result = *static_cast(*arg); - std::pair 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 DecodeObject(pb_istream_t* stream) { abort(); } - return result; + return ObjectValue{result}; } } // namespace -- cgit v1.2.3