// AUTO GENERATED FILE, DO NOT EDIT.
//
// Generated by `package:ffigen`.
import 'dart:ffi' as ffi;
import 'package:ffi/ffi.dart' as pkg_ffi;

/// Bindings to `headers/example.h`.
class NativeLibrary {
  /// Holds the symbol lookup function.
  final ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
      _lookup;

  /// The symbols are looked up in [dynamicLibrary].
  NativeLibrary(ffi.DynamicLibrary dynamicLibrary)
      : _lookup = dynamicLibrary.lookup;

  /// The symbols are looked up with [lookup].
  NativeLibrary.fromLookup(
      ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
          lookup)
      : _lookup = lookup;

  /// Adds 2 integers.
  int sum(
    int a,
    int b,
  ) {
    return _sum(
      a,
      b,
    );
  }

  late final _sumPtr = _lookup<
          ffi.NativeFunction<pkg_ffi.Int Function(pkg_ffi.Int, pkg_ffi.Int)>>(
      'sum');
  late final _sum = _sumPtr.asFunction<int Function(int, int)>();

  /// Subtracts 2 integers.
  int subtract(
    ffi.Pointer<pkg_ffi.Int> a,
    int b,
  ) {
    return _subtract(
      a,
      b,
    );
  }

  late final _subtractPtr = _lookup<
      ffi.NativeFunction<
          pkg_ffi.Int Function(
              ffi.Pointer<pkg_ffi.Int>, pkg_ffi.Int)>>('subtract');
  late final _subtract =
      _subtractPtr.asFunction<int Function(ffi.Pointer<pkg_ffi.Int>, int)>();

  /// Multiplies 2 integers, returns pointer to an integer,.
  ffi.Pointer<pkg_ffi.Int> multiply(
    int a,
    int b,
  ) {
    return _multiply(
      a,
      b,
    );
  }

  late final _multiplyPtr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<pkg_ffi.Int> Function(
              pkg_ffi.Int, pkg_ffi.Int)>>('multiply');
  late final _multiply =
      _multiplyPtr.asFunction<ffi.Pointer<pkg_ffi.Int> Function(int, int)>();

  /// Divides 2 integers, returns pointer to a float.
  ffi.Pointer<ffi.Float> divide(
    int a,
    int b,
  ) {
    return _divide(
      a,
      b,
    );
  }

  late final _dividePtr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ffi.Float> Function(pkg_ffi.Int, pkg_ffi.Int)>>('divide');
  late final _divide =
      _dividePtr.asFunction<ffi.Pointer<ffi.Float> Function(int, int)>();

  /// Divides 2 floats, returns a pointer to double.
  ffi.Pointer<ffi.Double> dividePercision(
    ffi.Pointer<ffi.Float> a,
    ffi.Pointer<ffi.Float> b,
  ) {
    return _dividePercision(
      a,
      b,
    );
  }

  late final _dividePercisionPtr = _lookup<
      ffi.NativeFunction<
          ffi.Pointer<ffi.Double> Function(ffi.Pointer<ffi.Float>,
              ffi.Pointer<ffi.Float>)>>('dividePercision');
  late final _dividePercision = _dividePercisionPtr.asFunction<
      ffi.Pointer<ffi.Double> Function(
          ffi.Pointer<ffi.Float>, ffi.Pointer<ffi.Float>)>();
}
