// 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 _com1Ptr =
      _lookup<ffi.NativeFunction<ffi.Void Function()>>('com1');
  late final _com1 = _com1Ptr.asFunction<void Function()>();

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

  late final _com2Ptr =
      _lookup<ffi.NativeFunction<ffi.Void Function()>>('com2');
  late final _com2 = _com2Ptr.asFunction<void Function()>();

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

  late final _com3Ptr =
      _lookup<ffi.NativeFunction<ffi.Void Function()>>('com3');
  late final _com3 = _com3Ptr.asFunction<void Function()>();
}

/// 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;
}
