/*
 *  This file is part of the Jikes RVM project (http://jikesrvm.org).
 *
 *  This file is licensed to You under the Common Public License (CPL);
 *  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/cpl1.0.php
 *
 *  See the COPYRIGHT.txt file distributed with this work for information
 *  regarding copyright ownership.
 */
package org.vmutil.options;

import org.vmmagic.pragma.Uninterruptible;

/**
 * A time option that stores values at a microsecond granularity.
 */
public class MicrosecondsOption extends Option {
  // values
  protected int defaultValue;
  protected int value;

  /**
   * Create a new microsecond option.
   *
   * @param set The option set this option belongs to.
   * @param name The space separated name for the option.
   * @param desc The purpose of the option
   * @param defaultUs The default value of the option (usec).
   */
  protected MicrosecondsOption(OptionSet set, String name, String desc, int defaultUs) {
    super(set, MICROSECONDS_OPTION, name, desc);
    this.value = this.defaultValue = defaultUs;
  }

  /**
   * Read the current value of the option in microseconds.
   *
   * @return The option value.
   */
  @Uninterruptible
  public int getMicroseconds() {
    return this.value;
  }

  /**
   * Read the current value of the option in milliseconds.
   *
   * @return The option value.
   */
  @Uninterruptible
  public int getMilliseconds() {
    return this.value / 1000;
  }

  /**
   * Read the default value of the option in microseconds.
   *
   * @return The default value.
   */
  @Uninterruptible
  public int getDefaultMicroseconds() {
    return this.defaultValue;
  }

  /**
   * Read the default value of the option in milliseconds.
   *
   * @return The default value.
   */
  @Uninterruptible
  public int getDefaultMilliseconds() {
    return this.defaultValue / 1000;
  }

  /**
   * Update the value of the option, echoing the change if the echoOptions
   * option is set. An error occurs if the value is negative, and then the
   * validate method is called to allow subclasses to perform any additional
   * validation.
   *
   * @param value The new value for the option.
   */
  public void setMicroseconds(int value) {
    failIf(value < 0, "Unreasonable " + this.getName() + " value");
    this.value = value;
    validate();
    set.logChange(this);
  }

  /**
   * Modify the default value of the option.
   *
   * @param value The new default value for the option.
   */
  public void setDefaultMicrosends(int value) {
    this.value = this.defaultValue = value;
  }
}
