From 7e29b4fae7c7199a58aa4cb39b28ac7bd4684ac1 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 16 Oct 2012 13:07:22 -0700 Subject: [PATCH] Some additional helper functions. --- src/SerializedObject.cpp | 13 +++++++++++++ src/SerializedObject.h | 3 +++ 2 files changed, 16 insertions(+) diff --git a/src/SerializedObject.cpp b/src/SerializedObject.cpp index c8d243952e..a7ce22ba43 100644 --- a/src/SerializedObject.cpp +++ b/src/SerializedObject.cpp @@ -396,6 +396,19 @@ bool STObject::isFieldPresent(SField::ref field) const return peekAtIndex(index).getSType() != STI_NOTPRESENT; } +STObject& STObject::peekFieldObject(SField::ref field) +{ + SerializedType* rf = getPField(field, true); + if (!rf) + throw std::runtime_error("Field not found"); + if (rf->getSType() == STI_NOTPRESENT) + rf = makeFieldPresent(field); + STObject* cf = dynamic_cast(rf); + if (!cf) + throw std::runtime_error("Wrong field type"); + return *cf; +} + bool STObject::setFlag(uint32 f) { STUInt32* t = dynamic_cast(getPField(sfFlags, true)); diff --git a/src/SerializedObject.h b/src/SerializedObject.h index f2c389f09d..69683ed497 100644 --- a/src/SerializedObject.h +++ b/src/SerializedObject.h @@ -132,6 +132,8 @@ public: void setFieldPathSet(SField::ref field, const STPathSet&); void setFieldV256(SField::ref field, const STVector256& v); + STObject& peekFieldObject(SField::ref field); + bool isFieldPresent(SField::ref field) const; SerializedType* makeFieldPresent(SField::ref field); void makeFieldAbsent(SField::ref field); @@ -199,6 +201,7 @@ public: void pop_back() { value.pop_back(); } bool empty() const { return value.empty(); } void clear() { value.clear(); } + void swap(STArray& a) { value.swap(a.value); } virtual std::string getFullText() const; virtual std::string getText() const;