From c9cd7e4be08f6c37bb624e6fa8ce03d73b90e989 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 30 Jul 2014 22:00:36 -0700 Subject: [PATCH] Rewrite STObject::setType for improved performance --- .../module/data/protocol/SerializedObject.cpp | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/ripple/module/data/protocol/SerializedObject.cpp b/src/ripple/module/data/protocol/SerializedObject.cpp index c59878116..3f41644d7 100644 --- a/src/ripple/module/data/protocol/SerializedObject.cpp +++ b/src/ripple/module/data/protocol/SerializedObject.cpp @@ -154,30 +154,35 @@ bool STObject::setType (const SOTemplate& type) mType = &type; - for (SOTemplate::value_type const& elem : type.peek ()) + SerializedType** array = mData.c_array(); + std::size_t count = mData.size (); + + for (auto const& elem : type.peek ()) { + // Loop through all the fields in the template bool match = false; - for (boost::ptr_vector::iterator it = mData.begin (); it != mData.end (); ++it) - if (it->getFName () == elem->e_field) + for (std::size_t i = 0; i < count; ++i) + if ((array[i] != nullptr) && (array[i]->getFName () == elem->e_field)) { - // matching entry, move to new vector + // matching entry in the object, move to new vector match = true; - if ((elem->flags == SOE_DEFAULT) && it->isDefault ()) + if ((elem->flags == SOE_DEFAULT) && array[i]->isDefault ()) { WriteLog (lsWARNING, STObject) << "setType( " << getFName ().getName () << ") invalid default " << elem->e_field.fieldName; valid = false; } - newData.push_back (mData.release (it).release ()); // CAUTION: This renders 'it' invalid + newData.push_back (array[i]); + array[i] = nullptr; break; } if (!match) { - // no match found + // no match found in the object for an entry in the template if (elem->flags == SOE_REQUIRED) { WriteLog (lsWARNING, STObject) << "setType( " << getFName ().getName () << ") invalid missing " @@ -185,22 +190,26 @@ bool STObject::setType (const SOTemplate& type) valid = false; } + // Make a default object newData.push_back (makeNonPresentObject (elem->e_field).release ()); } } - BOOST_FOREACH (const SerializedType & t, mData) + for (std::size_t i = 0; i < count; ++i) { - // Anything left over must be discardable - if (!t.getFName ().isDiscardable ()) + // Anything left over in the object must be discardable + if ((array[i] != nullptr) && !array[i]->getFName ().isDiscardable ()) { WriteLog (lsWARNING, STObject) << "setType( " << getFName ().getName () << ") invalid leftover " - << t.getFName ().getName (); + << array[i]->getFName ().getName (); valid = false; } } + // Swap the template matching data in for the old data, + // freeing any leftover junk mData.swap (newData); + return valid; }