#include <iostream>
#include <string>
#include <vector>

#include <cuda.h>

#define GENERATED_HEADER(x) GENERATED_HEADER1(x)
#define GENERATED_HEADER1(x) <x>

static std::string input_paths = { CUBIN_FILE_PATHS };

int main()
{
  const std::string delimiter = "~_~";
  input_paths += delimiter;

  size_t end = 0;
  size_t previous_end = 0;
  std::vector<std::string> actual_paths;
  while ((end = input_paths.find(delimiter, previous_end)) !=
         std::string::npos) {
    actual_paths.emplace_back(
      input_paths.substr(previous_end, end - previous_end));
    previous_end = end + 3;
  }

  cuInit(0);
  int count = 0;
  cuDeviceGetCount(&count);
  if (count == 0) {
    std::cerr << "No CUDA devices found\n";
    return 1;
  }

  CUdevice device;
  cuDeviceGet(&device, 0);

  CUcontext context;
  cuCtxCreate(&context, 0, device);

  CUmodule module;
  for (auto p : actual_paths) {
    if (p.find(".cubin") == std::string::npos) {
      std::cout << p << " Doesn't have the .cubin suffix" << p << std::endl;
      return 1;
    }
    std::cout << "trying to load cubin: " << p << std::endl;
    CUresult result = cuModuleLoad(&module, p.c_str());
    std::cout << "module pointer: " << module << '\n';
    if (result != CUDA_SUCCESS || module == nullptr) {
      std::cerr << "Failed to load the embedded cubin with error: "
                << static_cast<unsigned int>(result) << '\n';
      return 1;
    }
  }

  return 0;
}
