package java.lang;

import ej.annotation.Nullable;

/**
 * Class {@code Object} is the root of the class hierarchy. Every class has {@code Object} as a
 * superclass. All objects, including arrays, implement the methods of this class.
 *
 * @see java.lang.Class
 */
public class Object {

	/**
	 * Creates a new Object.
	 */
	public Object() {
		throw new RuntimeException();
	}

	/**
	 * Creates and returns a copy of this object. The precise meaning of "copy" may depend on the class
	 * of the object. The general intent is that, for any object {@code x}, the expression: <blockquote>
	 *
	 * <pre>
	 * x.clone() != x
	 * </pre>
	 *
	 * </blockquote> will be true, and that the expression: <blockquote>
	 *
	 * <pre>
	 * x.clone().getClass() == x.getClass()
	 * </pre>
	 *
	 * </blockquote> will be {@code true}, but these are not absolute requirements. While it is
	 * typically the case that: <blockquote>
	 *
	 * <pre>
	 * x.clone().equals(x)
	 * </pre>
	 *
	 * </blockquote> will be {@code true}, this is not an absolute requirement.
	 * <p>
	 * By convention, the returned object should be obtained by calling {@code super.clone}. If a class
	 * and all of its superclasses (except {@code Object}) obey this convention, it will be the case
	 * that {@code x.clone().getClass() == x.getClass()}.
	 * <p>
	 * By convention, the object returned by this method should be independent of this object (which is
	 * being cloned). To achieve this independence, it may be necessary to modify one or more fields of
	 * the object returned by {@code super.clone} before returning it. Typically, this means copying any
	 * mutable objects that comprise the internal "deep structure" of the object being cloned and
	 * replacing the references to these objects with references to the copies. If a class contains only
	 * primitive fields or references to immutable objects, then it is usually the case that no fields
	 * in the object returned by {@code super.clone} need to be modified.
	 * <p>
	 * The method {@code clone} for class {@code Object} performs a specific cloning operation. First,
	 * if the class of this object does not implement the interface {@code Cloneable}, then a
	 * {@code CloneNotSupportedException} is thrown. Note that all arrays are considered to implement
	 * the interface {@code Cloneable} and that the return type of the {@code clone} method of an array
	 * type {@code T[]} is {@code T[]} where T is any reference or primitive type. Otherwise, this
	 * method creates a new instance of the class of this object and initializes all its fields with
	 * exactly the contents of the corresponding fields of this object, as if by assignment; the
	 * contents of the fields are not themselves cloned. Thus, this method performs a "shallow copy" of
	 * this object, not a "deep copy" operation.
	 * <p>
	 * The class {@code Object} does not itself implement the interface {@code Cloneable}, so calling
	 * the {@code clone} method on an object whose class is {@code Object} will result in throwing an
	 * exception at run time.
	 *
	 * @return a clone of this instance.
	 * @exception CloneNotSupportedException
	 *            if the object's class does not support the {@code Cloneable} interface. Subclasses
	 *            that override the {@code clone} method can also throw this exception to indicate that
	 *            an instance cannot be cloned.
	 * @see java.lang.Cloneable
	 */
	protected Object clone() throws CloneNotSupportedException {
		throw new RuntimeException();
	}

	/**
	 * Indicates whether some other object is "equal to" this one.
	 * <p>
	 * The {@code equals} method implements an equivalence relation on non-null object references:
	 * <ul>
	 * <li>It is <i>reflexive</i>: for any non-null reference value {@code x}, {@code x.equals(x)}
	 * should return {@code true}.
	 * <li>It is <i>symmetric</i>: for any non-null reference values {@code x} and {@code y},
	 * {@code x.equals(y)} should return {@code true} if and only if {@code y.equals(x)} returns
	 * {@code true}.
	 * <li>It is <i>transitive</i>: for any non-null reference values {@code x}, {@code y}, and
	 * {@code z}, if {@code x.equals(y)} returns {@code true} and {@code y.equals(z)} returns
	 * {@code true}, then {@code x.equals(z)} should return {@code true}.
	 * <li>It is <i>consistent</i>: for any non-null reference values {@code x} and {@code y}, multiple
	 * invocations of {@code x.equals(y)} consistently return {@code true} or consistently return
	 * {@code false}, provided no information used in {@code equals} comparisons on the objects is
	 * modified.
	 * <li>For any non-null reference value {@code x}, {@code x.equals(null)} should return
	 * {@code false}.
	 * </ul>
	 * <p>
	 * The {@code equals} method for class {@code Object} implements the most discriminating possible
	 * equivalence relation on objects; that is, for any non-null reference values {@code x} and
	 * {@code y}, this method returns {@code true} if and only if {@code x} and {@code y} refer to the
	 * same object ({@code x == y} has the value {@code true}).
	 * <p>
	 * Note that it is generally necessary to override the {@code hashCode} method whenever this method
	 * is overridden, so as to maintain the general contract for the {@code hashCode} method, which
	 * states that equal objects must have equal hash codes.
	 *
	 * @param obj
	 *        the reference object with which to compare.
	 * @return {@code true} if this object is the same as the obj argument; {@code false} otherwise.
	 * @see #hashCode()
	 * @see java.util.HashMap
	 */
	public boolean equals(@Nullable Object obj) {
		throw new RuntimeException();
	}

	/**
	 * Returns the runtime class of this {@code Object}. The returned {@code Class} object is the object
	 * that is locked by {@code static synchronized} methods of the represented class.
	 *
	 * <p>
	 * <b>The actual result type is {@code Class<? extends |X|>} where {@code |X|} is the erasure of the
	 * static type of the expression on which {@code getClass} is called.</b> For example, no cast is
	 * required in this code fragment:
	 * </p>
	 *
	 * <p>
	 * {@code Number n = 0;                             }<br>
	 * {@code Class<? extends Number> c = n.getClass(); }
	 * </p>
	 *
	 * @return The {@code Class} object that represents the runtime class of this object.
	 * @see Class Literals, section 15.8.2 of <cite>The Java&trade; Language Specification</cite>.
	 */
	public final Class<?> getClass() {
		throw new RuntimeException();
	}

	/**
	 * Returns a hash code value for the object. This method is supported for the benefit of hash tables
	 * such as those provided by {@link java.util.HashMap}.
	 * <p>
	 * The general contract of {@code hashCode} is:
	 * <ul>
	 * <li>Whenever it is invoked on the same object more than once during an execution of a Java
	 * application, the {@code hashCode} method must consistently return the same integer, provided no
	 * information used in {@code equals} comparisons on the object is modified. This integer need not
	 * remain consistent from one execution of an application to another execution of the same
	 * application.
	 * <li>If two objects are equal according to the {@code equals(Object)} method, then calling the
	 * {@code hashCode} method on each of the two objects must produce the same integer result.
	 * <li>It is <em>not</em> required that if two objects are unequal according to the
	 * {@link java.lang.Object#equals(java.lang.Object)} method, then calling the {@code hashCode}
	 * method on each of the two objects must produce distinct integer results. However, the programmer
	 * should be aware that producing distinct integer results for unequal objects may improve the
	 * performance of hash tables.
	 * </ul>
	 * <p>
	 * As much as is reasonably practical, the hashCode method defined by class {@code Object} does
	 * return distinct integers for distinct objects. (This is typically implemented by converting the
	 * internal address of the object into an integer, but this implementation technique is not required
	 * by the Java<sup>TM</sup> programming language.)
	 *
	 * @return a hash code value for this object.
	 * @see java.lang.Object#equals(java.lang.Object)
	 * @see java.lang.System#identityHashCode
	 */
	public int hashCode() {
		throw new RuntimeException();
	}

	/**
	 * Wakes up a single thread that is waiting on this object's monitor. If any threads are waiting on
	 * this object, one of them is chosen to be awakened. The choice is arbitrary and occurs at the
	 * discretion of the implementation. A thread waits on an object's monitor by calling one of the
	 * {@code wait} methods.
	 * <p>
	 * The awakened thread will not be able to proceed until the current thread relinquishes the lock on
	 * this object. The awakened thread will compete in the usual manner with any other threads that
	 * might be actively competing to synchronize on this object; for example, the awakened thread
	 * enjoys no reliable privilege or disadvantage in being the next thread to lock this object.
	 * <p>
	 * This method should only be called by a thread that is the owner of this object's monitor. A
	 * thread becomes the owner of the object's monitor in one of three ways:
	 * <ul>
	 * <li>By executing a synchronized instance method of that object.
	 * <li>By executing the body of a {@code synchronized} statement that synchronizes on the object.
	 * <li>For objects of type {@code Class,} by executing a synchronized static method of that class.
	 * </ul>
	 * <p>
	 * Only one thread at a time can own an object's monitor.
	 *
	 * @exception IllegalMonitorStateException
	 *            if the current thread is not the owner of this object's monitor.
	 * @see java.lang.Object#notifyAll()
	 * @see java.lang.Object#wait()
	 */
	public final void notify() {
		throw new RuntimeException();
	}

	/**
	 * Wakes up all threads that are waiting on this object's monitor. A thread waits on an object's
	 * monitor by calling one of the {@code wait} methods.
	 * <p>
	 * The awakened threads will not be able to proceed until the current thread relinquishes the lock
	 * on this object. The awakened threads will compete in the usual manner with any other threads that
	 * might be actively competing to synchronize on this object; for example, the awakened threads
	 * enjoy no reliable privilege or disadvantage in being the next thread to lock this object.
	 * <p>
	 * This method should only be called by a thread that is the owner of this object's monitor. See the
	 * {@code notify} method for a description of the ways in which a thread can become the owner of a
	 * monitor.
	 *
	 * @exception IllegalMonitorStateException
	 *            if the current thread is not the owner of this object's monitor.
	 * @see java.lang.Object#notify()
	 * @see java.lang.Object#wait()
	 */
	public final void notifyAll() {
		throw new RuntimeException();
	}

	/**
	 * Returns a string representation of the object. In general, the {@code toString} method returns a
	 * string that "textually represents" this object. The result should be a concise but informative
	 * representation that is easy for a person to read. It is recommended that all subclasses override
	 * this method.
	 * <p>
	 * The {@code toString} method for class {@code Object} returns a string consisting of the name of
	 * the class of which the object is an instance, the at-sign character `{@code @}', and the unsigned
	 * hexadecimal representation of the hash code of the object. In other words, this method returns a
	 * string equal to the value of: <blockquote>
	 *
	 * <pre>
	 * getClass().getName() + '@' + Integer.toHexString(hashCode())
	 * </pre>
	 *
	 * </blockquote>
	 *
	 * @return a string representation of the object.
	 */
	public String toString() {
		throw new RuntimeException();
	}

	/**
	 * Causes the current thread to wait until another thread invokes the
	 * {@link java.lang.Object#notify()} method or the {@link java.lang.Object#notifyAll()} method for
	 * this object. In other words, this method behaves exactly as if it simply performs the call
	 * {@code wait(0)}.
	 * <p>
	 * The current thread must own this object's monitor. The thread releases ownership of this monitor
	 * and waits until another thread notifies threads waiting on this object's monitor to wake up
	 * either through a call to the {@code notify} method or the {@code notifyAll} method. The thread
	 * then waits until it can re-obtain ownership of the monitor and resumes execution.
	 * <p>
	 * As in the one argument version, interrupts and spurious wakeups are possible, and this method
	 * should always be used in a loop:
	 *
	 * <pre>
	 *     synchronized (obj) {
	 *         while (&lt;condition does not hold&gt;)
	 *             obj.wait();
	 *         ... // Perform action appropriate to condition
	 *     }
	 * </pre>
	 *
	 * This method should only be called by a thread that is the owner of this object's monitor. See the
	 * {@code notify} method for a description of the ways in which a thread can become the owner of a
	 * monitor.
	 *
	 * @exception IllegalMonitorStateException
	 *            if the current thread is not the owner of the object's monitor.
	 * @exception InterruptedException
	 *            if any thread interrupted the current thread before or while the current thread was
	 *            waiting for a notification. The <i>interrupted status</i> of the current thread is
	 *            cleared when this exception is thrown.
	 * @see java.lang.Object#notify()
	 * @see java.lang.Object#notifyAll()
	 */
	public final void wait() throws InterruptedException {
		throw new RuntimeException();
	}

	/**
	 * Causes the current thread to wait until either another thread invokes the
	 * {@link java.lang.Object#notify()} method or the {@link java.lang.Object#notifyAll()} method for
	 * this object, or a specified amount of time has elapsed.
	 * <p>
	 * The current thread must own this object's monitor.
	 * <p>
	 * This method causes the current thread (call it <var>T</var>) to place itself in the wait set for
	 * this object and then to relinquish any and all synchronization claims on this object. Thread
	 * <var>T</var> becomes disabled for thread scheduling purposes and lies dormant until one of four
	 * things happens:
	 * <ul>
	 * <li>Some other thread invokes the {@code notify} method for this object and thread <var>T</var>
	 * happens to be arbitrarily chosen as the thread to be awakened.
	 * <li>Some other thread invokes the {@code notifyAll} method for this object.
	 * <li>Some other thread {@linkplain Thread#interrupt() interrupts} thread <var>T</var>.
	 * <li>The specified amount of real time has elapsed, more or less. If {@code timeout} is zero,
	 * however, then real time is not taken into consideration and the thread simply waits until
	 * notified.
	 * </ul>
	 * The thread <var>T</var> is then removed from the wait set for this object and re-enabled for
	 * thread scheduling. It then competes in the usual manner with other threads for the right to
	 * synchronize on the object; once it has gained control of the object, all its synchronization
	 * claims on the object are restored to the status quo ante - that is, to the situation as of the
	 * time that the {@code wait} method was invoked. Thread <var>T</var> then returns from the
	 * invocation of the {@code wait} method. Thus, on return from the {@code wait} method, the
	 * synchronization state of the object and of thread {@code T} is exactly as it was when the
	 * {@code wait} method was invoked.
	 * <p>
	 * A thread can also wake up without being notified, interrupted, or timing out, a so-called
	 * <i>spurious wakeup</i>. While this will rarely occur in practice, applications must guard against
	 * it by testing for the condition that should have caused the thread to be awakened, and continuing
	 * to wait if the condition is not satisfied. In other words, waits should always occur in loops,
	 * like this one:
	 *
	 * <pre>
	 *     synchronized (obj) {
	 *         while (&lt;condition does not hold&gt;)
	 *             obj.wait(timeout);
	 *         ... // Perform action appropriate to condition
	 *     }
	 * </pre>
	 *
	 * (For more information on this topic, see Section 3.2.3 in Doug Lea's "Concurrent Programming in
	 * Java (Second Edition)" (Addison-Wesley, 2000), or Item 50 in Joshua Bloch's "Effective Java
	 * Programming Language Guide" (Addison-Wesley, 2001).
	 *
	 * <p>
	 * If the current thread is {@linkplain java.lang.Thread#interrupt() interrupted} by any thread
	 * before or while it is waiting, then an {@code InterruptedException} is thrown. This exception is
	 * not thrown until the lock status of this object has been restored as described above.
	 *
	 * <p>
	 * Note that the {@code wait} method, as it places the current thread into the wait set for this
	 * object, unlocks only this object; any other objects on which the current thread may be
	 * synchronized remain locked while the thread waits.
	 * <p>
	 * This method should only be called by a thread that is the owner of this object's monitor. See the
	 * {@code notify} method for a description of the ways in which a thread can become the owner of a
	 * monitor.
	 *
	 * @param timeout
	 *        the maximum time to wait in milliseconds.
	 * @exception IllegalArgumentException
	 *            if the value of timeout is negative.
	 * @exception IllegalMonitorStateException
	 *            if the current thread is not the owner of the object's monitor.
	 * @exception InterruptedException
	 *            if any thread interrupted the current thread before or while the current thread was
	 *            waiting for a notification. The <i>interrupted status</i> of the current thread is
	 *            cleared when this exception is thrown.
	 * @see java.lang.Object#notify()
	 * @see java.lang.Object#notifyAll()
	 */
	public final void wait(long timeout) throws InterruptedException {
		throw new RuntimeException();
	}

	/**
	 * Causes the current thread to wait until another thread invokes the
	 * {@link java.lang.Object#notify()} method or the {@link java.lang.Object#notifyAll()} method for
	 * this object, or some other thread interrupts the current thread, or a certain amount of real time
	 * has elapsed.
	 * <p>
	 * This method is similar to the {@code wait} method of one argument, but it allows finer control
	 * over the amount of time to wait for a notification before giving up. The amount of real time,
	 * measured in nanoseconds, is given by: <blockquote>
	 *
	 * <pre>
	 * 1000000 * timeout + nanos
	 * </pre>
	 *
	 * </blockquote>
	 * <p>
	 * In all other respects, this method does the same thing as the method {@link #wait(long)} of one
	 * argument. In particular, {@code wait(0, 0)} means the same thing as {@code wait(0)}.
	 * <p>
	 * The current thread must own this object's monitor. The thread releases ownership of this monitor
	 * and waits until either of the following two conditions has occurred:
	 * <ul>
	 * <li>Another thread notifies threads waiting on this object's monitor to wake up either through a
	 * call to the {@code notify} method or the {@code notifyAll} method.
	 * <li>The timeout period, specified by {@code timeout} milliseconds plus {@code nanos} nanoseconds
	 * arguments, has elapsed.
	 * </ul>
	 * <p>
	 * The thread then waits until it can re-obtain ownership of the monitor and resumes execution.
	 * <p>
	 * As in the one argument version, interrupts and spurious wakeups are possible, and this method
	 * should always be used in a loop:
	 *
	 * <pre>
	 *     synchronized (obj) {
	 *         while (&lt;condition does not hold&gt;)
	 *             obj.wait(timeout, nanos);
	 *         ... // Perform action appropriate to condition
	 *     }
	 * </pre>
	 *
	 * This method should only be called by a thread that is the owner of this object's monitor. See the
	 * {@code notify} method for a description of the ways in which a thread can become the owner of a
	 * monitor.
	 *
	 * @param timeout
	 *        the maximum time to wait in milliseconds.
	 * @param nanos
	 *        additional time, in nanoseconds range 0-999999.
	 * @exception IllegalArgumentException
	 *            if the value of timeout is negative or the value of nanos is not in the range
	 *            0-999999.
	 * @exception IllegalMonitorStateException
	 *            if the current thread is not the owner of this object's monitor.
	 * @exception InterruptedException
	 *            if any thread interrupted the current thread before or while the current thread was
	 *            waiting for a notification. The <i>interrupted status</i> of the current thread is
	 *            cleared when this exception is thrown.
	 */
	public final void wait(long timeout, int nanos) throws InterruptedException {
		throw new RuntimeException();
	}
}