diff --git a/atom/src/observer.h b/atom/src/observer.h index e6e9911a..fc0fcd3d 100644 --- a/atom/src/observer.h +++ b/atom/src/observer.h @@ -48,6 +48,12 @@ struct Observer return (m_change_types & change_types) != 0; } + inline void replace( const cppy::ptr& observer, uint8_t change_types ) + { + m_observer = observer; + m_change_types = change_types; + } + cppy::ptr m_observer; uint8_t m_change_types; diff --git a/atom/src/observerpool.cpp b/atom/src/observerpool.cpp index f861b852..d7dd4abe 100644 --- a/atom/src/observerpool.cpp +++ b/atom/src/observerpool.cpp @@ -129,17 +129,17 @@ ObserverPool::add( cppy::ptr& topic, cppy::ptr& observer, uint8_t change_types ) } if( obs_free == obs_end ) { - m_observers.insert( obs_end, Observer( observer, change_types ) ); + m_observers.emplace( obs_end, observer, change_types ); ++topic_it->m_count; } else - *obs_free = Observer( observer, change_types ); + obs_free->replace( observer, change_types ); return; } obs_offset += topic_it->m_count; } - m_topics.push_back( Topic( topic, 1 ) ); - m_observers.push_back( Observer(observer, change_types) ); + m_topics.emplace_back( topic, 1 ); + m_observers.emplace_back( observer, change_types ); }