Guest User

Untitled

a guest
Jun 21st, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.03 KB | None | 0 0
  1. interface IndexedEntity<T : IndexedEntity<T>> {
  2.  
  3. var index: EntityIndexReference<T>?
  4.  
  5. }
  6.  
  7. class EntityIndexReference<T : IndexedEntity<T>> internal constructor(val container: EntityList<T>, val entity: T, val index: Int)
  8.  
  9. class EntityList<T : IndexedEntity<T>>(private val capacity: Int) : AbstractCollection<T>() {
  10.  
  11. private val entities = HashMap<Int, EntityIndexReference<T>>(capacity)
  12.  
  13. private val indicies = ArrayDeque<Int>((1 .. capacity).toList())
  14.  
  15. override val size get() = capacity - indicies.size
  16.  
  17. override fun add(element: T): Boolean {
  18.  
  19. if (isExhausted()) {
  20. return false
  21. }
  22.  
  23. assert(element.index == null)
  24.  
  25. val index = indicies.poll()
  26.  
  27. assert(entities[index] == null)
  28.  
  29. val reference = EntityIndexReference(this, element, index)
  30.  
  31. entities[index] = reference
  32.  
  33. element.index = reference
  34.  
  35. return true
  36. }
  37.  
  38. override fun remove(element: T): Boolean {
  39. assert(contains(element))
  40.  
  41. val reference = element.index!!
  42.  
  43. entities.remove(reference.index)
  44.  
  45. indicies.add(reference.index)
  46.  
  47. element.index = null
  48.  
  49. return true
  50. }
  51.  
  52. fun remove(index: Int): T? {
  53. val reference = entities.remove(index) ?: return null
  54.  
  55. val entity = reference.entity
  56.  
  57. indicies.add(reference.index)
  58.  
  59. entity.index = null
  60.  
  61. return entity
  62. }
  63.  
  64. fun get(index: Int): T? = entities[index]?.entity
  65.  
  66. override fun contains(element: T): Boolean {
  67. val reference = element.index ?: return false
  68.  
  69. if (reference.container != this) {
  70. return false
  71. }
  72.  
  73. return entities[reference.index]?.entity == element
  74. }
  75.  
  76. override fun iterator(): MutableIterator<T> = EntityListIterator(entities.values.iterator())
  77.  
  78. private fun isExhausted() = indicies.isEmpty()
  79.  
  80. private inner class EntityListIterator(private val itr: MutableIterator<EntityIndexReference<T>>) : MutableIterator<T> {
  81.  
  82. override fun hasNext() = itr.hasNext()
  83.  
  84. override fun next() = itr.next().entity
  85.  
  86. override fun remove() = itr.remove()
  87.  
  88. }
  89.  
  90. }
  91.  
  92. data class Player(val name: String, override var index: EntityIndexReference<Player>? = null) : IndexedEntity<Player>
  93.  
  94. abstract class AbstractEntityManager {
  95.  
  96. companion object {
  97.  
  98. const val MAX_PLAYERS = 2048
  99.  
  100. }
  101.  
  102. abstract val players: Collection<Player>
  103.  
  104. }
  105.  
  106. class EntityManager : AbstractEntityManager() {
  107.  
  108. override val players = EntityList<Player>(MAX_PLAYERS)
  109.  
  110. }
  111.  
  112. class ConcurrentEntityManager : AbstractEntityManager() {
  113.  
  114. override val players = Collections.synchronizedCollection(EntityList<Player>(MAX_PLAYERS))
  115.  
  116. }
  117.  
  118. object Main {
  119.  
  120. @JvmStatic
  121. fun main(args: Array<String>) {
  122.  
  123. val manager = EntityManager() //or ConcurrentEntityManager
  124.  
  125. var index = 1
  126.  
  127. do {
  128.  
  129. val player = Player("P${index++}")
  130.  
  131. } while(manager.players.add(player))
  132.  
  133. println("Players Size: ${manager.players.size}")
  134.  
  135. manager.players.forEach { println("Player: $it") }
  136.  
  137. }
  138.  
  139. }
Add Comment
Please, Sign In to add comment