From 451df8141113d590452fb635ebc02c2b26463f9a Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Sat, 26 May 2012 02:55:36 -0700 Subject: [PATCH] Add support for STVector256. --- src/SerializedTypes.cpp | 44 ++++++++++++++++++++++++++----- src/SerializedTypes.h | 58 +++++++++++++++++++++++++++++++++++++---- src/Serializer.h | 6 ++--- 3 files changed, 93 insertions(+), 15 deletions(-) diff --git a/src/SerializedTypes.cpp b/src/SerializedTypes.cpp index c5fd60b8a9..6bbb2b7122 100644 --- a/src/SerializedTypes.cpp +++ b/src/SerializedTypes.cpp @@ -1,4 +1,5 @@ +#include #include #include "SerializedTypes.h" @@ -173,15 +174,44 @@ std::string STAccount::getText() const STAccount* STAccount::construct(SerializerIterator& u, const char *name) { - STAccount *ret = new STAccount(name, u.getVL()); - if (!ret->isValueH160()) - { - delete ret; - throw std::runtime_error("invalid account in transaction"); - } - return ret; + return new STAccount(name, u.getVL()); } +// +// STVector256 +// + +// Return a new object from a SerializerIterator. +STVector256* STVector256::construct(SerializerIterator& u, const char *name) +{ + return new STVector256(name, u.getVL()); +} + +void STVector256::add(Serializer& s) const +{ + s.add32(mValue.size()); + BOOST_FOREACH(const uint256& v, mValue) + { + s.add256(v); + } +} + +void STVector256::setValue(const std::vector& vucData) +{ + Serializer s(vucData); + SerializerIterator it(s); + uint64 uSize = it.get32(); + uint64 uIndex = 0; + + mValue.resize(uSize); + while (uSize--) + mValue[uIndex++] = it.get256(); +} + +// +// STAccount +// + bool STAccount::isValueH160() const { return peekValue().size() == (160/8); diff --git a/src/SerializedTypes.h b/src/SerializedTypes.h index 1e4c9c92a2..957e868ab2 100644 --- a/src/SerializedTypes.h +++ b/src/SerializedTypes.h @@ -12,15 +12,28 @@ enum SerializedTypeID { // special types - STI_DONE=-1, STI_NOTPRESENT=0, + STI_DONE = -1, + STI_NOTPRESENT = 0, // standard types - STI_OBJECT=1, STI_UINT8=2, STI_UINT16=3, STI_UINT32=4, STI_UINT64=5, - STI_HASH128=6, STI_HASH160=7, STI_HASH256=8, STI_VL=9, STI_TL=10, - STI_AMOUNT=11, STI_PATHSET=12, + STI_OBJECT = 1, + STI_UINT8 = 2, + STI_UINT16 = 3, + STI_UINT32 = 4, + STI_UINT64 = 5, + STI_HASH128 = 6, + STI_HASH160 = 7, + STI_HASH256 = 8, + STI_VL = 9, + STI_TL = 10, + STI_AMOUNT = 11, + STI_PATHSET = 12, + STI_VECTOR256 = 13, // high level types - STI_ACCOUNT=100, STI_TRANSACTION=101, STI_LEDGERENTRY=102 + STI_ACCOUNT = 100, + STI_TRANSACTION = 101, + STI_LEDGERENTRY = 102 }; class SerializedType @@ -561,5 +574,40 @@ public: virtual bool isEquivalent(const SerializedType& t) const; }; +class STVector256 : public SerializedType +{ +protected: + std::vector mValue; + + STVector256* duplicate() const { return new STVector256(name, mValue); } + static STVector256* construct(SerializerIterator&, const char* name = NULL); + +public: + STVector256() { ; } + STVector256(const char* n) : SerializedType(n) { ; } + STVector256(const char* n, const std::vector& v) : SerializedType(n), mValue(v) { ; } + STVector256(const std::vector& vector) : mValue(vector) { ; } + STVector256(const char* n, const std::vector& vucSerial) : SerializedType(n) + { setValue(vucSerial); } + + SerializedTypeID getSType() const { return STI_VECTOR256; } + int getLength() const { return mValue.size()*(256/8)+(64/8); } + void add(Serializer& s) const; + + static std::auto_ptr deserialize(SerializerIterator& sit, const char* name) + { return std::auto_ptr(construct(sit, name)); } + + const std::vector& peekValue() const { return mValue; } + std::vector& peekValue() { return mValue; } + + std::vector getValue() const { return mValue; } + + bool isEmpty() const { return mValue.empty(); } + + void setValue(const STVector256& v) { mValue = v.mValue; } + void setValue(const std::vector& v) { mValue = v; } + void setValue(const std::vector& vucData); +}; + #endif // vim:ts=4 diff --git a/src/Serializer.h b/src/Serializer.h index 6000c4e89b..95fbbaa02e 100644 --- a/src/Serializer.h +++ b/src/Serializer.h @@ -14,13 +14,13 @@ typedef std::pair > TaggedListItem; class Serializer { - public: +public: typedef boost::shared_ptr pointer; - protected: +protected: std::vector mData; - public: +public: Serializer(int n=256) { mData.reserve(n); } Serializer(const std::vector &data) : mData(data) { ; } Serializer(const std::string& data) : mData(data.data(), (data.data()) + data.size()) { ; }