diff --git a/oneapi-rs-sys/build.rs b/oneapi-rs-sys/build.rs index 854c5e4..c222644 100644 --- a/oneapi-rs-sys/build.rs +++ b/oneapi-rs-sys/build.rs @@ -35,6 +35,7 @@ fn main() { ]; let cpp_headers = [ + "include/utils.hpp", "include/types.hpp", "include/platform.hpp", "include/device.hpp", diff --git a/oneapi-rs-sys/include/utils.hpp b/oneapi-rs-sys/include/utils.hpp new file mode 100644 index 0000000..c3c358f --- /dev/null +++ b/oneapi-rs-sys/include/utils.hpp @@ -0,0 +1,40 @@ +// +// Copyright (C) 2026 Intel Corporation +// +// Under the MIT License or the Apache License v2.0. +// See LICENSE-MIT and LICENSE-APACHE for license information. +// SPDX-License-Identifier: MIT OR Apache-2.0 +// + +#pragma once + +#include +#include +#include +#include + +#include "oneapi-rs-sys/include/types.hpp" +#include "rust/cxx.h" + +namespace sycl_shims::utils { +template +using UnwrappedPtr = std::remove_reference_t().ptr)>; + +template +std::vector> vec_to_vector(rust::Vec &&vec) { + std::vector> vector; + for (auto &&e : vec) + vector.push_back(std::move(*e.ptr)); + + return vector; +} + +template +rust::Vec vector_to_vec(std::vector> &&vector) { + rust::Vec vec; + for (auto &&e : vector) + vec.push_back(T{std::make_unique>(e)}); + + return vec; +} +} // namespace sycl_shims::utils diff --git a/oneapi-rs-sys/src/context.cpp b/oneapi-rs-sys/src/context.cpp index 1cd1a7a..5b7c79c 100644 --- a/oneapi-rs-sys/src/context.cpp +++ b/oneapi-rs-sys/src/context.cpp @@ -7,13 +7,13 @@ // #include "oneapi-rs-sys/include/context.hpp" +#include "oneapi-rs-sys/include/utils.hpp" #include "oneapi-rs-sys/src/context-sys.rs.h" +using sycl_shims::utils::vec_to_vector; + namespace sycl_shims::context { std::unique_ptr new_context(rust::Vec devices) { - std::vector raw_devices; - for (auto &&d : devices) - raw_devices.push_back(std::move(*d.ptr)); - return std::make_unique(raw_devices); + return std::make_unique(vec_to_vector(std::move(devices))); } } // namespace sycl_shims::context diff --git a/oneapi-rs-sys/src/device.cpp b/oneapi-rs-sys/src/device.cpp index 1063f0f..7244aea 100644 --- a/oneapi-rs-sys/src/device.cpp +++ b/oneapi-rs-sys/src/device.cpp @@ -7,18 +7,15 @@ // #include "oneapi-rs-sys/include/device.hpp" +#include "oneapi-rs-sys/include/utils.hpp" #include "oneapi-rs-sys/src/device-sys.rs.h" +using sycl_shims::utils::vector_to_vec; using dt = sycl::info::device_type; namespace sycl_shims::device { rust::Vec get_devices() { - rust::Vec devices; - - for (auto &&device : sycl::device::get_devices()) - devices.push_back(DevicePtr{std::make_unique(device)}); - - return devices; + return vector_to_vec(sycl::device::get_devices()); } DeviceType get_device_type(Device const &device) { diff --git a/oneapi-rs-sys/src/platform.cpp b/oneapi-rs-sys/src/platform.cpp index 013e254..b76d79f 100644 --- a/oneapi-rs-sys/src/platform.cpp +++ b/oneapi-rs-sys/src/platform.cpp @@ -7,25 +7,18 @@ // #include "oneapi-rs-sys/include/platform.hpp" +#include "oneapi-rs-sys/include/utils.hpp" #include "oneapi-rs-sys/src/platform-sys.rs.h" +using sycl_shims::utils::vector_to_vec; + namespace sycl_shims::platform { rust::Vec get_platforms() { - rust::Vec platforms; - - for (auto &&platform : sycl::platform::get_platforms()) - platforms.push_back(PlatformPtr{std::make_unique(platform)}); - - return platforms; + return vector_to_vec(sycl::platform::get_platforms()); } rust::Vec get_devices(Platform const &platform) { - rust::Vec devices; - - for (auto &&device : platform.get_devices()) - devices.push_back(DevicePtr{std::make_unique(device)}); - - return devices; + return vector_to_vec(platform.get_devices()); } rust::String get_version(Platform const &platform) { diff --git a/oneapi-rs-sys/src/queue.cpp b/oneapi-rs-sys/src/queue.cpp index 8fce66d..272626d 100644 --- a/oneapi-rs-sys/src/queue.cpp +++ b/oneapi-rs-sys/src/queue.cpp @@ -7,10 +7,12 @@ // #include "oneapi-rs-sys/include/queue.hpp" +#include "oneapi-rs-sys/include/utils.hpp" #include "oneapi-rs-sys/src/queue-sys.rs.h" using sycl::ext::intel::property::queue::immediate_command_list; using sycl::property::queue::in_order; +using sycl_shims::utils::vec_to_vector; namespace syclexp = sycl::ext::oneapi::experimental; @@ -39,18 +41,14 @@ std::unique_ptr clone(Queue const &queue) { std::unique_ptr memset(std::unique_ptr &queue, std::uint8_t *ptr, int value, std::size_t num_bytes, rust::Vec dep_events) { - std::vector deps; - for (auto &&e : dep_events) - deps.push_back(std::move(*e.ptr)); - return std::make_unique(queue->memset(ptr, value, num_bytes, deps)); + return std::make_unique(queue->memset( + ptr, value, num_bytes, vec_to_vector(std::move(dep_events)))); } std::unique_ptr barrier(std::unique_ptr &queue, rust::Vec dep_events) { - std::vector deps; - for (auto &&e : dep_events) - deps.push_back(std::move(*e.ptr)); - return std::make_unique(queue->ext_oneapi_submit_barrier(deps)); + return std::make_unique( + queue->ext_oneapi_submit_barrier(vec_to_vector(std::move(dep_events)))); } void wait(std::unique_ptr &queue) { queue->wait(); } @@ -102,10 +100,7 @@ launch_3d(std::unique_ptr &queue, Range3 global_size, Range3 local_size, std::unique_ptr memcpy(std::unique_ptr &queue, std::uint8_t *dest, std::uint8_t const *src, std::size_t num_bytes, rust::Vec dep_events) { - std::vector deps; - for (auto &&e : dep_events) - deps.push_back(std::move(*e.ptr)); - - return std::make_unique(queue->memcpy(dest, src, num_bytes, deps)); + return std::make_unique(queue->memcpy( + dest, src, num_bytes, vec_to_vector(std::move(dep_events)))); } } // namespace sycl_shims::queue