From c6b2b5b819bcf6d8bee32882d682b140dcfc5187 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Sat, 2 Mar 2013 22:16:39 -0800 Subject: [PATCH 1/2] Add a get function. --- src/cpp/ripple/InstanceCounter.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/cpp/ripple/InstanceCounter.h b/src/cpp/ripple/InstanceCounter.h index 48f82d0332..95301cbbfa 100644 --- a/src/cpp/ripple/InstanceCounter.h +++ b/src/cpp/ripple/InstanceCounter.h @@ -50,6 +50,11 @@ public: sMultiThreaded = true; } + static bool isMultiThread() + { + return sMultiThreaded; + } + void addInstance() { if (sMultiThreaded) From 402f296c36349be5a75befc2526184dc23a13b22 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Sat, 2 Mar 2013 22:16:52 -0800 Subject: [PATCH 2/2] A more sensible implementaiton SOTemplate::getIndex. --- src/cpp/ripple/FieldNames.cpp | 1 + src/cpp/ripple/FieldNames.h | 12 +++++++++++- src/cpp/ripple/SerializedObject.cpp | 11 +++++++---- src/cpp/ripple/SerializedObject.h | 2 +- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/cpp/ripple/FieldNames.cpp b/src/cpp/ripple/FieldNames.cpp index 6bd34da299..18271e48c7 100644 --- a/src/cpp/ripple/FieldNames.cpp +++ b/src/cpp/ripple/FieldNames.cpp @@ -12,6 +12,7 @@ // These must stay at the top of this file std::map SField::codeToField; boost::mutex SField::mapMutex; +int SField::num = 0; SField sfInvalid(-1), sfGeneric(0); SField sfLedgerEntry(STI_LEDGERENTRY, 1, "LedgerEntry"); diff --git a/src/cpp/ripple/FieldNames.h b/src/cpp/ripple/FieldNames.h index f199c1f95c..b2ae08aa72 100644 --- a/src/cpp/ripple/FieldNames.h +++ b/src/cpp/ripple/FieldNames.h @@ -51,6 +51,7 @@ public: protected: static std::map codeToField; static boost::mutex mapMutex; + static int num; SField(SerializedTypeID id, int val); @@ -61,6 +62,7 @@ public: const int fieldValue; // Code number for protocol std::string fieldName; int fieldMeta; + int fieldNum; bool signingField; SField(int fc, SerializedTypeID tid, int fv, const char* fn) : @@ -68,6 +70,7 @@ public: { boost::mutex::scoped_lock sl(mapMutex); codeToField[fieldCode] = this; + fieldNum = ++num; } SField(SerializedTypeID tid, int fv, const char *fn) : @@ -76,9 +79,14 @@ public: { boost::mutex::scoped_lock sl(mapMutex); codeToField[fieldCode] = this; + fieldNum = ++num; } - SField(int fc) : fieldCode(fc), fieldType(STI_UNKNOWN), fieldValue(0), fieldMeta(sMD_Never) { ; } + SField(int fc) : fieldCode(fc), fieldType(STI_UNKNOWN), fieldValue(0), fieldMeta(sMD_Never) + { + boost::mutex::scoped_lock sl(mapMutex); + fieldNum = ++num; + } ~SField(); @@ -97,6 +105,8 @@ public: bool isBinary() const { return fieldValue < 256; } bool isDiscardable() const { return fieldValue > 256; } int getCode() const { return fieldCode; } + int getNum() const { return fieldNum; } + static int getNumFields() { return num; } bool isSigningField() const { return signingField; } void notSigningField() { signingField = false; } diff --git a/src/cpp/ripple/SerializedObject.cpp b/src/cpp/ripple/SerializedObject.cpp index 2ab80d4147..75dbfb108c 100644 --- a/src/cpp/ripple/SerializedObject.cpp +++ b/src/cpp/ripple/SerializedObject.cpp @@ -132,15 +132,18 @@ std::auto_ptr STObject::makeDeserializedObject(SerializedTypeID void SOTemplate::push_back(const SOElement &r) { - assert(mMap.find(r.e_field.getCode()) == mMap.end()); - mMap[r.e_field.getCode()] = mTypes.size(); + if (mIndex.empty()) + mIndex.resize(SField::getNumFields() + 1, -1); + assert(r.e_field.getNum() < mIndex.size()); + assert(getIndex(r.e_field) == -1); + mIndex[r.e_field.getNum()] = mTypes.size(); mTypes.push_back(new SOElement(r)); } int SOTemplate::getIndex(SField::ref f) const { - std::map::const_iterator it = mMap.find(f.getCode()); - return (it == mMap.end()) ? -1 : it->second; + assert(f.getNum() < mIndex.size()); + return mIndex[f.getNum()]; } void STObject::set(const SOTemplate& type) diff --git a/src/cpp/ripple/SerializedObject.h b/src/cpp/ripple/SerializedObject.h index bd5e5b2c16..8638d4e9e8 100644 --- a/src/cpp/ripple/SerializedObject.h +++ b/src/cpp/ripple/SerializedObject.h @@ -28,7 +28,7 @@ class SOTemplate { protected: std::vector mTypes; - std::map mMap; // field code -> index + std::vector mIndex; // field num -> index public: SOTemplate() { ; }