From c851c449dad11e6d1050caca4379b9496f442420 Mon Sep 17 00:00:00 2001 From: Thomas Geymayer Date: Wed, 12 Mar 2014 17:39:05 +0100 Subject: [PATCH] cppbind: Do not derive from SGReferenced if there is no need --- simgear/nasal/cppbind/CMakeLists.txt | 1 - simgear/nasal/cppbind/Ghost.hxx | 2 +- simgear/nasal/cppbind/NasalObjectHolder.cxx | 87 ------------------- simgear/nasal/cppbind/NasalObjectHolder.hxx | 85 ++++++++++++++++-- .../detail/from_nasal_function_templates.hxx | 6 +- 5 files changed, 84 insertions(+), 97 deletions(-) delete mode 100644 simgear/nasal/cppbind/NasalObjectHolder.cxx diff --git a/simgear/nasal/cppbind/CMakeLists.txt b/simgear/nasal/cppbind/CMakeLists.txt index a139202e..946d09d4 100644 --- a/simgear/nasal/cppbind/CMakeLists.txt +++ b/simgear/nasal/cppbind/CMakeLists.txt @@ -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 diff --git a/simgear/nasal/cppbind/Ghost.hxx b/simgear/nasal/cppbind/Ghost.hxx index 6bde8679..a1d82b32 100644 --- a/simgear/nasal/cppbind/Ghost.hxx +++ b/simgear/nasal/cppbind/Ghost.hxx @@ -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 index 45e929ec..00000000 --- a/simgear/nasal/cppbind/NasalObjectHolder.cxx +++ /dev/null @@ -1,87 +0,0 @@ -// Wrapper class for keeping Nasal objects save from the garbage collector -// -// Copyright (C) 2013 Thomas Geymayer -// -// 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 - -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 diff --git a/simgear/nasal/cppbind/NasalObjectHolder.hxx b/simgear/nasal/cppbind/NasalObjectHolder.hxx index 94f94e05..f2db7704 100644 --- a/simgear/nasal/cppbind/NasalObjectHolder.hxx +++ b/simgear/nasal/cppbind/NasalObjectHolder.hxx @@ -19,21 +19,25 @@ #ifndef SG_NASAL_OBJECT_HOLDER_HXX_ #define SG_NASAL_OBJECT_HOLDER_HXX_ -#include +#include #include namespace nasal { - class ObjectHolder; - typedef SGSharedPtr 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 ObjectHolder: - public SGReferenced + public Base { public: @@ -79,13 +83,84 @@ namespace nasal * * @param obj Object to save */ - static ObjectHolderRef makeShared(naRef obj); + static SGSharedPtr > makeShared(naRef obj); protected: naRef _ref; int _gc_key; }; + //---------------------------------------------------------------------------- + template + ObjectHolder::~ObjectHolder() + { + if( !naIsNil(_ref) ) + naGCRelease(_gc_key); + } + + //---------------------------------------------------------------------------- + template + naRef ObjectHolder::get_naRef() const + { + return _ref; + } + + //---------------------------------------------------------------------------- + template + void ObjectHolder::reset() + { + if( !naIsNil(_ref) ) + naGCRelease(_gc_key); + + _ref = naNil(); + _gc_key = 0; + } + + //---------------------------------------------------------------------------- + template + void ObjectHolder::reset(naRef obj) + { + if( !naIsNil(_ref) ) + naGCRelease(_gc_key); + + _ref = obj; + _gc_key = naGCSave(obj); + } + + //---------------------------------------------------------------------------- + template + bool ObjectHolder::valid() const + { + return !naIsNil(_ref); + } + + //---------------------------------------------------------------------------- + template + ObjectHolder::ObjectHolder(naRef obj): + _ref(obj), + _gc_key(0) + { + if( !naIsNil(obj) ) + naGCSave(obj); + } + + //---------------------------------------------------------------------------- + template + ObjectHolder::ObjectHolder(): + _ref(naNil()), + _gc_key(0) + { + + } + + //---------------------------------------------------------------------------- + template + SGSharedPtr > + ObjectHolder::makeShared(naRef obj) + { + return SGSharedPtr >( new ObjectHolder(obj) ); + } + } // namespace nasal #endif /* SG_NASAL_OBJECT_HOLDER_HXX_ */ diff --git a/simgear/nasal/cppbind/detail/from_nasal_function_templates.hxx b/simgear/nasal/cppbind/detail/from_nasal_function_templates.hxx index 324e524d..e72adbf7 100644 --- a/simgear/nasal/cppbind/detail/from_nasal_function_templates.hxx +++ b/simgear/nasal/cppbind/detail/from_nasal_function_templates.hxx @@ -16,7 +16,7 @@ BOOST_PP_ENUM_PARAMS(n, class A) > typename boost::disable_if, Ret>::type - callNasalFunction( const ObjectHolder* holder + callNasalFunction( const ObjectHolder* 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, Ret>::type - callNasalFunction( const ObjectHolder* holder + callNasalFunction( const ObjectHolder* holder BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM(n, SG_CALL_TRAITS_PARAM, 0) ) @@ -75,7 +75,7 @@ return boost::bind ( &callNasalFunction, - ObjectHolder::makeShared(code) + ObjectHolder::makeShared(code) BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_INC(n), _) );