//////////////////////////////////////////////////////////// // // RubySFML - Ruby extension for the SFML library // Copyright (C) 2007 Sean O'Neil and Laurent Gomila // (sean.p.oneil@gmail.com and laurent.gom@gmail.com) // // This software is provided 'as-is', without any express or implied warranty. // In no event will the authors be held liable for any damages arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it freely, // subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; // you must not claim that you wrote the original software. // If you use this software in a product, an acknowledgment // in the product documentation would be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, // and must not be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source distribution. // //////////////////////////////////////////////////////////// #ifndef __ruby_helper_h__ #define __ruby_helper_h__ #define NOMINMAX #include #include #include #if defined(_WIN32) || defined(__WIN32__) #include #endif #include #if defined(_WIN32) || defined(__WIN32__) #define DECL __cdecl #else #define DECL __attribute__((cdecl)) #endif // Copies a string, makes the first character upper case, and then returns it inline std::string fupr(const char *p) { std::string str = p; str[0] = toupper(str[0]); return str; } #define IS(v, c) rb_obj_class(v) == c #define ISKO(v, c) rb_obj_is_kind_of(v, c) #define ISNUM(v) ISKO(v, rb_cNumeric) #define ISSTR(v) ISKO(v, rb_cString) #define DECLARE_PTR_VAR(MyClass, MyVar, expr)\ MyClass *p##MyVar = expr;\ VALUE v##MyVar = p##MyVar == NULL ? Qnil : Data_Wrap_Struct(g_c##MyClass, 0, 0, p##MyVar) #define DECLARE_OBJ_VAR(MyClass, MyVar, expr)\ VALUE v##MyVar = MyClass##_new(0, NOARGV, g_c##MyClass);\ MyClass *p##MyVar = NULL;\ Data_Get_Struct(v##MyVar, MyClass, p##MyVar);\ *p##MyVar = expr #define GET_OBJ_VAR(MyClass, MyVar)\ MyClass *p##MyVar = NULL;\ Data_Get_Struct(v##MyVar, MyClass, p##MyVar) #define DEFINE_CLASS_METHOD(MyClass, MyMethod, n)\ rb_define_singleton_method(g_c##MyClass, #MyMethod,\ (unsigned long (DECL *)(...))MyClass##_##MyMethod, n) #define DEFINE_CLASS_METHOD2(MyClass, MyMethod, RubyMethod, n)\ rb_define_singleton_method(g_c##MyClass, #RubyMethod,\ (unsigned long (DECL *)(...))MyClass##_##MyMethod, n) #define DEFINE_INSTANCE_METHOD(MyClass, MyMethod, n)\ rb_define_method(g_c##MyClass, #MyMethod,\ (unsigned long (DECL *)(...))MyClass##_##MyMethod, n) #define DEFINE_INSTANCE_METHOD2(MyClass, MyMethod, RubyMethod, n)\ rb_define_method(g_c##MyClass, #RubyMethod,\ (unsigned long (DECL *)(...))MyClass##_##MyMethod, n) // Use to define a standard getter method (for any type of member) // (Defines both obj.variableName and obj.getVariableName) #define DEFINE_GETTER(MyClass, MyField) \ rb_define_method(g_c##MyClass, #MyField, \ (unsigned long (DECL *)(...))MyClass##_get_##MyField, 0);\ rb_define_method(g_c##MyClass, (std::string("get")+fupr(#MyField)).c_str(), \ (unsigned long (DECL *)(...))MyClass##_get_##MyField, 0) // Use to define a standard setter method (for any type of member) // (Defines both obj.variableName = v and obj.setVariableName v) #define DEFINE_SETTER(MyClass, MyField) \ rb_define_method(g_c##MyClass, #MyField "=", \ (unsigned long (DECL *)(...))MyClass##_set_##MyField, 1);\ rb_define_method(g_c##MyClass, (std::string("set")+fupr(#MyField)).c_str(), \ (unsigned long (DECL *)(...))MyClass##_set_##MyField, 1) // Use to define standard getter and setter methods (for any type of member) #define DEFINE_RW(MyClass, MyField) \ DEFINE_GETTER(MyClass, MyField);\ DEFINE_SETTER(MyClass, MyField) // Use to define a standard getter method (for any type of member) // (Defines both obj.variableName and obj.getVariableName) #define DEFINE_GETTER2(MyClass, MyField, RubyField) \ rb_define_method(g_c##MyClass, #RubyField, \ (unsigned long (DECL *)(...))MyClass##_get_##MyField, 0);\ rb_define_method(g_c##MyClass, (std::string("get")+fupr(#RubyField)).c_str(), \ (unsigned long (DECL *)(...))MyClass##_get_##MyField, 0) // Use to define a standard setter method (for any type of member) // (Defines both obj.variableName = v and obj.setVariableName v) #define DEFINE_SETTER2(MyClass, MyField, RubyField) \ rb_define_method(g_c##MyClass, #RubyField "=", \ (unsigned long (DECL *)(...))MyClass##_set_##MyField, 1);\ rb_define_method(g_c##MyClass, (std::string("set")+fupr(#RubyField)).c_str(), \ (unsigned long (DECL *)(...))MyClass##_set_##MyField, 1) // Use to define standard getter and setter methods (for any type of member) #define DEFINE_RW2(MyClass, MyField, RubyField) \ DEFINE_GETTER2(MyClass, MyField, RubyField);\ DEFINE_SETTER2(MyClass, MyField, RubyField) // Use to define a static getter method (for any type of member) // (Defines both Class.variableName and Class.getVariableName) #define DEFINE_STATIC_GETTER(MyClass, MyField) \ rb_define_singleton_method(g_c##MyClass, #MyField, \ (unsigned long (DECL *)(...))MyClass##_get_##MyField, 0);\ rb_define_singleton_method(g_c##MyClass, (std::string("get")+fupr(#MyField)).c_str(), \ (unsigned long (DECL *)(...))MyClass##_get_##MyField, 0) // Use to define a static setter method (for any type of member) // (Defines both Class.variableName = v and Class.setVariableName v) #define DEFINE_STATIC_SETTER(MyClass, MyField) \ rb_define_singleton_method(g_c##MyClass, #MyField "=", \ (unsigned long (DECL *)(...))MyClass##_set_##MyField, 1);\ rb_define_singleton_method(g_c##MyClass, (std::string("set")+fupr(#MyField)).c_str(), \ (unsigned long (DECL *)(...))MyClass##_set_##MyField, 1) // Use to define static getter and setter methods (for any type of member) #define DEFINE_STATIC_RW(MyClass, MyField) \ DEFINE_STATIC_GETTER(MyClass, MyField);\ DEFINE_STATIC_SETTER(MyClass, MyField) #define DEFINE_MODULE_CONST(MyConst)\ rb_define_const(g_vModule, #MyConst, INT2FIX(MyConst)) #define DEFINE_MODULE_METHOD(MyMethod, RubyMethod, n)\ rb_define_singleton_method(g_vModule, #RubyMethod,\ (unsigned long (DECL *)(...))SFML_##MyMethod, n) #define DEFINE_INT_CONST(MyClass, MyConst)\ rb_define_const(g_c##MyClass, #MyConst, INT2FIX(MyClass::MyConst)) #define DEFINE_PTR_CONST(MyClass, MyConst, expr)\ rb_define_const(g_c##MyClass, #MyConst, Data_Wrap_Struct(g_c##MyClass, 0, 0, expr)) #define DECLARE_VOID_METHOD(MyClass, MyMethod)\ static VALUE MyClass##_##MyMethod(VALUE vSelf)\ {\ MyClass *ptr;\ Data_Get_Struct(vSelf, MyClass, ptr);\ ptr->MyMethod();\ return vSelf;\ }\ // Use to declare standard free, new, and init methods with 0 parameters #define DECLARE_FREE_NEW_INIT0(MyClass)\ static void MyClass##_free(void *p)\ {\ delete (MyClass *)p;\ }\ static VALUE MyClass##_new(VALUE vClass)\ {\ VALUE argv[1];\ MyClass *ptr = new MyClass;\ VALUE tData = Data_Wrap_Struct(vClass, 0, MyClass##_free, ptr);\ rb_obj_call_init(tData, 0, argv);\ return tData;\ }\ static VALUE MyClass##_initialize(VALUE vSelf)\ {\ return vSelf;\ } // Use to declare standard free and new methods with 1 parameter #define DECLARE_FREE_NEW1(MyClass)\ static void MyClass##_free(void *p)\ {\ delete (MyClass *)p;\ }\ static VALUE MyClass##_new(VALUE vClass, VALUE v1)\ {\ VALUE argv[1];\ argv[0] = v1;\ MyClass *ptr = new MyClass;\ VALUE tData = Data_Wrap_Struct(vClass, 0, MyClass##_free, ptr);\ rb_obj_call_init(tData, 1, argv);\ return tData;\ } // Use to define standard free, new, and init methods with n parameters // (Also declares a free method) #define DEFINE_CLASS_NEW_INIT(MyClass, n)\ g_c##MyClass = rb_define_class(#MyClass, rb_cObject);\ DEFINE_CLASS_METHOD(MyClass, new, n);\ DEFINE_INSTANCE_METHOD(MyClass, initialize, n); // Use to declare a standard getter method for a public int member #define DECLARE_INT_GETTER(MyClass, MyField)\ static VALUE MyClass##_get_##MyField(VALUE vSelf)\ {\ MyClass *ptr;\ Data_Get_Struct(vSelf, MyClass, ptr);\ return INT2NUM((int)ptr->MyField);\ } // Use to declare a static getter method for a public int member #define DECLARE_STATIC_INT_GETTER(MyClass, MyField)\ static VALUE MyClass##_get_##MyField(VALUE vClass)\ {\ return INT2NUM((int)MyClass::MyField);\ } // Use to declare a standard setter method for a public int member #define DECLARE_INT_SETTER(MyClass, MyField)\ static VALUE MyClass##_set_##MyField(VALUE vSelf, VALUE v)\ {\ MyClass *ptr;\ Data_Get_Struct(vSelf, MyClass, ptr);\ ptr->MyField = NUM2INT(v);\ return v;\ } // Use to declare a static setter method for a public int member #define DECLARE_STATIC_INT_SETTER(MyClass, MyField)\ static VALUE MyClass##_set_##MyField(VALUE vClass)\ {\ MyClass::MyField = NUM2INT(v);\ return v;\ } // Use to declare standard getter and setter methods for a public int member #define DECLARE_INT_RW(MyClass, MyField)\ DECLARE_INT_GETTER(MyClass, MyField)\ DECLARE_INT_SETTER(MyClass, MyField) // Use to declare static getter and setter methods for a public int member #define DECLARE_STATIC_INT_RW(MyClass, MyField)\ DECLARE_STATIC_INT_GETTER(MyClass, MyField)\ DECLARE_STATIC_INT_SETTER(MyClass, MyField) // Use to declare a standard setter method for a public enum member #define DECLARE_ENUM_SETTER(MyClass, MyField, EnumType)\ static VALUE MyClass##_set_##MyField(VALUE vSelf, VALUE v)\ {\ MyClass *ptr;\ Data_Get_Struct(vSelf, MyClass, ptr);\ ptr->MyField = (EnumType)NUM2INT(v);\ return v;\ } // Use to declare a standard setter method for a public enum member #define DECLARE_STATIC_ENUM_SETTER(MyClass, MyField, EnumType)\ static VALUE MyClass##_set_##MyField(VALUE vSelf, VALUE v)\ {\ MyClass::MyField = (EnumType)NUM2INT(v);\ return v;\ } // Use to declare standard getter and setter methods for a public enum member #define DECLARE_ENUM_RW(MyClass, MyField, EnumType)\ DECLARE_INT_GETTER(MyClass, MyField)\ DECLARE_ENUM_SETTER(MyClass, MyField, EnumType) // Use to declare standard getter and setter methods for a public enum member #define DECLARE_STATIC_ENUM_RW(MyClass, MyField, EnumType)\ DECLARE_STATIC_INT_GETTER(MyClass, MyField)\ DECLARE_STATIC_ENUM_SETTER(MyClass, MyField, EnumType) // Use to declare a standard getter method for a public bool member #define DECLARE_BOOL_GETTER(MyClass, MyField)\ static VALUE MyClass##_get_##MyField(VALUE vSelf)\ {\ MyClass *ptr;\ Data_Get_Struct(vSelf, MyClass, ptr);\ return ptr->MyField ? Qtrue : Qfalse;\ } // Use to declare a static getter method for a public bool member #define DECLARE_STATIC_BOOL_GETTER(MyClass, MyField)\ static VALUE MyClass##_get_##MyField(VALUE vClass)\ {\ return MyClass::MyField ? Qtrue : Qfalse;\ } // Use to declare a standard setter method for a public bool member #define DECLARE_BOOL_SETTER(MyClass, MyField)\ static VALUE MyClass##_set_##MyField(VALUE vSelf, VALUE v)\ {\ MyClass *ptr;\ Data_Get_Struct(vSelf, MyClass, ptr);\ ptr->MyField = RTEST(v) ? true : false;\ return v;\ } // Use to declare a static setter method for a public bool member #define DECLARE_STATIC_BOOL_SETTER(MyClass, MyField)\ static VALUE MyClass##_set_##MyField(VALUE vClass, VALUE v)\ {\ MyClass::MyField = RTEST(v) ? true : false;\ return v;\ } // Use to declare standard getter and setter methods for a public int member #define DECLARE_BOOL_RW(MyClass, MyField)\ DECLARE_BOOL_GETTER(MyClass, MyField)\ DECLARE_BOOL_SETTER(MyClass, MyField) // Use to declare standard getter and setter methods for a public int member #define DECLARE_STATIC_BOOL_RW(MyClass, MyField)\ DECLARE_STATIC_BOOL_GETTER(MyClass, MyField)\ DECLARE_STATIC_BOOL_SETTER(MyClass, MyField) // Use to declare a standard getter method for a public double member #define DECLARE_DOUBLE_GETTER(MyClass, MyField)\ static VALUE MyClass##_get_##MyField(VALUE vSelf)\ {\ MyClass *ptr;\ Data_Get_Struct(vSelf, MyClass, ptr);\ return rb_float_new((double)ptr->MyField);\ } // Use to declare a static getter method for a public double member #define DECLARE_STATIC_DOUBLE_GETTER(MyClass, MyField)\ static VALUE MyClass##_get_##MyField(VALUE vSelf)\ {\ return rb_float_new((double)MyClass::MyField);\ } // Use to declare a standard setter method for a public double member #define DECLARE_DOUBLE_SETTER(MyClass, MyField)\ static VALUE MyClass##_set_##MyField(VALUE vSelf, VALUE v)\ {\ MyClass *ptr;\ Data_Get_Struct(vSelf, MyClass, ptr);\ ptr->MyField = (float)NUM2DBL(v);\ return v;\ } // Use to declare a static setter method for a public double member #define DECLARE_STATIC_DOUBLE_SETTER(MyClass, MyField)\ static VALUE MyClass##_set_##MyField(VALUE vSelf, VALUE v)\ {\ MyClass::MyField = NUM2DBL(v);\ return v;\ } // Use to declare standard getter and setter methods for a public double member #define DECLARE_DOUBLE_RW(MyClass, MyField)\ DECLARE_DOUBLE_GETTER(MyClass, MyField)\ DECLARE_DOUBLE_SETTER(MyClass, MyField) // Use to declare standard getter and setter methods for a public double member #define DECLARE_STATIC_DOUBLE_RW(MyClass, MyField)\ DECLARE_DOUBLE_STATIC_GETTER(MyClass, MyField)\ DECLARE_DOUBLE_STATIC_SETTER(MyClass, MyField) // Use to declare a standard getter method for a public std::string member #define DECLARE_STRING_GETTER(MyClass, MyField)\ static VALUE MyClass##_get_##MyField(VALUE vSelf)\ {\ MyClass *ptr;\ Data_Get_Struct(vSelf, MyClass, ptr);\ return rb_str_new2(ptr->MyField.c_str());\ } // Use to declare a static getter method for a public std::string member #define DECLARE_STATIC_STRING_GETTER(MyClass, MyField)\ static VALUE MyClass##_get_##MyField(VALUE vSelf)\ {\ return rb_str_new2(MyClass::MyField.c_str());\ } // Use to declare a standard setter method for a public std::string member #define DECLARE_STRING_SETTER(MyClass, MyField)\ static VALUE MyClass##_set_##MyField(VALUE vSelf, VALUE v)\ {\ MyClass *ptr;\ Data_Get_Struct(vSelf, MyClass, ptr);\ ptr->MyField = STR2CSTR(v);\ return v;\ } // Use to declare a static setter method for a public std::string member #define DECLARE_STATIC_STRING_SETTER(MyClass, MyField)\ static VALUE MyClass##_set_##MyField(VALUE vSelf, VALUE v)\ {\ MyClass::MyField = STR2CSTR(v);\ return v;\ } // Use to declare standard getter and setter methods for a public std::string member #define DECLARE_STRING_RW(MyClass, MyField)\ DECLARE_STRING_GETTER(MyClass, MyField)\ DECLARE_STRING_SETTER(MyClass, MyField) // Use to declare standard getter and setter methods for a public int member #define DECLARE_STATIC_STRING_RW(MyClass, MyField)\ DECLARE_STATIC_STRING_GETTER(MyClass, MyField)\ DECLARE_STATIC_STRING_SETTER(MyClass, MyField) // Use to declare a standard getter method for a public short member #define DECLARE_SHORT_GETTER(MyClass, MyField)\ static VALUE MyClass##_get_##MyField(VALUE vSelf)\ {\ MyClass *ptr;\ Data_Get_Struct(vSelf, MyClass, ptr);\ return INT2FIX((int)ptr->MyField);\ } // Use to declare a standard getter method for a public short member #define DECLARE_STATIC_SHORT_GETTER(MyClass, MyField)\ static VALUE MyClass##_get_##MyField(VALUE vSelf)\ {\ return INT2FIX((int)MyClass->MyField);\ } // Use to declare a standard setter method for a public short member #define DECLARE_SHORT_SETTER(MyClass, MyField)\ static VALUE MyClass##_set_##MyField(VALUE vSelf, VALUE v)\ {\ MyClass *ptr;\ Data_Get_Struct(vSelf, MyClass, ptr);\ ptr->MyField = (short)FIX2INT(v);\ return v;\ } // Use to declare a standard setter method for a public short member #define DECLARE_STATIC_SHORT_SETTER(MyClass, MyField)\ static VALUE MyClass##_set_##MyField(VALUE vSelf, VALUE v)\ {\ MyClass::MyField = (short)FIX2INT(v);\ return v;\ } // Use to declare standard getter and setter methods for a public short member #define DECLARE_SHORT_RW(MyClass, MyField)\ DECLARE_SHORT_GETTER(MyClass, MyField)\ DECLARE_SHORT_SETTER(MyClass, MyField) // Use to declare standard getter and setter methods for a public short member #define DECLARE_STATIC_SHORT_RW(MyClass, MyField)\ DECLARE_STATIC_SHORT_GETTER(MyClass, MyField)\ DECLARE_STATIC_SHORT_SETTER(MyClass, MyField) // Use to declare a standard getter method for a public object member #define DECLARE_OBJ_GETTER(MyClass, MyField, FieldType)\ static VALUE MyClass##_get_##MyField(VALUE vSelf)\ {\ MyClass *pSelf;\ Data_Get_Struct(vSelf, MyClass, pSelf);\ VALUE vRet = FieldType##_new(0, NOARGV, g_c##FieldType);\ FieldType *pRet;\ Data_Get_Struct(vRet, FieldType, pRet);\ *pRet = pSelf->MyField;\ return vRet;\ } // Use to declare a static getter method for a public object member #define DECLARE_STATIC_OBJ_GETTER(MyClass, MyField, FieldType)\ static VALUE MyClass##_get_##MyField(VALUE vSelf)\ {\ VALUE vRet = FieldType##_new(0, NOARGV, g_c##FieldType);\ FieldType *pRet;\ Data_Get_Struct(vRet, FieldType, pRet);\ *pRet = MyClass::MyField;\ return vRet;\ } // Use to declare a standard setter method for a public object member #define DECLARE_OBJ_SETTER(MyClass, MyField, FieldType)\ static VALUE MyClass##_set_##MyField(VALUE vSelf, VALUE v)\ {\ MyClass *pSelf;\ Data_Get_Struct(vSelf, MyClass, pSelf);\ FieldType *pV;\ Data_Get_Struct(v, FieldType, pV);\ pSelf->MyField = *pV;\ return Qnil;\ } // Use to declare a static setter method for a public object member #define DECLARE_STATIC_OBJ_SETTER(MyClass, MyField, FieldType)\ static VALUE MyClass##_set_##MyField(VALUE vClass, VALUE v)\ {\ FieldType *pV;\ Data_Get_Struct(v, FieldType, pV);\ MyClass::MyField = *pV;\ return Qnil;\ } // Use to declare standard getter and setter methods for a public object member #define DECLARE_OBJ_RW(MyClass, MyField, FieldType)\ DECLARE_OBJ_GETTER(MyClass, MyField, FieldType)\ DECLARE_OBJ_SETTER(MyClass, MyField, FieldType) // Use to declare static getter and setter methods for a public object member #define DECLARE_STATIC_OBJ_RW(MyClass, MyField, FieldType)\ DECLARE_STATIC_OBJ_GETTER(MyClass, MyField, FieldType)\ DECLARE_STATIC_OBJ_SETTER(MyClass, MyField, FieldType) // Use to declare a standard getter method for a public unsigned short member #define DECLARE_USHORT_GETTER(MyClass, MyField)\ static VALUE MyClass##_get_##MyField(VALUE vSelf)\ {\ MyClass *ptr;\ Data_Get_Struct(vSelf, MyClass, ptr);\ return INT2FIX((int)ptr->MyField);\ } // Use to declare a standard getter method for a public unsigned short member #define DECLARE_STATIC_USHORT_GETTER(MyClass, MyField)\ static VALUE MyClass##_get_##MyField(VALUE vSelf)\ {\ return INT2FIX((int)MyClass->MyField);\ } // Use to declare a standard setter method for a public unsigned short member #define DECLARE_USHORT_SETTER(MyClass, MyField)\ static VALUE MyClass##_set_##MyField(VALUE vSelf, VALUE v)\ {\ MyClass *ptr;\ Data_Get_Struct(vSelf, MyClass, ptr);\ ptr->MyField = (unsigned short)FIX2INT(v);\ return v;\ } // Use to declare a standard setter method for a public unsigned short member #define DECLARE_STATIC_USHORT_SETTER(MyClass, MyField)\ static VALUE MyClass##_set_##MyField(VALUE vSelf, VALUE v)\ {\ MyClass::MyField = (unsigned short)FIX2INT(v);\ return v;\ } // Use to declare standard getter and setter methods for a public unsigned short member #define DECLARE_USHORT_RW(MyClass, MyField)\ DECLARE_USHORT_GETTER(MyClass, MyField)\ DECLARE_USHORT_SETTER(MyClass, MyField) // Use to declare standard getter and setter methods for a public unsigned short member #define DECLARE_STATIC_USHORT_RW(MyClass, MyField)\ DECLARE_STATIC_USHORT_GETTER(MyClass, MyField)\ DECLARE_STATIC_USHORT_SETTER(MyClass, MyField) // Use to declare a standard getter method for a public unsigned char member #define DECLARE_UCHAR_GETTER(MyClass, MyField)\ static VALUE MyClass##_get_##MyField(VALUE vSelf)\ {\ MyClass *ptr;\ Data_Get_Struct(vSelf, MyClass, ptr);\ return INT2FIX((int)ptr->MyField);\ } // Use to declare a standard getter method for a public unsigned char member #define DECLARE_STATIC_UCHAR_GETTER(MyClass, MyField)\ static VALUE MyClass##_get_##MyField(VALUE vSelf)\ {\ return INT2FIX((int)MyClass->MyField);\ } // Use to declare a standard setter method for a public unsigned char member #define DECLARE_UCHAR_SETTER(MyClass, MyField)\ static VALUE MyClass##_set_##MyField(VALUE vSelf, VALUE v)\ {\ MyClass *ptr;\ Data_Get_Struct(vSelf, MyClass, ptr);\ ptr->MyField = (unsigned char)FIX2INT(v);\ return v;\ } // Use to declare a standard setter method for a public unsigned char member #define DECLARE_STATIC_UCHAR_SETTER(MyClass, MyField)\ static VALUE MyClass##_set_##MyField(VALUE vSelf, VALUE v)\ {\ MyClass::MyField = (unsigned char)FIX2INT(v);\ return v;\ } // Use to declare standard getter and setter methods for a public unsigned char member #define DECLARE_UCHAR_RW(MyClass, MyField)\ DECLARE_UCHAR_GETTER(MyClass, MyField)\ DECLARE_UCHAR_SETTER(MyClass, MyField) // Use to declare standard getter and setter methods for a public unsigned char member #define DECLARE_STATIC_UCHAR_RW(MyClass, MyField)\ DECLARE_STATIC_UCHAR_GETTER(MyClass, MyField)\ DECLARE_STATIC_UCHAR_SETTER(MyClass, MyField) // Use to declare a standard getter method for a public char member #define DECLARE_CHAR_GETTER(MyClass, MyField)\ static VALUE MyClass##_get_##MyField(VALUE vSelf)\ {\ MyClass *ptr;\ Data_Get_Struct(vSelf, MyClass, ptr);\ return INT2FIX((int)ptr->MyField);\ } // Use to declare a standard getter method for a public char member #define DECLARE_STATIC_CHAR_GETTER(MyClass, MyField)\ static VALUE MyClass##_get_##MyField(VALUE vSelf)\ {\ return INT2FIX((int)MyClass->MyField);\ } // Use to declare a standard setter method for a public char member #define DECLARE_CHAR_SETTER(MyClass, MyField)\ static VALUE MyClass##_set_##MyField(VALUE vSelf, VALUE v)\ {\ MyClass *ptr;\ Data_Get_Struct(vSelf, MyClass, ptr);\ ptr->MyField = (char)FIX2INT(v);\ return v;\ } // Use to declare a standard setter method for a public char member #define DECLARE_STATIC_CHAR_SETTER(MyClass, MyField)\ static VALUE MyClass##_set_##MyField(VALUE vSelf, VALUE v)\ {\ MyClass::MyField = (char)FIX2INT(v);\ return v;\ } // Use to declare standard getter and setter methods for a public char member #define DECLARE_CHAR_RW(MyClass, MyField)\ DECLARE_CHAR_GETTER(MyClass, MyField)\ DECLARE_CHAR_SETTER(MyClass, MyField) // Use to declare standard getter and setter methods for a public char member #define DECLARE_STATIC_CHAR_RW(MyClass, MyField)\ DECLARE_STATIC_CHAR_GETTER(MyClass, MyField)\ DECLARE_STATIC_CHAR_SETTER(MyClass, MyField) // Use to declare a standard getter method for a public int64 member #define DECLARE_INT64_GETTER(MyClass, MyField)\ static VALUE MyClass##_get_##MyField(VALUE vSelf)\ {\ MyClass *ptr;\ Data_Get_Struct(vSelf, MyClass, ptr);\ return LL2NUM(ptr->MyField);\ } // Use to declare a static getter method for a public int64 member #define DECLARE_STATIC_INT64_GETTER(MyClass, MyField)\ static VALUE MyClass##_get_##MyField(VALUE vClass)\ {\ return LL2NUM(MyClass::MyField);\ } // Use to declare a standard setter method for a public int64 member #define DECLARE_INT64_SETTER(MyClass, MyField)\ static VALUE MyClass##_set_##MyField(VALUE vSelf, VALUE v)\ {\ MyClass *ptr;\ Data_Get_Struct(vSelf, MyClass, ptr);\ ptr->MyField = NUM2LL(v);\ return v;\ } // Use to declare a static setter method for a public int64 member #define DECLARE_STATIC_INT64_SETTER(MyClass, MyField)\ static VALUE MyClass##_set_##MyField(VALUE vClass)\ {\ MyClass::MyField = NUM2LL(v);\ return v;\ } // Use to declare standard getter and setter methods for a public int64 member #define DECLARE_INT64_RW(MyClass, MyField)\ DECLARE_INT64_GETTER(MyClass, MyField)\ DECLARE_INT64_SETTER(MyClass, MyField) // Use to declare static getter and setter methods for a public int64 member #define DECLARE_STATIC_INT64_RW(MyClass, MyField)\ DECLARE_STATIC_INT64_GETTER(MyClass, MyField)\ DECLARE_STATIC_INT64_SETTER(MyClass, MyField) // Use to declare a standard getter method for a public uint64 member #define DECLARE_UINT64_GETTER(MyClass, MyField)\ static VALUE MyClass##_get_##MyField(VALUE vSelf)\ {\ MyClass *ptr;\ Data_Get_Struct(vSelf, MyClass, ptr);\ return ULL2NUM(ptr->MyField);\ } // Use to declare a static getter method for a public uint64 member #define DECLARE_STATIC_UINT64_GETTER(MyClass, MyField)\ static VALUE MyClass##_get_##MyField(VALUE vClass)\ {\ return ULL2NUM(MyClass::MyField);\ } // Use to declare a standard setter method for a public uint64 member #define DECLARE_UINT64_SETTER(MyClass, MyField)\ static VALUE MyClass##_set_##MyField(VALUE vSelf, VALUE v)\ {\ MyClass *ptr;\ Data_Get_Struct(vSelf, MyClass, ptr);\ ptr->MyField = NUM2ULL(v);\ return v;\ } // Use to declare a static setter method for a public uint64 member #define DECLARE_USTATIC_INT64_SETTER(MyClass, MyField)\ static VALUE MyClass##_set_##MyField(VALUE vClass)\ {\ MyClass::MyField = NUM2ULL(v);\ return v;\ } // Use to declare standard getter and setter methods for a public uint64 member #define DECLARE_UINT64_RW(MyClass, MyField)\ DECLARE_UINT64_GETTER(MyClass, MyField)\ DECLARE_UINT64_SETTER(MyClass, MyField) // Use to declare static getter and setter methods for a public uint64 member #define DECLARE_STATIC_UINT64_RW(MyClass, MyField)\ DECLARE_STATIC_UINT64_GETTER(MyClass, MyField)\ DECLARE_STATIC_UINT64_SETTER(MyClass, MyField) #define DECLARE_INT_ARR_GETTER(MyClass, MyField, Size)\ static VALUE MyClass##_get_##MyField(VALUE vSelf)\ {\ MyClass *pSelf;\ Data_Get_Struct(vSelf, MyClass, pSelf);\ VALUE v = rb_ary_new();\ for(int i=0; iMyField[i]));\ return v;\ } #define DECLARE_INT_ARR_SETTER(MyClass, MyField, Size)\ static VALUE MyClass##_set_##MyField(VALUE vSelf, VALUE v)\ {\ MyClass *pSelf;\ Data_Get_Struct(vSelf, MyClass, pSelf);\ for(int i=0; iMyField[i] = FIX2INT(rb_ary_entry(v, i));\ return v;\ } #define DECLARE_INT_ARR_RW(MyClass, MyField, Size)\ DECLARE_INT_ARR_GETTER(MyClass, MyField, Size);\ DECLARE_INT_ARR_SETTER(MyClass, MyField, Size) #define DECLARE_DOUBLE_ARR_GETTER(MyClass, MyField, Size)\ static VALUE MyClass##_get_##MyField(VALUE vSelf)\ {\ MyClass *pSelf;\ Data_Get_Struct(vSelf, MyClass, pSelf);\ VALUE v = rb_ary_new();\ for(int i=0; iMyField[i]));\ return v;\ } #define DECLARE_DOUBLE_ARR_SETTER(MyClass, MyField, Size)\ static VALUE MyClass##_set_##MyField(VALUE vSelf, VALUE v)\ {\ MyClass *pSelf;\ Data_Get_Struct(vSelf, MyClass, pSelf);\ for(int i=0; iMyField[i] = NUM2DBL(rb_ary_entry(v, i));\ return v;\ } #define DECLARE_DOUBLE_ARR_RW(MyClass, MyField, Size)\ DECLARE_DOUBLE_ARR_GETTER(MyClass, MyField, Size);\ DECLARE_DOUBLE_ARR_SETTER(MyClass, MyField, Size) #define DECLARE_ADDR_GETTER(MyClass, MyField, FieldType)\ static VALUE MyClass##_get_##MyField(VALUE vSelf)\ {\ MyClass *pSelf;\ Data_Get_Struct(vSelf, MyClass, pSelf);\ VALUE vRet = Data_Wrap_Struct(g_c##FieldType, 0, 0, &pSelf->MyField);\ return vRet;\ } // Use to declare a standard getter method for a public object pointer member #define DECLARE_PTR_GETTER(MyClass, MyField, FieldType)\ static VALUE MyClass##_get_##MyField(VALUE vSelf)\ {\ MyClass *pSelf;\ Data_Get_Struct(vSelf, MyClass, pSelf);\ VALUE vRet = Data_Wrap_Struct(g_c##FieldType, 0, 0, pSelf->MyField);\ return vRet;\ } // Use to declare a standard getter method for a public object reference member #define DECLARE_REF_GETTER(MyClass, MyField, FieldType)\ static VALUE MyClass##_get_##MyField(VALUE vSelf)\ {\ MyClass *pSelf;\ Data_Get_Struct(vSelf, MyClass, pSelf);\ pSelf->MyField->ReferenceCountedObject_refCount.increment();\ VALUE vRet = Data_Wrap_Struct(g_c##FieldType, 0, FieldType##_free, pSelf->MyField.pointer());\ return vRet;\ } // Use to declare a standard setter method for a public object reference member #define DECLARE_REF_SETTER(MyClass, MyField, FieldType)\ static VALUE MyClass##_set_##MyField(VALUE vSelf, VALUE v)\ {\ MyClass *pSelf;\ Data_Get_Struct(vSelf, MyClass, pSelf);\ FieldType *pV;\ Data_Get_Struct(v, FieldType, pV);\ pSelf->MyField = pV;\ return Qnil;\ } // Use to declare standard getter and setter methods for a public object member #define DECLARE_REF_RW(MyClass, MyField, FieldType)\ DECLARE_REF_GETTER(MyClass, MyField, FieldType)\ DECLARE_REF_SETTER(MyClass, MyField, FieldType) #endif // __ruby_helper_h__