import 'package:flutter/foundation.dart';

import 'vid_value.dart';

/// <summary>
/// abstract vid element

/// <typeparam name="T"></typeparam>
abstract class VidValueElement<T> implements IVidValue {
  late T _value;

  T get value => _value;
  @protected
  set value(T val) => _value = val;

  VidValueElement(T value);

  @override
  dynamic getValue() {
    return value;
  }
}

/// Integer element for vid
class VidIntegerValueElement extends VidValueElement<int> {
  VidIntegerValueElement(int val) : super(val) {
    value = val;
  }

  @override
  ValueType get type => ValueType.integer;
}

/// String element for vid
class VidStringValueElement extends VidValueElement<String> {
  @override
  ValueType get type => ValueType.string;

  VidStringValueElement(String val) : super(val) {
    value = val;
  }
}

/// double element for vid
class VidDoubleValueElement extends VidValueElement<double> {
  @override
  ValueType get type => ValueType.double;

  VidDoubleValueElement(double val) : super(val) {
    value = val;
  }
}

/// float element for vid
class VidFloatValueElement extends VidValueElement<double> {
  @override
  ValueType get type => ValueType.float;

  VidFloatValueElement(double val) : super(val) {
    value = val;
  }
}

/// Uint element for vid
class VidUintValueElement extends VidValueElement<int> {
  @override
  ValueType get type => ValueType.uint;

  VidUintValueElement(int val) : super(val) {
    value = val;
  }
}

/// short element for vid
class VidShortValueElement extends VidValueElement<int> {
  @override
  ValueType get type => ValueType.short;

  VidShortValueElement(int val) : super(val) {
    value = val;
  }
}

/// ushort element for vid
class VidUshortValueElement extends VidValueElement<int> {
  @override
  ValueType get type => ValueType.ushort;

  VidUshortValueElement(int val) : super(val) {
    value = val;
  }
}

/// long element for vid
class VidLongValueElement extends VidValueElement<int> {
  @override
  ValueType get type => ValueType.long;

  VidLongValueElement(int val) : super(val) {
    value = val;
  }
}

/// ulong element for vid
class VidUlongValueElement extends VidValueElement<int> {
  @override
  ValueType get type => ValueType.ulong;

  VidUlongValueElement(int val) : super(val) {
    value = val;
  }
}

/// byte element for vid
class VidByteValueElement extends VidValueElement<int> {
  @override
  ValueType get type => ValueType.byte;

  VidByteValueElement(int val) : super(val) {
    value = val;
  }
}