پرش به مطلب اصلی

نمایشگرها (enum) و نام‌های دیگر نوع (type alias)

Wave همچنان یک سیستم نوع صریح شبیه C را حفظ می‌کند، و برای خوانایی بیشتر و استحکام سازگاری ABI از نام‌های دیگر نوع (type alias) و نمایشگرهای عددی (enum) حمایت می‌کند.


نام‌های دیگر نوع (Type Alias)

خلاصه

کلید واژه type نام جدیدی به یک نوع موجود اختصاص می‌دهد. این یک نوع جدید ایجاد نمی‌کند، بلکه به‌طور کامل یک نام دیگر (alias) است.

type MyInt = i32;

در اعلامیه بالا، MyInt کاملاً هم‌نوع با i32 است.


ویژگی‌ها

  • ندارد overhead زمان اجرا
  • تحت ABI کاملاً معادل است
  • فقط در زمان کامپایل وجود دارد
  • قابل استفاده به عنوان نوع نمایشگرها (enum repr)

نمونه استفاده

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
}

type یک نوع جدید نیست، بلکه فقط نامی متفاوت برای یک نوع است.


نمایشگرها (enum)

خلاصه

نمایشگرهای Wave بر اساس عدد صحیح هستند. همه نمایشگرها باید نوع نمایشگر (repr) داشته باشند.

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

نوع نمایشگر

-> i32 نشان می‌دهد که این نمایشگر به چه نوع عدد صحیحی ارائه می‌شود.

نوع‌های نمایشگر مجاز:

  • 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
}

نمایشگرها نوع عددی هستند

نمایشگرها مقادیری عددی هستند و می‌توان آن‌ها را به‌طور آزادانه به‌عنوان آرگومان یا مقدار برگشتی تابع به‌کار برد.

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

استفاده به‌عنوان ثابت

نمایشگرهای variant در زمان کامپایل به‌عنوان ثابت در نظر گرفته می‌شوند.

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
}