Initial community commit
This commit is contained in:
parent
537bcbc862
commit
fc06254474
16440 changed files with 4239995 additions and 2 deletions
138
Src/Winamp/Singleton.h
Normal file
138
Src/Winamp/Singleton.h
Normal file
|
@ -0,0 +1,138 @@
|
|||
#ifndef __WASABI_SINGLETON_H
|
||||
#define __WASABI_SINGLETON_H
|
||||
|
||||
#include "api/service/waservicefactoryi.h"
|
||||
#include "api/service/services.h"
|
||||
|
||||
template <class api_t, class impl_t>
|
||||
class Singleton : public waServiceFactoryI
|
||||
{
|
||||
public:
|
||||
Singleton() : impl( 0 ), orig( 0 ) {}
|
||||
|
||||
Singleton( impl_t *new_impl, bool existing ) : impl( 0 ), orig( 0 )
|
||||
{
|
||||
if ( existing )
|
||||
Register( new_impl );
|
||||
else
|
||||
RegisterNew( new_impl );
|
||||
}
|
||||
|
||||
Singleton( impl_t *&new_impl ) : impl( 0 ), orig( 0 ) { RegisterNew( new_impl ); }
|
||||
|
||||
~Singleton() { Deregister(); }
|
||||
|
||||
void Register( impl_t *new_impl )
|
||||
{
|
||||
impl = new_impl;
|
||||
WASABI_API_SVC->service_register( this );
|
||||
}
|
||||
|
||||
void RegisterNew( impl_t *&new_impl )
|
||||
{
|
||||
if ( !new_impl )
|
||||
{
|
||||
orig = &new_impl;
|
||||
new_impl = new impl_t;
|
||||
}
|
||||
|
||||
impl = new_impl;
|
||||
WASABI_API_SVC->service_register( this );
|
||||
}
|
||||
|
||||
void Deregister()
|
||||
{
|
||||
if ( impl )
|
||||
{
|
||||
WASABI_API_SVC->service_deregister( this );
|
||||
if ( orig )
|
||||
{
|
||||
delete impl;
|
||||
*orig = 0;
|
||||
}
|
||||
|
||||
impl = 0;
|
||||
}
|
||||
}
|
||||
|
||||
impl_t *impl;
|
||||
impl_t **orig;
|
||||
|
||||
FOURCC svc_serviceType() { return WaSvc::UNIQUE; } // TODO: make this a (defaulted) template parameter
|
||||
const char *svc_getServiceName() { return impl_t::getServiceName(); }
|
||||
GUID svc_getGuid() { return impl_t::getServiceGuid(); } // GUID per service factory, can be INVALID_GUID
|
||||
void *svc_getInterface( int global_lock = TRUE ) { return static_cast<api_t *>( impl ); }
|
||||
int svc_supportNonLockingGetInterface() { return TRUE; }
|
||||
int svc_releaseInterface( void *ifc ) { return 0; }
|
||||
CfgItem *svc_getCfgInterface() { return NULL; }
|
||||
const wchar_t *svc_getTestString() { return 0; }
|
||||
int svc_notify( int msg, int param1 = 0, int param2 = 0 ) { return 0; }
|
||||
};
|
||||
|
||||
|
||||
template <class api_t, class impl_t>
|
||||
class Singleton2 : public waServiceFactoryI
|
||||
{
|
||||
public:
|
||||
Singleton2() : impl( 0 ), orig( 0 ) {}
|
||||
|
||||
Singleton2( impl_t *new_impl, bool existing ) : impl( 0 ), orig( 0 )
|
||||
{
|
||||
if ( existing )
|
||||
Register( new_impl );
|
||||
else
|
||||
RegisterNew( new_impl );
|
||||
}
|
||||
|
||||
Singleton2( impl_t *&new_impl ) : impl( 0 ), orig( 0 ) { RegisterNew( new_impl ); }
|
||||
|
||||
~Singleton2() { Deregister(); }
|
||||
|
||||
void Register( impl_t *new_impl )
|
||||
{
|
||||
impl = new_impl;
|
||||
WASABI_API_SVC->service_register( this );
|
||||
}
|
||||
|
||||
void RegisterNew( impl_t *&new_impl )
|
||||
{
|
||||
if ( !new_impl )
|
||||
{
|
||||
orig = &new_impl;
|
||||
new_impl = new impl_t;
|
||||
}
|
||||
|
||||
impl = new_impl;
|
||||
WASABI_API_SVC->service_register( this );
|
||||
}
|
||||
|
||||
void Deregister()
|
||||
{
|
||||
if ( impl )
|
||||
{
|
||||
WASABI_API_SVC->service_deregister( this );
|
||||
if ( orig )
|
||||
{
|
||||
delete impl;
|
||||
*orig = 0;
|
||||
}
|
||||
|
||||
impl = 0;
|
||||
}
|
||||
}
|
||||
|
||||
impl_t *impl;
|
||||
impl_t **orig;
|
||||
|
||||
FOURCC svc_serviceType() { return WaSvc::UNIQUE; } // TODO: make this a (defaulted) template parameter
|
||||
const char *svc_getServiceName() { return impl_t::getServiceName(); }
|
||||
GUID svc_getGuid() { return impl_t::getServiceGuid(); } // GUID per service factory, can be INVALID_GUID
|
||||
void *svc_getInterface( int global_lock = TRUE ) { return static_cast<api_t *>( impl ); }
|
||||
int svc_supportNonLockingGetInterface() { return TRUE; }
|
||||
int svc_releaseInterface( void *ifc ) { return 0; }
|
||||
CfgItem *svc_getCfgInterface() { return NULL; }
|
||||
const wchar_t *svc_getTestString() { return 0; }
|
||||
int svc_notify( int msg, int param1 = 0, int param2 = 0 ) { return 0; }
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Add table
Add a link
Reference in a new issue