content: /*
   * Copyright (C) 2016 The Android Open Source Project
   *
   * 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 com.android.ahat.heapdump;
  
  /**
   * Value represents a field value in a heap dump. The field value is either a
   * subclass of AhatInstance or a primitive Java type.
   */
  public class Value {
    private Object mObject;
  
    /**
     * Constructs a value from a generic Java Object.
     * The Object must either be a boxed Java primitive type or a subclass of
     * AhatInstance. The object must not be null.
     */
    Value(Object object) {
      // TODO: Check that the Object is either an AhatSnapshot or boxed Java
      // primitive type?
      assert object != null;
      mObject = object;
    }
  
    /**
     * Returns true if the Value is an AhatInstance, as opposed to a Java
     * primitive value.
     */
    public boolean isAhatInstance() {
      return mObject instanceof AhatInstance;
    }
  
    /**
     * Return the Value as an AhatInstance if it is one.
     * Returns null if the Value represents a Java primitive value.
     */
    public AhatInstance asAhatInstance() {
      if (isAhatInstance()) {
        return (AhatInstance)mObject;
      }
      return null;
    }
  
    /**
     * Returns true if the Value is an Integer.
     */
    public boolean isInteger() {
      return mObject instanceof Integer;
    }
  
    /**
     * Return the Value as an Integer if it is one.
     * Returns null if the Value does not represent an Integer.
     */
    public Integer asInteger() {
      if (isInteger()) {
        return (Integer)mObject;
      }
      return null;
    }
  
    /**
     * Returns true if the Value is an Long.
     */
    public boolean isLong() {
      return mObject instanceof Long;
    }
  
    /**
     * Return the Value as an Long if it is one.
     * Returns null if the Value does not represent an Long.
     */
    public Long asLong() {
      if (isLong()) {
        return (Long)mObject;
      }
      return null;
    }
  
    /**
     * Return the Value as a Byte if it is one.
     * Returns null if the Value does not represent a Byte.
     */
    public Byte asByte() {
      if (mObject instanceof Byte) {
        return (Byte)mObject;
      }
      return null;
    }
  
    /**
     * Return the Value as a Char if it is one.
     * Returns null if the Value does not represent a Char.
     */
    public Character asChar() {
      if (mObject instanceof Character) {
        return (Character)mObject;
      }
      return null;
    }
  
    public String toString() {
      return mObject.toString();
    }
  
    public static Value getBaseline(Value value) {
      if (value == null || !value.isAhatInstance()) {
        return value;
      }
      return new Value(value.asAhatInstance().getBaseline());
    }
  
    @Override public boolean equals(Object other) {
      if (other instanceof Value) {
        Value value = (Value)other;
        return mObject.equals(value.mObject);
      }
      return false;
    }
  }
  