blob: 551c3d58eabf4a279d18bcbf79bff398f4d1157a [file] [log] [blame]
/* -*- Mode: C++; tab-width: 8; c-basic-offset: 2; indent-tabs-mode: nil; -*- */
#ifndef RR_MEMORY_RANGE_H_
#define RR_MEMORY_RANGE_H_
#include "core.h"
#include "log.h"
#include "remote_ptr.h"
namespace rr {
/**
* Range of memory addresses that can be used as a std::map key.
*/
class MemoryRange {
public:
MemoryRange() {}
MemoryRange(remote_ptr<void> addr, size_t num_bytes)
: start_(addr), end_(addr + num_bytes) {
DEBUG_ASSERT(start_ <= end_);
}
MemoryRange(remote_ptr<void> addr, remote_ptr<void> end)
: start_(addr), end_(end) {
DEBUG_ASSERT(start_ <= end);
}
MemoryRange(const MemoryRange&) = default;
MemoryRange& operator=(const MemoryRange&) = default;
bool operator==(const MemoryRange& o) const {
return start_ == o.start_ && end_ == o.end_;
}
bool operator<(const MemoryRange& o) const {
return start_ != o.start_ ? start_ < o.start_ : end_ < o.end_;
}
/**
* Return true iff |o| is an address range fully contained by
* this.
*/
bool contains(const MemoryRange& o) const {
return start_ <= o.start_ && o.end_ <= end_;
}
bool contains(remote_ptr<void> p) const { return start_ <= p && p < end_; }
bool intersects(const MemoryRange& other) const {
remote_ptr<void> s = std::max(start_, other.start_);
remote_ptr<void> e = std::min(end_, other.end_);
return s < e;
}
MemoryRange intersect(const MemoryRange& other) const {
remote_ptr<void> s = std::max(start_, other.start_);
remote_ptr<void> e = std::min(end_, other.end_);
return MemoryRange(s, std::max(s, e));
}
remote_ptr<void> start() const { return start_; }
remote_ptr<void> end() const { return end_; }
size_t size() const { return end_ - start_; }
static MemoryRange all() {
return MemoryRange(remote_ptr<void>(), remote_ptr<void>(UINTPTR_MAX));
}
// XXX DO NOT USE
void update_start(remote_ptr<void> s) const {
const_cast<MemoryRange*>(this)->start_ = s;
}
private:
remote_ptr<void> start_;
remote_ptr<void> end_;
};
inline std::ostream& operator<<(std::ostream& o, const MemoryRange& m) {
o << m.start() << "-" << m.end();
return o;
}
} // namespace rr
#endif /* RR_MEMORY_RANGE_H_ */