IIterator<T>.fromPtr constructor

IIterator<T>.fromPtr(
  1. Pointer<COMObject> ptr, {
  2. T creator(
    1. Pointer<COMObject>
    )?,
  3. T enumCreator(
    1. int
    )?,
  4. DoubleType? doubleType,
  5. IntType? intType,
})

Creates an instance of IIterator from the given ptr.

T must be of type bool, DateTime, double, Duration, Guid, int, Object?, String, Uri?, IInspectable? (e.g., StorageFile?), WinRTEnum (e.g., DeviceClass), or WinRTStruct (e.g., BasicGeoposition).

doubleType must be specified if T is double.

final iterator =
    IIterator<double>.fromPtr(ptr, doubleType: DoubleType.float);

intType must be specified if T is int.

final iterator = IIterator<int>.fromPtr(ptr, intType: IntType.uint64);

creator must be specified if T is IInspectable?.

final iterator = IIterator<StorageFile?>.fromPtr(ptr,
    creator: StorageFile.fromPtr);

enumCreator must be specified if T is WinRTEnum.

final iterator = IIterator<DeviceClass>.fromPtr(ptr,
    enumCreator: DeviceClass.from);

Implementation

factory IIterator.fromPtr(
  Pointer<COMObject> ptr, {
  T Function(Pointer<COMObject>)? creator,
  T Function(int)? enumCreator,
  DoubleType? doubleType,
  IntType? intType,
}) {
  if (T == bool) return _IIteratorBool.fromPtr(ptr) as IIterator<T>;
  if (T == DateTime) return _IIteratorDateTime.fromPtr(ptr) as IIterator<T>;
  if (T == Duration) return _IIteratorDuration.fromPtr(ptr) as IIterator<T>;
  if (T == Guid) return _IIteratorGuid.fromPtr(ptr) as IIterator<T>;

  if (T == double) {
    if (doubleType == null) throw ArgumentError.notNull('doubleType');
    final iterator = switch (doubleType) {
      DoubleType.double => _IIteratorDouble.fromPtr(ptr),
      DoubleType.float => _IIteratorFloat.fromPtr(ptr),
    };
    return iterator as IIterator<T>;
  }

  if (T == int) {
    if (intType == null) throw ArgumentError.notNull('intType');
    final iterator = switch (intType) {
      IntType.int16 => _IIteratorInt16.fromPtr(ptr),
      IntType.int32 => _IIteratorInt32.fromPtr(ptr),
      IntType.int64 => _IIteratorInt64.fromPtr(ptr),
      IntType.uint8 => _IIteratorUint8.fromPtr(ptr),
      IntType.uint16 => _IIteratorUint16.fromPtr(ptr),
      IntType.uint32 => _IIteratorUint32.fromPtr(ptr),
      IntType.uint64 => _IIteratorUint64.fromPtr(ptr)
    };
    return iterator as IIterator<T>;
  }

  if (isSubtypeOfInspectable<T>()) {
    if (creator == null) throw ArgumentError.notNull('creator');
    return _IIteratorInspectable.fromPtr(ptr, creator: creator);
  }

  if (T == String) return _IIteratorString.fromPtr(ptr) as IIterator<T>;
  if (isSubtype<T, Uri>()) return _IIteratorUri.fromPtr(ptr) as IIterator<T>;

  if (isSubtypeOfWinRTFlagsEnum<T>()) {
    if (enumCreator == null) throw ArgumentError.notNull('enumCreator');
    return _IIteratorWinRTFlagsEnum.fromPtr(ptr, enumCreator: enumCreator);
  }

  if (isSubtypeOfWinRTEnum<T>()) {
    if (enumCreator == null) throw ArgumentError.notNull('enumCreator');
    return _IIteratorWinRTEnum.fromPtr(ptr, enumCreator: enumCreator);
  }

  if (isNullableObjectType<T>()) {
    return _IIteratorObject.fromPtr(ptr) as IIterator<T>;
  }

  if (isSubtypeOfWinRTStruct<T>()) {
    if (T == AccessListEntry) {
      return _IIteratorAccessListEntry.fromPtr(ptr) as IIterator<T>;
    }
    if (T == BackgroundTransferFileRange) {
      return _IIteratorBackgroundTransferFileRange.fromPtr(ptr)
          as IIterator<T>;
    }
    if (T == BasicGeoposition) {
      return _IIteratorBasicGeoposition.fromPtr(ptr) as IIterator<T>;
    }
    if (T == Color) return _IIteratorColor.fromPtr(ptr) as IIterator<T>;
    if (T == GpioChangeRecord) {
      return _IIteratorGpioChangeRecord.fromPtr(ptr) as IIterator<T>;
    }
    if (T == MediaTimeRange) {
      return _IIteratorMediaTimeRange.fromPtr(ptr) as IIterator<T>;
    }
    if (T == MseTimeRange) {
      return _IIteratorMseTimeRange.fromPtr(ptr) as IIterator<T>;
    }
    if (T == NitRange) return _IIteratorNitRange.fromPtr(ptr) as IIterator<T>;
    if (T == Point) return _IIteratorPoint.fromPtr(ptr) as IIterator<T>;
    if (T == PointerDeviceUsage) {
      return _IIteratorPointerDeviceUsage.fromPtr(ptr) as IIterator<T>;
    }
    if (T == Rect) return _IIteratorRect.fromPtr(ptr) as IIterator<T>;
    if (T == RectInt32)
      return _IIteratorRectInt32.fromPtr(ptr) as IIterator<T>;
    if (T == Size) return _IIteratorSize.fromPtr(ptr) as IIterator<T>;
    if (T == SizeUInt32) {
      return _IIteratorSizeUInt32.fromPtr(ptr) as IIterator<T>;
    }
    if (T == SortEntry)
      return _IIteratorSortEntry.fromPtr(ptr) as IIterator<T>;
    if (T == StorePackageUpdateStatus) {
      return _IIteratorStorePackageUpdateStatus.fromPtr(ptr) as IIterator<T>;
    }
    if (T == TextRange) {
      return _IIteratorTextRange.fromPtr(ptr) as IIterator<T>;
    }
    if (T == TextSegment) {
      return _IIteratorTextSegment.fromPtr(ptr) as IIterator<T>;
    }
    if (T == WindowId) return _IIteratorWindowId.fromPtr(ptr) as IIterator<T>;
  }

  throw ArgumentError.value(T, 'T', 'Unsupported type');
}