namespace log

namespace log {

// typedefs

typedef void ObserverFunc(
    uint64_t timestamp,
    uint64_t recordCode,
    void const* p,
    size_t size
    );

typedef log.RangeProcessor* RangeProcessorFactoryFunc();

typedef bool RepresenterFunc(
    log.Representation* representation,
    uint64_t recordCode,
    void const* p,
    size_t size,
    uint_t foldFlags
    );

typedef char const* FormatFunc(void const* p);

typedef char const* FormatExFunc(
    void const* p,
    size_t size
    );

// enums

enum
{
    RecordFileSignature = ':gol',
    RecordSignature     = ':cr\n',
};

bitflag enum LineAttrFlags;
enum MonitorFilterKind;
bitflag enum PartCodeFlags;
enum PartKind;
bitflag enum RecordCodeFlags;
bitflag enum RetroColorizeFlags;
enum StdLogColor;
enum StdLogIcon;
enum StdRecordCode;

// structs

struct LineAttr;
struct Record;
struct RecordFileHdr;
struct RetroColorizeParams;
struct TxRxStats;

// classes

class ChecksumCalcRangeProcessor;
class Converter;
class Filter;
class FoldingFilter;
class Log;
class MonitorFilter;
class ProxyWriter;
class RangeProcessor;
class Representation;
class ThroughputCalcRangeProcessor;
class Writer;

// global functions

char const* getMonitorFilterPlaceholderText(log.MonitorFilterKind filterKind);

void representDeviceOpened(
    log.Representation* representation,
    char const* messageText,
    void const* p,
    size_t size
    );

void representDeviceOpenError(
    log.Representation* representation,
    char const* messageText,
    void const* p,
    size_t size
    );

char const* getDisplayName(jnc.ModuleItemDecl* decl);

char const* getStructDigest(
    jnc.StructType* type,
    void const* p
    );

void representStruct(
    log.Representation* representation,
    jnc.StructType* type,
    char const* name = null,
    uint_t binPartRecordCode = 0,
    void const* p,
    size_t baseOffset = 0,
    uint_t foldFlags = 1,
    uint_t structFoldFlag = 1,
    size_t indentLevel = 0
    );

} // namespace log