tmap.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. #ifndef _TMap_H_
  2. #define _TMap_H_
  3. //////////////////////////////////////////////////////////////////////////////
  4. //
  5. // Map Template
  6. //
  7. //////////////////////////////////////////////////////////////////////////////
  8. template<class TKey, class TValue, class SinkFunctionType = NullFunc>
  9. class TMap : public IObject {
  10. public:
  11. class MapNode : public IObjectSingle {
  12. public:
  13. TKey m_key;
  14. TValue m_value;
  15. TRef<MapNode> m_pnode;
  16. MapNode(const TKey& key, const TValue& value, MapNode* pnode) :
  17. m_key(key),
  18. m_value(value),
  19. m_pnode(pnode)
  20. {}
  21. };
  22. TRef<MapNode> m_pnodes;
  23. int m_count;
  24. SinkFunctionType m_fnSink;
  25. SinkFunctionType& GetSink()
  26. {
  27. return m_fnSink;
  28. };
  29. MapNode* FindNode(const TKey& key) const
  30. {
  31. MapNode* pnode = m_pnodes;
  32. while (pnode && pnode->m_key >= key) {
  33. if (pnode->m_key == key) {
  34. return pnode;
  35. }
  36. pnode = pnode->m_pnode;
  37. }
  38. return NULL;
  39. }
  40. class Iterator : public IObject {
  41. private:
  42. TRef<MapNode> m_pnode;
  43. public:
  44. Iterator(TMap& map) :
  45. m_pnode(map.m_pnodes)
  46. {}
  47. virtual const TValue& Value()
  48. {
  49. return m_pnode->m_value;
  50. }
  51. virtual const TKey& Key()
  52. {
  53. return m_pnode->m_key;
  54. }
  55. virtual bool End()
  56. {
  57. return (m_pnode == NULL);
  58. }
  59. virtual bool Next()
  60. {
  61. if (m_pnode) {
  62. m_pnode = m_pnode->m_pnode;
  63. }
  64. return End();
  65. }
  66. };
  67. TMap() :
  68. m_pnodes(NULL),
  69. m_count(0)
  70. {}
  71. void Set(const TKey& key, const TValue& value)
  72. {
  73. TRef<MapNode>* ppnode = m_pnodes.Pointer();
  74. while ((*ppnode) && (*ppnode)->m_key > key) {
  75. ppnode = (*ppnode)->m_pnode.Pointer();
  76. }
  77. if ((*ppnode) && (*ppnode)->m_key == key) {
  78. (*ppnode)->m_value = value;
  79. } else {
  80. (*ppnode) = new MapNode(key, value, (*ppnode));
  81. ++m_count;
  82. }
  83. m_fnSink();
  84. }
  85. const bool Find(const TKey& key, TValue& value) const
  86. {
  87. MapNode* pnode = FindNode(key);
  88. if (pnode) {
  89. value = pnode->m_value;
  90. }
  91. return pnode != NULL;
  92. }
  93. const bool FindValue(const TValue& value, TKey& key)
  94. {
  95. MapNode* pnode = m_pnodes;
  96. while (pnode) {
  97. if (pnode->m_value == value) {
  98. key = pnode->m_key;
  99. return true;
  100. }
  101. pnode = pnode->m_pnode;
  102. }
  103. return false;
  104. }
  105. void Remove(const TKey& key)
  106. {
  107. TRef<MapNode>* ppnode = m_pnodes.Pointer();
  108. while (*ppnode) {
  109. if ((*ppnode)->m_key == key) {
  110. (*ppnode) = (*ppnode)->m_pnode;
  111. --m_count;
  112. m_fnSink();
  113. return;
  114. }
  115. ppnode = (*ppnode)->m_pnode.Pointer();
  116. }
  117. }
  118. void Remove(const TValue& value)
  119. {
  120. TRef<MapNode>* ppnode = m_pnodes.Pointer();
  121. while (*ppnode) {
  122. if ((*ppnode)->m_value == value) {
  123. (*ppnode) = (*ppnode)->m_pnode;
  124. --m_count;
  125. m_fnSink();
  126. return;
  127. }
  128. ppnode = (*ppnode)->m_pnode.Pointer();
  129. }
  130. }
  131. int Count() const
  132. {
  133. return m_count;
  134. }
  135. void SetEmpty()
  136. {
  137. m_count = 0;
  138. m_pnodes = NULL;
  139. m_fnSink();
  140. }
  141. bool IsEmpty() const
  142. {
  143. return (m_count == 0);
  144. }
  145. };
  146. #endif