cppbind: Do not derive from SGReferenced if there is no need
This commit is contained in:
parent
b2d9385f46
commit
c851c449da
@ -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
|
||||
|
@ -137,7 +137,7 @@ namespace nasal
|
||||
}
|
||||
|
||||
protected:
|
||||
ObjectHolder _obj;
|
||||
ObjectHolder<> _obj;
|
||||
|
||||
virtual naRef createNasalObject(naContext c) = 0;
|
||||
};
|
||||
|
@ -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
|
@ -19,21 +19,25 @@
|
||||
#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_ */
|
||||
|
@ -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), _)
|
||||
);
|
||||
|
Loading…
Reference in New Issue
Block a user