Guest
Public paste!

nameczanin

By: a guest | Feb 7th, 2008 | Syntax: C++ | Size: 7.98 KB | Hits: 51 | Expires: Never
Copy text to clipboard
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <cstdarg>
  5.  
  6. using namespace std;
  7.  
  8.  
  9. //maly singleton do tworzenia id dla kolejnych callbackow
  10. class CCallbackIdCreator
  11. {
  12.  
  13. private:
  14.  
  15.     unsigned int m_dLastId;
  16.  
  17.  
  18. public:
  19.  
  20.     CCallbackIdCreator()
  21.     {
  22.         m_dLastId = 0;
  23.     }
  24.  
  25.     static CCallbackIdCreator& inst()
  26.     {
  27.         static CCallbackIdCreator m_inst;
  28.  
  29.         return m_inst;
  30.     }
  31.  
  32.  
  33. private:
  34.  
  35.     unsigned int getId()
  36.     {
  37.         return ++m_dLastId;
  38.     }
  39.  
  40.     friend class Callback;
  41.  
  42. };
  43.  
  44.  
  45. //container (handler)
  46. class Callback
  47. {
  48.  
  49. private:
  50.    
  51.     //nasze najpotrzebniejsze wskazniki
  52.     void* m_pThis;
  53.     void* m_pFunc;
  54.     int* m_vpParameters;
  55.     unsigned int m_dNumParameters;
  56.  
  57.     //takie krotkie info :P
  58.     int m_bIsInstantiated;
  59.  
  60.     //id
  61.     unsigned int m_id;
  62.  
  63.  
  64. public:
  65.  
  66.     //konstruktory ogolne
  67.     Callback()
  68.     {
  69.         m_vpParameters = NULL;
  70.         Reset();
  71.     }
  72.  
  73.     Callback( const Callback& obj )
  74.     {
  75.         Reset( obj );
  76.     }
  77.  
  78.  
  79.     //destruktor dla niektorych kompilatorow bez wyobrazni
  80.     ~Callback()
  81.     {
  82.     }
  83.  
  84.     //konstruktory dla funkcji
  85.     Callback( int parNum, ... )
  86.     {
  87.         va_list list;
  88.         va_start( list, parNum );
  89.             m_pThis = va_arg( list, void* );
  90.             m_pFunc = va_arg( list, void* );
  91.  
  92.             m_dNumParameters = parNum;
  93.             m_vpParameters = new int[parNum];
  94.             for( int i = parNum - 1; i >= 0; i -- )
  95.                 m_vpParameters[i] = va_arg( list, int );
  96.         va_end( list );
  97.  
  98.         m_bIsInstantiated = true;
  99.  
  100.         m_id = CCallbackIdCreator::inst().getId();
  101.     }
  102.  
  103.     //wywolanie metody/funkcji
  104.     void call( void* par = NULL )
  105.     {
  106.         callInt( par );
  107.     }
  108.  
  109.     //usuwa stare parametry i ustawia nowe
  110.     int callInt( unsigned int parsNum, ... )
  111.     {
  112.         va_list list;
  113.         delete[] m_vpParameters;
  114.         m_vpParameters = new int[parsNum];
  115.  
  116.         va_start( list, parsNum );
  117.         for( unsigned int i = parsNum - 1; i >= 0; i -- )
  118.             va_arg( list, int );
  119.         va_end( list );
  120.     }
  121.  
  122.     //wywolanie metody/funkcji ze zwrotem parametru
  123.     int callInt( void* par = NULL )
  124.     {
  125.         if( par != NULL )
  126.         {
  127.             delete[] m_vpParameters;
  128.             m_vpParameters = new int[1];
  129.             m_vpParameters[0] = (int)par;
  130.             m_dNumParameters = 1;
  131.         }
  132.  
  133.         if( m_bIsInstantiated )
  134.         {
  135.             void* pFunc = (void*) m_pFunc;
  136.  
  137.             int dSize = 0;
  138.             int dNumParameters = m_dNumParameters;
  139.             int dOut = 0;
  140.  
  141.             /* w tym miejscu wszystkie parametry sa juz ustawione w odpowiedniej konwencji wywolania */
  142.             int* pParameter = &m_vpParameters[0];
  143.             __asm
  144.             {
  145.                 mov ecx, 0                        //zerujemy iterator
  146.  
  147.                                                   //while( true )
  148.                 our_for:                          //{
  149.  
  150.                     cmp ecx, [dNumParameters]     //if( i < dNumParameters )
  151.                     jae end_our_for               //goto end_our_for;
  152.  
  153.                     mov ebx, pParameter           //wrzucamy parametr ze wskaznika
  154.                     push [ebx]                    //na stos
  155.  
  156.                     add ecx, 1                    //i++;
  157.  
  158.                     add dSize, 4                  //zwiekszamy wielkosc oczyszczajaca stos
  159.                     add pParameter, 4             //wybieramy nastepny parametr
  160.  
  161.                     jmp our_for      
  162.  
  163.                 end_our_for:                      //}
  164.  
  165.  
  166.                 mov ecx, [m_pThis];              //ustawiamy funkcje i wywolujemy ja
  167.                 call near pFunc;                 //
  168.  
  169.                 add esp, [dSize]            //czas oczyscic stos
  170.                
  171.                 mov [dOut], eax;            //umieszczamy wynik w zmiennej
  172.                                             //potrzebne to jest w zasadzie
  173.                                             //tylko dla wywolania callInt
  174.                                             //ale nic nie stoi na przeszkodzie
  175.                                             //aby wywolac to takze dla void
  176.             }
  177.          
  178.             return dOut;
  179.         }
  180.  
  181.         //aby kompilator sie nie plul w zasadzie :P
  182.         return 0;
  183.     }
  184.  
  185.     void operator= ( const Callback& obj )
  186.     {
  187.         Reset( obj );
  188.     }
  189.  
  190.     bool operator== ( const Callback& obj ) const
  191.     {
  192.         if( m_id == m_id )
  193.             return true;
  194.         else
  195.             return false;
  196.     }
  197.  
  198.     bool operator!= ( const Callback& obj ) const
  199.     {
  200.         if( m_id != obj.m_id )
  201.             return true;
  202.         else
  203.             return false;
  204.     }
  205.  
  206.     void Reset( const Callback& obj )
  207.     {
  208.         m_pThis = obj.m_pThis;
  209.         m_pFunc = obj.m_pFunc;
  210.  
  211.         m_dNumParameters = obj.m_dNumParameters;
  212.         m_vpParameters = new int[m_dNumParameters];
  213.         for( unsigned int i = 0; i < m_dNumParameters; i ++ )
  214.             m_vpParameters[i] = obj.m_vpParameters[i];
  215.  
  216.         m_bIsInstantiated = obj.m_bIsInstantiated;
  217.  
  218.         m_id = obj.m_id;
  219.     }
  220.  
  221.     void Reset()
  222.     {
  223.         m_pThis = NULL;
  224.         m_pFunc = NULL;
  225.         delete[] m_vpParameters;
  226.         m_vpParameters = NULL;
  227.         m_dNumParameters = 0;
  228.  
  229.         m_bIsInstantiated = NULL;
  230.  
  231.         m_id = NULL;
  232.     }
  233.  
  234. };
  235.  
  236.  
  237.  
  238. /* test functions */
  239. void some_func();
  240. void some_func3_1( void* );
  241. void some_func3_2( void* );
  242. int some_func3_3( void* );
  243. void some_func3_4( char* txt );
  244. char* some_func3_5( char* someTxt, int someInt );
  245.  
  246.  
  247. //test A
  248. void some_func()
  249. {
  250.     cout << "\tcalled some_func" << endl;
  251. }
  252.  
  253. //test B
  254. int some_func3_3( void* myInt )
  255. {
  256.     int dTmp = (int) myInt;
  257.  
  258.     cout << "\tcalled some_func3_3" << endl << "\t\tgot param: " << dTmp << endl << "\t\tret val: ";
  259.     if( dTmp != 4 )
  260.     {
  261.         cout << "false (par != 4)" << endl;
  262.         return false;
  263.     }
  264.    
  265.     cout << "true (par == 4)" << endl;
  266.     return true;
  267. }
  268.  
  269. //test C
  270. //global func inside another func
  271.  
  272. Callback c( 0, &some_func3_1, &some_func3_2 );
  273.  
  274. void some_func3_2( void* myInt )
  275. {
  276.     int dTmp = (int) myInt;
  277.  
  278.     cout << "\tcalled some_func3_2" << endl << "\t\tgot param: " << dTmp << endl;
  279. }
  280.  
  281. void some_func3_1( void* )
  282. {
  283.     int myPrivateInt = 6;
  284.  
  285.     c.call( (void*) myPrivateInt );
  286. }
  287.  
  288. //test D
  289. class SomeClass
  290. {
  291.  
  292. public:
  293.  
  294.     SomeClass(){}
  295.     ~SomeClass(){}
  296.  
  297.     void someMethod( void* par )
  298.     {
  299.         cout << "\tcalled someMethod" << endl;
  300.         if( par != NULL )
  301.             cout << "\t\tgot param: " << ((int)par) << endl;
  302.     }
  303.  
  304. };
  305.  
  306. //test E
  307. void some_func3_4( char* txt )
  308. {
  309.     cout << "\tcalled some_func3_4" << endl;
  310.     cout << "\t\tpar(txt): " << txt << endl;
  311. }
  312.  
  313. //test F
  314. char* some_func3_5( char* someTxt, int someInt )
  315. {
  316.     cout << "\tcalled some_func3_5" << endl;
  317.     cout << "\t\tsomeTxt: " << someTxt << endl;
  318.     cout << "\t\tsomeInt: " << someInt << endl;
  319.  
  320.     char* tmpTxt = new char[5];
  321.     memset( tmpTxt, 0, 5 );
  322.     tmpTxt[0] = 32;
  323.     tmpTxt[1] = 65;
  324.  
  325.     return tmpTxt;
  326. }
  327.  
  328. //test A, B, C, D, E, F
  329. int main( int argc, char* argv[] )
  330. {
  331.     //class method
  332.     SomeClass obj;
  333.     Callback d( 1, &obj, &SomeClass::someMethod, 0 );
  334.    
  335.     //global func
  336.     Callback a( 0, 0, &some_func );
  337.     Callback b( 1, 0, &some_func3_3, (void*)4 );
  338.  
  339.     char pszStr[] = "jakies info do przekazania";
  340.     Callback e( 1, &main, &some_func3_4, pszStr );
  341.  
  342.     int dInt = 613;
  343.     Callback f( 2, &main, &some_func3_5, pszStr, dInt );
  344.  
  345.  
  346.     //calling
  347.     cout << "void:" << endl;
  348.         a.call();
  349.         a.call( (void*) 123 );
  350.         d.call();
  351.         d.call( (void*) 5 );
  352.         some_func3_1( 0 );
  353.  
  354.     cout << endl << "int: " << endl;
  355.         int ourBool = b.callInt();
  356.  
  357.         e.call();
  358.         char* tmpTxt = (char*)f.callInt();
  359.         cout << "\t\treturn: " << tmpTxt << endl;
  360.  
  361.  
  362.     getchar();
  363.  
  364.     return 0;
  365. }