浏览代码

2008-05-15 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

	Use erase+lower_bound+insert instead of sort.
	* src/DefaultPieceStorage.cc (addPieceStats)
Tatsuhiro Tsujikawa 17 年之前
父节点
当前提交
46636201c1
共有 2 个文件被更改,包括 20 次插入10 次删除
  1. 5 0
      ChangeLog
  2. 15 10
      src/DefaultPieceStorage.cc

+ 5 - 0
ChangeLog

@@ -1,3 +1,8 @@
+2008-05-15  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
+
+	Use erase+lower_bound+insert instead of sort.
+	* src/DefaultPieceStorage.cc (addPieceStats) 
+
 2008-05-15  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
 
 	Use A2STR::SHARP_C and A2STR::EQUAL_C.

+ 15 - 10
src/DefaultPieceStorage.cc

@@ -701,19 +701,24 @@ void DefaultPieceStorage::updatePieceStats(const unsigned char* newBitfield,
 
 void DefaultPieceStorage::addPieceStats(size_t index)
 {
-  std::deque<SharedHandle<PieceStat> >::iterator cur =
-    std::lower_bound(_sortedPieceStats.begin(), _sortedPieceStats.end(),
-		     _pieceStats[index], PieceRarer());
+  SharedHandle<PieceStat> pieceStat(_pieceStats[index]);
+  {
+    std::deque<SharedHandle<PieceStat> >::iterator cur =
+      std::lower_bound(_sortedPieceStats.begin(), _sortedPieceStats.end(),
+		       pieceStat, PieceRarer());
+    _sortedPieceStats.erase(cur);
+  }
+  pieceStat->addCount();
 
-  (*cur)->addCount();
+  std::deque<SharedHandle<PieceStat> >::iterator to =
+    std::lower_bound(_sortedPieceStats.begin(), _sortedPieceStats.end(),
+		     pieceStat, PieceRarer());
 
-  std::deque<SharedHandle<PieceStat> >::iterator last =
-    std::upper_bound(cur+1, _sortedPieceStats.end(), *cur, PieceRarer());
+  _sortedPieceStats.insert(to, pieceStat);
 
-  std::sort(cur, last, PieceRarer());
-//   for(std::deque<SharedHandle<PieceStat> >::const_iterator i = _sortedPieceStats.begin(); i != _sortedPieceStats.end(); ++i) {
-//     logger->debug("index = %u, count = %u", (*i)->getIndex(), (*i)->getCount());
-//   }
+//    for(std::deque<SharedHandle<PieceStat> >::const_iterator i = _sortedPieceStats.begin(); i != _sortedPieceStats.end(); ++i) {
+//      logger->debug("index = %u, count = %u", (*i)->getIndex(), (*i)->getCount());
+//    }
 }
 
 PieceStat::PieceStat(size_t index):_order(0), _index(index), _count(0) {}