00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef FLC_CORECARRIER_H
00017 #define FLC_CORECARRIER_H
00018
00019 #include <falcon/setup.h>
00020 #include <falcon/coreobject.h>
00021 #include <falcon/error.h>
00022
00023 namespace Falcon {
00024
00025 template<class _T>
00026 class CoreCarrier: public CoreObject
00027 {
00028 _T* m_carried;
00029
00030 public:
00031 CoreCarrier( const CoreClass* base, _T* la ):
00032 CoreObject( base ),
00033 m_carried( la )
00034 {
00035 if ( la != 0 )
00036 la->incref();
00037
00038 setUserData(la);
00039 }
00040
00041 CoreCarrier( const CoreCarrier& cc ):
00042 CoreObject( cc ),
00043 m_carried( cc.m_carried )
00044 {
00045 if( m_carried != 0 )
00046 m_carried->incref();
00047 setUserData( m_carried );
00048 }
00049
00050 virtual ~CoreCarrier()
00051 {
00052 if ( m_carried != 0 )
00053 carried()->decref();
00054 }
00055
00056 bool hasProperty( const String &key ) const
00057 {
00058 uint32 pos = 0;
00059 return generator()->properties().findKey(key, pos);
00060 }
00061
00062 bool setProperty( const String &prop, const Item &value )
00063 {
00064 if ( hasProperty(prop) )
00065 {
00066 throw new AccessError( ErrorParam( e_prop_ro, __LINE__ )
00067 .origin( e_orig_runtime )
00068 .extra( prop ) );
00069 }
00070
00071 return false;
00072 }
00073
00074 bool getProperty( const String &key, Item &ret ) const
00075 {
00076 return defaultProperty( key, ret );
00077 }
00078
00079
00080 virtual CoreObject *clone() const
00081 {
00082 return new CoreCarrier<_T>( *this );
00083 }
00084
00085 _T* carried() const { return m_carried; }
00086 void carried( _T* c )
00087 {
00088 if ( m_carried )
00089 m_carried->decref();
00090 m_carried = c;
00091 c->incref();
00092 }
00093 };
00094
00095 template<class _T>
00096 CoreObject* CoreCarrier_Factory( const CoreClass *cls, void *data, bool )
00097 {
00098 return new CoreCarrier<_T>( cls, reinterpret_cast<_T*>(data));
00099 }
00100
00101 }
00102
00103 #endif
00104
00105