Skip to content

Commit

Permalink
Add emplace to OptionalHolder, AnyHolder
Browse files Browse the repository at this point in the history
  • Loading branch information
mikir committed Jan 31, 2024
1 parent c91ee90 commit 2e9b086
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 0 deletions.
12 changes: 12 additions & 0 deletions compiler/extensions/cpp/runtime/src/zserio/AnyHolder.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,12 @@ class HolderBase : public IHolder<ALLOC>
m_typedHolder = std::forward<U>(value);
}

template <typename... U>
T& emplace(U&&... parameters)
{
return m_typedHolder.emplace(std::forward<U>(parameters)...);
}

void setHolder(const inplace_optional_holder<T>& value)
{
m_typedHolder = value;
Expand Down Expand Up @@ -602,6 +608,12 @@ class AnyHolder : public AllocatorHolder<ALLOC>
createHolder<typename std::decay<T>::type>()->set(NoInit, std::forward<T>(value));
}

template <typename T, typename... U>
T& emplace(U&&... args)
{
return createHolder<typename std::decay<T>::type>()->emplace(std::forward<U>(args)...);
}

/**
* Gets value of the given type.
*
Expand Down
30 changes: 30 additions & 0 deletions compiler/extensions/cpp/runtime/src/zserio/OptionalHolder.h
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,20 @@ class heap_optional_holder : public optional_holder_base<T, heap_optional_holder
return *this;
}

/**
* Assigns a new value by forwarding arguments for its constructor
*
* \param parameters Constructor arguments to forward
*
* \return reference to the created object
*/
template <typename... U>
T& emplace(U&&... parameters)
{
m_storage = zserio::allocate_unique<T, allocator_type>(get_allocator(), std::forward<U>(parameters)...);
return *m_storage.get();
}

/**
* Assignment operator from value.
*
Expand Down Expand Up @@ -883,6 +897,22 @@ class inplace_optional_holder : public optional_holder_base<T, inplace_optional_
return *this;
}

/**
* Assigns a new value by forwarding arguments for its constructor
*
* \param parameters Constructor arguments to forward
*
* \return reference to the created object
*/
template <typename... U>
T& emplace(U&&... parameters)
{
reset();
new (m_storage.getStorage()) T(std::forward<U>(parameters)...);
m_hasValue = true;
return *m_storage.getObject();
}

/**
* Assignment operator from value.
*
Expand Down

0 comments on commit 2e9b086

Please sign in to comment.