diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -351,42 +351,36 @@ nOrderPos = -1; } - ADD_SERIALIZE_METHODS; + template void Serialize(Stream &s) const { + char fSpent = false; + mapValue_t mapValueCopy = mapValue; - template - inline void SerializationOp(Stream &s, Operation ser_action) { - if (ser_action.ForRead()) { - Init(nullptr); + mapValueCopy["fromaccount"] = strFromAccount; + WriteOrderPos(nOrderPos, mapValueCopy); + if (nTimeSmart) { + mapValueCopy["timesmart"] = strprintf("%u", nTimeSmart); } - char fSpent = false; + s << *static_cast(this); + std::vector vUnused; //!< Used to be vtxPrev + s << vUnused << mapValueCopy << vOrderForm << fTimeReceivedIsTxTime + << nTimeReceived << fFromMe << fSpent; + } - if (!ser_action.ForRead()) { - mapValue["fromaccount"] = strFromAccount; - WriteOrderPos(nOrderPos, mapValue); - if (nTimeSmart) { - mapValue["timesmart"] = strprintf("%u", nTimeSmart); - } - } + template void Unserialize(Stream &s) { + Init(nullptr); + char fSpent; - READWRITE(*static_cast(this)); - //!< Used to be vtxPrev - std::vector vUnused; - READWRITE(vUnused); - READWRITE(mapValue); - READWRITE(vOrderForm); - READWRITE(fTimeReceivedIsTxTime); - READWRITE(nTimeReceived); - READWRITE(fFromMe); - READWRITE(fSpent); + s >> *static_cast(this); + std::vector vUnused; //!< Used to be vtxPrev + s >> vUnused >> mapValue >> vOrderForm >> fTimeReceivedIsTxTime >> + nTimeReceived >> fFromMe >> fSpent; - if (ser_action.ForRead()) { - strFromAccount = mapValue["fromaccount"]; - ReadOrderPos(nOrderPos, mapValue); - nTimeSmart = mapValue.count("timesmart") - ? (unsigned int)atoi64(mapValue["timesmart"]) - : 0; - } + strFromAccount = std::move(mapValue["fromaccount"]); + ReadOrderPos(nOrderPos, mapValue); + nTimeSmart = mapValue.count("timesmart") + ? (unsigned int)atoi64(mapValue["timesmart"]) + : 0; mapValue.erase("fromaccount"); mapValue.erase("version"); @@ -568,45 +562,50 @@ nEntryNo = 0; } - ADD_SERIALIZE_METHODS; - - template - inline void SerializationOp(Stream &s, Operation ser_action) { + template void Serialize(Stream &s) const { int nVersion = s.GetVersion(); - if (!(s.GetType() & SER_GETHASH)) READWRITE(nVersion); + if (!(s.GetType() & SER_GETHASH)) { + s << nVersion; + } //! Note: strAccount is serialized as part of the key, not here. - READWRITE(nCreditDebit); - READWRITE(nTime); - READWRITE(LIMITED_STRING(strOtherAccount, 65536)); - - if (!ser_action.ForRead()) { - WriteOrderPos(nOrderPos, mapValue); - - if (!(mapValue.empty() && _ssExtra.empty())) { - CDataStream ss(s.GetType(), s.GetVersion()); - ss.insert(ss.begin(), '\0'); - ss << mapValue; - ss.insert(ss.end(), _ssExtra.begin(), _ssExtra.end()); - strComment.append(ss.str()); - } + s << nCreditDebit << nTime << strOtherAccount; + + mapValue_t mapValueCopy = mapValue; + WriteOrderPos(nOrderPos, mapValueCopy); + + std::string strCommentCopy = strComment; + if (!mapValueCopy.empty() || !_ssExtra.empty()) { + CDataStream ss(s.GetType(), s.GetVersion()); + ss.insert(ss.begin(), '\0'); + ss << mapValueCopy; + ss.insert(ss.end(), _ssExtra.begin(), _ssExtra.end()); + strCommentCopy.append(ss.str()); } + s << strCommentCopy; + } - READWRITE(LIMITED_STRING(strComment, 65536)); + template void Unserialize(Stream &s) { + int nVersion = s.GetVersion(); + if (!(s.GetType() & SER_GETHASH)) { + s >> nVersion; + } + //! Note: strAccount is serialized as part of the key, not here. + s >> nCreditDebit >> nTime >> LIMITED_STRING(strOtherAccount, 65536) >> + LIMITED_STRING(strComment, 65536); size_t nSepPos = strComment.find("\0", 0, 1); - if (ser_action.ForRead()) { - mapValue.clear(); - if (std::string::npos != nSepPos) { - CDataStream ss( - std::vector(strComment.begin() + nSepPos + 1, - strComment.end()), - s.GetType(), s.GetVersion()); - ss >> mapValue; - _ssExtra = std::vector(ss.begin(), ss.end()); - } - ReadOrderPos(nOrderPos, mapValue); + mapValue.clear(); + if (std::string::npos != nSepPos) { + CDataStream ss(std::vector(strComment.begin() + nSepPos + 1, + strComment.end()), + s.GetType(), s.GetVersion()); + ss >> mapValue; + _ssExtra = std::vector(ss.begin(), ss.end()); + } + ReadOrderPos(nOrderPos, mapValue); + if (std::string::npos != nSepPos) { + strComment.erase(nSepPos); } - if (std::string::npos != nSepPos) strComment.erase(nSepPos); mapValue.erase("n"); }