set(SOURCES
NasalHash.cxx
- NasalObjectHolder.cxx
NasalString.cxx
detail/from_nasal_helper.cxx
detail/to_nasal_helper.cxx
}
protected:
- ObjectHolder _obj;
+ ObjectHolder<> _obj;
virtual naRef createNasalObject(naContext c) = 0;
};
+++ /dev/null
-// 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
#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:
*
* @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_ */
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)
)
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)
)
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), _)
);