// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

part of "dart:ffi";

/// The supertype of all [Abi]-specific integer types.
///
/// [Abi]-specific integers should extend this class and annotate it with
/// [AbiSpecificIntegerMapping] to declare the integer size and signedness
/// for [Abi.values].
///
/// For example:
///
/// ```
/// /// The C `uintptr_t` type.
/// ///
/// /// The [UintPtr] type is a native type, and should not be constructed in
/// /// Dart code.
/// /// It occurs only in native type signatures and as annotation on [Struct]
/// /// and [Union] fields.
/// @AbiSpecificIntegerMapping({
///   Abi.androidArm: Uint32(),
///   Abi.androidArm64: Uint64(),
///   Abi.androidIA32: Uint32(),
///   Abi.androidX64: Uint64(),
///   Abi.androidRiscv64: Uint64(),
///   Abi.fuchsiaArm64: Uint64(),
///   Abi.fuchsiaX64: Uint64(),
///   Abi.fuchsiaRiscv64: Uint64(),
///   Abi.iosArm: Uint32(),
///   Abi.iosArm64: Uint64(),
///   Abi.linuxArm: Uint32(),
///   Abi.linuxArm64: Uint64(),
///   Abi.linuxIA32: Uint32(),
///   Abi.linuxX64: Uint64(),
///   Abi.linuxRiscv32: Uint32(),
///   Abi.linuxRiscv64: Uint64(),
///   Abi.macosArm64: Uint64(),
///   Abi.macosX64: Uint64(),
///   Abi.windowsIA32: Uint32(),
///   Abi.windowsX64: Uint64(),
/// })
/// final class UintPtr extends AbiSpecificInteger {
///   const UintPtr();
/// }
/// ```
@Since('2.16')
base class AbiSpecificInteger implements SizedNativeType {
  const AbiSpecificInteger();
}

/// Mapping for a subtype of [AbiSpecificInteger].
///
/// See documentation on [AbiSpecificInteger].
@Since('2.16')
final class AbiSpecificIntegerMapping {
  final Map<Abi, NativeType> mapping;

  const AbiSpecificIntegerMapping(this.mapping);
}
