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

/// Comment Markup Test
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;

  /// This is a single line test comment.
  void com1() {
    return _com1();
  }

  late final _com1_ptr = _lookup<ffi.NativeFunction<_c_com1>>('com1');
  late final _dart_com1 _com1 = _com1_ptr.asFunction<_dart_com1>();

  /// This is a multi-line
  /// test comment.
  void com2() {
    return _com2();
  }

  late final _com2_ptr = _lookup<ffi.NativeFunction<_c_com2>>('com2');
  late final _dart_com2 _com2 = _com2_ptr.asFunction<_dart_com2>();

  /// This is a multi-line
  /// doxygen style
  /// test comment.
  void com3() {
    return _com3();
  }

  late final _com3_ptr = _lookup<ffi.NativeFunction<_c_com3>>('com3');
  late final _dart_com3 _com3 = _com3_ptr.asFunction<_dart_com3>();
}

/// Test comment for struct.
class com4 extends ffi.Struct {
  /// Muli-line test comment for struct field
  /// With multiple line and both // and ///.
  @ffi.Int32()
  external int a;

  /// Single line field comment.
  @ffi.Float()
  external double b;
}

typedef _c_com1 = ffi.Void Function();

typedef _dart_com1 = void Function();

typedef _c_com2 = ffi.Void Function();

typedef _dart_com2 = void Function();

typedef _c_com3 = ffi.Void Function();

typedef _dart_com3 = void Function();
