int unwrapenum(const VALUE &arg, const std::string& name) { enumregistertype::iterator it = enumregister.find(name); if(it != enumregister.end()) { enumtype* etype = it->second; if(NIL_P(arg)) return etype->defaults; else if(RB_SYMBOL_P(arg)) { ID id(RB_SYM2ID(arg)); for(enumtype::value_type::iterator it2 = etype->values.begin(); it2 != etype->values.end(); ++it2) { if(it2->second == id) return it2->first; } rb_raise(rb_eTypeError,"%s is not a %s-Enum.",rb_id2name(id),etype->name.c_str()); }else if(rb_obj_is_kind_of(arg,rb_cArray) && etype->allow_array ) { int result = 0; size_t count = RARRAY_LEN(arg); for(size_t i = 0; i < count; ++i) result = result | unwrapenum(RARRAY_AREF(arg,i),name); }else return RB_NUM2INT(arg); } return 0; }
int unwrap_iconflag(const VALUE &val,int mask) { int result = unwrapenum(val,"icon_flag"); if((result & mask) != result) rb_raise(rb_eTypeError,"%" PRIsVALUE " is not a in %d mask", RB_OBJ_STRING(val), mask); return result; }
T unwrapenum(const VALUE &arg){ return (T)unwrapenum(arg,typeid(T).name()); }
int unwrap_buttonflag(const VALUE& val) { return unwrapenum(val,"button_flag"); }