/*
 * Aleph Toolkit
 *
 * Copyright 1997, Brown University, Providence, RI.
 * 
 *                         All Rights Reserved
 * 
 * Permission to use, copy, modify, and distribute this software and its
 * documentation for any purpose other than its incorporation into a
 * commercial product is hereby granted without fee, provided that the
 * above copyright notice appear in all copies and that both that
 * copyright notice and this permission notice appear in supporting
 * documentation, and that the name of Brown University not be used in
 * advertising or publicity pertaining to distribution of the software
 * without specific, written prior permission.
 * 
 * BROWN UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ANY
 * PARTICULAR PURPOSE.  IN NO EVENT SHALL BROWN UNIVERSITY BE LIABLE FOR
 * ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

/**
 * Globally unique identifiers.
 *
 * @author  Maurice Herlihy
 * @date    May 1997
 **/

package aleph;

import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;

public final class UniqueID implements java.io.Externalizable {

  static long uniqueId = 0;

  private long key;
  private PE   home;

  public UniqueID() {
    key  = uniqueId ++;
    home = PE.thisPE();
  }
  
  public int hashCode() {
    return (int) ((home.hashCode() << 20) | key);
  }

  public PE getHome() {
    return home;
  }

  /**
   * @see java.io.Externalizable
   **/
  public void writeExternal(ObjectOutput out) throws IOException {
    out.writeLong(key);
    out.writeObject(home);
  }

  /**
   * @see java.io.Externalizable
   **/
  public void readExternal(ObjectInput in)
    throws IOException, java.lang.ClassNotFoundException {
    key  = in.readLong();
    home = (PE) in.readObject();
  }

  public boolean equals(Object anObject) {
    if ((anObject != null) && (anObject instanceof UniqueID)) {
      UniqueID other = (UniqueID) anObject;
      return (other.key == this.key) && (other.home.equals(this.home));
    } else {
      return false;
    }
  }

  public String toString() {
    return "[" + home + "." + key + "]";
  }

}

