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

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

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

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

  late final _com3_ptr =
      _lookup<ffi.NativeFunction<ffi.Void Function()>>('com3');
  late final _com3 = _com3_ptr.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;
}
