]> git.sesse.net Git - vlc/commitdiff
Skins2: Reduce another macro to bare minimum and helper fuction.
authorJP Dinger <jpd@videolan.org>
Sun, 22 Nov 2009 12:41:51 +0000 (13:41 +0100)
committerJP Dinger <jpd@videolan.org>
Sat, 5 Dec 2009 21:25:42 +0000 (22:25 +0100)
modules/gui/skins2/parser/builder.cpp
modules/gui/skins2/parser/builder.hpp

index 3606f2a86d495c1168850c3dc7a05a38a8c8987a..b3f6ff4827e7a85c0fc8255594cdd96cd27e9412 100644 (file)
@@ -75,24 +75,23 @@ CmdGeneric *Builder::parseAction( const string &rAction )
     return Interpreter::instance( getIntf() )->parseAction( rAction, m_pTheme );
 }
 
-
-// Useful macro
-#define ADD_OBJECTS( type ) \
-    list<BuilderData::type>::const_iterator it##type; \
-    for( it##type = m_rData.m_list##type.begin(); \
-         it##type != m_rData.m_list##type.end(); it##type++ ) \
-    { \
-        add##type( *it##type ); \
-    }
-
+template<class T> inline
+void Builder::add_objects(const std::list<T> &list,
+                          void (Builder::*addfn)(const T &))
+{
+    typename std::list<T>::const_iterator i;
+    for( i = list.begin(); i != list.end(); ++i )
+        (this->*addfn)( *i );
+}
 
 Theme *Builder::build()
 {
-    m_pTheme = new Theme( getIntf() );
+#define ADD_OBJECTS( type ) \
+    add_objects(m_rData.m_list##type,&Builder::add##type)
+
+    m_pTheme = new (std::nothrow) Theme( getIntf() );
     if( m_pTheme == NULL )
-    {
         return NULL;
-    }
 
     // Create everything from the data in the XML
     ADD_OBJECTS( Theme );
@@ -123,6 +122,8 @@ Theme *Builder::build()
     ADD_OBJECTS( MenuSeparator );
 
     return m_pTheme;
+
+#undef  ADD_OBJECTS
 }
 
 
index c7e4b33a69c2fef32c34e5ba8503fc380455759f..09dfd1512c9450ab2ac662ea5e5d21eb81eab323 100644 (file)
@@ -91,6 +91,10 @@ private:
     void addTree( const BuilderData::Tree &rData );
     void addVideo( const BuilderData::Video &rData );
 
+    /// Helper for build(); gluing BuilderData::list<T>s to addType(T&)
+    template<class T> void add_objects(const std::list<T> &list,
+                                       void (Builder::*addfn)(const T &));
+
     /// Compute the position of a control
     const Position makePosition( const string &rLeftTop,
                                  const string &rRightBottom,