define(['dart_sdk'], function(dart_sdk) {
  'use strict';
  const core = dart_sdk.core;
  const dart = dart_sdk.dart;
  const dartx = dart_sdk.dartx;
  const BenchmarkBase$ = Object.create(null);
  let VoidToNull = () => (VoidToNull = dart.constFn(dart.fnType(core.Null, [])))();
  BenchmarkBase$.Expect = class Expect extends core.Object {
    static equals(expected, actual) {
      if (!dart.equals(expected, actual)) {
        dart.throw(dart.str`Values not equal: ${expected} vs ${actual}`);
      }
    }
    static listEquals(expected, actual) {
      if (expected[dartx.length] != actual[dartx.length]) {
        dart.throw(dart.str`Lists have different lengths: ${expected[dartx.length]} vs ${actual[dartx.length]}`);
      }
      for (let i = 0; i < dart.notNull(actual[dartx.length]); i++) {
        BenchmarkBase$.Expect.equals(expected[dartx._get](i), actual[dartx._get](i));
      }
    }
    fail(message) {
      dart.throw(message);
    }
  };
  (BenchmarkBase$.Expect.new = function() {
  }).prototype = BenchmarkBase$.Expect.prototype;
  dart.setSignature(BenchmarkBase$.Expect, {
    methods: () => ({fail: dart.fnType(dart.dynamic, [dart.dynamic])}),
    statics: () => ({
      equals: dart.fnType(dart.void, [dart.dynamic, dart.dynamic]),
      listEquals: dart.fnType(dart.void, [core.List, core.List])
    }),
    names: ['equals', 'listEquals']
  });
  BenchmarkBase$.BenchmarkBase = class BenchmarkBase extends core.Object {
    get name() {
      return this[name$];
    }
    set name(value) {
      super.name = value;
    }
    run() {}
    warmup() {
      this.run();
    }
    exercise() {
      for (let i = 0; i < 10; i++) {
        this.run();
      }
    }
    setup() {}
    teardown() {}
    static measureFor(f, timeMinimum) {
      let time = 0;
      let iter = 0;
      let watch = new core.Stopwatch.new();
      watch.start();
      let elapsed = 0;
      while (dart.notNull(elapsed) < dart.notNull(timeMinimum)) {
        dart.dcall(f);
        elapsed = watch.elapsedMilliseconds;
        iter++;
      }
      return 1000.0 * dart.notNull(elapsed) / iter;
    }
    measure() {
      this.setup();
      BenchmarkBase$.BenchmarkBase.measureFor(dart.fn(() => {
        this.warmup();
      }, VoidToNull()), 100);
      let result = BenchmarkBase$.BenchmarkBase.measureFor(dart.fn(() => {
        this.exercise();
      }, VoidToNull()), 2000);
      this.teardown();
      return result;
    }
    report() {
      let score = this.measure();
      core.print(dart.str`${this.name}(RunTime): ${score} us.`);
    }
  };
  (BenchmarkBase$.BenchmarkBase.new = function(name) {
    this[name$] = name;
  }).prototype = BenchmarkBase$.BenchmarkBase.prototype;
  const name$ = Symbol("BenchmarkBase.name");
  dart.setSignature(BenchmarkBase$.BenchmarkBase, {
    fields: () => ({name: dart.finalFieldType(core.String)}),
    methods: () => ({
      run: dart.fnType(dart.void, []),
      warmup: dart.fnType(dart.void, []),
      exercise: dart.fnType(dart.void, []),
      setup: dart.fnType(dart.void, []),
      teardown: dart.fnType(dart.void, []),
      measure: dart.fnType(core.double, []),
      report: dart.fnType(dart.void, [])
    }),
    statics: () => ({measureFor: dart.fnType(core.double, [core.Function, core.int])}),
    names: ['measureFor']
  });
  dart.trackLibraries("BenchmarkBase", {
    "BenchmarkBase.dart": BenchmarkBase$
  }, null);
  // Exports:
  return {
    BenchmarkBase: BenchmarkBase$
  };
});
