diff options
Diffstat (limited to 'src/processor/range_map.h')
-rw-r--r-- | src/processor/range_map.h | 71 |
1 files changed, 2 insertions, 69 deletions
diff --git a/src/processor/range_map.h b/src/processor/range_map.h index 1395c924..06015c98 100644 --- a/src/processor/range_map.h +++ b/src/processor/range_map.h @@ -72,81 +72,14 @@ class RangeMap { // Convenience types. typedef std::map<AddressType, Range> AddressToRangeMap; - typedef typename AddressToRangeMap::const_iterator const_iterator; - typedef typename AddressToRangeMap::value_type value_type; + typedef typename AddressToRangeMap::const_iterator MapConstIterator; + typedef typename AddressToRangeMap::value_type MapValue; // Maps the high address of each range to a EntryType. AddressToRangeMap map_; }; -template<typename AddressType, typename EntryType> -bool RangeMap<AddressType, EntryType>::StoreRange(const AddressType &base, - const AddressType &size, - const EntryType &entry) { - AddressType high = base + size - 1; - - // Check for undersize or overflow. - if (size <= 0 || high < base) - return false; - - // Ensure that this range does not overlap with another one already in the - // map. - const_iterator iterator_base = map_.lower_bound(base); - const_iterator iterator_high = map_.lower_bound(high); - - if (iterator_base != iterator_high) { - // Some other range begins in the space used by this range. It may be - // contained within the space used by this range, or it may extend lower. - // Regardless, it is an error. - return false; - } - - if (iterator_high != map_.end()) { - if (iterator_high->second.base() <= high) { - // The range above this one overlaps with this one. It may fully - // contain this range, or it may begin within this range and extend - // higher. Regardless, it's an error. - return false; - } - } - - // Store the range in the map by its high address, so that lower_bound can - // be used to quickly locate a range by address. - map_.insert(value_type(high, Range(base, entry))); - return true; -} - - -template<typename AddressType, typename EntryType> -bool RangeMap<AddressType, EntryType>::RetrieveRange( - const AddressType &address, EntryType *entry) const { - if (!entry) - return false; - - const_iterator iterator = map_.lower_bound(address); - if (iterator == map_.end()) - return false; - - // The map is keyed by the high address of each range, so |address| is - // guaranteed to be lower than the range's high address. If |range| is - // not directly preceded by another range, it's possible for address to - // be below the range's low address, though. When that happens, address - // references something not within any range, so return false. - if (address < iterator->second.base()) - return false; - - *entry = iterator->second.entry(); - return true; -} - - -template<typename AddressType, typename EntryType> -void RangeMap<AddressType, EntryType>::Clear() { - map_.clear(); -} - - } // namespace google_airbag |