/*
 * TI Voxel Lib component.
 *
 * Copyright (c) 2014 Texas Instruments Inc.
 */

#ifndef VOXEL_DOWNLOADER_FACTORY_H
#define VOXEL_DOWNLOADER_FACTORY_H

#include "Downloader.h"
#include "Common.h"
#include "Device.h"

namespace Voxel
{
  
/**
 *  \addtogroup CamSys
 *  @{
 */

class VOXEL_EXPORT DownloaderFactory
{
protected:
  Vector<DevicePtr> _supportedDevices;
  
  inline void _addSupportedDevices(const Vector<DevicePtr> &devices);
  
  String _name;
  
public:
  DownloaderFactory(const String &name): _name(name) {}
  
  inline const String &name() const { return _name; }
  
  inline const Vector<DevicePtr> &getSupportedDevices() const { return _supportedDevices; }
  
  // Instantiate a depth camera for the specified device
  virtual DownloaderPtr getDownloader(DevicePtr device) = 0;
  
  virtual ~DownloaderFactory() {}
};

void DownloaderFactory::_addSupportedDevices(const Vector<DevicePtr> &devices)
{
  _supportedDevices.reserve(_supportedDevices.size() + devices.size());
  _supportedDevices.insert(_supportedDevices.end(), devices.begin(), devices.end());
}


// Implement this function in every device-specific voxel library

typedef Ptr<DownloaderFactory> DownloaderFactoryPtr;

#ifndef SWIG
extern "C" void getDownloaderFactory(DownloaderFactoryPtr &downloaderFactory);
#endif

typedef void (*GetDownloaderFactory)(DownloaderFactoryPtr &downloaderFactory); // Function type to return DownloaderFactory

/**
 * @}
 */
}

#endif // DEPTHCAMERA_FACTORY_H