libquickjspp-sys 0.1.0

QuickJSpp Javascript Engine FFI bindings
Documentation

#ifndef __BUFFER_H__
#define __BUFFER_H__

template <class T, int initSize> class dbSmallBuffer {
private:
  T        buf[initSize];
  length_t used;
  T *      ptr;
  length_t allocated;

public:
  dbSmallBuffer() {
    ptr       = buf;
    used      = 0;
    allocated = initSize;
  }

  ~dbSmallBuffer() {
    if (ptr != buf) { delete[] ptr; }
  }

  T *base() { return ptr; }

  length_t size() { return used; }

  T *append(int n) {
    if (n + used > allocated) {
      length_t newSize = n + used > allocated * 2 ? n + used : allocated * 2;
      T *      newBuf  = new T[newSize];
      for (int i = int(used); --i >= 0;) {
        newBuf[i] = ptr[i];
      }
      if (ptr != buf) { delete[] ptr; }
      ptr       = newBuf;
      allocated = newSize;
    }
    T *p = ptr + used;
    used += n;
    return p;
  }
};

template <class T> class dbBuffer {
private:
  length_t used;
  T *      ptr;
  length_t allocated;

public:
  dbBuffer() {
    ptr       = NULL;
    used      = 0;
    allocated = 0;
  }

  ~dbBuffer() { delete[] ptr; }

  T *base() { return ptr; }

  T *grab() {
    T *p = ptr;
    ptr  = NULL;
    return p;
  }

  length_t size() { return used; }

  void add(T val) { *append(1) = val; }

  T *append(int n) {
    if (n + used > allocated) {
      length_t newSize = n + used > allocated * 2 ? n + used : allocated * 2;
      T *      newBuf  = new T[newSize];
      for (int i = int(used); --i >= 0;) {
        newBuf[i] = ptr[i];
      }
      delete[] ptr;
      ptr       = newBuf;
      allocated = newSize;
    }
    T *p = ptr + used;
    used += n;
    return p;
  }
};

#endif