// 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.fuchsiaArm64: Uint64(),
///   Abi.fuchsiaX64: 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(),
/// })
/// class UintPtr extends AbiSpecificInteger {
///   const UintPtr();
/// }
/// ```
@Since('2.16')
class AbiSpecificInteger extends NativeType {
  const AbiSpecificInteger();
}

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

  const AbiSpecificIntegerMapping(this.mapping);
}
