quite a bit of refactoring. mostly formatting and renaming, slight amount of cleanup.

This commit is contained in:
swaits committed 2010-10-04 14:52:55 -07:00
1 parent 3b66e243ae
commit 9043e38ef2
23 files changed
+1856 -1416

No files matched your search

+101 -68
View File
@@ -1,20 +1,21 @@
#ifndef __Signal11_h__
#define __Signal11_h__
#ifndef __signal11_h__
#define __signal11_h__
#include "horrible_cast.h"
#include "slot_base.h"
#include "signal_base.h"
//=========================================================================================================================================
// Slot tempplate.
//=========================================================================================================================================
/**
* Abstract base class for Slots with 11 parameter(s).
*/
//
// classes slot11, slot11_function, and slot11_method
//
//
// Abstract base class for slots with 11 parameter(s).
//
template<typename T_return, typename T_arg0, typename T_arg1, typename T_arg2, typename T_arg3, typename T_arg4, typename T_arg5, typename T_arg6, typename T_arg7, typename T_arg8, typename T_arg9, typename T_arg10>
class Slot11 : public slot_base
class slot11 : public slot_base
{
public:
/**
@@ -25,23 +26,34 @@ class Slot11 : public slot_base
virtual T_return operator() (T_arg0 a0, T_arg1 a1, T_arg2 a2, T_arg3 a3, T_arg4 a4, T_arg5 a5, T_arg6 a6, T_arg7 a7, T_arg8 a8, T_arg9 a9, T_arg10 a10) const = 0;
};
//
// a concrete Slot class for a normal function
// A concrete slot class for a normal function.
//
template <typename T_return, typename T_arg0, typename T_arg1, typename T_arg2, typename T_arg3, typename T_arg4, typename T_arg5, typename T_arg6, typename T_arg7, typename T_arg8, typename T_arg9, typename T_arg10>
class Slot11_function: public Slot11<T_return, T_arg0, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7, T_arg8, T_arg9, T_arg10>
class slot11_function: public slot11<T_return, T_arg0, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7, T_arg8, T_arg9, T_arg10>
{
public:
typedef T_return (*FUNCTION_POINTER)(T_arg0 a0, T_arg1 a1, T_arg2 a2, T_arg3 a3, T_arg4 a4, T_arg5 a5, T_arg6 a6, T_arg7 a7, T_arg8 a8, T_arg9 a9, T_arg10 a10);
typedef T_return (*FUNCTION_POINTER)(T_arg0 a0, T_arg1 a1, T_arg2 a2, T_arg3 a3, T_arg4 a4, T_arg5 a5, T_arg6 a6, T_arg7 a7, T_arg8 a8, T_arg9 a9, T_arg10 a10); // convenience typedef
Slot11_function( const FUNCTION_POINTER func )
/**
* Constructor.
*
* Converts a function pointer into raw data.
*/
slot11_function( const FUNCTION_POINTER func )
{
// convert and store function pointer in slot_base
this->data[0] = safe_horrible_cast<slot_base::data_container>(func);
}
/**
* Perform callback.
*
* Converts raw data back into a function pointer, and calls it.
*
* @return Returns an object of type T_return; the result of the user callback.
*/
T_return operator() (T_arg0 a0, T_arg1 a1, T_arg2 a2, T_arg3 a3, T_arg4 a4, T_arg5 a5, T_arg6 a6, T_arg7 a7, T_arg8 a8, T_arg9 a9, T_arg10 a10) const
{
// retrieve data from slot_base and convert back to a function pointer
@@ -52,22 +64,33 @@ class Slot11_function: public Slot11<T_return, T_arg0, T_arg1, T_arg2, T_arg3, T
}
};
//
// a concrete Slot class for an object pointer and method (usually 'this' and 'Class::Method')
// A concrete slot class for an object pointer and method (usually 'this' and 'Class::Method').
//
template <class T_object, typename T_member, typename T_return, typename T_arg0, typename T_arg1, typename T_arg2, typename T_arg3, typename T_arg4, typename T_arg5, typename T_arg6, typename T_arg7, typename T_arg8, typename T_arg9, typename T_arg10>
class Slot11_method: public Slot11<T_return, T_arg0, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7, T_arg8, T_arg9, T_arg10>
class slot11_method: public slot11<T_return, T_arg0, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7, T_arg8, T_arg9, T_arg10>
{
public:
Slot11_method(const T_object* p_object, const T_member p_member)
/**
* Constructor.
*
* Converts an object and method pointer into raw data.
*/
slot11_method(const T_object* p_object, const T_member p_member)
{
// convert and store object pointer and member function pointer in slot_base
this->data[0] = safe_horrible_cast<slot_base::data_container>(p_object);
this->data[1] = safe_horrible_cast<slot_base::data_container>(p_member);
}
/**
* Perform callback.
*
* Converts raw data back into a method pointer, and calls it.
*
* @return Returns an object of type T_return; the result of the user callback.
*/
T_return operator() (T_arg0 a0, T_arg1 a1, T_arg2 a2, T_arg3 a3, T_arg4 a4, T_arg5 a5, T_arg6 a6, T_arg7 a7, T_arg8 a8, T_arg9 a9, T_arg10 a10) const
{
// retrieve data from slot_base and convert back to an object pointer and member function pointer
@@ -79,103 +102,113 @@ class Slot11_method: public Slot11<T_return, T_arg0, T_arg1, T_arg2, T_arg3, T_a
}
};
//=========================================================================================================================================
// Signal tempplate.
//=========================================================================================================================================
//
// class signal11
//
template< typename T_return, typename T_arg0, typename T_arg1, typename T_arg2, typename T_arg3, typename T_arg4, typename T_arg5, typename T_arg6, typename T_arg7, typename T_arg8, typename T_arg9, typename T_arg10 >
class Signal11: public signal_base
class signal11: public signal_base
{
public:
//-----------------------------------------------------------------------------------------------------------------------------------------
// Execute the Signal:
// - Walk the list of Slot nodes.
//-----------------------------------------------------------------------------------------------------------------------------------------
/**
* Emit the signal.
*
* Iterate through the list of slots, and call each one.
*/
void operator() (T_arg0 a0, T_arg1 a1, T_arg2 a2, T_arg3 a3, T_arg4 a4, T_arg5 a5, T_arg6 a6, T_arg7 a7, T_arg8 a8, T_arg9 a9, T_arg10 a10)
{
if( IsSignalEmitting( ) )
// if we're already emitting, return (i.e. no re-entrancy allowed)
if( signal_base::emitting )
{
#if defined( _DEBUG )
printf("WARNING: Signal11<...> @ 0x%p recursive Emit attempt\n", this);
printf("WARNING: signal11<...> @ 0x%p recursive emit attempt\n", this);
#endif
return;
}
BeginEmit( );
list_node* cur = GetFirstNode( );
// set emitting flag
signal_base::emitting = true;
// iterate through the list
signal_base::list_node* cur = signal_base::head;
while( cur )
{
// make the slot_base pointer a Slot11 pointer
Slot11<T_return, T_arg0, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7, T_arg8, T_arg9, T_arg10>* s = static_cast<Slot11<T_return, T_arg0, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7, T_arg8, T_arg9, T_arg10>*>(cur->slot);
// cast the slot_base pointer to a slot11 pointer (converts from raw memory to pointer again)
slot11<T_return, T_arg0, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7, T_arg8, T_arg9, T_arg10>* s = static_cast<slot11<T_return, T_arg0, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7, T_arg8, T_arg9, T_arg10>*>(cur->slot);
// call the Signal
(*s)(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
// call the signal as long as it's still valid
if ( !cur->deleted )
{
(*s)(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
}
// move to next Slot in the list.
// move to next slot in the list.
cur = cur->next;
}
EndEmit( );
// delete any pending slot deletions
signal_base::remove_pending_nodes( );
// clear emitting flag
signal_base::emitting = false;
}
//=========================================================================================================================================
// Signal connections
//=========================================================================================================================================
//
// signal connections to slots
//
// convenience typedef
typedef T_return (*FUNCTION_POINTER)(T_arg0 a0, T_arg1 a1, T_arg2 a2, T_arg3 a3, T_arg4 a4, T_arg5 a5, T_arg6 a6, T_arg7 a7, T_arg8 a8, T_arg9 a9, T_arg10 a10);
// Functions
//-----------------------------------------------------------------------------------------------------------------------------------------
// connect to normal functions
bool Connect( FUNCTION_POINTER func )
{
// make a copy of the Slot to store in our list
Slot11<T_return, T_arg0, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7, T_arg8, T_arg9, T_arg10>* sNewFunc = new Slot11_function<T_return, T_arg0, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7, T_arg8, T_arg9, T_arg10>( func );
// make a copy of the slot to store in our list
slot11<T_return, T_arg0, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7, T_arg8, T_arg9, T_arg10>* sNewFunc = new slot11_function<T_return, T_arg0, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7, T_arg8, T_arg9, T_arg10>( func );
// add it to the end of our linked list
return bind(sNewFunc);
return signal_base::bind(sNewFunc);
}
// Object methods
//-----------------------------------------------------------------------------------------------------------------------------------------
template <class T_object, typename T_member>
// connect to an object's method
template <class T_object, typename T_member>
bool Connect(T_object* p_object, T_member p_member)
{
// make a copy of the Slot to store in our list
Slot11<T_return, T_arg0, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7, T_arg8, T_arg9, T_arg10>* sNewMethod = new Slot11_method<T_object,T_member,T_return, T_arg0, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7, T_arg8, T_arg9, T_arg10>( p_object, p_member );
// make a copy of the slot to store in our list
slot11<T_return, T_arg0, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7, T_arg8, T_arg9, T_arg10>* sNewMethod = new slot11_method<T_object,T_member,T_return, T_arg0, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7, T_arg8, T_arg9, T_arg10>( p_object, p_member );
// add it to the end of our linked list
return bind(sNewMethod);
return signal_base::bind(sNewMethod);
}
//=========================================================================================================================================
// Signal Disconnections
//=========================================================================================================================================
// Functions
//-----------------------------------------------------------------------------------------------------------------------------------------
//
// signal disconnections from slots
//
// disconnect from a normal function
bool Disconnect( FUNCTION_POINTER func )
{
// make a temporary Slot we can use to find a match in the list
Slot11_function<T_return, T_arg0, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7, T_arg8, T_arg9, T_arg10> sTest( func );
// make a temporary slot we can use to find a match in the list
slot11_function<T_return, T_arg0, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7, T_arg8, T_arg9, T_arg10> sTest( func );
// search and remove it
return unbind(&sTest);
return signal_base::unbind(&sTest);
}
// Object method
//-----------------------------------------------------------------------------------------------------------------------------------------
template <class T_object, typename T_member>
// disconnect from an object's method
template <class T_object, typename T_member>
bool Disconnect(T_object* p_object, T_member p_member)
{
// make a temporary Slot we can use to find a match in the list
Slot11_method<T_object,T_member,T_return, T_arg0, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7, T_arg8, T_arg9, T_arg10> sTemp(p_object,p_member);
// make a temporary slot we can use to find a match in the list
slot11_method<T_object,T_member,T_return, T_arg0, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7, T_arg8, T_arg9, T_arg10> sTemp(p_object,p_member);
// search and remove it
return unbind(&sTemp);
return signal_base::unbind(&sTemp);
}
};
#endif // __Signal11_h__
#endif // __signal11_h__