انتقل إلى المحتوى الرئيسي

أنواع التعداد (enum) واسم مستعار للنوع (type alias)

يحافظ Wave على نظام الأنواع الصريح المشابه لـ C، ويدعم الأسماء المستعارة للأنواع (type alias) وأنواع التعداد (enum) القائمة على الأعداد الصحيحة بهدف تحسين القابلية للقراءة والاستقرار الثنائي للتطبيق (ABI).


الأسماء المستعارة للأنواع (Type Alias)

نظرة عامة

تعطي الكلمة المفتاحية 'type' اسماً جديداً لنوع موجود. هذا ليس لإنشاء نوع جديد، بل هو اسم مستعار مطابق تمامًا.

type MyInt = i32;

في الإعلان أعلاه، MyInt هو نوع مطابق تمامًا لـ i32.


خصائص

  • بدون تكلفة إضافية في وقت التشغيل
  • مطابق تمامًا على مستوى واجهة التطبيق الثنائية (ABI)
  • موجود فقط في وقت التجميع
  • يمكن استخدامه كنوع مقدّم لـ enum

مثال على الاستخدام

type Size = i64;
type Index = u32;

fun add(a: Size, b: Size) -> Size {
return a + b;
}

مطابقة النوع

type A = i32;
type B = A;

fun f(x: i32) -> i32 { return x; }

fun main() {
var v: B = 10;
f(v); // OK
}

النوع ليس نوعًا جديدًا بل نوعًا بنفس الاسم.


أنواع التعداد (enum)

نظرة عامة

النوع enum في Wave يعتمد على الأعداد الصحيحة. يجب أن يحتوي كل نوع تعداد على نوع مقدّم (repr).

enum ShaderUniformType -> i32 {
A = 0,
B,
C = 10,
D
}

نوع مقدّم (repr)

-> i32 يوضح نوع العدد الصحيح الذي سيتم من خلاله تمثيل هذا التعداد.

أنواع المقدّم (repr) المسموح بها:

  • i8، i16، i32، i64
  • i8، i16، i32، i64
  • اسم مستعار للنوع المحدد
type MyInt = i32;

enum Example -> MyInt {
X,
Y
}

قواعد تخصيص القيم

  • إذا كان هناك قيمة صريحة، يتم استخدام هذه القيمة
  • إذا لم تكن هناك قيمة، فيتم استخدام القيمة السابقة + 1
  • إذا لم تكن هناك قيمة أولية، يبدأ من 0
enum E -> i32 {
A, // 0
B, // 1
C = 10, // 10
D // 11
}

النوع enum هو نوع القيمة

النوع enum يمثل قيمة عدد صحيح، ويمكن استخدامه بحرية كمعامل معاملات الدالة أو كقيمة عائدة.

fun f(t: ShaderUniformType) -> i32 {
return t;
}

الاستخدام كـ ثابت

النوع المتفاوت من enum هو ثابت في وقت التجميع.

const X: i32 = B;
const Y: ShaderUniformType = D;

مثال فعلي

type MyInt = i32;

enum ShaderUniformType -> MyInt {
A = 0,
B,
C = 10,
D
}

const X: MyInt = 123;
const Y: MyInt = B;
const Z: ShaderUniformType = D;

fun f(t: ShaderUniformType) -> MyInt {
return t;
}

fun g(v: MyInt) -> MyInt {
return v;
}

fun main() {
println("{}", f(A)); // 0
println("{}", f(B)); // 1
println("{}", f(C)); // 10
println("{}", f(D)); // 11

println("{}", g(X)); // 123
println("{}", g(Y)); // 1
println("{}", f(Z)); // 11
}