
import cpp20_concepts.*;

public class cpp20_concepts_runme {

  static {
    try {
      System.loadLibrary("cpp20_concepts");
    } catch (UnsatisfiedLinkError e) {
      System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e);
      System.exit(1);
    }
  }

  public static void main(String argv[]) {
    // Trailing requires-clause.
    if (cpp20_concepts.cube_int(3) != 27)
      throw new RuntimeException("cube_int(3)");
    if (cpp20_concepts.cube_int(-4) != -64)
      throw new RuntimeException("cube_int(-4)");
    if (cpp20_concepts.cube_double(2.0) != 8.0)
      throw new RuntimeException("cube_double(2.0)");
    if (cpp20_concepts.cube_double(0.5) != 0.125)
      throw new RuntimeException("cube_double(0.5)");

    // Prefix requires-clause - bare concept.
    if (cpp20_concepts.quad_int(2) != 16)
      throw new RuntimeException("quad_int(2)");
    if (cpp20_concepts.quad_int(-3) != 81)
      throw new RuntimeException("quad_int(-3)");
    if (cpp20_concepts.quad_double(1.5) != 5.0625)
      throw new RuntimeException("quad_double(1.5)");

    // Prefix requires-clause - compound constraint joined by '&&'.
    if (cpp20_concepts.half_int(8) != 4)
      throw new RuntimeException("half_int(8)");
    if (cpp20_concepts.half_int(-9) != -4)
      throw new RuntimeException("half_int(-9)");

    // Prefix requires-clause - parenthesised constraint subexpression.
    if (cpp20_concepts.identity_int(42) != 42)
      throw new RuntimeException("identity_int(42)");
    if (cpp20_concepts.identity_int(-1) != -1)
      throw new RuntimeException("identity_int(-1)");

    // Trailing requires-clause after a trailing return type.
    if (cpp20_concepts.negate_value_int(5) != -5)
      throw new RuntimeException("negate_value_int(5)");
    if (cpp20_concepts.triple_int(-3) != -9)
      throw new RuntimeException("triple_int(-3)");

    // Trailing requires-clause whose constraint contains a requires-expression
    // as a primary.
    if (cpp20_concepts.add_int(2, 3) != 5)
      throw new RuntimeException("add_int(2, 3)");
    if (cpp20_concepts.add_int(-7, 4) != -3)
      throw new RuntimeException("add_int(-7, 4)");

    // Function template constrained by a named concept whose body is a requires-expression.
    if (cpp20_concepts.sum_pair_int(2, 3) != 5)
      throw new RuntimeException("sum_pair_int(2, 3)");
    if (cpp20_concepts.sum_pair_int(-7, 4) != -3)
      throw new RuntimeException("sum_pair_int(-7, 4)");

    // Function template constrained by a concept whose requires-expression
    // contains a compound requirement '{ a + b } -> std::same_as<T>;'.
    if (cpp20_concepts.add_same_int(2, 3) != 5)
      throw new RuntimeException("add_same_int(2, 3)");
    if (cpp20_concepts.add_same_int(-7, 4) != -3)
      throw new RuntimeException("add_same_int(-7, 4)");

    // Inline 'requires requires' with a compound requirement.
    if (cpp20_concepts.add_inline_same_int(2, 3) != 5)
      throw new RuntimeException("add_inline_same_int(2, 3)");
    if (cpp20_concepts.add_inline_same_int(-7, 4) != -3)
      throw new RuntimeException("add_inline_same_int(-7, 4)");

    // Multiple simple-requirements.
    Engine e = new Engine();
    if (!cpp20_concepts.cycle_engine(e))
      throw new RuntimeException("cycle_engine");
    if (e.getRunning())
      throw new RuntimeException("Engine should be stopped after cycle");

    // Type-, noexcept compound- and nested-requirements.
    if (!cpp20_concepts.check_container_c(new Container()))
      throw new RuntimeException("check_container_c");
  }
}
