
/*
 * binary_buf是二进制缓存
 * 这里用字符串，来存储雷达的通信消息的原始数据
 * Binary_buf 的内容格式：消息类型 + 消息数据
 *
 * 例如思科的雷达的消息类型
 * ready->ready->start->data->data->data->stop->ready->ready
 *
 * 提供了 is_equal 系列的函数，来进行判断前面的消息类型
 *
 * 注意了：m_buf是中间可以允许有‘\0’的，不是单纯的字符串格式
 * 			末尾也不一定是‘\0’
 */

#ifndef LIDARMEASURE_BINARY_BUF_H
#define LIDARMEASURE_BINARY_BUF_H

#include <iostream>


//雷达消息的类型
//在通信消息的前面一部分字符串，表示这条消息的类型。
//在解析消息的时候，先解析前面的消息类型，来判断这条消息的功用
enum Buf_type {
    //默认值 BUF_UNKNOW = 0
    BUF_UNKNOW = 0,    //未知消息
    BUF_READY = 1,    //待机消息
    BUF_START = 2,    //开始消息
    BUF_DATA = 3,    //数据消息
    BUF_STOP = 4,    //结束消息
    BUF_ERROR = 5,    //错误消息
};


//二进制缓存，
class Binary_buf {
public:
    Binary_buf();

    Binary_buf(const Binary_buf &other);

    ~Binary_buf();

    //使用参数构造，深拷贝，len为0时，使用strlen(buf)，不存储结束符'\0'
    Binary_buf(const char *p_buf, int len = 0);

    //使用参数构造，深拷贝，len为0时，使用strlen(buf)，不存储结束符'\0'
    Binary_buf(char *p_buf, int len = 0);

    //重载=，深拷贝，
    Binary_buf &operator=(const Binary_buf &other);

    //重载=，深拷贝，使用strlen(buf)，不存储结束符'\0'
    Binary_buf &operator=(const char *p_buf);

    //重载+，other追加在this的后面，
    Binary_buf &operator+(Binary_buf &other);

    //重载+，追加在this的后面，使用strlen(buf)，不存储结束符'\0'
    Binary_buf &operator+(const char *p_buf);

    //重载[]，允许直接使用数组的形式，直接访问buf的内存。注意，n值必须在0～m_length之间，
    char &operator[](int n);

    //判空
    bool is_empty();

    //清空
    void clear();

    //比较前面部分的buf是否相等，使用 other.m_length 为标准
    bool is_equal_front(const Binary_buf &other);

    //比较前面部分的buf是否相等，len为0时，使用strlen(buf)为标准，不比较结束符'\0'
    bool is_equal_front(const char *p_buf, int len = 0);

    //比较的buf是否全部相等，
    bool is_equal_all(const Binary_buf &other);

    //比较的buf是否全部相等，不比较结束符'\0'
    bool is_equal_all(const char *p_buf);


public:
    char *get_buf() const;

    int get_length() const;

protected:
    char *mp_buf;                //二进制缓存指针
    int m_length;            //二进制缓存长度

private:

};


#endif //LIDARMEASURE_BINARY_BUF_H
