// Copyright (c) 2012-2017 VideoStitch SAS
// Copyright (c) 2018 stitchEm

#pragma once

#include <gpu/buffer.hpp>

#include "opencl.h"

namespace VideoStitch {
namespace GPU {

template <typename T>
class DeviceBuffer {
 public:
  DeviceBuffer() : data(nullptr) {}

  explicit DeviceBuffer(const DeviceBuffer *other) : data(other ? other->data : nullptr) {}

  template <typename S>
  explicit DeviceBuffer(const DeviceBuffer<S> *other) : data(other ? other->data : nullptr) {}

  explicit DeviceBuffer(cl_mem buf) : data(buf) {}

  static Buffer<T> createBuffer(cl_mem buf, size_t elems);

  cl_mem raw() const { return data; }

  operator cl_mem() const { return raw(); }

  bool operator==(const DeviceBuffer &other) const { return data == other.data; }

  friend class Buffer<T>;

  template <typename S>
  friend class DeviceBuffer;

 private:
  cl_mem data;
};

}  // namespace GPU
}  // namespace VideoStitch