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

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

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

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

  void a() {
    return _a();
  }

  late final _a_ptr = _lookup<ffi.NativeFunction<_c_a>>('a');
  late final _dart_a _a = _a_ptr.asFunction<_dart_a>();

  void b() {
    return _b();
  }

  late final _b_ptr = _lookup<ffi.NativeFunction<_c_b>>('b');
  late final _dart_b _b = _b_ptr.asFunction<_dart_b>();
}

class c extends ffi.Opaque {}

class d extends ffi.Opaque {}

typedef _c_a = ffi.Void Function();

typedef _dart_a = void Function();

typedef _c_b = ffi.Void Function();

typedef _dart_b = void Function();
