aboutsummaryrefslogtreecommitdiff
path: root/src/wallet.h
diff options
context:
space:
mode:
authorKamil Domanski <kdomanski@kdemail.net>2014-08-20 08:42:31 +0200
committerKamil Domanski <kdomanski@kdemail.net>2014-08-31 02:14:20 +0200
commit3d796f89962842e91e7d88e57c1d2d579f01052e (patch)
treed4be736c23fbc4d453a1e4e281eafb4f51cdffd8 /src/wallet.h
parent9f3d47677973cb894fdbb437b9b322e2062a1bf1 (diff)
overhaul serialization code
The implementation of each class' serialization/deserialization is no longer passed within a macro. The implementation now lies within a template of form: template <typename T, typename Stream, typename Operation> inline static size_t SerializationOp(T thisPtr, Stream& s, Operation ser_action, int nType, int nVersion) { size_t nSerSize = 0; /* CODE */ return nSerSize; } In cases when codepath should depend on whether or not we are just deserializing (old fGetSize, fWrite, fRead flags) an additional clause can be used: bool fRead = boost::is_same<Operation, CSerActionUnserialize>(); The IMPLEMENT_SERIALIZE macro will now be a freestanding clause added within class' body (similiar to Qt's Q_OBJECT) to implement GetSerializeSize, Serialize and Unserialize. These are now wrappers around the "SerializationOp" template.
Diffstat (limited to 'src/wallet.h')
-rw-r--r--src/wallet.h123
1 files changed, 76 insertions, 47 deletions
diff --git a/src/wallet.h b/src/wallet.h
index 544b4f5bfb..36b0bafe5a 100644
--- a/src/wallet.h
+++ b/src/wallet.h
@@ -64,12 +64,16 @@ public:
CKeyPool(const CPubKey& vchPubKeyIn);
IMPLEMENT_SERIALIZE
- (
+
+ template <typename T, typename Stream, typename Operation>
+ inline static size_t SerializationOp(T thisPtr, Stream& s, Operation ser_action, int nType, int nVersion) {
+ size_t nSerSize = 0;
if (!(nType & SER_GETHASH))
READWRITE(nVersion);
- READWRITE(nTime);
- READWRITE(vchPubKey);
- )
+ READWRITE(thisPtr->nTime);
+ READWRITE(thisPtr->vchPubKey);
+ return nSerSize;
+ }
};
/** Address book data */
@@ -489,16 +493,20 @@ public:
fMerkleVerified = false;
}
-
IMPLEMENT_SERIALIZE
- (
- nSerSize += SerReadWrite(s, *(CTransaction*)this, nType, nVersion, ser_action);
- nVersion = this->nVersion;
- READWRITE(hashBlock);
- READWRITE(vMerkleBranch);
- READWRITE(nIndex);
- )
+ template <typename T, typename Stream, typename Operation>
+ inline static size_t SerializationOp(T thisPtr, Stream& s, Operation ser_action, int nType, int nVersion) {
+ size_t nSerSize = 0;
+
+ nSerSize += SerReadWrite(s, *(CTransaction*)thisPtr, nType, nVersion, ser_action);
+ nVersion = thisPtr->nVersion;
+ READWRITE(thisPtr->hashBlock);
+ READWRITE(thisPtr->vMerkleBranch);
+ READWRITE(thisPtr->nIndex);
+
+ return nSerSize;
+ }
int SetMerkleBranch(const CBlock* pblock=NULL);
@@ -513,7 +521,6 @@ public:
bool AcceptToMemoryPool(bool fLimitFree=true, bool fRejectInsaneFee=true);
};
-
/** A transaction with a bunch of additional info that only the owner cares about.
* It includes any unrecorded transactions needed to link it back to the block chain.
*/
@@ -604,8 +611,13 @@ public:
}
IMPLEMENT_SERIALIZE
- (
- CWalletTx* pthis = const_cast<CWalletTx*>(this);
+
+ template <typename T, typename Stream, typename Operation>
+ inline static size_t SerializationOp(T thisPtr, Stream& s, Operation ser_action, int nType, int nVersion) {
+ size_t nSerSize = 0;
+ bool fRead = boost::is_same<Operation, CSerActionUnserialize>();
+
+ CWalletTx* pthis = const_cast<CWalletTx*>(thisPtr);
if (fRead)
pthis->Init(NULL);
char fSpent = false;
@@ -616,18 +628,18 @@ public:
WriteOrderPos(pthis->nOrderPos, pthis->mapValue);
- if (nTimeSmart)
- pthis->mapValue["timesmart"] = strprintf("%u", nTimeSmart);
+ if (thisPtr->nTimeSmart)
+ pthis->mapValue["timesmart"] = strprintf("%u", thisPtr->nTimeSmart);
}
- nSerSize += SerReadWrite(s, *(CMerkleTx*)this, nType, nVersion,ser_action);
+ nSerSize += SerReadWrite(s, *(CMerkleTx*)thisPtr, nType, nVersion,ser_action);
std::vector<CMerkleTx> vUnused; // Used to be vtxPrev
READWRITE(vUnused);
- READWRITE(mapValue);
- READWRITE(vOrderForm);
- READWRITE(fTimeReceivedIsTxTime);
- READWRITE(nTimeReceived);
- READWRITE(fFromMe);
+ READWRITE(thisPtr->mapValue);
+ READWRITE(thisPtr->vOrderForm);
+ READWRITE(thisPtr->fTimeReceivedIsTxTime);
+ READWRITE(thisPtr->nTimeReceived);
+ READWRITE(thisPtr->fFromMe);
READWRITE(fSpent);
if (fRead)
@@ -636,7 +648,7 @@ public:
ReadOrderPos(pthis->nOrderPos, pthis->mapValue);
- pthis->nTimeSmart = mapValue.count("timesmart") ? (unsigned int)atoi64(pthis->mapValue["timesmart"]) : 0;
+ pthis->nTimeSmart = thisPtr->mapValue.count("timesmart") ? (unsigned int)atoi64(pthis->mapValue["timesmart"]) : 0;
}
pthis->mapValue.erase("fromaccount");
@@ -644,7 +656,9 @@ public:
pthis->mapValue.erase("spent");
pthis->mapValue.erase("n");
pthis->mapValue.erase("timesmart");
- )
+
+ return nSerSize;
+ }
// make sure balances are recalculated
void MarkDirty()
@@ -891,14 +905,18 @@ public:
CWalletKey(int64_t nExpires=0);
IMPLEMENT_SERIALIZE
- (
+
+ template <typename T, typename Stream, typename Operation>
+ inline static size_t SerializationOp(T thisPtr, Stream& s, Operation ser_action, int nType, int nVersion) {
+ size_t nSerSize = 0;
if (!(nType & SER_GETHASH))
READWRITE(nVersion);
- READWRITE(vchPrivKey);
- READWRITE(nTimeCreated);
- READWRITE(nTimeExpires);
- READWRITE(LIMITED_STRING(strComment, 65536));
- )
+ READWRITE(thisPtr->vchPrivKey);
+ READWRITE(thisPtr->nTimeCreated);
+ READWRITE(thisPtr->nTimeExpires);
+ READWRITE(LIMITED_STRING(thisPtr->strComment, 65536));
+ return nSerSize;
+ }
};
@@ -925,11 +943,15 @@ public:
}
IMPLEMENT_SERIALIZE
- (
+
+ template <typename T, typename Stream, typename Operation>
+ inline static size_t SerializationOp(T thisPtr, Stream& s, Operation ser_action, int nType, int nVersion) {
+ size_t nSerSize = 0;
if (!(nType & SER_GETHASH))
READWRITE(nVersion);
- READWRITE(vchPubKey);
- )
+ READWRITE(thisPtr->vchPubKey);
+ return nSerSize;
+ }
};
@@ -966,38 +988,43 @@ public:
}
IMPLEMENT_SERIALIZE
- (
- CAccountingEntry& me = *const_cast<CAccountingEntry*>(this);
+
+ template <typename T, typename Stream, typename Operation>
+ inline static size_t SerializationOp(T thisPtr, Stream& s, Operation ser_action, int nType, int nVersion) {
+ size_t nSerSize = 0;
+ bool fRead = boost::is_same<Operation, CSerActionUnserialize>();
+
+ CAccountingEntry& me = *const_cast<CAccountingEntry*>(thisPtr);
if (!(nType & SER_GETHASH))
READWRITE(nVersion);
// Note: strAccount is serialized as part of the key, not here.
- READWRITE(nCreditDebit);
- READWRITE(nTime);
- READWRITE(LIMITED_STRING(strOtherAccount, 65536));
+ READWRITE(thisPtr->nCreditDebit);
+ READWRITE(thisPtr->nTime);
+ READWRITE(LIMITED_STRING(thisPtr->strOtherAccount, 65536));
if (!fRead)
{
- WriteOrderPos(nOrderPos, me.mapValue);
+ WriteOrderPos(thisPtr->nOrderPos, me.mapValue);
- if (!(mapValue.empty() && _ssExtra.empty()))
+ if (!(thisPtr->mapValue.empty() && thisPtr->_ssExtra.empty()))
{
CDataStream ss(nType, nVersion);
ss.insert(ss.begin(), '\0');
- ss << mapValue;
- ss.insert(ss.end(), _ssExtra.begin(), _ssExtra.end());
+ ss << thisPtr->mapValue;
+ ss.insert(ss.end(), thisPtr->_ssExtra.begin(), thisPtr->_ssExtra.end());
me.strComment.append(ss.str());
}
}
- READWRITE(LIMITED_STRING(strComment, 65536));
+ READWRITE(LIMITED_STRING(thisPtr->strComment, 65536));
- size_t nSepPos = strComment.find("\0", 0, 1);
+ size_t nSepPos = thisPtr->strComment.find("\0", 0, 1);
if (fRead)
{
me.mapValue.clear();
if (std::string::npos != nSepPos)
{
- CDataStream ss(std::vector<char>(strComment.begin() + nSepPos + 1, strComment.end()), nType, nVersion);
+ CDataStream ss(std::vector<char>(thisPtr->strComment.begin() + nSepPos + 1, thisPtr->strComment.end()), nType, nVersion);
ss >> me.mapValue;
me._ssExtra = std::vector<char>(ss.begin(), ss.end());
}
@@ -1007,7 +1034,9 @@ public:
me.strComment.erase(nSepPos);
me.mapValue.erase("n");
- )
+
+ return nSerSize;
+ }
private:
std::vector<char> _ssExtra;