]> git.mxchange.org Git - simgear.git/commitdiff
cppbind: Do not derive from SGReferenced if there is no need
authorThomas Geymayer <tomgey@gmail.com>
Wed, 12 Mar 2014 16:39:05 +0000 (17:39 +0100)
committerThomas Geymayer <tomgey@gmail.com>
Wed, 12 Mar 2014 16:40:21 +0000 (17:40 +0100)
simgear/nasal/cppbind/CMakeLists.txt
simgear/nasal/cppbind/Ghost.hxx
simgear/nasal/cppbind/NasalObjectHolder.cxx [deleted file]
simgear/nasal/cppbind/NasalObjectHolder.hxx
simgear/nasal/cppbind/detail/from_nasal_function_templates.hxx

index a139202ee855cf1b567d603bd49ab5c813e9a7e2..946d09d4c966bbbef5d62e2d97054e81facb44f2 100644 (file)
@@ -20,7 +20,6 @@ set(DETAIL_HEADERS
 
 set(SOURCES
   NasalHash.cxx
-  NasalObjectHolder.cxx
   NasalString.cxx
   detail/from_nasal_helper.cxx
   detail/to_nasal_helper.cxx
index 6bde867974dcc33e6c0f5ad67a8c1dcc5e2b31c9..a1d82b32919c5a033d17785050b139060d825709 100644 (file)
@@ -137,7 +137,7 @@ namespace nasal
         }
 
       protected:
-        ObjectHolder _obj;
+        ObjectHolder<> _obj;
 
         virtual naRef createNasalObject(naContext c) = 0;
     };
diff --git a/simgear/nasal/cppbind/NasalObjectHolder.cxx b/simgear/nasal/cppbind/NasalObjectHolder.cxx
deleted file mode 100644 (file)
index 45e929e..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-// Wrapper class for keeping Nasal objects save from the garbage collector
-//
-// Copyright (C) 2013  Thomas Geymayer <tomgey@gmail.com>
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Library General Public
-// License as published by the Free Software Foundation; either
-// version 2 of the License, or (at your option) any later version.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Library General Public License for more details.
-//
-// You should have received a copy of the GNU Library General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA
-
-#include "NasalObjectHolder.hxx"
-#include <simgear/nasal/nasal.h>
-
-namespace nasal
-{
-
-  //----------------------------------------------------------------------------
-  ObjectHolder::~ObjectHolder()
-  {
-    if( !naIsNil(_ref) )
-      naGCRelease(_gc_key);
-  }
-
-  //----------------------------------------------------------------------------
-  naRef ObjectHolder::get_naRef() const
-  {
-    return _ref;
-  }
-
-  //----------------------------------------------------------------------------
-  void ObjectHolder::reset()
-  {
-    if( !naIsNil(_ref) )
-      naGCRelease(_gc_key);
-
-    _ref = naNil();
-    _gc_key = 0;
-  }
-
-  //----------------------------------------------------------------------------
-  void ObjectHolder::reset(naRef obj)
-  {
-    if( !naIsNil(_ref) )
-      naGCRelease(_gc_key);
-
-    _ref = obj;
-    _gc_key = naGCSave(obj);
-  }
-
-  //----------------------------------------------------------------------------
-  bool ObjectHolder::valid() const
-  {
-    return !naIsNil(_ref);
-  }
-
-  //----------------------------------------------------------------------------
-  ObjectHolderRef ObjectHolder::makeShared(naRef obj)
-  {
-    return new ObjectHolder(obj);
-  }
-
-  //----------------------------------------------------------------------------
-  ObjectHolder::ObjectHolder(naRef obj):
-    _ref(obj),
-    _gc_key(0)
-  {
-    if( !naIsNil(obj) )
-      naGCSave(obj);
-  }
-
-  //----------------------------------------------------------------------------
-  ObjectHolder::ObjectHolder():
-    _ref(naNil()),
-    _gc_key(0)
-  {
-
-  }
-
-} // namespace nasal
index 94f94e05c04e059341bc59cc73410f67e64f22b1..f2db7704b9602e090441383e1d19cf020cf13ac2 100644 (file)
 #ifndef SG_NASAL_OBJECT_HOLDER_HXX_
 #define SG_NASAL_OBJECT_HOLDER_HXX_
 
-#include <simgear/nasal/naref.h>
+#include <simgear/nasal/nasal.h>
 #include <simgear/structure/SGSharedPtr.hxx>
 
 namespace nasal
 {
 
-  class ObjectHolder;
-  typedef SGSharedPtr<ObjectHolder> ObjectHolderRef;
+  /**
+   * Usable for example as empty base class if a base class is required.(Eg. as
+   * parameter for a mixin class).
+   */
+  struct empty_class {};
 
   /**
    * Prevent a Nasal object from being destroyed by the garbage collector during
    * the lifetime of this object.
    */
+  template<class Base = empty_class>
   class ObjectHolder:
-    public SGReferenced
+    public Base
   {
     public:
 
@@ -79,13 +83,84 @@ namespace nasal
        *
        * @param obj Object to save
        */
-      static ObjectHolderRef makeShared(naRef obj);
+      static SGSharedPtr<ObjectHolder<Base> > makeShared(naRef obj);
 
     protected:
       naRef _ref;
       int _gc_key;
   };
 
+  //----------------------------------------------------------------------------
+  template<class Base>
+  ObjectHolder<Base>::~ObjectHolder()
+  {
+    if( !naIsNil(_ref) )
+      naGCRelease(_gc_key);
+  }
+
+  //----------------------------------------------------------------------------
+  template<class Base>
+  naRef ObjectHolder<Base>::get_naRef() const
+  {
+    return _ref;
+  }
+
+  //----------------------------------------------------------------------------
+  template<class Base>
+  void ObjectHolder<Base>::reset()
+  {
+    if( !naIsNil(_ref) )
+      naGCRelease(_gc_key);
+
+    _ref = naNil();
+    _gc_key = 0;
+  }
+
+  //----------------------------------------------------------------------------
+  template<class Base>
+  void ObjectHolder<Base>::reset(naRef obj)
+  {
+    if( !naIsNil(_ref) )
+      naGCRelease(_gc_key);
+
+    _ref = obj;
+    _gc_key = naGCSave(obj);
+  }
+
+  //----------------------------------------------------------------------------
+  template<class Base>
+  bool ObjectHolder<Base>::valid() const
+  {
+    return !naIsNil(_ref);
+  }
+
+  //----------------------------------------------------------------------------
+  template<class Base>
+  ObjectHolder<Base>::ObjectHolder(naRef obj):
+    _ref(obj),
+    _gc_key(0)
+  {
+    if( !naIsNil(obj) )
+      naGCSave(obj);
+  }
+
+  //----------------------------------------------------------------------------
+  template<class Base>
+  ObjectHolder<Base>::ObjectHolder():
+    _ref(naNil()),
+    _gc_key(0)
+  {
+
+  }
+
+  //----------------------------------------------------------------------------
+  template<class Base>
+  SGSharedPtr<ObjectHolder<Base> >
+  ObjectHolder<Base>::makeShared(naRef obj)
+  {
+    return SGSharedPtr<ObjectHolder<Base> >( new ObjectHolder<SGReferenced>(obj) );
+  }
+
 } // namespace nasal
 
 #endif /* SG_NASAL_OBJECT_HOLDER_HXX_ */
index 324e524d3da797cf523b497d30b2a7ee806d95c5..e72adbf751131518b0cb9345d306227de8c3101c 100644 (file)
@@ -16,7 +16,7 @@
     BOOST_PP_ENUM_PARAMS(n, class A)
   >
   typename boost::disable_if<boost::is_void<Ret>, Ret>::type
-  callNasalFunction( const ObjectHolder* holder
+  callNasalFunction( const ObjectHolder<SGReferenced>* holder
                      BOOST_PP_COMMA_IF(n)
                      BOOST_PP_ENUM(n, SG_CALL_TRAITS_PARAM, 0)
                    )
@@ -42,7 +42,7 @@
     BOOST_PP_ENUM_PARAMS(n, class A)
   >
   typename boost::enable_if<boost::is_void<Ret>, Ret>::type
-  callNasalFunction( const ObjectHolder* holder
+  callNasalFunction( const ObjectHolder<SGReferenced>* holder
                      BOOST_PP_COMMA_IF(n)
                      BOOST_PP_ENUM(n, SG_CALL_TRAITS_PARAM, 0)
                    )
@@ -75,7 +75,7 @@
     return boost::bind
     (
       &callNasalFunction<Ret BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_PARAMS(n, A)>,
-      ObjectHolder::makeShared(code)
+      ObjectHolder<SGReferenced>::makeShared(code)
       BOOST_PP_COMMA_IF(n)
       BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_INC(n), _)
     );