//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include <sycl/__impl/device.hpp>
#include <sycl/__impl/platform.hpp>

#include <detail/device_impl.hpp>
#include <detail/platform_impl.hpp>

_LIBSYCL_BEGIN_NAMESPACE_SYCL

backend platform::get_backend() const noexcept { return impl->getBackend(); }

std::vector<platform> platform::get_platforms() {
  auto &PlatformImpls = detail::PlatformImpl::getPlatforms();
  std::vector<platform> Platforms;
  Platforms.reserve(PlatformImpls.size());
  for (auto &PlatformImpl : PlatformImpls) {
    Platforms.emplace_back(
        detail::createSyclObjFromImpl<platform>(*PlatformImpl.get()));
  }
  return Platforms;
}

std::vector<device> platform::get_devices(info::device_type DeviceType) const {
  std::vector<device> Devices;
  impl->iterateDevices(DeviceType, [&Devices](detail::DeviceImpl *DevImpl) {
    assert(DevImpl && "Device impl can't be nullptr");
    Devices.push_back(detail::createSyclObjFromImpl<device>(*DevImpl));
  });

  return Devices;
}

bool platform::has(aspect Aspect) const { return impl->has(Aspect); }

template <typename Param>
detail::is_platform_info_desc_t<Param> platform::get_info() const {
  return impl->getInfo<Param>();
}

#define _LIBSYCL_EXPORT_GET_INFO(Desc)                                         \
  template _LIBSYCL_EXPORT                                                     \
      detail::is_platform_info_desc_t<info::platform::Desc>                    \
      platform::get_info<info::platform::Desc>() const;
_LIBSYCL_EXPORT_GET_INFO(version)
_LIBSYCL_EXPORT_GET_INFO(name)
_LIBSYCL_EXPORT_GET_INFO(vendor)
#undef _LIBSYCL_EXPORT_GET_INFO

_LIBSYCL_END_NAMESPACE_SYCL
