zeek/src/SerializationFormat.h
Max Kellermann 0db61f3094 include cleanup
The Zeek code base has very inconsistent #includes.  Many sources
included a few headers, and those headers included other headers, and
in the end, nearly everything is included everywhere, so missing
#includes were never noticed.  Another side effect was a lot of header
bloat which slows down the build.

First step to fix it: in each source file, its own header should be
included first to verify that each header's includes are correct, and
none is missing.

After adding the missing #includes, I replaced lots of #includes
inside headers with class forward declarations.  In most headers,
object pointers are never referenced, so declaring the function
prototypes with forward-declared classes is just fine.

This patch speeds up the build by 19%, because each compilation unit
gets smaller.  Here are the "time" numbers for a fresh build (with a
warm page cache but without ccache):

Before this patch:

 3144.94user 161.63system 3:02.87elapsed 1808%CPU (0avgtext+0avgdata 2168608maxresident)k
 760inputs+12008400outputs (1511major+57747204minor)pagefaults 0swaps

After this patch:

 2565.17user 141.83system 2:25.46elapsed 1860%CPU (0avgtext+0avgdata 1489076maxresident)k
 72576inputs+9130920outputs (1667major+49400430minor)pagefaults 0swaps
2020-02-04 20:51:02 +01:00

132 lines
4.9 KiB
C++

// Implements different data formats for serialization.
#pragma once
#include <string>
#include <stdint.h>
class IPAddr;
class IPPrefix;
// Abstract base class.
class SerializationFormat {
public:
SerializationFormat();
virtual ~SerializationFormat();
// Unserialization.
virtual void StartRead(const char* data, uint32_t len);
virtual void EndRead();
virtual bool Read(int* v, const char* tag) = 0;
virtual bool Read(uint16_t* v, const char* tag) = 0;
virtual bool Read(uint32_t* v, const char* tag) = 0;
virtual bool Read(int64_t* v, const char* tag) = 0;
virtual bool Read(uint64_t* v, const char* tag) = 0;
virtual bool Read(char* v, const char* tag) = 0;
virtual bool Read(bool* v, const char* tag) = 0;
virtual bool Read(double* d, const char* tag) = 0;
virtual bool Read(std::string* s, const char* tag) = 0;
virtual bool Read(IPAddr* addr, const char* tag) = 0;
virtual bool Read(IPPrefix* prefix, const char* tag) = 0;
virtual bool Read(struct in_addr* addr, const char* tag) = 0;
virtual bool Read(struct in6_addr* addr, const char* tag) = 0;
// Returns number of raw bytes read since last call to StartRead().
int BytesRead() const { return bytes_read; }
// Passes ownership of string.
virtual bool Read(char** str, int* len, const char* tag) = 0;
// Serialization.
virtual void StartWrite();
/**
* Retrieves serialized data.
* @param data A pointer that will be assigned to point at the internal
* buffer containing serialized data. The memory should
* be reclaimed using "free()".
* @return The number of bytes in the buffer object assigned to \a data.
*/
virtual uint32_t EndWrite(char** data);
virtual bool Write(int v, const char* tag) = 0;
virtual bool Write(uint16_t v, const char* tag) = 0;
virtual bool Write(uint32_t v, const char* tag) = 0;
virtual bool Write(int64_t v, const char* tag) = 0;
virtual bool Write(uint64_t v, const char* tag) = 0;
virtual bool Write(char v, const char* tag) = 0;
virtual bool Write(bool v, const char* tag) = 0;
virtual bool Write(double d, const char* tag) = 0;
virtual bool Write(const char* s, const char* tag) = 0;
virtual bool Write(const char* buf, int len, const char* tag) = 0;
virtual bool Write(const std::string& s, const char* tag) = 0;
virtual bool Write(const IPAddr& addr, const char* tag) = 0;
virtual bool Write(const IPPrefix& prefix, const char* tag) = 0;
virtual bool Write(const struct in_addr& addr, const char* tag) = 0;
virtual bool Write(const struct in6_addr& addr, const char* tag) = 0;
virtual bool WriteOpenTag(const char* tag) = 0;
virtual bool WriteCloseTag(const char* tag) = 0;
virtual bool WriteSeparator() = 0;
// Returns number of raw bytes written since last call to StartWrite().
int BytesWritten() const { return bytes_written; }
protected:
bool ReadData(void* buf, size_t count);
bool WriteData(const void* buf, size_t count);
static const uint32_t INITIAL_SIZE = 65536;
static const float GROWTH_FACTOR;
char* output;
uint32_t output_size;
uint32_t output_pos;
const char* input;
uint32_t input_len;
uint32_t input_pos;
int bytes_written;
int bytes_read;
};
class BinarySerializationFormat : public SerializationFormat {
public:
BinarySerializationFormat();
~BinarySerializationFormat() override;
bool Read(int* v, const char* tag) override;
bool Read(uint16_t* v, const char* tag) override;
bool Read(uint32_t* v, const char* tag) override;
bool Read(int64_t* v, const char* tag) override;
bool Read(uint64_t* v, const char* tag) override;
bool Read(char* v, const char* tag) override;
bool Read(bool* v, const char* tag) override;
bool Read(double* d, const char* tag) override;
bool Read(char** str, int* len, const char* tag) override;
bool Read(std::string* s, const char* tag) override;
bool Read(IPAddr* addr, const char* tag) override;
bool Read(IPPrefix* prefix, const char* tag) override;
bool Read(struct in_addr* addr, const char* tag) override;
bool Read(struct in6_addr* addr, const char* tag) override;
bool Write(int v, const char* tag) override;
bool Write(uint16_t v, const char* tag) override;
bool Write(uint32_t v, const char* tag) override;
bool Write(int64_t v, const char* tag) override;
bool Write(uint64_t v, const char* tag) override;
bool Write(char v, const char* tag) override;
bool Write(bool v, const char* tag) override;
bool Write(double d, const char* tag) override;
bool Write(const char* s, const char* tag) override;
bool Write(const char* buf, int len, const char* tag) override;
bool Write(const std::string& s, const char* tag) override;
bool Write(const IPAddr& addr, const char* tag) override;
bool Write(const IPPrefix& prefix, const char* tag) override;
bool Write(const struct in_addr& addr, const char* tag) override;
bool Write(const struct in6_addr& addr, const char* tag) override;
bool WriteOpenTag(const char* tag) override;
bool WriteCloseTag(const char* tag) override;
bool WriteSeparator() override;
};