* Adding EntityManager.cs
* Not referenced anywhere yet. * Designed to replace Dictionary<UUID,EntityBase> within SceneGraph.Entities * Allows indexed access and better handling of locks. * Someone needs to implement IEnumerable on this before we can switch it over.0.6.1-post-fixes
parent
0be9ff1949
commit
eb8650fc14
|
@ -0,0 +1,148 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using OpenMetaverse;
|
||||
|
||||
namespace OpenSim.Region.Environment.Scenes
|
||||
{
|
||||
public class EntityManager
|
||||
{
|
||||
private readonly Dictionary<UUID,EntityBase> m_eb_uuid = new Dictionary<UUID, EntityBase>();
|
||||
private readonly Dictionary<uint, EntityBase> m_eb_localID = new Dictionary<uint, EntityBase>();
|
||||
private readonly Object m_lock = new Object();
|
||||
|
||||
[Obsolete("Use Add() instead.")]
|
||||
public void Add(UUID id, EntityBase eb)
|
||||
{
|
||||
Add(eb);
|
||||
}
|
||||
|
||||
public void Add(EntityBase entity)
|
||||
{
|
||||
lock(m_lock)
|
||||
{
|
||||
m_eb_uuid.Add(entity.UUID, entity);
|
||||
m_eb_localID.Add(entity.LocalId, entity);
|
||||
}
|
||||
}
|
||||
|
||||
public void InsertOrReplace(EntityBase entity)
|
||||
{
|
||||
lock(m_lock)
|
||||
{
|
||||
m_eb_uuid[entity.UUID] = entity;
|
||||
m_eb_localID[entity.LocalId] = entity;
|
||||
}
|
||||
}
|
||||
|
||||
public void Clear()
|
||||
{
|
||||
lock (m_lock)
|
||||
{
|
||||
m_eb_uuid.Clear();
|
||||
m_eb_localID.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
public int Count
|
||||
{
|
||||
get
|
||||
{
|
||||
lock (m_lock)
|
||||
{
|
||||
return m_eb_uuid.Count;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool ContainsKey(UUID id)
|
||||
{
|
||||
lock(m_lock)
|
||||
{
|
||||
return m_eb_uuid.ContainsKey(id);
|
||||
}
|
||||
}
|
||||
|
||||
public bool ContainsKey(uint localID)
|
||||
{
|
||||
lock (m_lock)
|
||||
{
|
||||
return m_eb_localID.ContainsKey(localID);
|
||||
}
|
||||
}
|
||||
|
||||
public void Remove(uint localID)
|
||||
{
|
||||
lock(m_lock)
|
||||
{
|
||||
m_eb_uuid.Remove(m_eb_localID[localID].UUID);
|
||||
m_eb_localID.Remove(localID);
|
||||
}
|
||||
}
|
||||
|
||||
public void Remove(UUID id)
|
||||
{
|
||||
lock(m_lock)
|
||||
{
|
||||
m_eb_localID.Remove(m_eb_uuid[id].LocalId);
|
||||
m_eb_uuid.Remove(id);
|
||||
}
|
||||
}
|
||||
|
||||
public List<EntityBase> GetAllByType<T>()
|
||||
{
|
||||
List<EntityBase> tmp = new List<EntityBase>();
|
||||
|
||||
lock(m_lock)
|
||||
{
|
||||
foreach (KeyValuePair<UUID, EntityBase> pair in m_eb_uuid)
|
||||
{
|
||||
if(pair.Value is T)
|
||||
{
|
||||
tmp.Add(pair.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return tmp;
|
||||
}
|
||||
|
||||
[Obsolete("Please used indexed access to this instead. Indexes can be accessed via EntitiesManager[index]. LocalID and UUID are supported.")]
|
||||
public List<EntityBase> GetEntities()
|
||||
{
|
||||
lock (m_lock)
|
||||
{
|
||||
return new List<EntityBase>(m_eb_uuid.Values);
|
||||
}
|
||||
}
|
||||
|
||||
public EntityBase this[UUID id]
|
||||
{
|
||||
get
|
||||
{
|
||||
lock (m_lock)
|
||||
{
|
||||
return m_eb_uuid[id];
|
||||
}
|
||||
}
|
||||
set
|
||||
{
|
||||
InsertOrReplace(value);
|
||||
}
|
||||
}
|
||||
|
||||
public EntityBase this[uint localID]
|
||||
{
|
||||
get
|
||||
{
|
||||
lock (m_lock)
|
||||
{
|
||||
return m_eb_localID[localID];
|
||||
}
|
||||
}
|
||||
set
|
||||
{
|
||||
InsertOrReplace(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue