[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