Бибилиотека Delegates + Lambda (черновой вариант)
От: maggot  
Дата: 16.02.08 13:23
Оценка: 3 (1)
Сделал такую библиотеку. Пока что черновой вариант. Если привести код в порядок, вылизать, будет библиотека — замена части Boost, связанной с Лямбда функциями. Так что критикуйте и делайте предложения по улучшению библиотеки.

1) В делегатах использовал идеи из статьи про Быстрые Делегаты
Автор(ы): Don Clugston
Дата: 27.07.2005
В данной статье предоставлен исчерпывающий материал по указателям на функции-члены, а также приведена реализация делегатов, которые занимают всего две операции на ассемблере.

2) Прикрутил к ним Лямбда функции.
3) Размер библиотеки пытался сделать как можно меньше в отличие от Boost (кто считал, сколько там строк? ). И я думаю это получилось: класс делегатов — 165 строк. Лямбда функции — 260 строк. Bind — 80 строк. Нет, я не лепил всё в одну строку
4) По скорости, я думаю, должно быть достаточно быстро. Просто не знаю, с чем и как сравнивать и как. Скажите, сделаю тесты.

Вот примеры кода:
int test_fun1(int x,int& y,int z){
    return x + y + z;
}
int test_fun2(int x,int& y,int z, int w){
    return x + y + z;
}
double test_fun3(double x,double& y,double z){
    return x + y + z;
}

double test_fun4(double a, double b, const double c, double& d){
    ++d;
    return a + b + c + d;
}
int test_fun5(int arg, int arg3, double arg4, int sfs){
    return arg + arg3 + arg4 + sfs;
}
struct test_class1{
    int x;
    int foo(int arg, int arg3, double arg4, int sfs){
        return x + arg;
    }
};

Примерно так можно использовать:
    int a = 2, b = 4, c = 10, d = 7;

    (cout << __0 << endl)(1234567);
    cout << (__1 += (2 - __2) * (__0 + __1))(a,b,10) << endl;

    test_class1 test_class1_inst1;
    test_class1_inst1.x = 10;

    delegate<int(int,int,double, int)> pLamFun0 = bind(&test_class1::foo, &test_class1_inst1);
    
    delegate<int(int,int,double, int)> pLamFun1 = pLamFun0;
    pLamFun0 = bind(test_fun5);
    cout << "pLamFun0 : " << pLamFun0(1,a,3, 7) << endl;
    cout << "pLamFun1 : " << pLamFun1(1,a,3, 7) << endl;

    delegate<int(int,int&,int)> pLamFun2 = (__1 += (78 - __2) * __0 + d);
    delegate<int(int,int,int)> pLamFun3 = (d += (34 - __2) * (__0 + __1));
    delegate<double(double, const double, const double, double&)> pLamFun4 = bind(test_fun4, __0 * 5 + __2, 2, bind(test_fun3,__0, __3, __2), __3 );
    
    cout << "pLamFun2 : " << pLamFun2(1,a,7) << endl;
    cout << "pLamFun3 : " << pLamFun3(1,5,7) << endl;
    cout << "d: " << d << endl;
    double x = 3, y = 4;
    cout << "pLamFun4 : " << pLamFun4(1,2,x,y) << endl;


Откуда можно скачать:
Fast Functional Library C++

PS За код не ругайте, это пока черновой вариант.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.