Skip to content

Commit

Permalink
iox-#2414 Use placement new to construct a new object during assignment
Browse files Browse the repository at this point in the history
  • Loading branch information
yuanxingyang committed Feb 19, 2025
1 parent f33d582 commit b68079b
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 13 deletions.
1 change: 1 addition & 0 deletions doc/website/release-notes/iceoryx-unreleased.md
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@
- Depend on @ncurses when building with Bazel [#2372](https://github.com/eclipse-iceoryx/iceoryx/issues/2372)
- Fix windows performance issue [#2377](https://github.com/eclipse-iceoryx/iceoryx/issues/2377)
- Max Client and Server cannot be configured independently of Max Publisher and Subscriber [#2394](https://github.com/eclipse-iceoryx/iceoryx/issues/2394)
- Use placement new to construct a new object during assignment [#2414](https://github.com/eclipse-iceoryx/iceoryx/issues/2414)

**Refactoring:**

Expand Down
6 changes: 3 additions & 3 deletions iceoryx_hoofs/test/moduletests/test_vocabulary_variant.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -467,13 +467,13 @@ TEST_F(variant_Test, DirectValueAssignmentResultsInCorrectIndex)
EXPECT_THAT(schlomo.index(), Eq(0U));
}

TEST_F(variant_Test, DirectValueAssignmentWhenAlreadyAssignedWithDifferentType)
TEST_F(variant_Test, DirectValueAssignmentWhenAlreadyAssignedWithDifferentTypeResultsInCorrectIndex)
{
::testing::Test::RecordProperty("TEST_ID", "a058c173-497b-43ec-ba03-2702f3ba8190");
::testing::Test::RecordProperty("TEST_ID", "f9f10061-b7f2-4e8f-a4b2-c04478046dcd");
iox::variant<int, float> schlomo;
schlomo = 123;
schlomo = 123.01F;
EXPECT_THAT(schlomo.index(), Eq(0U));
EXPECT_THAT(schlomo.index(), Eq(1U));
}

TEST_F(variant_Test, HoldsAlternativeForCorrectType)
Expand Down
14 changes: 4 additions & 10 deletions iceoryx_hoofs/vocabulary/include/iox/detail/variant.inl
Original file line number Diff line number Diff line change
Expand Up @@ -149,25 +149,19 @@ template <typename T>
inline typename std::enable_if<!std::is_same<T, variant<Types...>&>::value, variant<Types...>>::type&
variant<Types...>::operator=(T&& rhs) noexcept
{
if (m_type_index == INVALID_VARIANT_INDEX)
if (m_type_index != internal::get_index_of_type<0, T, Types...>::index)
{
call_element_destructor();
new (&m_storage) T(std::move(rhs));
m_type_index = internal::get_index_of_type<0, T, Types...>::index;
}

if (!has_bad_variant_element_access<T>())
else
{
// AXIVION Next Construct AutosarC++19_03-M5.2.8: conversion to typed pointer is intentional, it is correctly aligned and points to sufficient memory for a T by design
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
auto storage = reinterpret_cast<T*>(&m_storage);
*storage = std::forward<T>(rhs);
}
else
{
error_message(__PRETTY_FUNCTION__,
"wrong variant type assignment, another type is already "
"set in variant");
}

return *this;
}

Expand Down

0 comments on commit b68079b

Please sign in to comment.