[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdebindings/ruby
From: Richard Dale <Richard_Dale () tipitina ! demon ! co ! uk>
Date: 2008-11-24 15:34:08
Message-ID: 1227540848.972075.1726.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 888478 by rdale:
* Added a QMap<QString,KTimeZone> marshaller
* Added a DEF_MAP_MARSHALLER() macro for defining marshallers for
QMaps with QString keys and value types as the values
M +3 -0 korundum/ChangeLog
M +2 -109 korundum/src/kdehandlers.cpp
M +4 -0 qtruby/ChangeLog
M +86 -1 qtruby/src/marshall_macros.h
--- trunk/KDE/kdebindings/ruby/korundum/ChangeLog #888477:888478
@@ -1,3 +1,6 @@
+2008-11-24 Richard Dale <richard.j.dale@gmail.com>
+ * Added a QMap<QString,KTimeZone> marshaller
+
2008-10-21 Richard Dale <richard.j.dale@gmail.com>
* Special case the KDE::StandardAction.open method so it gets called and not
--- trunk/KDE/kdebindings/ruby/korundum/src/kdehandlers.cpp #888477:888478
@@ -282,115 +282,8 @@
DEF_VALUELIST_MARSHALLER( KUserList, QList<KUser>, KUser )
DEF_VALUELIST_MARSHALLER( QColorList, QList<QColor>, QColor )
-/*
-template <class Qt::Key, class Value, class ItemMapIterator, const char *KeySTR, \
const char *ValueSTR >
-void marshall_Map(Marshall *m) {
- switch(m->action()) {
- case Marshall::FromVALUE:
- {
- VALUE hash = *(m->var());
- if (TYPE(hash) != T_HASH) {
- m->item().s_voidp = 0;
- break;
- }
-
- QMap<Qt::Key,Value> * map = new QMap<Qt::Key,Value>;
-
- // Convert the ruby hash to an array of key/value arrays
- VALUE temp = rb_funcall(hash, rb_intern("to_a"), 0);
+DEF_MAP_MARSHALLER( QMapQStringKTimeZone, KTimeZone )
- for (long i = 0; i < RARRAY(temp)->len; i++) {
- VALUE key = rb_ary_entry(rb_ary_entry(temp, i), 0);
- VALUE value = rb_ary_entry(rb_ary_entry(temp, i), 1);
-
- smokeruby_object *o = value_obj_info(key);
- if( !o || !o->ptr)
- continue;
- void * key_ptr = o->ptr;
- key_ptr = o->smoke->cast(key_ptr, o->classId, o->smoke->idClass(KeySTR));
-
- o = value_obj_info(value);
- if( !o || !o->ptr)
- continue;
- void * val_ptr = o->ptr;
- val_ptr = o->smoke->cast(val_ptr, o->classId, o->smoke->idClass(ValueSTR));
-
- (*map)[(Qt::Key)*(Qt::Key*)key_ptr] = (Value)*(Value*)val_ptr;
- }
-
- m->item().s_voidp = map;
- m->next();
-
- if(m->cleanup())
- delete map;
- }
- break;
- case Marshall::ToVALUE:
- {
- QMap<Qt::Key,Value> *map = (QMap<Qt::Key,Value>*)m->item().s_voidp;
- if(!map) {
- *(m->var()) = Qnil;
- break;
- }
-
- VALUE hv = rb_hash_new();
-
- int key_ix = m->smoke()->idClass(KeySTR);
- const char * key_className = m->smoke()->binding->className(key_ix);
-
- int val_ix = m->smoke()->idClass(ValueSTR);
- const char * val_className = m->smoke()->binding->className(val_ix);
-
- ItemMapIterator it;
- for (it = map->begin(); it != map->end(); ++it) {
- void *key_p = new Key(it.key());
- VALUE key_obj = getPointerObject(key_p);
- smokeruby_object * o;
-
- if (key_obj == Qnil) {
- o = ALLOC(smokeruby_object);
- o->classId = m->smoke()->idClass(KeySTR);
- o->smoke = m->smoke();
- o->ptr = key_p;
- o->allocated = true;
- key_obj = set_obj_info(key_className, o);
- }
-
- void *val_p = new Value(it.data());
- VALUE value_obj = getPointerObject(val_p);
-
- if (value_obj == Qnil) {
- o = ALLOC(smokeruby_object);
- o->classId = m->smoke()->idClass(ValueSTR);
- o->smoke = m->smoke();
- o->ptr = val_p;
- o->allocated = true;
- value_obj = set_obj_info(val_className, o);
- }
-
- rb_hash_aset(hv, key_obj, value_obj);
- }
-
- *(m->var()) = hv;
- m->next();
-
- if(m->cleanup())
- delete map;
- }
- break;
- default:
- m->unsupported();
- break;
- }
-}
-
-#define DEF_MAP_MARSHALLER(MapIdent,Qt::Key,Value) namespace { char KeyIdent##STR[] \
= #Qt::Key; char ValueIdent##STR[] = #Value; } \
- Marshall::HandlerFn marshall_##MapIdent = marshall_Map<Qt::Key, \
Value,QMap<Qt::Key,Value>::Iterator,KeyIdent##STR, ValueIdent##STR>;
-
-DEF_MAP_MARSHALLER( QMapKEntryKeyKEntry, KEntryKey, KEntry )
-
-*/
-
TypeHandler KDE_handlers[] = {
{ "KFileItemList", marshall_KFileItemList },
{ "KFileItemList*", marshall_KFileItemList },
@@ -459,6 +352,6 @@
{ "QList<KXMLGUIClient*>&", marshall_KXMLGUIClientList },
{ "QList<QColor>", marshall_QColorList },
{ "QList<QColor>&", marshall_QColorList },
-
+ { "QMap<QString,KTimeZone>", marshall_QMapQStringKTimeZone },
{ 0, 0 }
};
--- trunk/KDE/kdebindings/ruby/qtruby/ChangeLog #888477:888478
@@ -1,3 +1,7 @@
+2008-11-24 Richard Dale <richard.j.dale@gmail.com>
+ * Added a DEF_MAP_MARSHALLER() macro for defining marshallers for
+ QMaps with QString keys and value types as the values
+
2008-11-17 Richard Dale <richard.j.dale@gmail.com>
* Comparisons between Qt instances and nil were causing QtRuby to
crash. Fixes bug reported by Stefano Crocco.
--- trunk/KDE/kdebindings/ruby/qtruby/src/marshall_macros.h #888477:888478
@@ -22,12 +22,17 @@
#include <QtCore/qlist.h>
#include <QtCore/qlinkedlist.h>
#include <QtCore/qvector.h>
+#include <QtCore/qhash.h>
+#include <QtCore/qmap.h>
#include "marshall.h"
#define DEF_HASH_MARSHALLER(HashIdent,Item) namespace { char HashIdent##STR[] = \
#Item; } \
Marshall::HandlerFn marshall_##HashIdent = \
marshall_Hash<Item,HashIdent##STR>;
+#define DEF_MAP_MARSHALLER(MapIdent,Item) namespace { char MapIdent##STR[] = #Item; \
} \ + Marshall::HandlerFn marshall_##MapIdent = \
marshall_Map<Item,MapIdent##STR>; +
#define DEF_LIST_MARSHALLER(ListIdent,ItemList,Item) namespace { char \
ListIdent##STR[] = #Item; } \
Marshall::HandlerFn marshall_##ListIdent = \
marshall_ItemList<Item,ItemList,ListIdent##STR>;
@@ -513,7 +518,7 @@
o->classId = m->smoke()->idClass(ValueSTR).index;
o->smoke = m->smoke();
o->ptr = val_p;
- o->allocated = true;
+ o->allocated = false;
value_obj = set_obj_info(val_className, o);
}
rb_hash_aset(hv, rb_str_new2(((QString*)&(it.key()))->toLatin1()), value_obj);
@@ -532,5 +537,85 @@
}
}
+template <class Value, const char *ValueSTR >
+void marshall_Map(Marshall *m) {
+ switch(m->action()) {
+ case Marshall::FromVALUE:
+ {
+ VALUE hv = *(m->var());
+ if (TYPE(hv) != T_HASH) {
+ m->item().s_voidp = 0;
+ break;
+ }
+
+ QMap<QString, Value> * map = new QMap<QString, Value>;
+
+ // Convert the ruby hash to an array of key/value arrays
+ VALUE temp = rb_funcall(hv, rb_intern("to_a"), 0);
+ for (long i = 0; i < RARRAY(temp)->len; i++) {
+ VALUE key = rb_ary_entry(rb_ary_entry(temp, i), 0);
+ VALUE value = rb_ary_entry(rb_ary_entry(temp, i), 1);
+
+ smokeruby_object *o = value_obj_info(value);
+ if (o == 0 || o->ptr == 0) {
+ continue;
+ }
+ void * val_ptr = o->ptr;
+ val_ptr = o->smoke->cast(val_ptr, o->classId, o->smoke->idClass(ValueSTR).index);
+
+ (*map)[QString(StringValuePtr(key))] = *((Value*)val_ptr);
+ }
+
+ m->item().s_voidp = map;
+ m->next();
+
+ if (m->cleanup()) {
+ delete map;
+ }
+ }
+ break;
+ case Marshall::ToVALUE:
+ {
+ QMap<QString, Value> *map = (QMap<QString, Value>*) m->item().s_voidp;
+ if (map == 0) {
+ *(m->var()) = Qnil;
+ break;
+ }
+
+ VALUE hv = rb_hash_new();
+
+ int val_ix = m->smoke()->idClass(ValueSTR).index;
+ const char * val_className = \
qtruby_modules[m->smoke()].binding->className(val_ix); + QMapIterator<QString, \
Value> it(*map); + while (it.hasNext()) {
+ it.next();
+ void *val_p = (void *) &(it.value());
+ VALUE value_obj = getPointerObject(val_p);
+
+ if (value_obj == Qnil) {
+ smokeruby_object *o = ALLOC(smokeruby_object);
+ o->classId = m->smoke()->idClass(ValueSTR).index;
+ o->smoke = m->smoke();
+ o->ptr = val_p;
+ o->allocated = false;
+ value_obj = set_obj_info(val_className, o);
+ }
+ rb_hash_aset(hv, rb_str_new2(((QString*)&(it.key()))->toLatin1()), value_obj);
+ }
+
+ *(m->var()) = hv;
+ m->next();
+
+ if (m->cleanup()) {
+ delete map;
+ }
+ }
+ break;
+ default:
+ m->unsupported();
+ break;
+ }
+}
+
#endif
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic