Быстрые делегаты C++ - Определение

ОГЛАВЛЕНИЕ

Определение

namespace fd
{
  // ----------------------------------------------------------------------

  class bad_function_call;
  class bad_member_function_call;

  // ======================================================================
  //
  // класс delegateN (переносимый синтаксис)
  //
  // ======================================================================


  template < typename R,typename T1,typename T2,...,typename TN,
       typename Alloocator = std::allocator < void > ,
                               size_t t_countof_pvoid = 2 >
  class delegateN;

  // ----------------------------------------------------------------------
  // по умолчанию c'tor

  delegateN< R, T1, T2, ..., TN >::delegateN();

  // ----------------------------------------------------------------------
  // копируем c'tor для 0

  delegateN< R, T1, T2, ..., TN >::delegateN(implClass::clear_type const *);

  // ----------------------------------------------------------------------


  // копируем c'tor

  delegateN< R, T1, T2, ..., TN >::delegateN(delegateN< R, T1,
                                      T2, ..., TN > const & other);

  // ----------------------------------------------------------------------
  // функция копирует c'tor

  delegateN< R, T1, T2, ..., TN >::delegateN(R (*fn)(T1, T2, ..., TN);

  // ----------------------------------------------------------------------


  // адаптер функции-члена копирует c'tors

  //  ,в которых T1 заведомо можно преобразовать в U * или U &

  delegateN< R, T1, T2, ..., TN >::delegateN(R (U::*mfn)(T2, T3, ..., TN));

  //  ,в которых T1 заведомо можно преобразовать в один из
  //         U * или U const * или U & или U const &

  delegateN< R, T1, T2, ..., TN >::delegateN(R (U::*mfn)(T2, T3, ..., TN) const);

  // ----------------------------------------------------------------------


  // связывание аргументов функции-члена копирует c'tors

  delegateN< R, T1, T2, ..., TN >::delegateN(R (U::*mfn)(T1, T2, ..., TN), T & obj);

  delegateN< R, T1, T2, ..., TN >::delegateN(R (U::*mfn)(T1, T2, ..., TN) const, T & obj);

  delegateN< R, T1, T2, ..., TN >::delegateN(R (U::*mfn)(T1, T2, ..., TN), T * obj);

  delegateN< R, T1, T2, ..., TN >::delegateN(R (U::*mfn)(T1, T2, ..., TN) const, T * obj);

  // ----------------------------------------------------------------------


  // функтор копирует c'tors

  template< typename Functor >
  delegateN< R, T1, T2, ..., TN >::delegateN(Functor & ftor, bool/* dummy*/);

  template< typename Functor >
  delegateN< R, T1, T2, ..., TN >::delegateN(Functor * ftor, bool/* dummy*/);

  // ----------------------------------------------------------------------


  // присваивание из 0

  delegateN< R, T1, T2, ..., TN > &
  delegateN< R, T1, T2, ..., TN >::operator = (implClass::clear_type const *);

  // ----------------------------------------------------------------------


  // оператор присваивания

  delegateN< R, T1, T2, ..., TN > &
  delegateN< R, T1, T2, ..., TN >::operator =
      (delegateN< R, T1, T2, ..., TN > const & other);

  // ----------------------------------------------------------------------


  // оператор присваивания функции

  delegateN< R, T1, T2, ..., TN > &
  delegateN< R, T1, T2, ..., TN >::operator = (R (*fn)(T1, T2, ..., TN);

  // ----------------------------------------------------------------------


  // операторы присваивания адаптера функции-члена


  //  ,в которых T1 можно заведомо преобразовать в U * или U &

  delegateN< R, T1, T2, ..., TN > &
  delegateN< R, T1, T2, ..., TN >::operator = (R (U::*mfn)(T2, ..., TN));

  //  ,где T1 можно заведомо преобразовать в один из  U * или U const * или U & или U const &

  delegateN< R, T1, T2, ..., TN > &
  delegateN< R, T1, T2, ..., TN >::operator = (R (U::*mfn)(T2, ..., TN) const);

  // ----------------------------------------------------------------------


  // операторы присваивания связываемых аргументов функции-члена

  delegateN< R, T1, T2, ..., TN > &
  delegateN< R, T1, T2, ..., TN >::operator = (R (U::*mfn)(T1, T2, ..., TN), T & obj);

  delegateN< R, T1, T2, ..., TN > &
  delegateN< R, T1, T2, ..., TN >::operator = (R (U::*mfn)(T1, T2, ..., TN) const, T & obj);

  delegateN< R, T1, T2, ..., TN > &
  delegateN< R, T1, T2, ..., TN >::operator = (R (U::*mfn)(T1, T2, ..., TN), T * obj);

  delegateN< R, T1, T2, ..., TN > &
  delegateN< R, T1, T2, ..., TN >::operator = (R (U::*mfn)(T1, T2, ..., TN) const, T * obj);

  // ----------------------------------------------------------------------


  // операторы присваивания функтора

  template< typename Functor >
  delegateN< R, T1, T2, ..., TN > &
  delegateN< R, T1, T2, ..., TN >::operator <<= (Functor & ftor);

  template< typename Functor >
  delegateN< R, T1, T2, ..., TN > &
  delegateN< R, T1, T2, ..., TN >::operator <<= (Functor * ftor);

  // ----------------------------------------------------------------------


  // оператор вызова

  result_type operator ()(T1 p1, T2 p2, ..., TN pN) const;

  // ----------------------------------------------------------------------


  // обмен местами

  void delegateN< R, T1, T2, ..., TN >::swap(delegateN & other);

  // ----------------------------------------------------------------------


  // очистка

  void delegateN< R, T1, T2, ..., TN >::clear();

  // ----------------------------------------------------------------------


  // очищение

  bool delegateN< R, T1, T2, ..., TN >::empty() const;

  // ----------------------------------------------------------------------


  // сравнение с 0

  bool operator == (implClass::clear_type const *) const;

  bool operator != (implClass::clear_type const *) const;

  // ----------------------------------------------------------------------


  // сравнение

  int compare(delegateN const & other, bool check_bound_object = false) const;

  // операторы сравнения

  bool operator == (delegateN< R, T1, T2, ..., TN > const & other) const;
  bool operator != (delegateN< R, T1, T2, ..., TN > const & other) const;
  bool operator <= (delegateN< R, T1, T2, ..., TN > const & other) const;
  bool operator <  (delegateN< R, T1, T2, ..., TN > const & other) const;
  bool operator >= (delegateN< R, T1, T2, ..., TN > const & other) const;
  bool operator >  (delegateN< R, T1, T2, ..., TN > const & other) const;

  // ======================================================================

  // класс делегата (предпочтительный индекс)

  // ======================================================================


  template< typename R,typename T1,typename T2,...,typename TN,
       typename Allocator = std::allocator< void >,size_t t_countof_pvoid = 2 >
  class delegate< R (T1, T2, ..., TN), Allocator, t_countof_pvoid >;

  //
  // такой же набор членов-функций, что и для fd::delegateN в переносимом синтаксисе
  //


  // ======================================================================
  // fd::make_delegate()
  // ======================================================================


  // make_delegate для функции

  template< typename R,typename T1,typename T2,...,typename TN,typename U,typename T >
  delegateN< R, T1, T2, ..., TN >
  make_delegate(R (*fn)(T1, T2, ..., TN));

  // ----------------------------------------------------------------------


  // make_delegate для адаптера функции-члена

  template< typename R,typename T2,...,typename TN,typename U,typename T >
  delegateN< R, T *, T2, ..., TN >
  make_delegate(T *, R (U::*mfn)(T2, ..., TN));

  template< typename R,typename T2,...,typename TN,typename U,typename T >
  delegateN< R, T *, T2, ..., TN >
  make_delegate(T *, R (U::*mfn)(T2, ..., TN) const);

  // ----------------------------------------------------------------------


  // make_delegate для связанных аргументов функции-члена

  template< typename R,typename T1,typename T2,...,typename TN,typename U,typename T >
  delegateN< R, T1, T2, ..., TN >
  make_delegate(R (U::*mfn)(T1, T2, ..., TN), T & obj);

  template< typename R,typename T1,typename T2,...,typename TN,typename U,typename T >
  delegateN< R, T1, T2, ..., TN >
  make_delegate(R (U::*mfn)(T1, T2, ..., TN) const, T & obj);

  template< typename R,typename T1,typename T2,...,typename TN,typename U,typename T >
  delegateN< R, T1, T2, ..., TN >
  make_delegate(R (U::*mfn)(T1, T2, ..., TN), T * obj);

  template< typename R,typename T1,typename T2,...,typename TN,typename U,typename T >
  delegateN< R, T1, T2, ..., TN >
  make_delegate(R (U::*mfn)(T1, T2, ..., TN) const, T * obj);

  // ======================================================================

  // fd::bind()

  // ======================================================================


  // связывание для связанных аргументов функции-члена

  template< typename R,typename T1,typename T2,...,typename TN,typename U,typename T >
  delegateN< R, T1, T2, ..., TN >
  bind(R (U::*mfn)(T1, T2, ..., TN), T & obj, ...);

  template< typename R,typename T1,typename T2,...,typename TN,typename U,typename T >
  delegateN< R, T1, T2, ..., TN >
  bind(R (U::*mfn)(T1, T2, ..., TN) const, T & obj, ...);

  template< typename R,typename T1,typename T2,...,typename TN,typename U,typename T >
  delegateN< R, T1, T2, ..., TN >
  bind(R (U::*mfn)(T1, T2, ..., TN), T * obj, ...);

  template< typename R,typename T1,typename T2,...,typename TN,typename U,typename T >
  delegateN< R, T1, T2, ..., TN >
  bind(R (U::*mfn)(T1, T2, ..., TN) const, T * obj, ...);

  // ======================================================================

  // fd::get_pointer()

  // ======================================================================


  template< typename T >
  T * get_pointer(T * p);

  template< typename T >
  T * get_pointer(std::auto_ptr< T > & p);

  // ----------------------------------------------------------------------


  namespace util
  {
    // ======================================================================

    // пользовательские распределители памяти (управляемый политиками)

    // ======================================================================


    // распределитель фиксированных блоков памяти

    template< typename T >
    class fixed_allocator;

    // обычный распределитель  памяти( эквивалентно std::allocator< T > )

    template< typename T >
    class std_allocator;

  }  // использование пространства имен


  // ----------------------------------------------------------------------


} // пространство имен fd

 

Загрузить исходный код - 32.6 KB

Загрузить демо-проект (для VC6, VC71, и DEV-C++ 4.9.9.2) - 127 KB