// Copyright 2011 Google Inc. All Rights Reserved.

#ifndef ART_SRC_MARK_STACK_H_
#define ART_SRC_MARK_STACK_H_

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

namespace art {

class Object;

class MarkStack {
 public:
  static MarkStack* Create();

  ~MarkStack();

  void Push(const Object* obj) {
    DCHECK(obj != NULL);
    DCHECK_NE(ptr_, limit_);
    *ptr_ = obj;
    ++ptr_;
  }

  const Object* Pop() {
    DCHECK_NE(ptr_, base_);
    --ptr_;
    DCHECK(*ptr_ != NULL);
    return *ptr_;
  }

  bool IsEmpty() const {
    return ptr_ == base_;
  }

 private:
  MarkStack() :
      base_(NULL), limit_(NULL), ptr_(NULL) {
  }

  bool Init();

  // Memory mapping of the mark stack.
  scoped_ptr<MemMap> mem_map_;

  // Base of the mark stack.
  const Object* const* base_;

  // Exclusive limit of the mark stack.
  const Object* const* limit_;

  // Pointer to the top of the mark stack.
  Object const**  ptr_;

  DISALLOW_COPY_AND_ASSIGN(MarkStack);
};

}  // namespace art

#endif  // ART_SRC_MARK_STACK_H_
