Skip to content

Commit

Permalink
Simplify and fortify SFINAE logic for mutable associations
Browse files Browse the repository at this point in the history
  • Loading branch information
tmadlener committed Mar 24, 2023
1 parent 3435fe0 commit 8ececae
Showing 1 changed file with 7 additions and 9 deletions.
16 changes: 7 additions & 9 deletions include/podio/detail/Association.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,8 @@ class AssociationT {
}

/// Implicit conversion of mutable to immutable associations
template <typename FromU, typename ToU, bool Mut = Mutable,
typename = std::enable_if_t<Mut && std::is_same_v<FromU, FromT> && std::is_same_v<ToU, ToT>>>
template <typename FromU, typename ToU,
typename = std::enable_if_t<Mutable && std::is_same_v<FromU, FromT> && std::is_same_v<ToU, ToT>>>
operator AssociationT<FromU, ToU, false>() const {
return AssociationT<FromU, ToU, false>(m_obj);
}
Expand All @@ -95,7 +95,7 @@ class AssociationT {
}

/// Set the weight of the association
template <bool Mut = Mutable, typename = std::enable_if_t<Mut>>
template <bool Mut = Mutable, typename = std::enable_if_t<Mut && Mutable>>
void setWeight(float value) {
m_obj->weight = value;
}
Expand All @@ -109,8 +109,7 @@ class AssociationT {
}

/// Set the related-from object
template <typename FromU, bool Mut = Mutable,
typename = std::enable_if_t<Mut && std::is_same_v<detail::GetDefT<FromU>, FromT>>>
template <typename FromU, typename = std::enable_if_t<Mutable && std::is_same_v<detail::GetDefT<FromU>, FromT>>>
void setFrom(FromU value) {
delete m_obj->m_from;
m_obj->m_from = new detail::GetDefT<FromU>(value);
Expand All @@ -125,8 +124,7 @@ class AssociationT {
}

/// Set the related-to object
template <typename ToU, bool Mut = Mutable,
typename = std::enable_if_t<Mut && std::is_same_v<detail::GetDefT<ToU>, ToT>>>
template <typename ToU, typename = std::enable_if_t<Mutable && std::is_same_v<detail::GetDefT<ToU>, ToT>>>
void setTo(ToU value) {
delete m_obj->m_to;
m_obj->m_to = new detail::GetDefT<ToU>(value);
Expand Down Expand Up @@ -183,8 +181,8 @@ class AssociationT {
* @param value the element to set for this association.
*/
template <
typename T, bool Mut = Mutable,
typename = std::enable_if_t<Mut && !std::is_same_v<ToT, FromT> && detail::isMutableFromOrToT<T, FromT, ToT>>>
typename T,
typename = std::enable_if_t<Mutable && !std::is_same_v<ToT, FromT> && detail::isMutableFromOrToT<T, FromT, ToT>>>
void set(T value) {
if constexpr (std::is_same_v<T, FromT>) {
setFrom(std::move(value));
Expand Down

0 comments on commit 8ececae

Please sign in to comment.