netbuffer.h 3.31 KB
//
//  netbuffer.h
//  BBAAPIRequest
//
//  Created by cairui01 on 2020/05/11.
//


#ifndef COMM_AUTOBUFFER_H_
#define COMM_AUTOBUFFER_H_

#include <sys/types.h>
#include <string.h>

class NetBuffer {
  public:
    enum TSeek {
        ESeekStart,
        ESeekCur,
        ESeekEnd,
    };

  public:
    explicit NetBuffer(size_t _size = 128);
    explicit NetBuffer(void* _pbuffer, size_t _len, size_t _size = 128);
    explicit NetBuffer(const void* _pbuffer, size_t _len, size_t _size = 128);
    ~NetBuffer();

    void AllocWrite(size_t _readytowrite, bool _changelength = true);
    void AddCapacity(size_t _len);

    template<class T> void Write(const T& _val)
    { Write(&_val, sizeof(_val));}

    template<class T> void Write(off_t& _pos, const T& _val)
    { Write(_pos, &_val, sizeof(_val));}

    template<class T> void Write(const off_t& _pos, const T& _val)
    { Write(_pos, &_val, sizeof(_val));}

    void Write(const char* const _val)
    { Write(_val, strlen(_val));}

    void Write(off_t& _pos, const char* const _val)
    { Write(_pos, _val, strlen(_val));}

    void Write(const off_t& _pos, const char* const _val)
    { Write(_pos, _val, strlen(_val));}

    void Write(const NetBuffer& _buffer);
    void Write(const void* _pbuffer, size_t _len);
    void Write(off_t& _pos, const NetBuffer& _buffer);
    void Write(off_t& _pos, const void* _pbuffer, size_t _len);
    void Write(const off_t& _pos, const NetBuffer& _buffer);
    void Write(const off_t& _pos, const void* _pbuffer, size_t _len);
    void Write(TSeek _seek, const void* _pbuffer, size_t _len);

    template<class T> size_t Read(T& _val)
    { return Read(&_val, sizeof(_val)); }

    template<class T> size_t Read(off_t& _pos, T& _val) const
    { return Read(_pos, &_val, sizeof(_val)); }

    template<class T> size_t Read(const off_t& _pos, T& _val) const
    { return Read(_pos, &_val, sizeof(_val)); }

    size_t Read(void* _pbuffer, size_t _len);
    size_t Read(NetBuffer& _rhs , size_t _len);

    size_t Read(off_t& _pos, void* _pbuffer, size_t _len) const;
    size_t Read(off_t& _pos, NetBuffer& _rhs, size_t _len) const;

    size_t Read(const off_t& _pos, void* _pbuffer, size_t _len) const;
    size_t Read(const off_t& _pos, NetBuffer& _rhs, size_t _len) const;

    void Seek(off_t _offset,  TSeek _eorigin);
    void Length(off_t _pos, size_t _lenght);

    void* Ptr(off_t _offset=0);
    void* PosPtr();
    const void* Ptr(off_t _offset=0) const;
    const void* PosPtr() const;

    off_t Pos() const;
    size_t Length() const;
    size_t Capacity() const;

    void Attach(void* _pbuffer, size_t _len);
    void Attach(NetBuffer& _rhs);
    void* Detach(size_t* _plen = NULL);

    void Reset();

  private:
    void __FitSize(size_t _len);

  private:
    NetBuffer(const NetBuffer& _rhs);
    NetBuffer& operator = (const NetBuffer& _rhs);

  private:
    unsigned char* parray_;
    off_t pos_;
    size_t length_;
    size_t capacity_;
    size_t malloc_unitsize_;
};

template <class S> class copy_wrapper_helper;

template <>
class copy_wrapper_helper<NetBuffer> {
  public:
    static void copy_constructor(NetBuffer& _lhs, NetBuffer& _rhs)
    { _lhs.Attach(_rhs); }

    static void copy_constructor(NetBuffer& _lhs, const NetBuffer& _rhs)
    { _lhs.Attach(const_cast<NetBuffer&>(_rhs)); }

    static void destructor(NetBuffer& _delobj) {}
};

#endif