// 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,
  ) {
    return (_sum ??= _dylib.lookupFunction<_c_sum, _dart_sum>('sum'))(
      a,
      b,
    );
  }

  _dart_sum? _sum;

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

  _dart_subtract? _subtract;

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

  _dart_multiply? _multiply;

  /// Divides 2 integers, returns pointer to a float.
  ffi.Pointer<ffi.Float> divide(
    int a,
    int b,
  ) {
    return (_divide ??=
        _dylib.lookupFunction<_c_divide, _dart_divide>('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,
  ) {
    return (_dividePercision ??=
        _dylib.lookupFunction<_c_dividePercision, _dart_dividePercision>(
            '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,
);
