llpriqueuemap.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:4k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llpriqueuemap.h
  3.  * @brief Priority queue implementation
  4.  *
  5.  * $LicenseInfo:firstyear=2003&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2003-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #ifndef LL_LLPRIQUEUEMAP_H
  33. #define LL_LLPRIQUEUEMAP_H
  34. #include <map>
  35. //
  36. // Priority queue, implemented under the hood as a
  37. // map.  Needs to be done this way because none of the
  38. // standard STL containers provide a representation
  39. // where it's easy to reprioritize.
  40. //
  41. template <class DATA>
  42. class LLPQMKey
  43. {
  44. public:
  45. LLPQMKey(const F32 priority, DATA data) : mPriority(priority), mData(data)
  46. {
  47. }
  48. bool operator<(const LLPQMKey &b) const
  49. {
  50. if (mPriority > b.mPriority)
  51. {
  52. return TRUE;
  53. }
  54. if (mPriority < b.mPriority)
  55. {
  56. return FALSE;
  57. }
  58. if (mData > b.mData)
  59. {
  60. return TRUE;
  61. }
  62. return FALSE;
  63. }
  64. F32 mPriority;
  65. DATA mData;
  66. };
  67. template <class DATA_TYPE>
  68. class LLPriQueueMap
  69. {
  70. public:
  71. typedef typename std::map<LLPQMKey<DATA_TYPE>, DATA_TYPE>::iterator pqm_iter;
  72. typedef std::pair<LLPQMKey<DATA_TYPE>, DATA_TYPE> pqm_pair;
  73. typedef void (*set_pri_fn)(DATA_TYPE &data, const F32 priority);
  74. typedef F32 (*get_pri_fn)(DATA_TYPE &data);
  75. LLPriQueueMap(set_pri_fn set_pri, get_pri_fn get_pri) : mSetPriority(set_pri), mGetPriority(get_pri)
  76. {
  77. }
  78. void push(const F32 priority, DATA_TYPE data)
  79. {
  80. #ifdef _DEBUG
  81. pqm_iter iter = mMap.find(LLPQMKey<DATA_TYPE>(priority, data));
  82. if (iter != mMap.end())
  83. {
  84. llerrs << "Pushing already existing data onto queue!" << llendl;
  85. }
  86. #endif
  87. mMap.insert(pqm_pair(LLPQMKey<DATA_TYPE>(priority, data), data));
  88. }
  89. BOOL pop(DATA_TYPE *datap)
  90. {
  91. pqm_iter iter;
  92. iter = mMap.begin();
  93. if (iter == mMap.end())
  94. {
  95. return FALSE;
  96. }
  97. *datap = (*(iter)).second;
  98. mMap.erase(iter);
  99. return TRUE;
  100. }
  101. void reprioritize(const F32 new_priority, DATA_TYPE data)
  102. {
  103. pqm_iter iter;
  104. F32 cur_priority = mGetPriority(data);
  105. LLPQMKey<DATA_TYPE> cur_key(cur_priority, data);
  106. iter = mMap.find(cur_key);
  107. if (iter == mMap.end())
  108. {
  109. llwarns << "Data not on priority queue!" << llendl;
  110. // OK, try iterating through all of the data and seeing if we just screwed up the priority
  111. // somehow.
  112. for (iter = mMap.begin(); iter != mMap.end(); iter++)
  113. {
  114. if ((*(iter)).second == data)
  115. {
  116. llerrs << "Data on priority queue but priority not matched!" << llendl;
  117. }
  118. }
  119. return;
  120. }
  121. mMap.erase(iter);
  122. mSetPriority(data, new_priority);
  123. push(new_priority, data);
  124. }
  125. S32 getLength() const
  126. {
  127. return (S32)mMap.size();
  128. }
  129. // Hack: public for use by the transfer manager, ugh.
  130. std::map<LLPQMKey<DATA_TYPE>, DATA_TYPE> mMap;
  131. protected:
  132. void (*mSetPriority)(DATA_TYPE &data, const F32 priority);
  133. F32 (*mGetPriority)(DATA_TYPE &data);
  134. };
  135. #endif // LL_LLPRIQUEUEMAP_H