열거형 (enum)과 타입 별칭 (type alias)
Wave는 C와 유사한 명시적 타입 시스템을 유지하면서도, 가독성과 ABI 안정성을 위해 타입 별칭(type alias) 과 정수 기반 열거형(enum) 을 지원한다.
타입 별칭 (Type Alias)
개요
type 키워드는 기존 타입에 새로운 이름을 부여한다. 이는 새로운 타입을 만드는 것이 아니라, 완 전한 동치(alias) 이다.
type MyInt = i32;
위 선언에서 MyInt는 i32와 완전히 동일한 타입이다.
특징
- 런타임 오버헤드 없음
- 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의 enum은 정수 기반 열거형이다. 모든 열거형은 반드시 repr 타입을 가져야 한다.
enum ShaderUniformType -> i32 {
A = 0,
B,
C = 10,
D
}
repr 타입
-> i32 는 이 enum이 어떤 정수 타입으로 표현되는지를 나타낸다.
허용되는 repr 타입:
i8,i16,i32,i64u8,u16,u32,u64- 해당 타입의
type alias
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 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
}