 |
PRCYCoin
2.0.0.7rc1
P2P Digital Currency
|
Go to the documentation of this file.
6 #ifndef BITCOIN_STREAMS_H
7 #define BITCOIN_STREAMS_H
25 #define HEX_DATA_STREAM CDataStream ser(SER_NETWORK, PROTOCOL_VERSION); ser
26 #define HEX_DATA_STREAM_PROTOCOL(protocolVersion) CDataStream ser(SER_NETWORK, protocolVersion); ser
27 #define HEX_STR(a) HexStr(a.begin(), a.end())
57 Init(nTypeIn, nVersionIn);
62 Init(nTypeIn, nVersionIn);
65 #if !defined(_MSC_VER) || _MSC_VER >= 1300
66 CDataStream(
const char* pbegin,
const char* pend,
int nTypeIn,
int nVersionIn) :
vch(pbegin, pend)
68 Init(nTypeIn, nVersionIn);
74 Init(nTypeIn, nVersionIn);
79 Init(nTypeIn, nVersionIn);
84 Init(nTypeIn, nVersionIn);
87 void Init(
int nTypeIn,
int nVersionIn)
96 vch.insert(
vch.end(),
b.begin(),
b.end());
109 return (std::string(
begin(),
end()));
134 void insert(
iterator it, std::vector<char>::const_iterator first, std::vector<char>::const_iterator last)
136 assert(last - first >= 0);
142 vch.insert(it, first, last);
145 #if !defined(_MSC_VER) || _MSC_VER >= 1300
148 assert(last - first >= 0);
154 vch.insert(it, first, last);
165 return vch.erase(
vch.begin(),
vch.end());
169 return vch.erase(it);
176 if (last ==
vch.end()) {
178 return vch.erase(
vch.begin(),
vch.end());
184 return vch.erase(first, last);
220 unsigned int nReadPosNext =
nReadPos + nSize;
221 if (nReadPosNext >=
vch.size()) {
222 if (nReadPosNext >
vch.size()) {
223 throw std::ios_base::failure(
"CDataStream::read() : end of data");
239 unsigned int nReadPosNext =
nReadPos + nSize;
240 if (nReadPosNext >=
vch.size()) {
241 if (nReadPosNext >
vch.size())
242 throw std::ios_base::failure(
"CDataStream::ignore() : end of data");
254 vch.insert(
vch.end(), pch, pch + nSize);
258 template <
typename Stream>
263 s.write((
char*)&
vch[0],
vch.size() *
sizeof(
vch[0]));
266 template <
typename T>
273 template <
typename T>
281 template <
typename T>
291 data.insert(data.end(),
begin(),
end());
370 throw std::ios_base::failure(
"CAutoFile::read : file handle is NULL");
371 if (fread(pch, 1, nSize,
file) != nSize)
372 throw std::ios_base::failure(feof(
file) ?
"CAutoFile::read : end of file" :
"CAutoFile::read : fread failed");
379 throw std::ios_base::failure(
"CAutoFile::ignore: file handle is NULL");
380 unsigned char data[4096];
382 size_t nNow = std::min<size_t>(nSize,
sizeof(data));
383 if (fread(data, 1, nNow,
file) != nNow)
384 throw std::ios_base::failure(feof(
file) ?
"CAutoFile::ignore: end of file" :
"CAutoFile::read: fread failed");
393 throw std::ios_base::failure(
"CAutoFile::write : file handle is NULL");
394 if (fwrite(pch, 1, nSize,
file) != nSize)
395 throw std::ios_base::failure(
"CAutoFile::write : write failed");
399 template <
typename T>
406 template <
typename T>
411 throw std::ios_base::failure(
"CAutoFile::operator<< : file handle is NULL");
416 template <
typename T>
421 throw std::ios_base::failure(
"CAutoFile::operator>> : file handle is NULL");
455 unsigned int readNow =
vchBuf.size() - pos;
457 if (nAvail < readNow)
463 throw std::ios_base::failure(feof(
src) ?
"CBufferedFile::Fill : end of file" :
"CBufferedFile::Fill : fread failed");
501 throw std::ios_base::failure(
"Read attempted past buffer limit");
503 throw std::ios_base::failure(
"Read larger than buffer size");
509 if (nNow + pos >
vchBuf.size())
510 nNow =
vchBuf.size() - pos;
544 long nLongPos = nPos;
545 if (nPos != (uint64_t)nLongPos)
547 if (fseek(
src, nLongPos, SEEK_SET))
549 nLongPos = ftell(
src);
565 template <
typename T>
586 #endif // BITCOIN_STREAMS_H
CAutoFile & operator<<(const T &obj)
vector_type::value_type value_type
vector_type::size_type size_type
CAutoFile & operator=(const CAutoFile &)
CAutoFile & read(char *pch, size_t nSize)
iterator erase(iterator first, iterator last)
friend CDataStream operator+(const CDataStream &a, const CDataStream &b)
const_iterator begin() const
bool SetPos(uint64_t nPos)
FILE * Get() const
Get wrapped FILE* without transfer of ownership.
CDataStream(const std::vector< unsigned char > &vchIn, int nTypeIn, int nVersionIn)
CDataStream(const char *pbegin, const char *pend, int nTypeIn, int nVersionIn)
CDataStream & operator>>(T &obj)
void Init(int nTypeIn, int nVersionIn)
CDataStream(const vector_type &vchIn, int nTypeIn, int nVersionIn)
CAutoFile & operator>>(T &obj)
void insert(iterator it, std::vector< char >::const_iterator first, std::vector< char >::const_iterator last)
vector_type::reference reference
void * memcpy(void *a, const void *b, size_t c)
unsigned int GetSerializeSize(char a, int, int=0)
void Unserialize(Stream &s, char &a, int, int=0)
iterator insert(iterator it, const char &x=char())
CSerializeData vector_type
CDataStream(const std::vector< char > &vchIn, int nTypeIn, int nVersionIn)
void insert(iterator it, size_type n, const char &x)
Non-refcounted RAII wrapper for FILE*.
vector_type::const_reference const_reference
CDataStream & operator+=(const CDataStream &b)
vector_type::allocator_type allocator_type
Non-refcounted RAII wrapper around a FILE* that implements a ring buffer to deserialize from.
CDataStream(int nTypeIn, int nVersionIn)
CDataStream & ignore(int nSize)
const_reference operator[](size_type pos) const
CAutoFile & write(const char *pch, size_t nSize)
const_iterator end() const
std::vector< char > vchBuf
CAutoFile(FILE *filenew, int nTypeIn, int nVersionIn)
iterator erase(iterator it)
void GetAndClear(CSerializeData &data)
bool IsNull() const
Return true if the wrapped FILE* is NULL, false otherwise.
std::vector< char, zero_after_free_allocator< char > > CSerializeData
CBufferedFile & operator>>(T &obj)
CAutoFile & ignore(size_t nSize)
CBufferedFile & operator=(const CBufferedFile &)
CAutoFile(const CAutoFile &)
vector_type::reverse_iterator reverse_iterator
void reserve(size_type n)
CBufferedFile(const CBufferedFile &)
reference operator[](size_type pos)
void Serialize(Stream &s, int nType, int nVersion) const
unsigned int GetSerializeSize(const T &obj)
vector_type::difference_type difference_type
CDataStream & operator<<(const T &obj)
vector_type::const_iterator const_iterator
void Serialize(Stream &s, char a, int, int=0)
void resize(size_type n, value_type c=0)
CBufferedFile & read(char *pch, size_t nSize)
Double ended buffer combining vector and stream-like interfaces.
void insert(iterator it, const char *first, const char *last)
CDataStream(const_iterator pbegin, const_iterator pend, int nTypeIn, int nVersionIn)
FILE * release()
Get wrapped FILE* with transfer of ownership.
CBufferedFile(FILE *fileIn, uint64_t nBufSize, uint64_t nRewindIn, int nTypeIn, int nVersionIn)
unsigned int GetSerializeSize(const T &obj)
CDataStream & read(char *pch, size_t nSize)
bool SetLimit(uint64_t nPos=(uint64_t)(-1))
vector_type::iterator iterator
CDataStream & write(const char *pch, size_t nSize)