Selaa lähdekoodia

2010-11-11 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

	To match the behavior of friend operator functions in
	SharedHandle.h to std::tr1::shared_ptr, we intentionally broke
	these functions and modified code so that our code does not depend
	on old behavior.
	* src/AbstractCommand.cc
	* src/DHTAbstractNodeLookupTask.h
	* src/DHTBucket.cc
	* src/DHTMessageReceiver.cc
	* src/DHTNodeLookupEntry.cc
	* src/DHTRoutingTable.cc
	* src/DefaultBtRequestFactory.cc
	* src/DefaultPeerStorage.cc
	* src/DefaultPieceStorage.cc
	* src/DownloadContext.cc
	* src/EpollEventPoll.cc
	* src/Event.h
	* src/HttpConnection.cc
	* src/KqueueEventPoll.cc
	* src/MultiDiskAdaptor.cc
	* src/PeerAbstractCommand.cc
	* src/PieceStatMan.cc
	* src/PollEventPoll.cc
	* src/PortEventPoll.cc
	* src/SegmentMan.cc
	* src/SelectEventPoll.cc
	* src/SelectEventPoll.h
	* src/ServerStatMan.cc
	* src/SharedHandle.h
	* src/UnknownLengthPieceStorage.cc
	* src/a2functional.h
	* src/option_processing.cc
	* src/version_usage.cc
	* test/BNodeTest.cc
	* test/DHTAnnouncePeerMessageTest.cc
	* test/DHTBucketTest.cc
	* test/DHTFindNodeMessageTest.cc
	* test/DHTGetPeersMessageTest.cc
	* test/DHTIDCloserTest.cc
	* test/DHTMessageFactoryImplTest.cc
	* test/DHTPingMessageTest.cc
	* test/DefaultBtRequestFactoryTest.cc
	* test/DefaultPeerStorageTest.cc
	* test/SequentialPickerTest.cc
	* test/SingletonHolderTest.cc
Tatsuhiro Tsujikawa 15 vuotta sitten
vanhempi
commit
bc98e39fe5

+ 47 - 0
ChangeLog

@@ -1,3 +1,50 @@
+2010-11-11  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
+
+	To match the behavior of friend operator functions in
+	SharedHandle.h to std::tr1::shared_ptr, we intentionally broke
+	these functions and modified code so that our code does not depend
+	on old behavior.
+	* src/AbstractCommand.cc
+	* src/DHTAbstractNodeLookupTask.h
+	* src/DHTBucket.cc
+	* src/DHTMessageReceiver.cc
+	* src/DHTNodeLookupEntry.cc
+	* src/DHTRoutingTable.cc
+	* src/DefaultBtRequestFactory.cc
+	* src/DefaultPeerStorage.cc
+	* src/DefaultPieceStorage.cc
+	* src/DownloadContext.cc
+	* src/EpollEventPoll.cc
+	* src/Event.h
+	* src/HttpConnection.cc
+	* src/KqueueEventPoll.cc
+	* src/MultiDiskAdaptor.cc
+	* src/PeerAbstractCommand.cc
+	* src/PieceStatMan.cc
+	* src/PollEventPoll.cc
+	* src/PortEventPoll.cc
+	* src/SegmentMan.cc
+	* src/SelectEventPoll.cc
+	* src/SelectEventPoll.h
+	* src/ServerStatMan.cc
+	* src/SharedHandle.h
+	* src/UnknownLengthPieceStorage.cc
+	* src/a2functional.h
+	* src/option_processing.cc
+	* src/version_usage.cc
+	* test/BNodeTest.cc
+	* test/DHTAnnouncePeerMessageTest.cc
+	* test/DHTBucketTest.cc
+	* test/DHTFindNodeMessageTest.cc
+	* test/DHTGetPeersMessageTest.cc
+	* test/DHTIDCloserTest.cc
+	* test/DHTMessageFactoryImplTest.cc
+	* test/DHTPingMessageTest.cc
+	* test/DefaultBtRequestFactoryTest.cc
+	* test/DefaultPeerStorageTest.cc
+	* test/SequentialPickerTest.cc
+	* test/SingletonHolderTest.cc
+
 2010-11-11  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 
 	Create SharedHandle outside of function call to avoid unexpected

+ 2 - 2
src/AbstractCommand.cc

@@ -462,7 +462,7 @@ void AbstractCommand::setReadCheckSocket(const SocketHandle& socket) {
     disableReadCheckSocket();
   } else {
     if(checkSocketIsReadable_) {
-      if(readCheckTarget_ != socket) {
+      if(*readCheckTarget_ != *socket) {
         e_->deleteSocketForReadCheck(readCheckTarget_, this);
         e_->addSocketForReadCheck(socket, this);
         readCheckTarget_ = socket;
@@ -498,7 +498,7 @@ void AbstractCommand::setWriteCheckSocket(const SocketHandle& socket) {
     disableWriteCheckSocket();
   } else {
     if(checkSocketIsWritable_) {
-      if(writeCheckTarget_ != socket) {
+      if(*writeCheckTarget_ != *socket) {
         e_->deleteSocketForWriteCheck(writeCheckTarget_, this);
         e_->addSocketForWriteCheck(socket, this);
         writeCheckTarget_ = socket;

+ 6 - 2
src/DHTAbstractNodeLookupTask.h

@@ -54,6 +54,7 @@
 #include "Logger.h"
 #include "util.h"
 #include "DHTIDCloser.h"
+#include "a2functional.h"
 
 namespace aria2 {
 
@@ -203,7 +204,10 @@ public:
                          static_cast<unsigned long>(count));
     }
     std::stable_sort(entries_.begin(), entries_.end(), DHTIDCloser(targetID_));
-    entries_.erase(std::unique(entries_.begin(), entries_.end()), entries_.end());
+    entries_.erase
+      (std::unique(entries_.begin(), entries_.end(),
+                   DerefEqualTo<SharedHandle<DHTNodeLookupEntry> >()),
+       entries_.end());
     if(getLogger()->debug()) {
       getLogger()->debug("%lu node lookup entries are unique.",
                          static_cast<unsigned long>(entries_.size()));
@@ -223,7 +227,7 @@ public:
     --inFlightMessage_;
     for(std::deque<SharedHandle<DHTNodeLookupEntry> >::iterator i =
           entries_.begin(), eoi = entries_.end(); i != eoi; ++i) {
-      if((*i)->node == node) {
+      if(*(*i)->node == *node) {
         entries_.erase(i);
         break;
       }

+ 5 - 5
src/DHTBucket.cc

@@ -111,7 +111,7 @@ bool DHTBucket::addNode(const SharedHandle<DHTNode>& node)
 {
   notifyUpdate();
   std::deque<SharedHandle<DHTNode> >::iterator itr =
-    std::find(nodes_.begin(), nodes_.end(), node);
+    std::find_if(nodes_.begin(), nodes_.end(), derefEqual(node));
   if(itr == nodes_.end()) {
     if(nodes_.size() < K) {
       nodes_.push_back(node);
@@ -145,7 +145,7 @@ void DHTBucket::dropNode(const SharedHandle<DHTNode>& node)
 {
   if(cachedNodes_.size()) {
     std::deque<SharedHandle<DHTNode> >::iterator itr =
-      find(nodes_.begin(), nodes_.end(), node);
+      std::find_if(nodes_.begin(), nodes_.end(), derefEqual(node));
     if(itr != nodes_.end()) {
       nodes_.erase(itr);
       nodes_.push_back(cachedNodes_.front());
@@ -157,7 +157,7 @@ void DHTBucket::dropNode(const SharedHandle<DHTNode>& node)
 void DHTBucket::moveToHead(const SharedHandle<DHTNode>& node)
 {
   std::deque<SharedHandle<DHTNode> >::iterator itr =
-    std::find(nodes_.begin(), nodes_.end(), node);
+    std::find_if(nodes_.begin(), nodes_.end(), derefEqual(node));
   if(itr != nodes_.end()) {
     nodes_.erase(itr);
     nodes_.push_front(node);
@@ -167,7 +167,7 @@ void DHTBucket::moveToHead(const SharedHandle<DHTNode>& node)
 void DHTBucket::moveToTail(const SharedHandle<DHTNode>& node)
 {
   std::deque<SharedHandle<DHTNode> >::iterator itr =
-    std::find(nodes_.begin(), nodes_.end(), node);
+    std::find_if(nodes_.begin(), nodes_.end(), derefEqual(node));
   if(itr != nodes_.end()) {
     nodes_.erase(itr);
     nodes_.push_back(node);
@@ -233,7 +233,7 @@ SharedHandle<DHTNode> DHTBucket::getNode(const unsigned char* nodeID, const std:
   node->setIPAddress(ipaddr);
   node->setPort(port);
   std::deque<SharedHandle<DHTNode> >::const_iterator itr =
-    std::find(nodes_.begin(), nodes_.end(), node);
+    std::find_if(nodes_.begin(), nodes_.end(), derefEqual(node));
   if(itr == nodes_.end()) {
     return SharedHandle<DHTNode>();
   } else {

+ 1 - 1
src/DHTMessageReceiver.cc

@@ -109,7 +109,7 @@ SharedHandle<DHTMessage> DHTMessageReceiver::receiveMessage()
     } else {
       SharedHandle<DHTQueryMessage> message =
         factory_->createQueryMessage(dict, remoteAddr, remotePort);
-      if(message->getLocalNode() == message->getRemoteNode()) {
+      if(*message->getLocalNode() == *message->getRemoteNode()) {
         // drop message from localnode
         logger_->info("Received DHT message from localnode.");
         return handleUnknownMessage(data, sizeof(data), remoteAddr, remotePort);

+ 1 - 1
src/DHTNodeLookupEntry.cc

@@ -45,7 +45,7 @@ DHTNodeLookupEntry::DHTNodeLookupEntry():
 
 bool DHTNodeLookupEntry::operator==(const DHTNodeLookupEntry& entry) const
 {
-  return node == entry.node;
+  return *node == *entry.node;
 }
 
 } // namespace aria2

+ 1 - 1
src/DHTRoutingTable.cc

@@ -77,7 +77,7 @@ bool DHTRoutingTable::addNode(const SharedHandle<DHTNode>& node, bool good)
   if(logger_->debug()) {
     logger_->debug("Trying to add node:%s", node->toString().c_str());
   }
-  if(localNode_ == node) {
+  if(*localNode_ == *node) {
     if(logger_->debug()) {
       logger_->debug("Adding node with the same ID with localnode is not"
                      " allowed.");

+ 3 - 2
src/DefaultBtRequestFactory.cc

@@ -99,8 +99,9 @@ void DefaultBtRequestFactory::removeCompletedPiece() {
 void DefaultBtRequestFactory::removeTargetPiece
 (const SharedHandle<Piece>& piece)
 {
-  pieces_.erase(std::remove(pieces_.begin(), pieces_.end(), piece),
-               pieces_.end());
+  pieces_.erase(std::remove_if(pieces_.begin(), pieces_.end(),
+                               derefEqual(piece)),
+                pieces_.end());
   dispatcher_->doAbortOutstandingRequestAction(piece);
   pieceStorage_->cancelPiece(piece);
 }

+ 3 - 2
src/DefaultPeerStorage.cc

@@ -45,6 +45,7 @@
 #include "BtLeecherStateChoke.h"
 #include "PieceStorage.h"
 #include "wallclock.h"
+#include "a2functional.h"
 
 namespace aria2 {
 
@@ -75,7 +76,7 @@ public:
   FindIdenticalPeer(const SharedHandle<Peer>& peer):peer_(peer) {}
 
   bool operator()(const SharedHandle<Peer>& peer) const {
-    return (peer_ == peer) ||
+    return (*peer_ == *peer) ||
       ((peer_->getIPAddress() == peer->getIPAddress()) &&
        (peer_->getPort() == peer->getPort()));
   }
@@ -337,7 +338,7 @@ void DefaultPeerStorage::onReturningPeer(const SharedHandle<Peer>& peer)
 void DefaultPeerStorage::returnPeer(const SharedHandle<Peer>& peer)
 {
   std::deque<SharedHandle<Peer> >::iterator itr =
-    std::find(peers_.begin(), peers_.end(), peer);
+    std::find_if(peers_.begin(), peers_.end(), derefEqual(peer));
   if(itr == peers_.end()) {
     if(logger_->debug()) {
       logger_->debug("Cannot find peer %s:%u in PeerStorage.",

+ 10 - 6
src/DefaultPieceStorage.cc

@@ -127,7 +127,8 @@ SharedHandle<Piece> DefaultPieceStorage::getPiece(size_t index)
 void DefaultPieceStorage::addUsedPiece(const SharedHandle<Piece>& piece)
 {
   std::deque<SharedHandle<Piece> >::iterator i =
-    std::lower_bound(usedPieces_.begin(), usedPieces_.end(), piece);
+    std::lower_bound(usedPieces_.begin(), usedPieces_.end(), piece,
+                     DerefLess<SharedHandle<Piece> >());
   usedPieces_.insert(i, piece);
   if(logger_->debug()) {
     logger_->debug("usedPieces_.size()=%lu",
@@ -141,8 +142,9 @@ SharedHandle<Piece> DefaultPieceStorage::findUsedPiece(size_t index) const
   p->setIndex(index);
 
   std::deque<SharedHandle<Piece> >::const_iterator i =
-    std::lower_bound(usedPieces_.begin(), usedPieces_.end(), p);
-  if(i != usedPieces_.end() && (*i) == p) {
+    std::lower_bound(usedPieces_.begin(), usedPieces_.end(), p,
+                     DerefLess<SharedHandle<Piece> >());
+  if(i != usedPieces_.end() && *(*i) == *p) {
     return *i;
   } else {
     p.reset(0);
@@ -365,8 +367,9 @@ void DefaultPieceStorage::deleteUsedPiece(const SharedHandle<Piece>& piece)
     return;
   }
   std::deque<SharedHandle<Piece> >::iterator i = 
-    std::lower_bound(usedPieces_.begin(), usedPieces_.end(), piece);
-  if(i != usedPieces_.end() && (*i) == piece) {
+    std::lower_bound(usedPieces_.begin(), usedPieces_.end(), piece,
+                     DerefLess<SharedHandle<Piece> >());
+  if(i != usedPieces_.end() && *(*i) == *piece) {
     usedPieces_.erase(i);
   }
 }
@@ -723,7 +726,8 @@ void DefaultPieceStorage::addInFlightPiece
 (const std::vector<SharedHandle<Piece> >& pieces)
 {
   usedPieces_.insert(usedPieces_.end(), pieces.begin(), pieces.end());
-  std::sort(usedPieces_.begin(), usedPieces_.end());
+  std::sort(usedPieces_.begin(), usedPieces_.end(),
+            DerefLess<SharedHandle<Piece> >());
 }
 
 size_t DefaultPieceStorage::countInFlightPiece()

+ 3 - 1
src/DownloadContext.cc

@@ -41,6 +41,7 @@
 #include "util.h"
 #include "wallclock.h"
 #include "DlAbortEx.h"
+#include "a2functional.h"
 
 namespace aria2 {
 
@@ -102,7 +103,8 @@ DownloadContext::findFileEntryByOffset(off_t offset) const
   SharedHandle<FileEntry> obj(new FileEntry());
   obj->setOffset(offset);
   std::vector<SharedHandle<FileEntry> >::const_iterator i =
-    std::upper_bound(fileEntries_.begin(), fileEntries_.end(), obj);
+    std::upper_bound(fileEntries_.begin(), fileEntries_.end(), obj,
+                     DerefLess<SharedHandle<FileEntry> >());
   if(i != fileEntries_.end() && (*i)->getOffset() == offset) {
     return *i;
   } else {

+ 11 - 6
src/EpollEventPoll.cc

@@ -43,6 +43,7 @@
 #include "LogFactory.h"
 #include "Logger.h"
 #include "util.h"
+#include "a2functional.h"
 
 namespace aria2 {
 
@@ -166,10 +167,11 @@ bool EpollEventPoll::addEvents(sock_t socket,
 {
   SharedHandle<KSocketEntry> socketEntry(new KSocketEntry(socket));
   std::deque<SharedHandle<KSocketEntry> >::iterator i =
-    std::lower_bound(socketEntries_.begin(), socketEntries_.end(), socketEntry);
+    std::lower_bound(socketEntries_.begin(), socketEntries_.end(), socketEntry,
+                     DerefLess<SharedHandle<KSocketEntry> >());
   int r = 0;
   int errNum = 0;
-  if(i != socketEntries_.end() && (*i) == socketEntry) {
+  if(i != socketEntries_.end() && *(*i) == *socketEntry) {
 
     event.addSelf(*i);
 
@@ -229,8 +231,9 @@ bool EpollEventPoll::deleteEvents(sock_t socket,
 {
   SharedHandle<KSocketEntry> socketEntry(new KSocketEntry(socket));
   std::deque<SharedHandle<KSocketEntry> >::iterator i =
-    std::lower_bound(socketEntries_.begin(), socketEntries_.end(), socketEntry);
-  if(i != socketEntries_.end() && (*i) == socketEntry) {
+    std::lower_bound(socketEntries_.begin(), socketEntries_.end(), socketEntry,
+                     DerefLess<SharedHandle<KSocketEntry> >());
+  if(i != socketEntries_.end() && *(*i) == *socketEntry) {
 
     event.removeSelf(*i);
 
@@ -295,7 +298,8 @@ bool EpollEventPoll::addNameResolver
   SharedHandle<KAsyncNameResolverEntry> entry
     (new KAsyncNameResolverEntry(resolver, command));
   std::deque<SharedHandle<KAsyncNameResolverEntry> >::iterator itr =
-    std::find(nameResolverEntries_.begin(), nameResolverEntries_.end(), entry);
+    std::find_if(nameResolverEntries_.begin(), nameResolverEntries_.end(),
+                 derefEqual(entry));
   if(itr == nameResolverEntries_.end()) {
     nameResolverEntries_.push_back(entry);
     entry->addSocketEvents(this);
@@ -311,7 +315,8 @@ bool EpollEventPoll::deleteNameResolver
   SharedHandle<KAsyncNameResolverEntry> entry
     (new KAsyncNameResolverEntry(resolver, command));
   std::deque<SharedHandle<KAsyncNameResolverEntry> >::iterator itr =
-    std::find(nameResolverEntries_.begin(), nameResolverEntries_.end(), entry);
+    std::find_if(nameResolverEntries_.begin(), nameResolverEntries_.end(),
+                 derefEqual(entry));
   if(itr == nameResolverEntries_.end()) {
     return false;
   } else {

+ 2 - 2
src/Event.h

@@ -151,7 +151,7 @@ public:
 
   bool operator==(const ADNSEvent& event) const
   {
-    return resolver_ == event.resolver_;
+    return *resolver_ == *event.resolver_;
   }
     
   virtual int getEvents() const
@@ -323,7 +323,7 @@ public:
 
   bool operator==(const AsyncNameResolverEntry& entry)
   {
-    return nameResolver_ == entry.nameResolver_ &&
+    return *nameResolver_ == *entry.nameResolver_ &&
       command_ == entry.command_;
   }
 

+ 1 - 1
src/HttpConnection.cc

@@ -165,7 +165,7 @@ bool HttpConnection::isIssued(const SharedHandle<Segment>& segment) const
   for(HttpRequestEntries::const_iterator itr = outstandingHttpRequests_.begin(),
         eoi = outstandingHttpRequests_.end(); itr != eoi; ++itr) {
     SharedHandle<HttpRequest> httpRequest = (*itr)->getHttpRequest();
-    if(httpRequest->getSegment() == segment) {
+    if(*httpRequest->getSegment() == *segment) {
       return true;
     }
   }

+ 10 - 6
src/KqueueEventPoll.cc

@@ -170,12 +170,13 @@ bool KqueueEventPoll::addEvents
 {
   SharedHandle<KSocketEntry> socketEntry(new KSocketEntry(socket));
   std::deque<SharedHandle<KSocketEntry> >::iterator i =
-    std::lower_bound(socketEntries_.begin(), socketEntries_.end(), socketEntry);
+    std::lower_bound(socketEntries_.begin(), socketEntries_.end(), socketEntry,
+                     DerefLess<SharedHandle<KSocketEntry> >());
   int r = 0;
   struct timespec zeroTimeout = { 0, 0 };
   struct kevent changelist[2];
   size_t n;
-  if(i != socketEntries_.end() && (*i) == socketEntry) {
+  if(i != socketEntries_.end() && *(*i) == *socketEntry) {
     event.addSelf(*i);
     n = (*i)->getEvents(changelist);
   } else {
@@ -221,8 +222,9 @@ bool KqueueEventPoll::deleteEvents(sock_t socket,
 {
   SharedHandle<KSocketEntry> socketEntry(new KSocketEntry(socket));
   std::deque<SharedHandle<KSocketEntry> >::iterator i =
-    std::lower_bound(socketEntries_.begin(), socketEntries_.end(), socketEntry);
-  if(i != socketEntries_.end() && (*i) == socketEntry) {
+    std::lower_bound(socketEntries_.begin(), socketEntries_.end(), socketEntry,
+                     DerefLess<SharedHandle<KSocketEntry> >());
+  if(i != socketEntries_.end() && *(*i) == *socketEntry) {
     event.removeSelf(*i);
     int r = 0;
     struct timespec zeroTimeout = { 0, 0 };
@@ -272,7 +274,8 @@ bool KqueueEventPoll::addNameResolver
   SharedHandle<KAsyncNameResolverEntry> entry
     (new KAsyncNameResolverEntry(resolver, command));
   std::deque<SharedHandle<KAsyncNameResolverEntry> >::iterator itr =
-    std::find(nameResolverEntries_.begin(), nameResolverEntries_.end(), entry);
+    std::find_if(nameResolverEntries_.begin(), nameResolverEntries_.end(),
+                 derefEqual(entry));
   if(itr == nameResolverEntries_.end()) {
     nameResolverEntries_.push_back(entry);
     entry->addSocketEvents(this);
@@ -288,7 +291,8 @@ bool KqueueEventPoll::deleteNameResolver
   SharedHandle<KAsyncNameResolverEntry> entry
     (new KAsyncNameResolverEntry(resolver, command));
   std::deque<SharedHandle<KAsyncNameResolverEntry> >::iterator itr =
-    std::find(nameResolverEntries_.begin(), nameResolverEntries_.end(), entry);
+    std::find_if(nameResolverEntries_.begin(), nameResolverEntries_.end(),
+                 derefEqual(entry));
   if(itr == nameResolverEntries_.end()) {
     return false;
   } else {

+ 1 - 1
src/MultiDiskAdaptor.cc

@@ -119,7 +119,7 @@ void DiskWriterEntry::setDiskWriter(const SharedHandle<DiskWriter>& diskWriter)
 
 bool DiskWriterEntry::operator<(const DiskWriterEntry& entry) const
 {
-  return fileEntry_ < entry.fileEntry_;
+  return *fileEntry_ < *entry.fileEntry_;
 }
 
 void DiskWriterEntry::enableDirectIO()

+ 2 - 2
src/PeerAbstractCommand.cc

@@ -148,7 +148,7 @@ void PeerAbstractCommand::setReadCheckSocket(const SocketHandle& socket)
     disableReadCheckSocket();
   } else {
     if(checkSocketIsReadable_) {
-      if(readCheckTarget_ != socket) {
+      if(*readCheckTarget_ != *socket) {
         e_->deleteSocketForReadCheck(readCheckTarget_, this);
         e_->addSocketForReadCheck(socket, this);
         readCheckTarget_ = socket;
@@ -176,7 +176,7 @@ void PeerAbstractCommand::setWriteCheckSocket(const SocketHandle& socket)
     disableWriteCheckSocket();
   } else {
     if(checkSocketIsWritable_) {
-      if(writeCheckTarget_ != socket) {
+      if(*writeCheckTarget_ != *socket) {
         e_->deleteSocketForWriteCheck(writeCheckTarget_, this);
         e_->addSocketForWriteCheck(socket, this);
         writeCheckTarget_ = socket;

+ 1 - 1
src/PieceStatMan.cc

@@ -103,7 +103,7 @@ public:
 
   bool operator()(size_t lhs, size_t rhs) const
   {
-    return pieceStats_[lhs] < pieceStats_[rhs];
+    return *pieceStats_[lhs] < *pieceStats_[rhs];
   }
 };
 } // namespace

+ 14 - 8
src/PollEventPoll.cc

@@ -41,6 +41,7 @@
 #include "Command.h"
 #include "LogFactory.h"
 #include "Logger.h"
+#include "a2functional.h"
 
 namespace aria2 {
 
@@ -97,8 +98,9 @@ void PollEventPoll::poll(const struct timeval& tv)
       if(first->revents) {
         se->setSocket(first->fd);
         std::deque<SharedHandle<KSocketEntry> >::iterator itr =
-          std::lower_bound(socketEntries_.begin(), socketEntries_.end(), se);
-        if(itr != socketEntries_.end() && (*itr) == se) {
+          std::lower_bound(socketEntries_.begin(), socketEntries_.end(), se,
+                           DerefLess<SharedHandle<KSocketEntry> >());
+        if(itr != socketEntries_.end() && *(*itr) == *se) {
           (*itr)->processEvents(first->revents);
         } else {
           if(logger_->debug()) {
@@ -150,8 +152,9 @@ bool PollEventPoll::addEvents
 {
   SharedHandle<KSocketEntry> socketEntry(new KSocketEntry(socket));
   std::deque<SharedHandle<KSocketEntry> >::iterator i =
-    std::lower_bound(socketEntries_.begin(), socketEntries_.end(), socketEntry);
-  if(i != socketEntries_.end() && (*i) == socketEntry) {
+    std::lower_bound(socketEntries_.begin(), socketEntries_.end(), socketEntry,
+                     DerefLess<SharedHandle<KSocketEntry> >());
+  if(i != socketEntries_.end() && *(*i) == *socketEntry) {
     event.addSelf(*i);
     for(struct pollfd* first = pollfds_, *last = pollfds_+pollfdNum_;
         first != last; ++first) {
@@ -197,8 +200,9 @@ bool PollEventPoll::deleteEvents
 {
   SharedHandle<KSocketEntry> socketEntry(new KSocketEntry(socket));
   std::deque<SharedHandle<KSocketEntry> >::iterator i =
-    std::lower_bound(socketEntries_.begin(), socketEntries_.end(), socketEntry);
-  if(i != socketEntries_.end() && (*i) == socketEntry) {
+    std::lower_bound(socketEntries_.begin(), socketEntries_.end(), socketEntry,
+                     DerefLess<SharedHandle<KSocketEntry> >());
+  if(i != socketEntries_.end() && *(*i) == *socketEntry) {
     event.removeSelf(*i);
     for(struct pollfd* first = pollfds_, *last = pollfds_+pollfdNum_;
         first != last; ++first) {
@@ -246,7 +250,8 @@ bool PollEventPoll::addNameResolver
   SharedHandle<KAsyncNameResolverEntry> entry
     (new KAsyncNameResolverEntry(resolver, command));
   std::deque<SharedHandle<KAsyncNameResolverEntry> >::iterator itr =
-    std::find(nameResolverEntries_.begin(), nameResolverEntries_.end(), entry);
+    std::find_if(nameResolverEntries_.begin(), nameResolverEntries_.end(),
+                 derefEqual(entry));
   if(itr == nameResolverEntries_.end()) {
     nameResolverEntries_.push_back(entry);
     entry->addSocketEvents(this);
@@ -262,7 +267,8 @@ bool PollEventPoll::deleteNameResolver
   SharedHandle<KAsyncNameResolverEntry> entry
     (new KAsyncNameResolverEntry(resolver, command));
   std::deque<SharedHandle<KAsyncNameResolverEntry> >::iterator itr =
-    std::find(nameResolverEntries_.begin(), nameResolverEntries_.end(), entry);
+    std::find_if(nameResolverEntries_.begin(), nameResolverEntries_.end(),
+                 derefEqual(entry));
   if(itr == nameResolverEntries_.end()) {
     return false;
   } else {

+ 10 - 6
src/PortEventPoll.cc

@@ -173,10 +173,11 @@ bool PortEventPoll::addEvents(sock_t socket,
 {
   SharedHandle<KSocketEntry> socketEntry(new KSocketEntry(socket));
   std::deque<SharedHandle<KSocketEntry> >::iterator i =
-    std::lower_bound(socketEntries_.begin(), socketEntries_.end(), socketEntry);
+    std::lower_bound(socketEntries_.begin(), socketEntries_.end(), socketEntry,
+                     DerefLess<SharedHandle<KSocketEntry> >());
   int r = 0;
   int errNum = 0;
-  if(i != socketEntries_.end() && (*i) == socketEntry) {
+  if(i != socketEntries_.end() && *(*i) == *socketEntry) {
     event.addSelf(*i);
     A2PortEvent pv = (*i)->getEvents();
     r = port_associate(port_, PORT_SOURCE_FD, (*i)->getSocket(),
@@ -226,8 +227,9 @@ bool PortEventPoll::deleteEvents(sock_t socket,
 {
   SharedHandle<KSocketEntry> socketEntry(new KSocketEntry(socket));
   std::deque<SharedHandle<KSocketEntry> >::iterator i =
-    std::lower_bound(socketEntries_.begin(), socketEntries_.end(), socketEntry);
-  if(i != socketEntries_.end() && (*i) == socketEntry) {
+    std::lower_bound(socketEntries_.begin(), socketEntries_.end(), socketEntry,
+                     DerefLess<SharedHandle<KSocketEntry> >());
+  if(i != socketEntries_.end() && *(*i) == *socketEntry) {
     event.removeSelf(*i);
     int r = 0;
     int errNum = 0;
@@ -280,7 +282,8 @@ bool PortEventPoll::addNameResolver
   SharedHandle<KAsyncNameResolverEntry> entry
     (new KAsyncNameResolverEntry(resolver, command));
   std::deque<SharedHandle<KAsyncNameResolverEntry> >::iterator itr =
-    std::find(nameResolverEntries_.begin(), nameResolverEntries_.end(), entry);
+    std::find_if(nameResolverEntries_.begin(), nameResolverEntries_.end(),
+                 derefEqual(entry));
   if(itr == nameResolverEntries_.end()) {
     nameResolverEntries_.push_back(entry);
     entry->addSocketEvents(this);
@@ -296,7 +299,8 @@ bool PortEventPoll::deleteNameResolver
   SharedHandle<KAsyncNameResolverEntry> entry
     (new KAsyncNameResolverEntry(resolver, command));
   std::deque<SharedHandle<KAsyncNameResolverEntry> >::iterator itr =
-    std::find(nameResolverEntries_.begin(), nameResolverEntries_.end(), entry);
+    std::find_if(nameResolverEntries_.begin(), nameResolverEntries_.end(),
+                 derefEqual(entry));
   if(itr == nameResolverEntries_.end()) {
     return false;
   } else {

+ 1 - 1
src/SegmentMan.cc

@@ -280,7 +280,7 @@ void SegmentMan::cancelSegment
 {
   for(SegmentEntries::iterator itr = usedSegmentEntries_.begin(),
         eoi = usedSegmentEntries_.end(); itr != eoi;) {
-    if((*itr)->cuid == cuid && (*itr)->segment == segment) {
+    if((*itr)->cuid == cuid && *(*itr)->segment == *segment) {
       cancelSegment((*itr)->segment);
       itr = usedSegmentEntries_.erase(itr);
       //eoi = usedSegmentEntries_.end();

+ 11 - 6
src/SelectEventPoll.cc

@@ -44,6 +44,7 @@
 #include "Command.h"
 #include "LogFactory.h"
 #include "Logger.h"
+#include "a2functional.h"
 
 namespace aria2 {
 
@@ -278,8 +279,9 @@ bool SelectEventPoll::addEvents(sock_t socket, Command* command,
 {
   SharedHandle<SocketEntry> socketEntry(new SocketEntry(socket));
   std::deque<SharedHandle<SocketEntry> >::iterator i =
-    std::lower_bound(socketEntries_.begin(), socketEntries_.end(), socketEntry);
-  if(i != socketEntries_.end() && (*i) == socketEntry) {
+    std::lower_bound(socketEntries_.begin(), socketEntries_.end(), socketEntry,
+                     DerefLess<SharedHandle<SocketEntry> >());
+  if(i != socketEntries_.end() && *(*i) == *socketEntry) {
     (*i)->addCommandEvent(command, events);
   } else {
     socketEntries_.insert(i, socketEntry);
@@ -294,8 +296,9 @@ bool SelectEventPoll::deleteEvents(sock_t socket, Command* command,
 {
   SharedHandle<SocketEntry> socketEntry(new SocketEntry(socket));
   std::deque<SharedHandle<SocketEntry> >::iterator i =
-    std::lower_bound(socketEntries_.begin(), socketEntries_.end(), socketEntry);
-  if(i != socketEntries_.end() && (*i) == socketEntry) {
+    std::lower_bound(socketEntries_.begin(), socketEntries_.end(), socketEntry,
+                     DerefLess<SharedHandle<SocketEntry> >());
+  if(i != socketEntries_.end() && *(*i) == *socketEntry) {
     (*i)->removeCommandEvent(command, events);
     if((*i)->eventEmpty()) {
       socketEntries_.erase(i);
@@ -317,7 +320,8 @@ bool SelectEventPoll::addNameResolver
   SharedHandle<AsyncNameResolverEntry> entry
     (new AsyncNameResolverEntry(resolver, command));
   std::deque<SharedHandle<AsyncNameResolverEntry> >::iterator itr =
-    std::find(nameResolverEntries_.begin(), nameResolverEntries_.end(), entry);
+    std::find_if(nameResolverEntries_.begin(), nameResolverEntries_.end(),
+                 derefEqual(entry));
   if(itr == nameResolverEntries_.end()) {
     nameResolverEntries_.push_back(entry);
     return true;
@@ -332,7 +336,8 @@ bool SelectEventPoll::deleteNameResolver
   SharedHandle<AsyncNameResolverEntry> entry
     (new AsyncNameResolverEntry(resolver, command));
   std::deque<SharedHandle<AsyncNameResolverEntry> >::iterator itr =
-    std::find(nameResolverEntries_.begin(), nameResolverEntries_.end(), entry);
+    std::find_if(nameResolverEntries_.begin(), nameResolverEntries_.end(),
+                 derefEqual(entry));
   if(itr == nameResolverEntries_.end()) {
     return false;
   } else {

+ 1 - 1
src/SelectEventPoll.h

@@ -143,7 +143,7 @@ private:
 
     bool operator==(const AsyncNameResolverEntry& entry)
     {
-      return nameResolver_ == entry.nameResolver_ &&
+      return *nameResolver_ == *entry.nameResolver_ &&
         command_ == entry.command_;
     }
 

+ 10 - 5
src/ServerStatMan.cc

@@ -43,6 +43,7 @@
 #include "ServerStat.h"
 #include "util.h"
 #include "RecoverableException.h"
+#include "a2functional.h"
 
 namespace aria2 {
 
@@ -55,7 +56,8 @@ SharedHandle<ServerStat> ServerStatMan::find(const std::string& hostname,
 {
   SharedHandle<ServerStat> ss(new ServerStat(hostname, protocol));
   std::deque<SharedHandle<ServerStat> >::const_iterator i =
-    std::lower_bound(serverStats_.begin(), serverStats_.end(), ss);
+    std::lower_bound(serverStats_.begin(), serverStats_.end(), ss,
+                     DerefLess<SharedHandle<ServerStat> >());
   if(i != serverStats_.end() &&
      (*i)->getHostname() == hostname && (*i)->getProtocol() == protocol) {
     return *i;
@@ -67,9 +69,10 @@ SharedHandle<ServerStat> ServerStatMan::find(const std::string& hostname,
 bool ServerStatMan::add(const SharedHandle<ServerStat>& serverStat)
 {
   std::deque<SharedHandle<ServerStat> >::iterator i =
-    std::lower_bound(serverStats_.begin(), serverStats_.end(), serverStat);
+    std::lower_bound(serverStats_.begin(), serverStats_.end(), serverStat,
+                     DerefLess<SharedHandle<ServerStat> >());
 
-  if(i != serverStats_.end() && (*i) == serverStat) {
+  if(i != serverStats_.end() && *(*i) == *serverStat) {
     return false;
   } else {
     serverStats_.insert(i, serverStat);
@@ -79,8 +82,10 @@ bool ServerStatMan::add(const SharedHandle<ServerStat>& serverStat)
 
 bool ServerStatMan::save(std::ostream& out) const
 {
-  std::copy(serverStats_.begin(), serverStats_.end(),
-            std::ostream_iterator<SharedHandle<ServerStat> >(out, "\n"));
+  for(std::deque<SharedHandle<ServerStat> >::const_iterator i =
+        serverStats_.begin(), eoi = serverStats_.end(); i != eoi; ++i) {
+    out << *(*i) << "\n";
+  }
   out.flush();
   return !out.bad();
 }

+ 21 - 8
src/SharedHandle.h

@@ -35,6 +35,7 @@
 #ifndef D_SHARED_HANDLE_H
 #define D_SHARED_HANDLE_H
 
+#include <cassert>
 #include <iosfwd>
 
 namespace aria2 {
@@ -236,6 +237,11 @@ public:
 
   T* operator->() const { return obj_; }
 
+  T& operator*() const {
+    assert(obj_);
+    return *obj_;
+  }
+
   T* get() const {
     return obj_;
   }
@@ -273,25 +279,26 @@ static_pointer_cast(const SharedHandle<S>& t) {
   return SharedHandle<T>(t, static_cast<T*>(t.get()));
 }
 
+// Intentionally renamed obj_ as obj_x to cause error
 template<typename T>
 std::ostream& operator<<(std::ostream& o, const SharedHandle<T>& sp) {
-  o << *sp.obj_;
+  o << *sp.obj_x;
   return o;
 }
 
 template<typename T1, typename T2>
 bool operator==(const SharedHandle<T1>& t1, const SharedHandle<T2>& t2) {
-  return *t1.obj_ == *t2.obj_;
+  return *t1.obj_x == *t2.obj_;
 }
 
 template<typename T1, typename T2>
 bool operator!=(const SharedHandle<T1>& t1, const SharedHandle<T2>& t2) {
-  return *t1.obj_ != *t2.obj_;
+  return *t1.obj_x != *t2.obj_;
 }
 
 template<typename T1, typename T2>
 bool operator<(const SharedHandle<T1>& t1, const SharedHandle<T2>& t2) {
-  return *t1.obj_ < *t2.obj_;
+  return *t1.obj_x < *t2.obj_;
 }
 
 template<typename T>
@@ -357,6 +364,11 @@ public:
 
   T* operator->() const { return obj_; }
 
+  T& operator*() const {
+    assert(obj_);
+    return *obj_;
+  }
+
   T* get() const {
     if(isNull()) {
       return 0;
@@ -378,25 +390,26 @@ public:
   }
 };
 
+// Intentionally renamed obj_ as obj_x to cause error
 template<typename T>
 std::ostream& operator<<(std::ostream& o, const WeakHandle<T>& sp) {
-  o << *sp.obj_;
+  o << *sp.obj_x;
   return o;
 }
 
 template<typename T1, typename T2>
 bool operator==(const WeakHandle<T1>& t1, const WeakHandle<T2>& t2) {
-  return *t1.obj_ == *t2.obj_;
+  return *t1.obj_x == *t2.obj_;
 }
 
 template<typename T1, typename T2>
 bool operator!=(const WeakHandle<T1>& t1, const WeakHandle<T2>& t2) {
-  return *t1.obj_ != *t2.obj_;
+  return *t1.obj_x != *t2.obj_;
 }
 
 template<typename T1, typename T2>
 bool operator<(const WeakHandle<T1>& t1, const WeakHandle<T2>& t2) {
-  return *t1.obj_ < *t2.obj_;
+  return *t1.obj_x < *t2.obj_;
 }
 
 template<typename T, typename S>

+ 2 - 2
src/UnknownLengthPieceStorage.cc

@@ -167,7 +167,7 @@ SharedHandle<Piece> UnknownLengthPieceStorage::getPiece(size_t index)
 
 void UnknownLengthPieceStorage::completePiece(const SharedHandle<Piece>& piece)
 {
-  if(piece_ == piece) {
+  if(*piece_ == *piece) {
     downloadFinished_ = true;
     totalLength_ = piece_->getLength();
     diskAdaptor_->setTotalLength(totalLength_);
@@ -177,7 +177,7 @@ void UnknownLengthPieceStorage::completePiece(const SharedHandle<Piece>& piece)
 
 void UnknownLengthPieceStorage::cancelPiece(const SharedHandle<Piece>& piece)
 {
-  if(piece_ == piece) {
+  if(*piece_ == *piece) {
     piece_.reset();
   }
 }

+ 33 - 0
src/a2functional.h

@@ -431,6 +431,39 @@ bool in(T x, S s, S t)
   return s <= x && x <= t;
 }
 
+template<typename T>
+struct DerefLess {
+  bool operator()(const T& lhs, const T& rhs) const
+  {
+    return *lhs < *rhs;
+  }
+};
+
+template<typename T>
+struct DerefEqualTo {
+  bool operator()(const T& lhs, const T& rhs) const
+  {
+    return *lhs == *rhs;
+  }
+};
+
+template<typename T>
+struct DerefEqual {
+  T target;
+
+  DerefEqual(const T& t):target(t) {}
+  bool operator()(const T& other) const
+  {
+    return *target == *other;
+  }
+};
+
+template<typename T>
+struct DerefEqual<T> derefEqual(const T& t)
+{
+  return DerefEqual<T>(t);
+}
+
 } // namespace aria2
 
 #endif // D_A2_FUNCTIONAL_H

+ 1 - 1
src/option_processing.cc

@@ -174,7 +174,7 @@ void option_processing(Option& op, std::vector<std::string>& uris,
   } catch(OptionHandlerException& e) {
     std::cerr << e.stackTrace() << "\n"
               << "Usage:" << "\n"
-              << oparser.findByName(e.getOptionName())
+              << *oparser.findByName(e.getOptionName())
               << std::endl;
     exit(downloadresultcode::UNKNOWN_ERROR);
   } catch(Exception& e) {

+ 9 - 8
src/version_usage.cc

@@ -101,10 +101,10 @@ void showUsage(const std::string& keyword, const OptionParser& oparser) {
     }
     std::cout << "\n"
               << _("Options:") << "\n";
-
-    std::copy(handlers.begin(), handlers.end(),
-              std::ostream_iterator<SharedHandle<OptionHandler> >
-              (std::cout, "\n\n"));
+    for(std::vector<SharedHandle<OptionHandler> >::const_iterator i =
+          handlers.begin(), eoi = handlers.end(); i != eoi; ++i) {
+      std::cout << *(*i) << "\n\n";
+    }
   } else {    
     std::vector<SharedHandle<OptionHandler> > handlers =
       oparser.findByNameSubstring(keyword);
@@ -113,13 +113,14 @@ void showUsage(const std::string& keyword, const OptionParser& oparser) {
                                   " '%s'."), keyword.c_str())
                 << "\n"
                 << _("Options:") << "\n";
-      std::copy(handlers.begin(), handlers.end(),
-                std::ostream_iterator<SharedHandle<OptionHandler> >
-                (std::cout, "\n\n"));
+      for(std::vector<SharedHandle<OptionHandler> >::const_iterator i =
+            handlers.begin(), eoi = handlers.end(); i != eoi; ++i) {
+        std::cout << *(*i) << "\n\n";
+      }
     } else {
       std::cout << StringFormat(_("No option matching with '%s'."),
                                 keyword.c_str())
-                << "\n" << oparser.findByName("help") << "\n";
+                << "\n" << *oparser.findByName("help") << "\n";
     }
   }
 

+ 8 - 8
test/BNodeTest.cc

@@ -68,7 +68,7 @@ void BNodeTest::testFindBucketFor()
 
   {
     BNode b(bucket5);
-    CPPUNIT_ASSERT(bucket5 == BNode::findBucketFor(&b, localNodeID));
+    CPPUNIT_ASSERT(*bucket5 == *BNode::findBucketFor(&b, localNodeID));
   }
   {
     BNode b(bucket1);
@@ -97,7 +97,7 @@ void BNodeTest::testFindBucketFor()
     bp4->setLeft(bp3);
     bp4->setRight(b2);
 
-    CPPUNIT_ASSERT(bucket5 == BNode::findBucketFor(bp4, localNode->getID()));
+    CPPUNIT_ASSERT(*bucket5 == *BNode::findBucketFor(bp4, localNode->getID()));
 
     delete bp4;
   }
@@ -220,7 +220,7 @@ void BNodeTest::testEnumerateBucket()
     std::vector<SharedHandle<DHTBucket> > buckets;
     BNode::enumerateBucket(buckets, &b);
     CPPUNIT_ASSERT_EQUAL((size_t)1, buckets.size());
-    CPPUNIT_ASSERT(bucket1 == buckets[0]);
+    CPPUNIT_ASSERT(*bucket1 == *buckets[0]);
   }
   {
     BNode* b1 = new BNode(bucket1);
@@ -248,11 +248,11 @@ void BNodeTest::testEnumerateBucket()
     std::vector<SharedHandle<DHTBucket> > buckets;
     BNode::enumerateBucket(buckets, bp4);
     CPPUNIT_ASSERT_EQUAL((size_t)5, buckets.size());
-    CPPUNIT_ASSERT(bucket1 == buckets[0]);
-    CPPUNIT_ASSERT(bucket3 == buckets[1]);
-    CPPUNIT_ASSERT(bucket5 == buckets[2]);
-    CPPUNIT_ASSERT(bucket4 == buckets[3]);
-    CPPUNIT_ASSERT(bucket2 == buckets[4]);
+    CPPUNIT_ASSERT(*bucket1 == *buckets[0]);
+    CPPUNIT_ASSERT(*bucket3 == *buckets[1]);
+    CPPUNIT_ASSERT(*bucket5 == *buckets[2]);
+    CPPUNIT_ASSERT(*bucket4 == *buckets[3]);
+    CPPUNIT_ASSERT(*bucket2 == *buckets[4]);
 
     delete bp4;
   }

+ 2 - 2
test/DHTAnnouncePeerMessageTest.cc

@@ -111,8 +111,8 @@ void DHTAnnouncePeerMessageTest::testDoReceivedAction()
   SharedHandle<MockDHTResponseMessage> m
     (dynamic_pointer_cast<MockDHTResponseMessage>
      (dispatcher.messageQueue_[0].message_));
-  CPPUNIT_ASSERT(localNode == m->getLocalNode());
-  CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
+  CPPUNIT_ASSERT(*localNode == *m->getLocalNode());
+  CPPUNIT_ASSERT(*remoteNode == *m->getRemoteNode());
   CPPUNIT_ASSERT_EQUAL(std::string("announce_peer"), m->getMessageType());
   CPPUNIT_ASSERT_EQUAL(transactionID, m->getTransactionID());
   std::vector<SharedHandle<Peer> > peers;

+ 12 - 10
test/DHTBucketTest.cc

@@ -319,7 +319,7 @@ void DHTBucketTest::testAddNode()
   // nodes[0] is located at the tail of the bucket(least recent seen)
   nodes[0]->markBad();
   CPPUNIT_ASSERT(bucket.addNode(newNode));
-  CPPUNIT_ASSERT(bucket.getNodes().back() == newNode);
+  CPPUNIT_ASSERT(*bucket.getNodes().back() == *newNode);
 }
 
 void DHTBucketTest::testMoveToHead()
@@ -337,7 +337,7 @@ void DHTBucketTest::testMoveToHead()
     CPPUNIT_ASSERT(bucket.addNode(nodes[i]));
   }
   bucket.moveToHead(nodes[DHTBucket::K-1]);
-  CPPUNIT_ASSERT(bucket.getNodes().front() == nodes[DHTBucket::K-1]);
+  CPPUNIT_ASSERT(*bucket.getNodes().front() == *nodes[DHTBucket::K-1]);
 }
 
 void DHTBucketTest::testMoveToTail()
@@ -355,7 +355,7 @@ void DHTBucketTest::testMoveToTail()
     CPPUNIT_ASSERT(bucket.addNode(nodes[i]));
   }
   bucket.moveToTail(nodes[0]);
-  CPPUNIT_ASSERT(bucket.getNodes().back() == nodes[0]);
+  CPPUNIT_ASSERT(*bucket.getNodes().back() == *nodes[0]);
 }
 
 void DHTBucketTest::testGetGoodNodes()
@@ -400,12 +400,12 @@ void DHTBucketTest::testCacheNode()
   bucket.cacheNode(n1);
   bucket.cacheNode(n2);
   CPPUNIT_ASSERT_EQUAL((size_t)2, bucket.getCachedNodes().size());
-  CPPUNIT_ASSERT(n2 == bucket.getCachedNodes()[0]);
+  CPPUNIT_ASSERT(*n2 == *bucket.getCachedNodes()[0]);
 
   bucket.cacheNode(n3);
   CPPUNIT_ASSERT_EQUAL((size_t)2, bucket.getCachedNodes().size());
-  CPPUNIT_ASSERT(n3 == bucket.getCachedNodes()[0]);
-  CPPUNIT_ASSERT(n2 == bucket.getCachedNodes()[1]);
+  CPPUNIT_ASSERT(*n3 == *bucket.getCachedNodes()[0]);
+  CPPUNIT_ASSERT(*n2 == *bucket.getCachedNodes()[1]);
 }
 
 void DHTBucketTest::testDropNode()
@@ -432,7 +432,7 @@ void DHTBucketTest::testDropNode()
   {
     std::deque<SharedHandle<DHTNode> > tnodes = bucket.getNodes();
     CPPUNIT_ASSERT_EQUAL((size_t)8, tnodes.size());
-    CPPUNIT_ASSERT(nodes[3] == tnodes[3]);
+    CPPUNIT_ASSERT(*nodes[3] == *tnodes[3]);
   }
 
   bucket.cacheNode(cachedNode1);
@@ -442,11 +442,13 @@ void DHTBucketTest::testDropNode()
   {
     std::deque<SharedHandle<DHTNode> > tnodes = bucket.getNodes();
     CPPUNIT_ASSERT_EQUAL((size_t)8, tnodes.size());
-    CPPUNIT_ASSERT(tnodes.end() == std::find(tnodes.begin(), tnodes.end(), nodes[3]));
-    CPPUNIT_ASSERT(cachedNode2 == tnodes[7]);
+    CPPUNIT_ASSERT(tnodes.end() ==
+                   std::find_if(tnodes.begin(), tnodes.end(),
+                                derefEqual(nodes[3])));
+    CPPUNIT_ASSERT(*cachedNode2 == *tnodes[7]);
   }
   CPPUNIT_ASSERT_EQUAL((size_t)1, bucket.getCachedNodes().size());
-  CPPUNIT_ASSERT(cachedNode1 == bucket.getCachedNodes()[0]);
+  CPPUNIT_ASSERT(*cachedNode1 == *bucket.getCachedNodes()[0]);
 }
 
 } // namespace aria2

+ 2 - 2
test/DHTFindNodeMessageTest.cc

@@ -103,8 +103,8 @@ void DHTFindNodeMessageTest::testDoReceivedAction()
   SharedHandle<MockDHTResponseMessage> m
     (dynamic_pointer_cast<MockDHTResponseMessage>
      (dispatcher.messageQueue_[0].message_));
-  CPPUNIT_ASSERT(localNode == m->getLocalNode());
-  CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
+  CPPUNIT_ASSERT(*localNode == *m->getLocalNode());
+  CPPUNIT_ASSERT(*remoteNode == *m->getRemoteNode());
   CPPUNIT_ASSERT_EQUAL(std::string("find_node"), m->getMessageType());
   CPPUNIT_ASSERT_EQUAL(msg.getTransactionID(), m->getTransactionID());
   CPPUNIT_ASSERT_EQUAL((size_t)1, m->nodes_.size());

+ 5 - 5
test/DHTGetPeersMessageTest.cc

@@ -124,8 +124,8 @@ void DHTGetPeersMessageTest::testDoReceivedAction()
     SharedHandle<MockDHTResponseMessage> m
       (dynamic_pointer_cast<MockDHTResponseMessage>
        (dispatcher.messageQueue_[0].message_));
-    CPPUNIT_ASSERT(localNode == m->getLocalNode());
-    CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
+    CPPUNIT_ASSERT(*localNode == *m->getLocalNode());
+    CPPUNIT_ASSERT(*remoteNode == *m->getRemoteNode());
     CPPUNIT_ASSERT_EQUAL(std::string("get_peers"), m->getMessageType());
     CPPUNIT_ASSERT_EQUAL(msg.getTransactionID(), m->getTransactionID());
     CPPUNIT_ASSERT_EQUAL(tokenTracker.generateToken(infoHash, remoteNode->getIPAddress(), remoteNode->getPort()), m->token_);
@@ -161,13 +161,13 @@ void DHTGetPeersMessageTest::testDoReceivedAction()
     SharedHandle<MockDHTResponseMessage> m
       (dynamic_pointer_cast<MockDHTResponseMessage>
        (dispatcher.messageQueue_[0].message_));
-    CPPUNIT_ASSERT(localNode == m->getLocalNode());
-    CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
+    CPPUNIT_ASSERT(*localNode == *m->getLocalNode());
+    CPPUNIT_ASSERT(*remoteNode == *m->getRemoteNode());
     CPPUNIT_ASSERT_EQUAL(std::string("get_peers"), m->getMessageType());
     CPPUNIT_ASSERT_EQUAL(msg.getTransactionID(), m->getTransactionID());
     CPPUNIT_ASSERT_EQUAL(tokenTracker.generateToken(infoHash, remoteNode->getIPAddress(), remoteNode->getPort()), m->token_);
     CPPUNIT_ASSERT_EQUAL((size_t)1, m->nodes_.size());
-    CPPUNIT_ASSERT(returnNode1 == m->nodes_[0]);
+    CPPUNIT_ASSERT(*returnNode1 == *m->nodes_[0]);
     CPPUNIT_ASSERT_EQUAL((size_t)0, m->peers_.size());
   }
 }

+ 5 - 5
test/DHTIDCloserTest.cc

@@ -58,11 +58,11 @@ void DHTIDCloserTest::testOperator()
 
   std::sort(entries.begin(), entries.end(), DHTIDCloser(e3->node->getID()));
 
-  CPPUNIT_ASSERT(e3 == entries[0]);
-  CPPUNIT_ASSERT(e2 == entries[1]);
-  CPPUNIT_ASSERT(e4 == entries[2]);
-  CPPUNIT_ASSERT(e1 == entries[3]);
-  CPPUNIT_ASSERT(e5 == entries[4]);
+  CPPUNIT_ASSERT(*e3 == *entries[0]);
+  CPPUNIT_ASSERT(*e2 == *entries[1]);
+  CPPUNIT_ASSERT(*e4 == *entries[2]);
+  CPPUNIT_ASSERT(*e1 == *entries[3]);
+  CPPUNIT_ASSERT(*e5 == *entries[4]);
 }
 
 } // namespace aria2

+ 32 - 32
test/DHTMessageFactoryImplTest.cc

@@ -100,8 +100,8 @@ void DHTMessageFactoryImplTest::testCreatePingMessage()
   remoteNode->setIPAddress("192.168.0.1");
   remoteNode->setPort(6881);
 
-  CPPUNIT_ASSERT(localNode == m->getLocalNode());
-  CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
+  CPPUNIT_ASSERT(*localNode == *m->getLocalNode());
+  CPPUNIT_ASSERT(*remoteNode == *m->getRemoteNode());
   CPPUNIT_ASSERT_EQUAL(util::toHex(transactionID, DHT_TRANSACTION_ID_LENGTH),
                        util::toHex(m->getTransactionID()));
 }
@@ -125,8 +125,8 @@ void DHTMessageFactoryImplTest::testCreatePingReplyMessage()
                                      remoteNode->getIPAddress(),
                                      remoteNode->getPort())));
 
-  CPPUNIT_ASSERT(localNode == m->getLocalNode());
-  CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
+  CPPUNIT_ASSERT(*localNode == *m->getLocalNode());
+  CPPUNIT_ASSERT(*remoteNode == *m->getRemoteNode());
   CPPUNIT_ASSERT_EQUAL(util::toHex(transactionID, DHT_TRANSACTION_ID_LENGTH),
                        util::toHex(m->getTransactionID()));
 }
@@ -151,8 +151,8 @@ void DHTMessageFactoryImplTest::testCreateFindNodeMessage()
   remoteNode->setIPAddress("192.168.0.1");
   remoteNode->setPort(6881);
 
-  CPPUNIT_ASSERT(localNode == m->getLocalNode());
-  CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
+  CPPUNIT_ASSERT(*localNode == *m->getLocalNode());
+  CPPUNIT_ASSERT(*remoteNode == *m->getRemoteNode());
   CPPUNIT_ASSERT_EQUAL(util::toHex(transactionID, DHT_TRANSACTION_ID_LENGTH),
                        util::toHex(m->getTransactionID()));
   CPPUNIT_ASSERT_EQUAL(util::toHex(targetNodeID, DHT_ID_LENGTH),
@@ -196,11 +196,11 @@ void DHTMessageFactoryImplTest::testCreateFindNodeReplyMessage()
                                        remoteNode->getIPAddress(),
                                        remoteNode->getPort())));
 
-    CPPUNIT_ASSERT(localNode == m->getLocalNode());
-    CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
+    CPPUNIT_ASSERT(*localNode == *m->getLocalNode());
+    CPPUNIT_ASSERT(*remoteNode == *m->getRemoteNode());
     CPPUNIT_ASSERT_EQUAL((size_t)DHTBucket::K, m->getClosestKNodes().size());
-    CPPUNIT_ASSERT(nodes[0] == m->getClosestKNodes()[0]);
-    CPPUNIT_ASSERT(nodes[7] == m->getClosestKNodes()[7]);
+    CPPUNIT_ASSERT(*nodes[0] == *m->getClosestKNodes()[0]);
+    CPPUNIT_ASSERT(*nodes[7] == *m->getClosestKNodes()[7]);
     CPPUNIT_ASSERT_EQUAL(util::toHex(transactionID, DHT_TRANSACTION_ID_LENGTH),
                          util::toHex(m->getTransactionID()));
   } catch(Exception& e) {
@@ -249,11 +249,11 @@ void DHTMessageFactoryImplTest::testCreateFindNodeReplyMessage6()
                                        remoteNode->getIPAddress(),
                                        remoteNode->getPort())));
 
-    CPPUNIT_ASSERT(localNode == m->getLocalNode());
-    CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
+    CPPUNIT_ASSERT(*localNode == *m->getLocalNode());
+    CPPUNIT_ASSERT(*remoteNode == *m->getRemoteNode());
     CPPUNIT_ASSERT_EQUAL((size_t)DHTBucket::K, m->getClosestKNodes().size());
-    CPPUNIT_ASSERT(nodes[0] == m->getClosestKNodes()[0]);
-    CPPUNIT_ASSERT(nodes[7] == m->getClosestKNodes()[7]);
+    CPPUNIT_ASSERT(*nodes[0] == *m->getClosestKNodes()[0]);
+    CPPUNIT_ASSERT(*nodes[7] == *m->getClosestKNodes()[7]);
     CPPUNIT_ASSERT_EQUAL(util::toHex(transactionID, DHT_TRANSACTION_ID_LENGTH),
                          util::toHex(m->getTransactionID()));
   } catch(Exception& e) {
@@ -282,8 +282,8 @@ void DHTMessageFactoryImplTest::testCreateGetPeersMessage()
   remoteNode->setIPAddress("192.168.0.1");
   remoteNode->setPort(6881);
 
-  CPPUNIT_ASSERT(localNode == m->getLocalNode());
-  CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
+  CPPUNIT_ASSERT(*localNode == *m->getLocalNode());
+  CPPUNIT_ASSERT(*remoteNode == *m->getRemoteNode());
   CPPUNIT_ASSERT_EQUAL(util::toHex(transactionID, DHT_TRANSACTION_ID_LENGTH),
                        util::toHex(m->getTransactionID()));
   CPPUNIT_ASSERT_EQUAL(util::toHex(infoHash, DHT_ID_LENGTH),
@@ -343,15 +343,15 @@ void DHTMessageFactoryImplTest::testCreateGetPeersReplyMessage()
                                        remoteNode->getIPAddress(),
                                        remoteNode->getPort())));
 
-    CPPUNIT_ASSERT(localNode == m->getLocalNode());
-    CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
+    CPPUNIT_ASSERT(*localNode == *m->getLocalNode());
+    CPPUNIT_ASSERT(*remoteNode == *m->getRemoteNode());
     CPPUNIT_ASSERT_EQUAL(std::string("token"), m->getToken());
     CPPUNIT_ASSERT_EQUAL((size_t)DHTBucket::K, m->getClosestKNodes().size());
-    CPPUNIT_ASSERT(nodes[0] == m->getClosestKNodes()[0]);
-    CPPUNIT_ASSERT(nodes[7] == m->getClosestKNodes()[7]);
+    CPPUNIT_ASSERT(*nodes[0] == *m->getClosestKNodes()[0]);
+    CPPUNIT_ASSERT(*nodes[7] == *m->getClosestKNodes()[7]);
     CPPUNIT_ASSERT_EQUAL((size_t)4, m->getValues().size());
-    CPPUNIT_ASSERT(peers[0] == m->getValues()[0]);
-    CPPUNIT_ASSERT(peers[3] == m->getValues()[3]);
+    CPPUNIT_ASSERT(*peers[0] == *m->getValues()[0]);
+    CPPUNIT_ASSERT(*peers[3] == *m->getValues()[3]);
     CPPUNIT_ASSERT_EQUAL(util::toHex(transactionID, DHT_TRANSACTION_ID_LENGTH),
                          util::toHex(m->getTransactionID()));
   } catch(Exception& e) {
@@ -416,15 +416,15 @@ void DHTMessageFactoryImplTest::testCreateGetPeersReplyMessage6()
                                        remoteNode->getIPAddress(),
                                        remoteNode->getPort())));
 
-    CPPUNIT_ASSERT(localNode == m->getLocalNode());
-    CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
+    CPPUNIT_ASSERT(*localNode == *m->getLocalNode());
+    CPPUNIT_ASSERT(*remoteNode == *m->getRemoteNode());
     CPPUNIT_ASSERT_EQUAL(std::string("token"), m->getToken());
     CPPUNIT_ASSERT_EQUAL((size_t)DHTBucket::K, m->getClosestKNodes().size());
-    CPPUNIT_ASSERT(nodes[0] == m->getClosestKNodes()[0]);
-    CPPUNIT_ASSERT(nodes[7] == m->getClosestKNodes()[7]);
+    CPPUNIT_ASSERT(*nodes[0] == *m->getClosestKNodes()[0]);
+    CPPUNIT_ASSERT(*nodes[7] == *m->getClosestKNodes()[7]);
     CPPUNIT_ASSERT_EQUAL((size_t)4, m->getValues().size());
-    CPPUNIT_ASSERT(peers[0] == m->getValues()[0]);
-    CPPUNIT_ASSERT(peers[3] == m->getValues()[3]);
+    CPPUNIT_ASSERT(*peers[0] == *m->getValues()[0]);
+    CPPUNIT_ASSERT(*peers[3] == *m->getValues()[3]);
     CPPUNIT_ASSERT_EQUAL(util::toHex(transactionID, DHT_TRANSACTION_ID_LENGTH),
                          util::toHex(m->getTransactionID()));
   } catch(Exception& e) {
@@ -458,8 +458,8 @@ void DHTMessageFactoryImplTest::testCreateAnnouncePeerMessage()
     remoteNode->setIPAddress("192.168.0.1");
     remoteNode->setPort(6882);
 
-    CPPUNIT_ASSERT(localNode == m->getLocalNode());
-    CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
+    CPPUNIT_ASSERT(*localNode == *m->getLocalNode());
+    CPPUNIT_ASSERT(*remoteNode == *m->getRemoteNode());
     CPPUNIT_ASSERT_EQUAL(token, m->getToken());
     CPPUNIT_ASSERT_EQUAL(util::toHex(transactionID, DHT_TRANSACTION_ID_LENGTH),
                          util::toHex(m->getTransactionID()));
@@ -490,8 +490,8 @@ void DHTMessageFactoryImplTest::testCreateAnnouncePeerReplyMessage()
                                      remoteNode->getIPAddress(),
                                      remoteNode->getPort())));
 
-  CPPUNIT_ASSERT(localNode == m->getLocalNode());
-  CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
+  CPPUNIT_ASSERT(*localNode == *m->getLocalNode());
+  CPPUNIT_ASSERT(*remoteNode == *m->getRemoteNode());
   CPPUNIT_ASSERT_EQUAL(util::toHex(transactionID, DHT_TRANSACTION_ID_LENGTH),
                        util::toHex(m->getTransactionID()));
 }

+ 2 - 2
test/DHTPingMessageTest.cc

@@ -92,8 +92,8 @@ void DHTPingMessageTest::testDoReceivedAction()
   SharedHandle<MockDHTResponseMessage> m
     (dynamic_pointer_cast<MockDHTResponseMessage>
      (dispatcher.messageQueue_[0].message_));
-  CPPUNIT_ASSERT(localNode == m->getLocalNode());
-  CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
+  CPPUNIT_ASSERT(*localNode == *m->getLocalNode());
+  CPPUNIT_ASSERT(*remoteNode == *m->getRemoteNode());
   CPPUNIT_ASSERT_EQUAL(std::string("ping_reply"), m->getMessageType());
   CPPUNIT_ASSERT_EQUAL(msg.getTransactionID(), m->getTransactionID());
 }

+ 6 - 6
test/DefaultBtRequestFactoryTest.cc

@@ -210,16 +210,16 @@ void DefaultBtRequestFactoryTest::testRemoveTargetPiece() {
 
   requestFactory_->addTargetPiece(piece1);
 
-  CPPUNIT_ASSERT(std::find(requestFactory_->getTargetPieces().begin(),
-                           requestFactory_->getTargetPieces().end(),
-                           piece1) !=
+  CPPUNIT_ASSERT(std::find_if(requestFactory_->getTargetPieces().begin(),
+                              requestFactory_->getTargetPieces().end(),
+                              derefEqual(piece1)) !=
                  requestFactory_->getTargetPieces().end());
 
   requestFactory_->removeTargetPiece(piece1);
 
-  CPPUNIT_ASSERT(std::find(requestFactory_->getTargetPieces().begin(),
-                           requestFactory_->getTargetPieces().end(),
-                           piece1) ==
+  CPPUNIT_ASSERT(std::find_if(requestFactory_->getTargetPieces().begin(),
+                              requestFactory_->getTargetPieces().end(),
+                              derefEqual(piece1)) ==
                  requestFactory_->getTargetPieces().end());
 }
 

+ 6 - 4
test/DefaultPeerStorageTest.cc

@@ -121,7 +121,8 @@ void DefaultPeerStorageTest::testAddPeer() {
   CPPUNIT_ASSERT(ps.addPeer(peer4));
   // peer2 was deleted. While peer1 is oldest, its cuid is not 0.
   CPPUNIT_ASSERT_EQUAL((size_t)3, ps.countPeer());
-  CPPUNIT_ASSERT(std::find(ps.getPeers().begin(), ps.getPeers().end(), peer2) == ps.getPeers().end());
+  CPPUNIT_ASSERT(std::find_if(ps.getPeers().begin(), ps.getPeers().end(),
+                              derefEqual(peer2)) == ps.getPeers().end());
 
   SharedHandle<Peer> peer5(new Peer("192.168.0.4", 0));
 
@@ -224,13 +225,14 @@ void DefaultPeerStorageTest::testReturnPeer()
 
   ps.returnPeer(peer2); // peer2 removed from the container
   CPPUNIT_ASSERT_EQUAL((size_t)2, ps.getPeers().size());
-  CPPUNIT_ASSERT(std::find(ps.getPeers().begin(), ps.getPeers().end(), peer2)
-                 == ps.getPeers().end());
+  CPPUNIT_ASSERT(std::find_if(ps.getPeers().begin(), ps.getPeers().end(),
+                              derefEqual(peer2)) == ps.getPeers().end());
   CPPUNIT_ASSERT_EQUAL((size_t)1, ps.getDroppedPeers().size());
 
   ps.returnPeer(peer1); // peer1 is removed from the container
   CPPUNIT_ASSERT_EQUAL((size_t)1, ps.getPeers().size());
-  CPPUNIT_ASSERT(std::find(ps.getPeers().begin(), ps.getPeers().end(), peer1) == ps.getPeers().end());
+  CPPUNIT_ASSERT(std::find_if(ps.getPeers().begin(), ps.getPeers().end(),
+                              derefEqual(peer1)) == ps.getPeers().end());
   CPPUNIT_ASSERT_EQUAL((size_t)1, ps.getDroppedPeers().size());
 }
 

+ 2 - 2
test/SequentialPickerTest.cc

@@ -35,7 +35,7 @@ void SequentialPickerTest::testPick()
   picker.pickNext();
 
   CPPUNIT_ASSERT(picker.isPicked());
-  CPPUNIT_ASSERT_EQUAL(Integer(new int(1)), picker.getPickedEntry());
+  CPPUNIT_ASSERT_EQUAL(*Integer(new int(1)), *picker.getPickedEntry());
 
   picker.dropPickedEntry();
 
@@ -44,7 +44,7 @@ void SequentialPickerTest::testPick()
 
   picker.pickNext();
 
-  CPPUNIT_ASSERT_EQUAL(Integer(new int(2)), picker.getPickedEntry());
+  CPPUNIT_ASSERT_EQUAL(*Integer(new int(2)), *picker.getPickedEntry());
   CPPUNIT_ASSERT(!picker.hasNext());
 }
 

+ 1 - 1
test/SingletonHolderTest.cc

@@ -51,7 +51,7 @@ void SingletonHolderTest::testInstance()
 
   IntHandle i(new int(100));
   SingletonHolder<IntHandle>::instance(i);
-  std::cerr << SingletonHolder<IntHandle>::instance() << std::endl;
+  std::cerr << *SingletonHolder<IntHandle>::instance() << std::endl;
 
   std::cerr << SingletonHolder<MHandle>::instance()->greeting() << std::endl;