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

// template instantiations for Buffer<T> and its pimpl
// valid for all backends

#define BUFFER_T_INSTANTIATION(BufferType)       \
  template class DeviceBuffer<BufferType>;       \
  template class DeviceBuffer<const BufferType>; \
  template class Buffer<BufferType>;             \
  template class Buffer<const BufferType>;       \
  template Buffer<const BufferType>::Buffer(DeviceBuffer<BufferType> *pimpl, size_t num);

BUFFER_T_INSTANTIATION(char);
BUFFER_T_INSTANTIATION(unsigned char);
BUFFER_T_INSTANTIATION(uchar3);
BUFFER_T_INSTANTIATION(int16_t);
BUFFER_T_INSTANTIATION(uint16_t);
BUFFER_T_INSTANTIATION(int);
BUFFER_T_INSTANTIATION(int2);
BUFFER_T_INSTANTIATION(unsigned int);
BUFFER_T_INSTANTIATION(float);
BUFFER_T_INSTANTIATION(float2);
BUFFER_T_INSTANTIATION(float4);

// Buffer type conversions to arbitrary types
// add manually as needed
template Buffer<unsigned char>::Buffer(DeviceBuffer<unsigned int> *pimpl, size_t num);
template Buffer<unsigned short>::Buffer(DeviceBuffer<unsigned char> *pimpl, size_t num);
template Buffer<uchar3>::Buffer(DeviceBuffer<unsigned char> *pimpl, size_t num);
template Buffer<unsigned int>::Buffer(DeviceBuffer<char> *pimpl, size_t num);
template Buffer<unsigned int>::Buffer(DeviceBuffer<unsigned char> *pimpl, size_t num);
template Buffer<unsigned int>::Buffer(DeviceBuffer<float> *pimpl, size_t num);
template Buffer<float>::Buffer(DeviceBuffer<unsigned int> *pimpl, size_t num);
template Buffer<float2>::Buffer(DeviceBuffer<float> *pimpl, size_t num);

template Buffer<const unsigned char>::Buffer(DeviceBuffer<unsigned int> *pimpl, size_t num);
template Buffer<const unsigned short>::Buffer(DeviceBuffer<const unsigned char> *pimpl, size_t num);
template Buffer<const uchar3>::Buffer(DeviceBuffer<const unsigned char> *pimpl, size_t num);
template Buffer<const uchar3>::Buffer(DeviceBuffer<unsigned char> *pimpl, size_t num);
template Buffer<const uchar3>::Buffer(DeviceBuffer<unsigned int> *pimpl, size_t num);
template Buffer<const unsigned int>::Buffer(DeviceBuffer<uchar3> *pimpl, size_t num);
template Buffer<const unsigned int>::Buffer(DeviceBuffer<unsigned char> *pimpl, size_t num);
template Buffer<const unsigned int>::Buffer(DeviceBuffer<const unsigned char> *pimpl, size_t num);