如何创建一个获取枚举类型值的宏?

时间:2016-12-25 07:03:34

标签: enums macros rust

我的枚举看起来像这样:

#[derive(Clone, Debug)]
pub enum Type {
    GLnull,
    GLenum(GLenum),
    GLboolean(GLboolean),
    GLint(GLint),
    GLbyte(GLbyte),
    GLshort(GLshort),
    GLclampx(GLclampx),
    GLubyte(GLubyte),
    GLushort(GLushort),
    GLuint(GLuint),
    GLsizei(GLsizei),
    GLclampf(GLclampf),
    GLdouble(GLdouble),
    GLclampd(GLclampd),
    GLfloat_4fv((GLfloat, GLfloat, GLfloat, GLfloat)),
    GLfloat(GLfloat),
    GLintptr(GLintptr),
    GLsizeiptr(GLsizeiptr),
    GLbitfield(GLbitfield),
    GLchar_ptr(String),
}

macro_rules! get{
    ($e:expr) => {
        match $e {
            Type::GLsizei(x) => { x }
            Type::GLbitfield(x) => { x }
            _ => { 0 }
        }
    }
}

现在如何创建一个获取枚举类型值的宏?

2 个答案:

答案 0 :(得分:-1)

像@aochagavia一样,如果你必须用你的枚举做特定的事情,那就没有意义了。

以下宏可以帮助您,目的是创建一个创建枚举的宏并生成一些方法。这仅适用于所有变体都有一种类型的情况。

error.log

original宏来自@ koka-el-kiwi,我以此为例进行修改。

答案 1 :(得分:-2)

以下方法也可用

pub enum Type<T> {
    gli32(T),
    gli64(T),
    glfloat4fv(T),
    glString(T),
    glVec(T),
}

impl<T> Type<T> {
    pub fn unwarp(&self) -> &T {
        match *self {
            Type::gli32(ref x) => x,
            Type::gli64(ref x) => x,
            Type::glfloat4fv(ref x) => x,
            Type::glString(ref x) => x,
            Type::glVec(ref x) => x,
        }
    }
}

fn main() {
    println!("Hello, world!");
    let f = Type::gli32(32 as i32);
    let ff64 = Type::gli64((64, 32));
    let f4fv = Type::glfloat4fv((0.1, 0.2, 0.0));
    let cstr = Type::glString(CString::new("glstring").unwrap());
    let ve = [1, 2, 3, 5];
    let glve = Type::glVec(ve);

    println!("f ={} {:?} {:?} {:?}",
             f.unwarp(),
             f4fv.unwarp(),
             cstr.unwarp(),
             glve.unwarp());
}