aboutsummaryrefslogtreecommitdiffhomepage
path: root/Firestore/core/src/firebase/firestore/model/field_value.cc
diff options
context:
space:
mode:
authorGravatar zxu <zxu@google.com>2018-02-12 17:00:25 -0500
committerGravatar GitHub <noreply@github.com>2018-02-12 17:00:25 -0500
commitadf9fb31eeef639ef23b2ff22a71adaa91a263b7 (patch)
treefe302ae8527b8b39669fa937b364b55d812ec610 /Firestore/core/src/firebase/firestore/model/field_value.cc
parent4afcfb1b11a9ab2cd3ae4ee212093cce845a5978 (diff)
Update FieldValue of type Reference (#775)
* update FieldValue of type Reference * address change * fix bad path string literal in test * use ReferenceValue and qualified name
Diffstat (limited to 'Firestore/core/src/firebase/firestore/model/field_value.cc')
-rw-r--r--Firestore/core/src/firebase/firestore/model/field_value.cc41
1 files changed, 41 insertions, 0 deletions
diff --git a/Firestore/core/src/firebase/firestore/model/field_value.cc b/Firestore/core/src/firebase/firestore/model/field_value.cc
index 570226e..012a90d 100644
--- a/Firestore/core/src/firebase/firestore/model/field_value.cc
+++ b/Firestore/core/src/firebase/firestore/model/field_value.cc
@@ -99,6 +99,9 @@ FieldValue& FieldValue::operator=(const FieldValue& value) {
std::swap(blob_value_, tmp);
break;
}
+ case Type::Reference:
+ reference_value_ = value.reference_value_;
+ break;
case Type::GeoPoint:
geo_point_value_ = value.geo_point_value_;
break;
@@ -131,6 +134,11 @@ FieldValue& FieldValue::operator=(FieldValue&& value) {
SwitchTo(Type::Blob);
std::swap(blob_value_, value.blob_value_);
return *this;
+ case Type::Reference:
+ SwitchTo(Type::Reference);
+ std::swap(reference_value_.reference, value.reference_value_.reference);
+ reference_value_.database_id = value.reference_value_.database_id;
+ return *this;
case Type::Array:
SwitchTo(Type::Array);
std::swap(array_value_, value.array_value_);
@@ -233,6 +241,26 @@ FieldValue FieldValue::BlobValue(const uint8_t* source, size_t size) {
return result;
}
+// Does NOT pass ownership of database_id.
+FieldValue FieldValue::ReferenceValue(const DocumentKey& value,
+ const DatabaseId* database_id) {
+ FieldValue result;
+ result.SwitchTo(Type::Reference);
+ result.reference_value_.reference = value;
+ result.reference_value_.database_id = database_id;
+ return result;
+}
+
+// Does NOT pass ownership of database_id.
+FieldValue FieldValue::ReferenceValue(DocumentKey&& value,
+ const DatabaseId* database_id) {
+ FieldValue result;
+ result.SwitchTo(Type::Reference);
+ std::swap(result.reference_value_.reference, value);
+ result.reference_value_.database_id = database_id;
+ return result;
+}
+
FieldValue FieldValue::GeoPointValue(const GeoPoint& value) {
FieldValue result;
result.SwitchTo(Type::GeoPoint);
@@ -309,6 +337,12 @@ bool operator<(const FieldValue& lhs, const FieldValue& rhs) {
return lhs.string_value_.compare(rhs.string_value_) < 0;
case Type::Blob:
return lhs.blob_value_ < rhs.blob_value_;
+ case Type::Reference:
+ return *lhs.reference_value_.database_id <
+ *rhs.reference_value_.database_id ||
+ (*lhs.reference_value_.database_id ==
+ *rhs.reference_value_.database_id &&
+ lhs.reference_value_.reference < rhs.reference_value_.reference);
case Type::GeoPoint:
return lhs.geo_point_value_ < rhs.geo_point_value_;
case Type::Array:
@@ -343,6 +377,9 @@ void FieldValue::SwitchTo(const Type type) {
case Type::Blob:
blob_value_.~vector();
break;
+ case Type::Reference:
+ reference_value_.~ReferenceValue();
+ break;
case Type::GeoPoint:
geo_point_value_.~GeoPoint();
break;
@@ -370,6 +407,10 @@ void FieldValue::SwitchTo(const Type type) {
// Do not even bother to allocate a new array of size 0.
new (&blob_value_) std::vector<uint8_t>();
break;
+ case Type::Reference:
+ // Qualified name to avoid conflict with the member function of same name.
+ new (&reference_value_) firebase::firestore::model::ReferenceValue();
+ break;
case Type::GeoPoint:
new (&geo_point_value_) GeoPoint();
break;