// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.

// THIS FILE WAS AUTO-GENERATED BY ./wpimath/generate_numbers.py. DO NOT MODIFY

package org.wpilib.math.util;

// CHECKSTYLE.OFF: ImportOrder

import org.wpilib.math.numbers.N0;
import org.wpilib.math.numbers.N1;
import org.wpilib.math.numbers.N2;
import org.wpilib.math.numbers.N3;
import org.wpilib.math.numbers.N4;
import org.wpilib.math.numbers.N5;
import org.wpilib.math.numbers.N6;
import org.wpilib.math.numbers.N7;
import org.wpilib.math.numbers.N8;
import org.wpilib.math.numbers.N9;
import org.wpilib.math.numbers.N10;
import org.wpilib.math.numbers.N11;
import org.wpilib.math.numbers.N12;
import org.wpilib.math.numbers.N13;
import org.wpilib.math.numbers.N14;
import org.wpilib.math.numbers.N15;
import org.wpilib.math.numbers.N16;
import org.wpilib.math.numbers.N17;
import org.wpilib.math.numbers.N18;
import org.wpilib.math.numbers.N19;
import org.wpilib.math.numbers.N20;
// CHECKSTYLE.ON

/**
 * A natural number expressed as a java class.
 * The counterpart to {@link Num} that should be used as a concrete value.
 *
 * @param <T> The {@link Num} this represents.
 */
@SuppressWarnings("PMD.ImplicitFunctionalInterface")
public interface Nat<T extends Num> {
  /**
   * The number this interface represents.
   *
   * @return The number backing this value.
   */
  int getNum();

  /**
   * Returns the Nat instance for 0.
   *
   * @return The Nat instance for 0.
   */
  static Nat<N0> N0() {
    return N0.instance;
  }

  /**
   * Returns the Nat instance for 1.
   *
   * @return The Nat instance for 1.
   */
  static Nat<N1> N1() {
    return N1.instance;
  }

  /**
   * Returns the Nat instance for 2.
   *
   * @return The Nat instance for 2.
   */
  static Nat<N2> N2() {
    return N2.instance;
  }

  /**
   * Returns the Nat instance for 3.
   *
   * @return The Nat instance for 3.
   */
  static Nat<N3> N3() {
    return N3.instance;
  }

  /**
   * Returns the Nat instance for 4.
   *
   * @return The Nat instance for 4.
   */
  static Nat<N4> N4() {
    return N4.instance;
  }

  /**
   * Returns the Nat instance for 5.
   *
   * @return The Nat instance for 5.
   */
  static Nat<N5> N5() {
    return N5.instance;
  }

  /**
   * Returns the Nat instance for 6.
   *
   * @return The Nat instance for 6.
   */
  static Nat<N6> N6() {
    return N6.instance;
  }

  /**
   * Returns the Nat instance for 7.
   *
   * @return The Nat instance for 7.
   */
  static Nat<N7> N7() {
    return N7.instance;
  }

  /**
   * Returns the Nat instance for 8.
   *
   * @return The Nat instance for 8.
   */
  static Nat<N8> N8() {
    return N8.instance;
  }

  /**
   * Returns the Nat instance for 9.
   *
   * @return The Nat instance for 9.
   */
  static Nat<N9> N9() {
    return N9.instance;
  }

  /**
   * Returns the Nat instance for 10.
   *
   * @return The Nat instance for 10.
   */
  static Nat<N10> N10() {
    return N10.instance;
  }

  /**
   * Returns the Nat instance for 11.
   *
   * @return The Nat instance for 11.
   */
  static Nat<N11> N11() {
    return N11.instance;
  }

  /**
   * Returns the Nat instance for 12.
   *
   * @return The Nat instance for 12.
   */
  static Nat<N12> N12() {
    return N12.instance;
  }

  /**
   * Returns the Nat instance for 13.
   *
   * @return The Nat instance for 13.
   */
  static Nat<N13> N13() {
    return N13.instance;
  }

  /**
   * Returns the Nat instance for 14.
   *
   * @return The Nat instance for 14.
   */
  static Nat<N14> N14() {
    return N14.instance;
  }

  /**
   * Returns the Nat instance for 15.
   *
   * @return The Nat instance for 15.
   */
  static Nat<N15> N15() {
    return N15.instance;
  }

  /**
   * Returns the Nat instance for 16.
   *
   * @return The Nat instance for 16.
   */
  static Nat<N16> N16() {
    return N16.instance;
  }

  /**
   * Returns the Nat instance for 17.
   *
   * @return The Nat instance for 17.
   */
  static Nat<N17> N17() {
    return N17.instance;
  }

  /**
   * Returns the Nat instance for 18.
   *
   * @return The Nat instance for 18.
   */
  static Nat<N18> N18() {
    return N18.instance;
  }

  /**
   * Returns the Nat instance for 19.
   *
   * @return The Nat instance for 19.
   */
  static Nat<N19> N19() {
    return N19.instance;
  }

  /**
   * Returns the Nat instance for 20.
   *
   * @return The Nat instance for 20.
   */
  static Nat<N20> N20() {
    return N20.instance;
  }
}
