bool add(const TObject& object, TFunc&& func) { assert(!m_init_phase && "Call MembersDatabase::prepare_for_lookup() before calling add()."); auto range = find(object.id()); if (range.empty()) { // No relation needs this object. return false; } // At least one relation needs this object. Store it and // "tell" all relations. add_object(object, range); for (auto& elem : range) { assert(!elem.is_removed()); assert(elem.member_id == object.id()); auto rel_handle = m_relations_db[elem.relation_pos]; assert(elem.member_num < rel_handle->members().size()); rel_handle.decrement_members(); if (rel_handle.has_all_members()) { func(rel_handle); } } return true; }
/** * This removes all relations that have already been assembled * from the m_relations vector. */ void clean_assembled_relations() { m_relations.erase( std::remove_if(m_relations.begin(), m_relations.end(), has_all_members()), m_relations.end() ); }