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

/// Bindings to `headers/example.h`.
class NativeLibrary {
  /// Holds the Dynamic library.
  final ffi.DynamicLibrary _dylib;

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

  /// Adds 2 integers.
  int sum(
    int a,
    int b,
  ) {
    _sum ??= _dylib.lookupFunction<_c_sum, _dart_sum>('sum');
    return _sum(
      a,
      b,
    );
  }

  _dart_sum _sum;

  /// Subtracts 2 integers.
  int subtract(
    ffi.Pointer<ffi.Int32> a,
    int b,
  ) {
    _subtract ??=
        _dylib.lookupFunction<_c_subtract, _dart_subtract>('subtract');
    return _subtract(
      a,
      b,
    );
  }

  _dart_subtract _subtract;

  /// Multiplies 2 integers, returns pointer to an integer,.
  ffi.Pointer<ffi.Int32> multiply(
    int a,
    int b,
  ) {
    _multiply ??=
        _dylib.lookupFunction<_c_multiply, _dart_multiply>('multiply');
    return _multiply(
      a,
      b,
    );
  }

  _dart_multiply _multiply;

  /// Divides 2 integers, returns pointer to a float.
  ffi.Pointer<ffi.Float> divide(
    int a,
    int b,
  ) {
    _divide ??= _dylib.lookupFunction<_c_divide, _dart_divide>('divide');
    return _divide(
      a,
      b,
    );
  }

  _dart_divide _divide;

  /// Divides 2 floats, returns a pointer to double.
  ffi.Pointer<ffi.Double> dividePercision(
    ffi.Pointer<ffi.Float> a,
    ffi.Pointer<ffi.Float> b,
  ) {
    _dividePercision ??=
        _dylib.lookupFunction<_c_dividePercision, _dart_dividePercision>(
            'dividePercision');
    return _dividePercision(
      a,
      b,
    );
  }

  _dart_dividePercision _dividePercision;
}

typedef _c_sum = ffi.Int32 Function(
  ffi.Int32 a,
  ffi.Int32 b,
);

typedef _dart_sum = int Function(
  int a,
  int b,
);

typedef _c_subtract = ffi.Int32 Function(
  ffi.Pointer<ffi.Int32> a,
  ffi.Int32 b,
);

typedef _dart_subtract = int Function(
  ffi.Pointer<ffi.Int32> a,
  int b,
);

typedef _c_multiply = ffi.Pointer<ffi.Int32> Function(
  ffi.Int32 a,
  ffi.Int32 b,
);

typedef _dart_multiply = ffi.Pointer<ffi.Int32> Function(
  int a,
  int b,
);

typedef _c_divide = ffi.Pointer<ffi.Float> Function(
  ffi.Int32 a,
  ffi.Int32 b,
);

typedef _dart_divide = ffi.Pointer<ffi.Float> Function(
  int a,
  int b,
);

typedef _c_dividePercision = ffi.Pointer<ffi.Double> Function(
  ffi.Pointer<ffi.Float> a,
  ffi.Pointer<ffi.Float> b,
);

typedef _dart_dividePercision = ffi.Pointer<ffi.Double> Function(
  ffi.Pointer<ffi.Float> a,
  ffi.Pointer<ffi.Float> b,
);
