Skip to content

Commit

Permalink
Support serializing Span<unsigned char> and use that instead of FLATDATA
Browse files Browse the repository at this point in the history
  • Loading branch information
sipa authored and furszy committed Jul 3, 2021
1 parent 8fef544 commit 1ef2d90
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 49 deletions.
9 changes: 5 additions & 4 deletions src/compressor.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include "primitives/transaction.h"
#include "script/script.h"
#include "serialize.h"
#include "span.h"

class CKeyID;
class CPubKey;
Expand Down Expand Up @@ -63,12 +64,12 @@ class CScriptCompressor
{
std::vector<unsigned char> compr;
if (Compress(compr)) {
s << CFlatData(compr);
s << MakeSpan(compr);
return;
}
unsigned int nSize = script.size() + nSpecialScripts;
s << VARINT(nSize);
s << CFlatData(script);
s << MakeSpan(script);
}

template <typename Stream>
Expand All @@ -78,7 +79,7 @@ class CScriptCompressor
s >> VARINT(nSize);
if (nSize < nSpecialScripts) {
std::vector<unsigned char> vch(GetSpecialSize(nSize), 0x00);
s >> CFlatData(vch);
s >> MakeSpan(vch);
Decompress(nSize, vch);
return;
}
Expand All @@ -89,7 +90,7 @@ class CScriptCompressor
s.ignore(nSize);
} else {
script.resize(nSize);
s >> CFlatData(script);
s >> MakeSpan(script);
}
}
};
Expand Down
8 changes: 6 additions & 2 deletions src/netaddress.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

#include "compat.h"
#include "serialize.h"
#include "span.h"

#include <stdint.h>
#include <string>
Expand Down Expand Up @@ -171,10 +172,13 @@ class CService : public CNetAddr
inline void SerializationOp(Stream& s, Operation ser_action)
{
READWRITE(ip);

// TODO: introduce native support for BE serialization in serialize.h
unsigned short portN = htons(port);
READWRITE(FLATDATA(portN));
if (ser_action.ForRead())
READWRITE(Span<unsigned char>((unsigned char*)&portN, 2));
if (ser_action.ForRead()) {
port = ntohs(portN);
}
}
};

Expand Down
48 changes: 5 additions & 43 deletions src/serialize.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include "libzerocoin/SpendType.h"
#include "optional.h"
#include "prevector.h"
#include "span.h"
#include "sporkid.h"

class CScript;
Expand All @@ -49,7 +50,7 @@ constexpr deserialize_type deserialize {};

/**
* Used to bypass the rule against non-const reference to temporary
* where it makes sense with wrappers such as CFlatData or CTxDB
* where it makes sense with wrappers.
*/
template <typename T>
inline T& REF(const T& val)
Expand Down Expand Up @@ -203,6 +204,8 @@ template<typename Stream> inline void Serialize(Stream& s, float a ) { ser_wri
template<typename Stream> inline void Serialize(Stream& s, double a ) { ser_writedata64(s, ser_double_to_uint64(a)); }
template<typename Stream, int N> inline void Serialize(Stream& s, const char (&a)[N]) { s.write(a, N); }
template<typename Stream, int N> inline void Serialize(Stream& s, const unsigned char (&a)[N]) { s.write(CharCast(a), N); }
template<typename Stream> inline void Serialize(Stream& s, const Span<const unsigned char>& span) { s.write(CharCast(span.data()), span.size()); }
template<typename Stream> inline void Serialize(Stream& s, const Span<unsigned char>& span) { s.write(CharCast(span.data()), span.size()); }

template<typename Stream> inline void Unserialize(Stream& s, char& a ) { a = ser_readdata8(s); } // TODO Get rid of bare char
template<typename Stream> inline void Unserialize(Stream& s, int8_t& a ) { a = ser_readdata8(s); }
Expand All @@ -217,6 +220,7 @@ template<typename Stream> inline void Unserialize(Stream& s, float& a ) { a =
template<typename Stream> inline void Unserialize(Stream& s, double& a ) { a = ser_uint64_to_double(ser_readdata64(s)); }
template<typename Stream, int N> inline void Unserialize(Stream& s, char (&a)[N]) { s.read(a, N); }
template<typename Stream, int N> inline void Unserialize(Stream& s, unsigned char (&a)[N]) { s.read(CharCast(a), N); }
template<typename Stream> inline void Unserialize(Stream& s, Span<unsigned char>& span) { s.read(CharCast(span.data()), span.size()); }

template<typename Stream> inline void Serialize(Stream& s, bool a) { char f=a; ser_writedata8(s, f); }
template<typename Stream> inline void Unserialize(Stream& s, bool& a) { char f=ser_readdata8(s); a=f; }
Expand Down Expand Up @@ -433,52 +437,10 @@ I ReadVarInt(Stream& is)
}
}

#define FLATDATA(obj) CFlatData((char*)&(obj), (char*)&(obj) + sizeof(obj))
#define VARINT(obj, ...) WrapVarInt<__VA_ARGS__>(REF(obj))
#define COMPACTSIZE(obj) CCompactSize(REF(obj))
#define LIMITED_STRING(obj,n) LimitedString< n >(REF(obj))

/**
* Wrapper for serializing arrays and POD.
*/
class CFlatData
{
protected:
char* pbegin;
char* pend;

public:
CFlatData(void* pbeginIn, void* pendIn) : pbegin((char*)pbeginIn), pend((char*)pendIn) {}
template <class T, class TAl>
explicit CFlatData(std::vector<T, TAl>& v)
{
pbegin = (char*)v.data();
pend = (char*)(v.data() + v.size());
}
template <unsigned int N, typename T, typename S, typename D>
explicit CFlatData(prevector<N, T, S, D> &v)
{
pbegin = (char*)v.data();
pend = (char*)(v.data() + v.size());
}
char* begin() { return pbegin; }
const char* begin() const { return pbegin; }
char* end() { return pend; }
const char* end() const { return pend; }

template <typename Stream>
void Serialize(Stream& s) const
{
s.write(pbegin, pend - pbegin);
}

template <typename Stream>
void Unserialize(Stream& s)
{
s.read(pbegin, pend - pbegin);
}
};

template<VarIntMode Mode, typename I>
class CVarInt
{
Expand Down

0 comments on commit 1ef2d90

Please sign in to comment.