/*
 * Copyright 2007 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package java.lang;

import java.io.Serializable;

/**
 * Wraps native <code>boolean</code> as an object.
 */
public final class Boolean implements Comparable<Boolean>, Serializable {
  /*
   * TODO: figure out how to not clinit this class on direct field access.
   */

  // CHECKSTYLE_OFF: These have to be created somewhere.
  public static Boolean FALSE = new Boolean(false);
  public static Boolean TRUE = new Boolean(true);

  // CHECKSTYLE_ON

  public static boolean parseBoolean(String s) {
    return "true".equalsIgnoreCase(s);
  }

  public static String toString(boolean x) {
    return String.valueOf(x);
  }

  public static Boolean valueOf(boolean b) {
    return b ? TRUE : FALSE;
  }

  public static Boolean valueOf(String s) {
    return valueOf(parseBoolean(s));
  }

  private final transient boolean value;

  public Boolean(boolean value) {
    this.value = value;
  }

  public Boolean(String s) {
    this(parseBoolean(s));
  }

  public boolean booleanValue() {
    return value;
  }

  public int compareTo(Boolean other) {
    return (this.value == other.value) ? 0 : (this.value ? 1 : -1);
  }

  @Override
  public boolean equals(Object o) {
    return (o instanceof Boolean) && (((Boolean) o).value == value);
  }

  @Override
  public int hashCode() {
    // The Java API doc defines these magic numbers.
    return value ? 1231 : 1237;
  }

  @Override
  public String toString() {
    return value ? "true" : "false";
  }
}
