ParticlePoolMap.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #ifndef PARTICLE_POOL_MAP_H
  2. #define PARTICLE_POOL_MAP_H
  3. template <typename T>
  4. class ParticlePoolMap
  5. {
  6. public:
  7. typedef std::multimap<Ogre::String, T*> PoolMapMap;
  8. typedef typename PoolMapMap::iterator PoolMapIterator; // The 'typename' MUST be added, since T is not a fixed type
  9. ParticlePoolMap () {};
  10. virtual ~ParticlePoolMap() {};
  11. bool
  12. IsEmpty()
  13. {
  14. return m_Released.empty();
  15. };
  16. size_t
  17. GetSize()
  18. {
  19. return m_Released.size();
  20. };
  21. void
  22. ResetIterator()
  23. {
  24. m_PoolMapIterator = m_Released.begin();
  25. };
  26. T*
  27. GetFirst()
  28. {
  29. ResetIterator();
  30. if (End())
  31. {
  32. return NULL;
  33. }
  34. T* t = m_PoolMapIterator->second;
  35. return t;
  36. };
  37. T*
  38. GetNext()
  39. {
  40. if (End())
  41. {
  42. return NULL;
  43. }
  44. ++m_PoolMapIterator;
  45. if (End())
  46. {
  47. return NULL;
  48. }
  49. T* t = m_PoolMapIterator->second;
  50. return t;
  51. };
  52. bool
  53. End()
  54. {
  55. return m_PoolMapIterator == m_Released.end();
  56. };
  57. void
  58. Clear()
  59. {
  60. m_Locked.clear();
  61. m_Released.clear();
  62. };
  63. void
  64. AddElement(const Ogre::String& key, T* element)
  65. {
  66. m_Locked.insert(make_pair(key, element));
  67. };
  68. T*
  69. ReleaseElement(const Ogre::String& key)
  70. {
  71. // Return with 0 if no elements left
  72. if (m_Locked.empty())
  73. {
  74. return NULL;
  75. }
  76. // Return the first element that is encountered
  77. T* t = 0;
  78. PoolMapIterator it;
  79. it = m_Locked.find(key);
  80. if (it != m_Locked.end())
  81. {
  82. // Get the element and move it to the released elements list
  83. t = it->second;
  84. m_Released.insert(make_pair(key, t));
  85. m_Locked.erase(it);
  86. }
  87. return t;
  88. };
  89. void
  90. ReleaseAllElements()
  91. {
  92. // Move all elements from locked elements to released elements
  93. PoolMapIterator it;
  94. for (it = m_Locked.begin(); it != m_Locked.end(); ++it)
  95. {
  96. m_Released.insert(make_pair(it->first, it->second));
  97. }
  98. m_Locked.clear();
  99. ResetIterator();
  100. };
  101. void
  102. LockLatestElement()
  103. {
  104. // Move element pointed by iterator from released elements to locked elements
  105. m_Locked.insert(make_pair(m_PoolMapIterator->first, m_PoolMapIterator->second));
  106. m_Released.erase(m_PoolMapIterator++); // Watch the ++ at the end to set mPoolMapIterator to the next element
  107. };
  108. void
  109. LockAllElements()
  110. {
  111. // Move all elements from release elements to locked elements
  112. PoolMapIterator it;
  113. for (it = m_Released.begin(); it != m_Released.end(); ++it)
  114. {
  115. m_Locked.insert(make_pair(it->first, it->second));
  116. }
  117. m_Released.clear();
  118. ResetIterator();
  119. };
  120. protected:
  121. PoolMapMap m_Released;
  122. PoolMapMap m_Locked;
  123. PoolMapIterator m_PoolMapIterator;
  124. };
  125. #endif // PARTICLE_POOL_MAP_H