// Copyright (c) 2009 The Chromium 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 COURGETTE_REGION_H_
#define COURGETTE_REGION_H_

#include <stddef.h>
#include <stdint.h>

#include <string>


namespace courgette {

// A Region is a descriptor for a region of memory.  It has a start address and
// a length measured in bytes.  The Region object does not own the memory.
//
class Region {
 public:
  // Default constructor: and empty region.
  Region() : start_(NULL), length_(0) {}

  // Usual constructor for regions given a |start| address and |length|.
  Region(const void* start, size_t length)
      : start_(static_cast<const uint8_t*>(start)), length_(length) {}

  // String constructor.  Region is owned by the string, so the string should
  // have a lifetime greater than the region.
  explicit Region(const std::string& string)
      : start_(reinterpret_cast<const uint8_t*>(string.c_str())),
        length_(string.length()) {}

  // Copy constructor.
  Region(const Region& other) : start_(other.start_), length_(other.length_) {}

  // Assignment 'operator' makes |this| region the same as |other|.
  Region& assign(const Region& other) {
    this->start_ = other.start_;
    this->length_ = other.length_;
    return *this;
  }

  // Returns the starting address of the region.
  const uint8_t* start() const { return start_; }

  // Returns the length of the region.
  size_t length() const { return length_; }

  // Returns the address after the last byte of the region.
  const uint8_t* end() const { return start_ + length_; }

 private:
  const uint8_t* start_;
  size_t length_;

  void operator=(const Region&);  // Disallow assignment operator.
};

}  // namespace
#endif  // COURGETTE_REGION_H_
