/*
 *  This file is part of the Jikes RVM project (http://jikesrvm.org).
 *
 *  This file is licensed to You under the Eclipse Public License (EPL);
 *  You may not use this file except in compliance with the License. You
 *  may obtain a copy of the License at
 *
 *      http://www.opensource.org/licenses/eclipse-1.0.php
 *
 *  See the COPYRIGHT.txt file distributed with this work for information
 *  regarding copyright ownership.
 */
package org.mmtk.utility.deque;

import org.mmtk.utility.Constants;

import org.mmtk.vm.VM;

import org.vmmagic.unboxed.*;
import org.vmmagic.pragma.*;

/**
 * This supports <i>unsynchronized</i> pushing and popping of object
 * references.  In addition, this can sort the entries currently on
 * the shared stack.
 */
@Uninterruptible public class SortTODObjectReferenceStack extends LocalDeque
  implements Constants {

  /****************************************************************************
   *
   * Public instance methods
   */

  /**
   * Constructor
   *
   * @param queue The shared stack to which this stack will append
   * its buffers (when full or flushed) and from which it will aquire new
   * buffers when it has exhausted its own.
   */
  public SortTODObjectReferenceStack(SortTODSharedDeque queue) {
    super(queue);
  }

  /**
   * Sort the address on the shared stack.
   */
  public final void sort() {
    flushLocal();
    ((SortTODSharedDeque) queue).sort();
  }

  /**
   * Push an address onto the address stack.
   *
   * @param object the object to be pushed onto the object queue
   */
  @Inline
  public final void push(ObjectReference object) {
    Address addr = object.toAddress();
    if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(!addr.isZero());
    checkHeadInsert(1);
    uncheckedHeadInsert(addr);
  }

  /**
   * Pop an address from the address stack, return zero if the stack
   * is empty.
   *
   * @return The next address in the address stack, or zero if the
   * stack is empty
   */
  @Inline
  public final ObjectReference pop() {
    if (checkDequeue(1)) {
      return uncheckedDequeue().toObjectReference();
    } else {
      return ObjectReference.nullReference();
    }
  }

  /**
   * Check if the (local and shared) stacks are empty.
   *
   * @return True if there are no more entries on the local & shared stack,
   *         false otherwise.
   */
  @Inline
  public final boolean isEmpty() {
    return !checkDequeue(1);
  }
}
