Kolja Strohm 3 years ago
parent
commit
eaeae130e5
4 changed files with 17 additions and 11 deletions
  1. 3 3
      Bildschirm.cpp
  2. 2 2
      ReferenceCounter.cpp
  3. 8 2
      ReferenceCounter.h
  4. 4 4
      UIMLView.cpp

+ 3 - 3
Bildschirm.cpp

@@ -272,7 +272,7 @@ bool Bildschirm::removeToolTip( ToolTip *zTip ) // entfernt ToolTip
 // constant 
 Bild *Bildschirm::getRenderBild() const
 {
-    return (Bild *)api->zUIRenderBild()->getThis();
+    return api->zUIRenderBild()->getThis()->as<Bild>();
 }
 
 Bild *Bildschirm::zRenderBild() const
@@ -323,7 +323,7 @@ GraphicsApi *Bildschirm::zGraphicsApi() const
 // Gibt die Grafik API zurück
 GraphicsApi *Bildschirm::getGraphicsApi() const
 {
-    return api ? (GraphicsApi *)api->getThis() : 0;
+    return api ? api->getThis()->as<GraphicsApi>() : 0;
 }
 
 #ifdef WIN32
@@ -371,7 +371,7 @@ Bildschirm2D::Bildschirm2D( WFenster *fenster )
     : Bildschirm( fenster )
 {
     api = new DirectX9();
-    api->initialize( (WFenster *)fenster->getThis(), fenster->getKörperGröße(), 0 );
+    api->initialize( fenster->getThis()->as<WFenster>(), fenster->getKörperGröße(), 0 );
 }
 
 // Destruktor 

+ 2 - 2
ReferenceCounter.cpp

@@ -10,13 +10,13 @@ ReferenceCounter::ReferenceCounter()
 
 ReferenceCounter::~ReferenceCounter() {}
 
-void *ReferenceCounter::getThis()
+ReferenceCounter *ReferenceCounter::getThis()
 {
     ref++;
     return this;
 }
 
-void *ReferenceCounter::release()
+ReferenceCounter *ReferenceCounter::release()
 {
     if( !--ref )
         delete this;

+ 8 - 2
ReferenceCounter.h

@@ -13,7 +13,13 @@ namespace Framework
         DLLEXPORT ReferenceCounter();
         DLLEXPORT virtual ~ReferenceCounter();
 
-        DLLEXPORT void *getThis();
-        DLLEXPORT void *release();
+        DLLEXPORT ReferenceCounter *getThis();
+        DLLEXPORT ReferenceCounter *release();
+
+        template<typename T>
+        inline T *as() const
+        {
+            return dynamic_cast<T>( this )
+        }
     };
 }

+ 4 - 4
UIMLView.cpp

@@ -120,7 +120,7 @@ void UIMLView::parseTable( Iterator<XML::Element *> childs, ObjTabelle *table )
                 if( table->getSpaltenAnzahl() < c )
                     table->addSpalte( Text( c - 1 ) );
                 if( z )
-                    table->setZeichnungZ( (char *)Text( c - 1 ), (char *)line, (Zeichnung *)z->getThis() );
+                    table->setZeichnungZ( (char *)Text( c - 1 ), (char *)line, z->getThis()->as<Zeichnung>() );
                 c++;
             }
         }
@@ -133,7 +133,7 @@ void UIMLView::parseFrame( Iterator<XML::Element *> childs, Fenster *frame )
     {
         Zeichnung *z = parseElement( i._ );
         if( z )
-            frame->addMember( (Zeichnung *)z->getThis() );
+            frame->addMember( z->getThis()->as<Zeichnung>() );
     }
 }
 
@@ -537,7 +537,7 @@ Text UIMLView::addMember( Text uiml, Text parentId )
                 Zeichnung *z = parseElement( e );
                 if( z )
                 {
-                    ( (Fenster *)members->z( parentId ) )->addMember( (Zeichnung *)z->getThis() );
+                    ( (Fenster *)members->z( parentId ) )->addMember( z->getThis()->as<Zeichnung>() );
                     ed2.getIterator()->addChild( e );
                 }
                 return e->getAttributeValue( "id" );
@@ -626,5 +626,5 @@ XML::Element *UIMLView::zDom() const
 // Änderungen am Dom Tree sollten vermieden werden (nur änderungen von attributen einzelner elemente sind erlaubt)
 XML::Element *UIMLView::getDom() const
 {
-    return dom ? (XML::Element *)dom->getThis() : 0;
+    return dom ? dom->getThis()->as<XML::Element>() : 0;
 }