Skip to content

Commit

Permalink
[eclipse-iceoryx#500] Expose UniqueSubscriberId UniqueNotifierId Uniq…
Browse files Browse the repository at this point in the history
…ueListenerId bytes in CXX API
  • Loading branch information
orecham committed Nov 2, 2024
1 parent a5df017 commit 2d1b857
Show file tree
Hide file tree
Showing 6 changed files with 108 additions and 7 deletions.
6 changes: 6 additions & 0 deletions iceoryx2-ffi/cxx/include/iox2/unique_port_id.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ class UniqueSubscriberId {
auto operator=(UniqueSubscriberId&& rhs) noexcept -> UniqueSubscriberId&;
~UniqueSubscriberId();

auto bytes() -> iox::optional<std::array<uint8_t, UNIQUE_PORT_ID_LENGTH>>;

private:
template <ServiceType, typename, typename>
friend class Subscriber;
Expand All @@ -76,6 +78,8 @@ class UniqueNotifierId {
auto operator=(UniqueNotifierId&& rhs) noexcept -> UniqueNotifierId&;
~UniqueNotifierId();

auto bytes() -> iox::optional<std::array<uint8_t, UNIQUE_PORT_ID_LENGTH>>;

private:
template <ServiceType>
friend class Notifier;
Expand All @@ -97,6 +101,8 @@ class UniqueListenerId {
auto operator=(UniqueListenerId&& rhs) noexcept -> UniqueListenerId&;
~UniqueListenerId();

auto bytes() -> iox::optional<std::array<uint8_t, UNIQUE_PORT_ID_LENGTH>>;

private:
template <ServiceType>
friend class Listener;
Expand Down
33 changes: 30 additions & 3 deletions iceoryx2-ffi/cxx/src/unique_port_id.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,9 @@ UniquePublisherId::UniquePublisherId(iox2_unique_publisher_id_h handle)

auto UniquePublisherId::bytes() -> iox::optional<std::array<uint8_t, UNIQUE_PORT_ID_LENGTH>> {
if (m_handle != nullptr) {
std::array<uint8_t, UNIQUE_PORT_ID_LENGTH> unique_port_id {};
iox2_unique_publisher_id_value(m_handle, unique_port_id.data());
return unique_port_id;
std::array<uint8_t, UNIQUE_PORT_ID_LENGTH> bytes {};
iox2_unique_publisher_id_value(m_handle, bytes.data());
return bytes;
}
return iox::nullopt;
};
Expand Down Expand Up @@ -90,6 +90,15 @@ UniqueSubscriberId::UniqueSubscriberId(iox2_unique_subscriber_id_h handle)
: m_handle { handle } {
}

auto UniqueSubscriberId::bytes() -> iox::optional<std::array<uint8_t, UNIQUE_PORT_ID_LENGTH>> {
if (m_handle != nullptr) {
std::array<uint8_t, UNIQUE_PORT_ID_LENGTH> bytes {};
iox2_unique_subscriber_id_value(m_handle, bytes.data());
return bytes;
}
return iox::nullopt;
};

void UniqueSubscriberId::drop() {
if (m_handle != nullptr) {
iox2_unique_subscriber_id_drop(m_handle);
Expand Down Expand Up @@ -127,6 +136,15 @@ UniqueNotifierId::UniqueNotifierId(iox2_unique_notifier_id_h handle)
: m_handle { handle } {
}

auto UniqueNotifierId::bytes() -> iox::optional<std::array<uint8_t, UNIQUE_PORT_ID_LENGTH>> {
if (m_handle != nullptr) {
std::array<uint8_t, UNIQUE_PORT_ID_LENGTH> bytes {};
iox2_unique_notifier_id_value(m_handle, bytes.data());
return bytes;
}
return iox::nullopt;
};

void UniqueNotifierId::drop() {
if (m_handle != nullptr) {
iox2_unique_notifier_id_drop(m_handle);
Expand Down Expand Up @@ -164,6 +182,15 @@ UniqueListenerId::UniqueListenerId(iox2_unique_listener_id_h handle)
: m_handle { handle } {
}

auto UniqueListenerId::bytes() -> iox::optional<std::array<uint8_t, UNIQUE_PORT_ID_LENGTH>> {
if (m_handle != nullptr) {
std::array<uint8_t, UNIQUE_PORT_ID_LENGTH> bytes {};
iox2_unique_listener_id_value(m_handle, bytes.data());
return bytes;
}
return iox::nullopt;
};

void UniqueListenerId::drop() {
if (m_handle != nullptr) {
iox2_unique_listener_id_drop(m_handle);
Expand Down
21 changes: 17 additions & 4 deletions iceoryx2-ffi/cxx/tests/src/unique_port_id_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,11 +65,24 @@ struct UniquePortIdTest : public ::testing::Test {

TYPED_TEST_SUITE(UniquePortIdTest, iox2_testing::ServiceTypes);

TYPED_TEST(UniquePortIdTest, unique_publisher_id_value) {
TYPED_TEST(UniquePortIdTest, unique_port_id_value) {
auto null_id = std::array<uint8_t, iox2::UNIQUE_PORT_ID_LENGTH> {};
auto unique_port_id = this->publisher_1.id();
ASSERT_TRUE(unique_port_id.bytes().has_value());
ASSERT_NE(unique_port_id.bytes().value(), null_id);

auto unique_publisher_id = this->publisher_1.id();
ASSERT_TRUE(unique_publisher_id.bytes().has_value());
ASSERT_NE(unique_publisher_id.bytes().value(), null_id);

auto unique_subscriber_id = this->publisher_1.id();
ASSERT_TRUE(unique_subscriber_id.bytes().has_value());
ASSERT_NE(unique_subscriber_id.bytes().value(), null_id);

auto unique_notifier_id = this->notifier_1.id();
ASSERT_TRUE(unique_notifier_id.bytes().has_value());
ASSERT_NE(unique_notifier_id.bytes().value(), null_id);

auto unique_listener_id = this->listener_1.id();
ASSERT_TRUE(unique_listener_id.bytes().has_value());
ASSERT_NE(unique_listener_id.bytes().value(), null_id);
}

TYPED_TEST(UniquePortIdTest, unique_port_id_from_same_port_is_equal) {
Expand Down
18 changes: 18 additions & 0 deletions iceoryx2-ffi/ffi/src/api/unique_listener_id.rs
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,24 @@ impl HandleToType for iox2_unique_listener_id_h_ref {

// BEGIN C API

#[no_mangle]
unsafe extern "C" fn iox2_unique_listener_id_value(
handle: iox2_unique_listener_id_h,
id_ptr: *mut u8,
) {
handle.assert_non_null();

let h = &mut *handle.as_type();

if let Some(Some(id)) = (h.value.internal.as_ptr() as *const Option<UniqueListenerId>).as_ref()
{
let bytes = id.value().to_ne_bytes();
unsafe {
std::ptr::copy_nonoverlapping(bytes.as_ptr(), id_ptr, bytes.len());
}
}
}

/// This function needs to be called to destroy the unique listener id!
///
/// # Arguments
Expand Down
18 changes: 18 additions & 0 deletions iceoryx2-ffi/ffi/src/api/unique_notifier_id.rs
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,24 @@ impl HandleToType for iox2_unique_notifier_id_h_ref {

// BEGIN C API

#[no_mangle]
unsafe extern "C" fn iox2_unique_notifier_id_value(
handle: iox2_unique_notifier_id_h,
id_ptr: *mut u8,
) {
handle.assert_non_null();

let h = &mut *handle.as_type();

if let Some(Some(id)) = (h.value.internal.as_ptr() as *const Option<UniqueNotifierId>).as_ref()
{
let bytes = id.value().to_ne_bytes();
unsafe {
std::ptr::copy_nonoverlapping(bytes.as_ptr(), id_ptr, bytes.len());
}
}
}

/// This function needs to be called to destroy the unique notifier id!
///
/// # Arguments
Expand Down
19 changes: 19 additions & 0 deletions iceoryx2-ffi/ffi/src/api/unique_subscriber_id.rs
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,25 @@ impl HandleToType for iox2_unique_subscriber_id_h_ref {

// BEGIN C API

#[no_mangle]
unsafe extern "C" fn iox2_unique_subscriber_id_value(
handle: iox2_unique_subscriber_id_h,
id_ptr: *mut u8,
) {
handle.assert_non_null();

let h = &mut *handle.as_type();

if let Some(Some(id)) =
(h.value.internal.as_ptr() as *const Option<UniqueSubscriberId>).as_ref()
{
let bytes = id.value().to_ne_bytes();
unsafe {
std::ptr::copy_nonoverlapping(bytes.as_ptr(), id_ptr, bytes.len());
}
}
}

/// This function needs to be called to destroy the unique subscriber id!
///
/// # Arguments
Expand Down

0 comments on commit 2d1b857

Please sign in to comment.