diff --git a/iceoryx2-cxx/CMakeLists.txt b/iceoryx2-cxx/CMakeLists.txt index 903a267bca..99396c96b5 100644 --- a/iceoryx2-cxx/CMakeLists.txt +++ b/iceoryx2-cxx/CMakeLists.txt @@ -84,6 +84,7 @@ add_library(iceoryx2-cxx-object-lib OBJECT src/static_config_request_response.cpp src/subscriber_details.cpp src/unique_port_id.cpp + src/version.cpp src/waitset.cpp src/writer_details.cpp ) diff --git a/iceoryx2-cxx/include/iox2/version.hpp b/iceoryx2-cxx/include/iox2/version.hpp new file mode 100644 index 0000000000..64805f5c77 --- /dev/null +++ b/iceoryx2-cxx/include/iox2/version.hpp @@ -0,0 +1,40 @@ +// Copyright (c) 2026 Contributors to the Eclipse Foundation +// +// See the NOTICE file(s) distributed with this work for additional +// information regarding copyright ownership. +// +// This program and the accompanying materials are made available under the +// terms of the Apache Software License 2.0 which is available at +// https://www.apache.org/licenses/LICENSE-2.0, or the MIT license +// which is available at https://opensource.org/licenses/MIT. +// +// SPDX-License-Identifier: Apache-2.0 OR MIT + +#ifndef IOX2_VERSION_HPP +#define IOX2_VERSION_HPP + +#include "iox2/internal/iceoryx2.hpp" + +#include +#include + +namespace iox2 { + +/// Version number. +struct PackageVersion { + std::uint16_t major; + std::uint16_t minor; + std::uint16_t patch; +}; + +/// Returns the crates version acquired through the internal environment variables set by cargo, +/// ("CARGO_PKG_VERSION_{MAJOR|MINOR|PATCH}"). +PackageVersion package_version(); + +auto operator<<(std::ostream& stream, const PackageVersion& version) -> std::ostream&; +auto operator==(const PackageVersion& lhs, const PackageVersion& rhs) -> bool; +auto operator<(const PackageVersion& lhs, const PackageVersion& rhs) -> bool; + +} // namespace iox2 + +#endif diff --git a/iceoryx2-cxx/src/version.cpp b/iceoryx2-cxx/src/version.cpp new file mode 100644 index 0000000000..7b961e728b --- /dev/null +++ b/iceoryx2-cxx/src/version.cpp @@ -0,0 +1,42 @@ +// Copyright (c) 2026 Contributors to the Eclipse Foundation +// +// See the NOTICE file(s) distributed with this work for additional +// information regarding copyright ownership. +// +// This program and the accompanying materials are made available under the +// terms of the Apache Software License 2.0 which is available at +// https://www.apache.org/licenses/LICENSE-2.0, or the MIT license +// which is available at https://opensource.org/licenses/MIT. +// +// SPDX-License-Identifier: Apache-2.0 OR MIT + +#include "iox2/version.hpp" + +#include + +namespace iox2 { + +PackageVersion package_version() { + iox2_package_version_t const v = iox2_package_version(); + return PackageVersion { v.major, v.minor, v.patch }; +} + +auto operator<<(std::ostream& stream, const PackageVersion& version) -> std::ostream& { + return stream << version.major << '.' << version.minor << '.' << version.patch; +} + +auto operator==(const PackageVersion& lhs, const PackageVersion& rhs) -> bool { + return lhs.major == rhs.major && lhs.minor == rhs.minor && lhs.patch == rhs.patch; +} + +auto operator<(const PackageVersion& lhs, const PackageVersion& rhs) -> bool { + if (lhs.major != rhs.major) { + return lhs.major < rhs.major; + } else if (lhs.minor != rhs.minor) { + return lhs.minor < rhs.minor; + } else { + return lhs.patch < rhs.patch; + } +} + +} // namespace iox2 diff --git a/iceoryx2-cxx/tests/src/version_tests.cpp b/iceoryx2-cxx/tests/src/version_tests.cpp new file mode 100644 index 0000000000..47bda4cb75 --- /dev/null +++ b/iceoryx2-cxx/tests/src/version_tests.cpp @@ -0,0 +1,143 @@ +// Copyright (c) 2026 Contributors to the Eclipse Foundation +// +// See the NOTICE file(s) distributed with this work for additional +// information regarding copyright ownership. +// +// This program and the accompanying materials are made available under the +// terms of the Apache Software License 2.0 which is available at +// https://www.apache.org/licenses/LICENSE-2.0, or the MIT license +// which is available at https://opensource.org/licenses/MIT. +// +// SPDX-License-Identifier: Apache-2.0 OR MIT + +#include "iox2/version.hpp" +#include "test.hpp" + +#include + +namespace { +using namespace iox2; + +TEST(VersionTest, version_obtains_version_number) { + ASSERT_EQ(package_version().major, 0); + ASSERT_EQ(package_version().minor, 8); + ASSERT_EQ(package_version().patch, 999); +} + +TEST(VersionTest, version_numbers_compare_equal_if_all_components_are_equal) { + PackageVersion sut1; + sut1.major = 1; + sut1.minor = 2; + sut1.patch = 3; + PackageVersion sut2; + sut2.major = 1; + sut2.minor = 2; + sut2.patch = 3; + EXPECT_EQ(sut1, sut1); + EXPECT_EQ(sut1, sut2); + EXPECT_EQ(sut2, sut1); + sut1.major = 25; + sut1.minor = 22; + sut1.patch = 0; + sut2.major = 25; + sut2.minor = 22; + sut2.patch = 0; + EXPECT_EQ(sut1, sut1); + EXPECT_EQ(sut1, sut2); + EXPECT_EQ(sut2, sut1); +} + +TEST(VersionTest, version_numbers_do_not_compare_equal_if_major_version_differs) { + PackageVersion sut1; + sut1.major = 1; + sut1.minor = 2; + sut1.patch = 3; + PackageVersion sut2; + sut2.major = 0; + sut2.minor = 2; + sut2.patch = 3; + EXPECT_FALSE(sut1 == sut2); + EXPECT_FALSE(sut2 == sut1); + sut1.major = 99; + sut2.major = 6; + EXPECT_FALSE(sut1 == sut2); + EXPECT_FALSE(sut2 == sut1); +} + +TEST(VersionTest, version_numbers_do_not_compare_equal_if_minor_version_differs) { + PackageVersion sut1; + sut1.major = 1; + sut1.minor = 2; + sut1.patch = 3; + PackageVersion sut2; + sut2.major = 1; + sut2.minor = 0; + sut2.patch = 3; + EXPECT_FALSE(sut1 == sut2); + EXPECT_FALSE(sut2 == sut1); + sut1.minor = 99; + sut2.minor = 6; + EXPECT_FALSE(sut1 == sut2); + EXPECT_FALSE(sut2 == sut1); +} + +TEST(VersionTest, version_numbers_do_not_compare_equal_if_patch_version_differs) { + PackageVersion sut1; + sut1.major = 1; + sut1.minor = 2; + sut1.patch = 3; + PackageVersion sut2; + sut2.major = 1; + sut2.minor = 2; + sut2.patch = 0; + EXPECT_FALSE(sut1 == sut2); + EXPECT_FALSE(sut2 == sut1); + sut1.patch = 99; + sut2.patch = 6; + EXPECT_FALSE(sut1 == sut2); + EXPECT_FALSE(sut2 == sut1); +} + +TEST(VersionTest, version_numbers_less_compares_lexicographically) { + PackageVersion sut1; + sut1.major = 1; + sut1.minor = 2; + sut1.patch = 3; + PackageVersion sut2; + sut2.major = 2; + sut2.minor = 2; + sut2.patch = 3; + EXPECT_LT(sut1, sut2); + EXPECT_FALSE(sut2 < sut1); + sut2.major = sut1.major; + sut2.minor = 3; + EXPECT_LT(sut1, sut2); + EXPECT_FALSE(sut2 < sut1); + sut2.minor = sut1.minor; + sut2.patch = 4; + EXPECT_LT(sut1, sut2); + EXPECT_FALSE(sut2 < sut1); + sut2.patch = sut1.patch; + EXPECT_FALSE(sut1 < sut2); + EXPECT_FALSE(sut2 < sut1); +} + +TEST(VersionTest, version_numbers_ostream_insertion_produces_version_string) { + std::stringstream sstr; + PackageVersion sut; + sut.major = 0; + sut.minor = 0; + sut.patch = 0; + sstr << sut; + ASSERT_FALSE(sstr.fail()); + EXPECT_STREQ(sstr.str().c_str(), "0.0.0"); + sstr = std::stringstream {}; + sut.major = 22; + sut.minor = 4; + sut.patch = 102; + sstr << sut; + ASSERT_FALSE(sstr.fail()); + EXPECT_STREQ(sstr.str().c_str(), "22.4.102"); +} + +} // namespace diff --git a/iceoryx2-ffi/c/src/api/mod.rs b/iceoryx2-ffi/c/src/api/mod.rs index abea7d7066..c0056a6994 100644 --- a/iceoryx2-ffi/c/src/api/mod.rs +++ b/iceoryx2-ffi/c/src/api/mod.rs @@ -295,3 +295,23 @@ pub unsafe extern "C" fn iox2_semantic_string_error_string( ) -> *const c_char { error.as_const_cstr().as_ptr() as *const c_char } + +/// Version number. +#[repr(C)] +pub struct iox2_package_version_t { + major: u16, + minor: u16, + patch: u16, +} + +/// Returns the crates version acquired through the internal environment variables set by cargo, +/// ("CARGO_PKG_VERSION_{MAJOR|MINOR|PATCH}"). +#[no_mangle] +pub unsafe extern "C" fn iox2_package_version() -> iox2_package_version_t { + let package_version = PackageVersion::get(); + iox2_package_version_t { + major: package_version.major(), + minor: package_version.minor(), + patch: package_version.patch(), + } +} diff --git a/iceoryx2/src/prelude.rs b/iceoryx2/src/prelude.rs index f58ca07e55..68cdc74549 100644 --- a/iceoryx2/src/prelude.rs +++ b/iceoryx2/src/prelude.rs @@ -26,6 +26,7 @@ pub use iceoryx2_bb_container::semantic_string::SemanticStringError; pub use iceoryx2_bb_derive_macros::PlacementDefault; pub use iceoryx2_bb_derive_macros::ZeroCopySend; pub use iceoryx2_bb_elementary::alignment::Alignment; +pub use iceoryx2_bb_elementary::package_version::PackageVersion; pub use iceoryx2_bb_elementary::CallbackProgression; pub use iceoryx2_bb_elementary_traits::placement_default::PlacementDefault; pub use iceoryx2_bb_elementary_traits::zero_copy_send::ZeroCopySend;