예제 #1
0
	//! delete all object in list, and clear self
void AccessByNameID<void*>::destroy()
{
	std::vector<uintptr_t> used_id;
	m_byid.get_used_id(used_id);
	std::vector<uintptr_t> bynamep(m_byname.size());
	std::map<std::string, void*>::iterator iter = m_byname.begin();
	for (long i = 0; iter != m_byname.end(); ++iter)
		bynamep[i++] = (uintptr_t)iter->second;
	for (long i = 0; i != static_cast<long>(used_id.size()); ++i)
		used_id[i] = m_byid.get_val(used_id[i]);
	std::sort(used_id.begin(), used_id.end());
	std::sort(bynamep.begin(), bynamep.end());
	long n = std::set_union(used_id.begin(), used_id.end(), bynamep.begin(), bynamep.end(), used_id.begin()) - used_id.begin();
	assert(static_cast<long>(used_id.size()) == n);
	for (long i = 0; i != static_cast<long>(used_id.size()); ++i)
	{
		on_destroy((void*)used_id[i]);
	}
	m_byid.clear();
	m_byname.clear();
}
예제 #2
0
//! delete all object in list, and clear self
void AccessByNameID<void*>::destroy()
{
	std::vector<uintptr_t> used_id;
	m_byid.get_used_id(&used_id);
	std::vector<uintptr_t> bynamep(m_byname->size());
	NameMapForAccessByNameID::iterator iter = m_byname->begin();
	for (uintptr_t i = 0; iter != m_byname->end(); ++iter)
		bynamep[i++] = (uintptr_t)iter->second;
	for (uintptr_t i = 0; i != used_id.size(); ++i)
		used_id[i] = m_byid.get_val(used_id[i]);
	std::sort(used_id.begin(), used_id.end());
	std::sort(bynamep.begin(), bynamep.end());
	uintptr_t n = std::set_union(used_id.begin(), used_id.end(),
		bynamep.begin(), bynamep.end(), used_id.begin()) - used_id.begin();
	assert(used_id.size() == n);
	if (used_id.size() != n) {
		THROW_STD(runtime_error,
			"(used_id.size=%zd) != (n=%zd)", used_id.size(), n);
	}
	for (uintptr_t i = 0; i != n; ++i)
		on_destroy((void*)used_id[i]);
	m_byid.clear();
	m_byname->clear();
}