diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2012-03-23 01:34:37 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2012-03-23 01:34:37 +0900 |
| commit | eed804baaa02b4f81a27ba2844868b19992a90a1 (patch) | |
| tree | f6c5741443a979593fe080422ac78ef1b0f699d2 /src/DNSCache.cc | |
| parent | 4acc0f88317287b86c6b89ba5e5262d3ebd30cc9 (diff) | |
Use std::set instead of std::deque if the elements are sorted and
insertions and deletions are frequent.
Diffstat (limited to 'src/DNSCache.cc')
| -rw-r--r-- | src/DNSCache.cc | 53 |
1 files changed, 26 insertions, 27 deletions
diff --git a/src/DNSCache.cc b/src/DNSCache.cc index 4faa9f16..5ffdb831 100644 --- a/src/DNSCache.cc +++ b/src/DNSCache.cc @@ -76,9 +76,16 @@ DNSCache::CacheEntry& DNSCache::CacheEntry::operator=(const CacheEntry& c) return *this; } -void DNSCache::CacheEntry::add(const std::string& addr) +bool DNSCache::CacheEntry::add(const std::string& addr) { + for(std::vector<AddrEntry>::const_iterator i = addrEntries_.begin(), + eoi = addrEntries_.end(); i != eoi; ++i) { + if((*i).addr_ == addr) { + return false; + } + } addrEntries_.push_back(AddrEntry(addr)); + return true; } std::vector<DNSCache::AddrEntry>::iterator DNSCache::CacheEntry::find @@ -160,50 +167,42 @@ DNSCache& DNSCache::operator=(const DNSCache& c) const std::string& DNSCache::find (const std::string& hostname, uint16_t port) const { - CacheEntry target(hostname, port); - std::deque<CacheEntry>::const_iterator i = - std::lower_bound(entries_.begin(), entries_.end(), target); - if(i != entries_.end() && (*i) == target) { - return (*i).getGoodAddr(); + SharedHandle<CacheEntry> target(new CacheEntry(hostname, port)); + CacheEntrySet::iterator i = entries_.find(target); + if(i == entries_.end()) { + return A2STR::NIL; + } else { + return (*i)->getGoodAddr(); } - return A2STR::NIL; } void DNSCache::put (const std::string& hostname, const std::string& ipaddr, uint16_t port) { - CacheEntry target(hostname, port); - std::deque<CacheEntry>::iterator i = - std::lower_bound(entries_.begin(), entries_.end(), target); - if(i == entries_.end() || !((*i) == target)) { - target.add(ipaddr); - entries_.insert(i, target); + SharedHandle<CacheEntry> target(new CacheEntry(hostname, port)); + CacheEntrySet::iterator i = entries_.lower_bound(target); + if(i != entries_.end() && *(*i) == *target) { + (*i)->add(ipaddr); } else { - if(!(*i).contains(ipaddr)) { - (*i).add(ipaddr); - } + target->add(ipaddr); + entries_.insert(i, target); } } void DNSCache::markBad (const std::string& hostname, const std::string& ipaddr, uint16_t port) { - CacheEntry target(hostname, port); - std::deque<CacheEntry>::iterator i = - std::lower_bound(entries_.begin(), entries_.end(), target); - if(i != entries_.end() && (*i) == target) { - (*i).markBad(ipaddr); + SharedHandle<CacheEntry> target(new CacheEntry(hostname, port)); + CacheEntrySet::iterator i = entries_.find(target); + if(i != entries_.end()) { + (*i)->markBad(ipaddr); } } void DNSCache::remove(const std::string& hostname, uint16_t port) { - CacheEntry target(hostname, port); - std::deque<CacheEntry>::iterator i = - std::lower_bound(entries_.begin(), entries_.end(), target); - if(i != entries_.end() && (*i) == target) { - entries_.erase(i); - } + SharedHandle<CacheEntry> target(new CacheEntry(hostname, port)); + entries_.erase(target); } } // namespace aria2 |
