address-region.h 1.8 KB
Newer Older
1 2 3 4 5 6 7
// Copyright 2018 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef V8_BASE_ADDRESS_REGION_H_
#define V8_BASE_ADDRESS_REGION_H_

8
#include <iostream>
9 10 11 12 13 14

#include "src/base/macros.h"

namespace v8 {
namespace base {

15
// Helper class representing an address region of certain size.
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
class AddressRegion {
 public:
  typedef uintptr_t Address;

  AddressRegion() = default;

  AddressRegion(Address address, size_t size)
      : address_(address), size_(size) {}

  Address begin() const { return address_; }
  Address end() const { return address_ + size_; }

  size_t size() const { return size_; }
  void set_size(size_t size) { size_ = size; }

  bool is_empty() const { return size_ == 0; }

  bool contains(Address address) const {
    STATIC_ASSERT(std::is_unsigned<Address>::value);
    return (address - begin()) < size();
  }

  bool contains(Address address, size_t size) const {
    STATIC_ASSERT(std::is_unsigned<Address>::value);
    Address offset = address - begin();
41
    return (offset < size_) && (offset + size <= size_);
42 43
  }

44
  bool contains(AddressRegion region) const {
45 46 47
    return contains(region.address_, region.size_);
  }

48 49 50 51 52 53 54 55
  bool operator==(AddressRegion other) const {
    return address_ == other.address_ && size_ == other.size_;
  }

  bool operator!=(AddressRegion other) const {
    return address_ != other.address_ || size_ != other.size_;
  }

56 57 58 59
 private:
  Address address_ = 0;
  size_t size_ = 0;
};
60 61 62 63 64 65
ASSERT_TRIVIALLY_COPYABLE(AddressRegion);

inline std::ostream& operator<<(std::ostream& out, AddressRegion region) {
  return out << "[" << reinterpret_cast<void*>(region.begin()) << "+"
             << region.size() << "]";
}
66 67 68 69 70

}  // namespace base
}  // namespace v8

#endif  // V8_BASE_ADDRESS_REGION_H_