Files
fail/src/core/util/ProtoStream.hpp
Horst Schirmeier 4cb97a7fa5 formatting, typos, comments, details
Change-Id: Iae5f1acb653a694622e9ac2bad93efcfca588f3a
2014-01-22 13:08:13 +01:00

82 lines
2.0 KiB
C++

/**
* \brief One way to manage large protobuf-messages
*
* Google protobuf is not designed for large messages. That leads to
* much memory which is consumed by processing large messages. To
* solve this problem the ProtoStream class stores the protobuf-messages
* in an other way. Instead of using the repeat-function the data is
* written sequentially in a file. Written in the format:
*
* \code
* | 4 bytes length-information of the first message | first message
* | 4 bytes length-information of the second message | second message
* | ...
* \endcode
*/
#ifndef __PROTOSTREAM_HPP__
#define __PROTOSTREAM_HPP__
#include <iostream>
#include <sys/types.h>
#include <netinet/in.h>
#include <google/protobuf/message.h>
#include "Logger.hpp"
namespace fail {
/**
* \class ProtoOStream
*
* This class can be used to sequentially write a large number of
* protocol buffer messages to a \c std::ostream.
*/
class ProtoOStream {
private:
uint32_t m_size; // TODO: comments needed here
Logger m_log;
std::ostream* m_outfile;
public:
ProtoOStream(std::ostream *outfile);
virtual ~ProtoOStream() { }
/**
* Writes a message to a file.
* @param m The protobuf-message to be written
* @return Returns \c true on success, \c false otherwise
*/
bool writeMessage(google::protobuf::Message *m);
};
/**
* \class ProtoIStream
*
* This class can be used to read protocol buffer messages sequentially
* from a \c std::istream.
*/
class ProtoIStream {
private:
uint32_t m_size; // TODO: comments needed here
long m_sizeOfInfile;
Logger m_log;
std::istream *m_infile;
public:
ProtoIStream(std::istream *infile);
virtual ~ProtoIStream() { }
/**
* Resets the position of the get pointer. After that \c getNext()
* reads the first message again.
*/
void reset();
/**
* Reads the next protobuf message from the input stream.
* @param m The output protobuf message
* @return Returns \c true on success, \c false otherwise
*/
bool getNext(google::protobuf::Message * m);
};
} // end-of-namespace: fail
#endif // __PROTOSTREAM_HPP__