// Copyright 2011 Google Inc. All Rights Reserved.

#ifndef ART_SRC_SPACE_H_
#define ART_SRC_SPACE_H_

#include "globals.h"
#include "macros.h"
#include "mem_map.h"
#include "scoped_ptr.h"

namespace art {

class Object;

// A space contains memory allocated for managed objects.
class Space {
 public:
  // create a Space with the requested sizes requesting a specific base address.
  static Space* Create(size_t initial_size, size_t maximum_size, byte* requested_base);

  // create a Space from an image file. cannot be used for future allocation or collected.
  static Space* Create(const char* image);

  ~Space();

  Object* AllocWithGrowth(size_t num_bytes);

  Object* AllocWithoutGrowth(size_t num_bytes);

  size_t Free(void* ptr);

  void Trim();

  size_t MaxAllowedFootprint();

  void Grow(size_t num_bytes);

  byte* GetBase() const {
    return base_;
  }

  byte* GetLimit() const {
    return limit_;
  }

  size_t Size() const {
    return limit_ - base_;
  }

  size_t AllocationSize(const Object* obj);

  bool IsCondemned() const {
    return true;  // TODO
  }

 private:
  // The boundary tag overhead.
  static const size_t kChunkOverhead = kWordSize;

  // create a Space from an existing memory mapping, taking ownership of the address space.
  static Space* Create(MemMap* mem_map);

  Space() : mspace_(NULL), maximum_size_(0), base_(0), limit_(0) {}

  // Initializes the space and underlying storage.
  bool Init(size_t initial_size, size_t maximum_size, byte* requested_base);

  // Initializes the space from existing storage, taking ownership of the storage.
  void Init(MemMap* map);

  // Initializes the space from an image file
  bool Init(const char* image_file_name);

  void* CreateMallocSpace(void* base, size_t initial_size, size_t maximum_size);

  static void DontNeed(void* start, void* end, void* num_bytes);

  // TODO: have a Space subclass for methods that depend on mspace_ and maximum_size_
  void* mspace_;
  size_t maximum_size_;

  scoped_ptr<MemMap> mem_map_;

  byte* base_;

  byte* limit_;

  // bool is_condemned_;  // TODO: with IsCondemned

  DISALLOW_COPY_AND_ASSIGN(Space);
};

}  // namespace art

#endif  // ART_SRC_SPACE_H_
