################################################################################
        FastDelegate
################################################################################

To jest biblioteka zewntrzna.

Autor         : Don Clugston
Znaleziona na : http://www.codeproject.com/cpp/FastDelegate.asp
Licencja      : Public Domain


Wstp
================================================================================

Implementuje przenone (bardzo przenone - dziaaj wszdzie od dziadowskich
kompilatorw w rodzaju Borlanda czy Visuala 6 poprzez Visual 2003, 2005 czy g++
a po jakie egzotyczne, 64-bitowe, a nawet Managed C++) delegaty, czyli
wskaniki na metody (konkretna metoda konkretnego obiektu dowolnej klasy o
zgodnej sygnaturze), ktrych bardzo brakuje w C++ (ma je np. Delphi/Object
Pascal, C# i kady cywilizowany jzyk), a ktre s bardzo potrzebne, gwnie do
realizacji callbackw, np. w systemie GUI.

S bardzo szybkie.

Nie ma eventw (sygnaw), czyli pamitania i wywoywania caej listy wskanikw
na funkcje - i dobrze :P


Waciwoci
================================================================================

Obsuguje funkcje majce do 8 parametrw. Funkcje mog zwraca warto.

Zgodno sygnatury jest sprawdzana na etapie kompilacji.

Wszystko jest w przestrzeni nazw 'fastdelegate'.

Przy tworzeniu automatycznie si zeruj.

Mona porwnywa z uyciem operatorw == i !=.

Dziaa te dla funkcji globalnych i metod statycznych.

Dziaa te dla metod wirtualnych, nawet dla dziedziczenia wirtualnego, metod
abstrakcyjnych itd. - full serwis.

Wywouje si tak po prostu - operator ().


Uycie
================================================================================

FastDelegateN<...>() // konstruktor domylny
Delegat.clear()
	Zeruje

FastDelegateN<...>(&Funkcja) // konstruktor
Delegat.Bind(&Funkcja)
Delegat = &Funkcja
	Przypisanie wskanika na funkcj globaln lub metod statyczn

FastDelegateN<...>(&Obiekt, &KlasaObiektu::Metoda) // konstruktor
Delegat.bind(&Objekt, &KlasaObjektu::Metoda)
Delegat = fastdelegate::MakeDelegate(&Objekt, &KlasaObjektu::Metoda)
	Przypisanie wskanika na metod

if (Delegat)
if (Delegat.empty())
	Testowanie na nie zerowo / zerowo


Przykad
================================================================================

// Taki nagwek wczamy

#include "FastDelegate.h"

// Jaka kontrolka, ktra bdzie wywoywaa callback
// Kto jej wywouje metod MouseDown, a w reakcji ona wywouje komu callback
// OnClick.

class Button
{
public:
	// Typedef, dla wygody. Tak wyglda typ callbacka.
	// S osobne typy zalenie od liczby parametrw.
	// Ostatni, opcjonalny parametr szablonu to typ zwracany (domylnie void).
	
	typedef fastdelegate::FastDelegate2<int, int, bool> ON_CLICK_DELEGATE;
	
	// Pole typu wskanik na metod (callback)

	ON_CLICK_DELEGATE OnClick;

	void MouseDown(int x, int y)
	{
		// Sprawdzanie czy wskanik nie pusty
		if (OnClick)
			// Wywoanie
			bool Foo = OnClick(x, y);
	}
};

// Formularz - jest wacicielem przycisku, reaguje na jego callback

class Form1
{
public:
	// Przycisk
	
	Button m_Btn;

	Form1()
	{
		// Bindowanie callbacka - opcja 1
		m_Btn.OnClick.bind(this, &Form1::Button1_Click);
		
		// Bindowanie callbacka - opcja 2
		//m_Btn.OnClick = fastdelegate::MakeDelegate(this, &Form1::Button1_Click);
	}
	
	// Ta metoda bdzie reagowaa na callback

	bool Button1_Click(int x, int y)
	{
		Beep(1000, 100);
		return true;
	}
};

(...)

Form1 Obj;
Obj.m_Btn.MouseDown(1, 2);

