Бибилиотека 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 За код не ругайте, это пока черновой вариант.
Re: Бибилиотека Delegates + Lambda (черновой вариант)
От: ArtDenis Россия  
Дата: 16.02.08 14:16
Оценка:
Здравствуйте, maggot, Вы писали:

M>Сделал такую библиотеку. Пока что черновой вариант. Если привести код в порядок, вылизать, будет библиотека — замена части Boost, связанной с Лямбда функциями. Так что критикуйте и делайте предложения по улучшению библиотеки.


Эх... Вот если бы твоя лямбда вот так умела:
(__1::some_func)(some_object);

то цены бы ей не было...
... << RSDN@Home 1.1.4 stable rev. 510>>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re: Бибилиотека Delegates + Lambda (черновой вариант)
От: Max M. Ниоткуда  
Дата: 16.02.08 16:28
Оценка:
Здравствуйте, maggot, Вы писали:

M>Нет, я не лепил всё в одну строку


ммм, а это? :
template<class U, class V, template<class> class Expression> struct ForEach<TypeList<U,V>, Expression >{typedef TypeList<typename Expression<U>::Result, typename ForEach<V, Expression>::Result > Result;};

ну это я конечно придираюсь... на вскидку — так вроде ничего — прикольно.
// ...
подпись
Re: Бибилиотека Delegates + Lambda (черновой вариант)
От: Tonal- Россия www.promsoft.ru
Дата: 16.02.08 17:33
Оценка:
Здравствуйте, maggot, Вы писали:
M>Сделал такую библиотеку. Пока что черновой вариант. Если привести код в порядок, вылизать, будет библиотека — замена части Boost, связанной с Лямбда функциями. Так что критикуйте и делайте предложения по улучшению библиотеки.
Не компилится gcc. Проверял на g++ (GCC) 3.4.5 (mingw special) и g++-dw2 (GCC) 4.2.1-dw2 (mingw32-2)
Не находит PP_ENUM_CAT_D_IMPL.
... << RSDN@Home 1.2.0 alpha rev. 789>>
Re[2]: Бибилиотека Delegates + Lambda (черновой вариант)
От: maggot  
Дата: 16.02.08 18:39
Оценка:
Здравствуйте, Tonal-, Вы писали:

T>Здравствуйте, maggot, Вы писали:

M>>Сделал такую библиотеку. Пока что черновой вариант. Если привести код в порядок, вылизать, будет библиотека — замена части Boost, связанной с Лямбда функциями. Так что критикуйте и делайте предложения по улучшению библиотеки.
T>Не компилится gcc. Проверял на g++ (GCC) 3.4.5 (mingw special) и g++-dw2 (GCC) 4.2.1-dw2 (mingw32-2)
T>Не находит PP_ENUM_CAT_D_IMPL.
Да, я не пробовал GCC компилировать. Работает точно на MSVC 8.0 и 9.0

Как установлю GCC, попробую сделать...
Re[2]: Бибилиотека Delegates + Lambda (черновой вариант)
От: maggot  
Дата: 16.02.08 20:25
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>Здравствуйте, maggot, Вы писали:


M>>Сделал такую библиотеку. Пока что черновой вариант. Если привести код в порядок, вылизать, будет библиотека — замена части Boost, связанной с Лямбда функциями. Так что критикуйте и делайте предложения по улучшению библиотеки.


AD>Эх... Вот если бы твоя лямбда вот так умела:

AD>
AD>(__1::some_func)(some_object);
AD>

AD>то цены бы ей не было...

Вот, пожалуйста, на сколько позволяет С++...

struct test_class1{
    int x;
    int foo(int arg, int arg3, double arg4, int sfs){
        return x + arg;
    }
};


test_class1 test_class1_inst1;
test_class1_inst1.x = 10;

delegate<int(test_class1*,int,int,double, int)> pLamFun6 = (__0->*&test_class1::foo)(__1, __2 - 23, __3, 245);
cout << "pLamFun6: " << pLamFun6(&test_class1_inst1, 1,a,3, 7) << endl;
Re[2]: Бибилиотека Delegates + Lambda (черновой вариант)
От: maggot  
Дата: 16.02.08 22:00
Оценка: 1 (1)
Здравствуйте, Tonal-, Вы писали:

T>Здравствуйте, maggot, Вы писали:

M>>Сделал такую библиотеку. Пока что черновой вариант. Если привести код в порядок, вылизать, будет библиотека — замена части Boost, связанной с Лямбда функциями. Так что критикуйте и делайте предложения по улучшению библиотеки.
T>Не компилится gcc. Проверял на g++ (GCC) 3.4.5 (mingw special) и g++-dw2 (GCC) 4.2.1-dw2 (mingw32-2)
T>Не находит PP_ENUM_CAT_D_IMPL.

А Boost Preprocessor работает на этом компиляторе?

Проблема вот в чём:

#define ZZ(d, s, n)
#define XX(s1, s2)             s1, s2
#define YY(ds, n)            ZZ(XX ds, n) //Ошибка. Компилятор пишет, что у ZZ должно быть три параметра, но дано только два.
YY((2,3),5)
Re[3]: Бибилиотека Delegates + Lambda (черновой вариант)
От: ArtDenis Россия  
Дата: 17.02.08 08:41
Оценка:
Здравствуйте, maggot, Вы писали:

M>Вот, пожалуйста, на сколько позволяет С++...

M>
M> ...
M>delegate<int(test_class1*,int,int,double, int)> pLamFun6 = (__0->*&test_class1::foo)(__1, __2 - 23, __3, 245);
M>cout << "pLamFun6: " << pLamFun6(&test_class1_inst1, 1,a,3, 7) << endl;
M>


Так неинтересно и слишком громоздко. Интересует именно упрощённый синтаксис __0->foo или __0::foo без наворотов типа __0->*&test_class1::foo. Думаю, после выхода boost::lambda многие разочаровались в том, что С++ не позволяет такие упрощённые конструкции и потеряли к этой либе всякий интерес.
... << RSDN@Home 1.1.4 stable rev. 510>>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[4]: Бибилиотека Delegates + Lambda (черновой вариант)
От: ArtDenis Россия  
Дата: 17.02.08 08:42
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>Думаю, после выхода boost::lambda многие разочаровались в том, что С++ не позволяет такие упрощённые конструкции и потеряли к этой либе всякий интерес.


Так что я пока не вижу смысла изобретать свой велосипед, с учётом того, что он не будет лучше оригинала
... << RSDN@Home 1.1.4 stable rev. 510>>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[3]: Бибилиотека Delegates + Lambda (черновой вариант)
От: Tonal- Россия www.promsoft.ru
Дата: 17.02.08 09:06
Оценка:
Здравствуйте, maggot, Вы писали:
M>А Boost Preprocessor работает на этом компиляторе?
Да, вполне: http://beta.boost.org/development/tests/trunk/developer/preprocessor.html

M>Проблема вот в чём:


M>
M>#define ZZ(d, s, n)
M>#define XX(s1, s2)             s1, s2
M>#define YY(ds, n)            ZZ(XX ds, n) //Ошибка. Компилятор пишет, что у ZZ должно быть три параметра, но дано только два.
M>YY((2,3),5)
M>

Судя по всему какие-то расширения препроцессора от MS.

P.S. Собственно по этому лямбда в босте такая объёмная — ей нужно работать не только на VC последний версии, но и на всех остальных распастранённых компиляторах.
... << RSDN@Home 1.2.0 alpha rev. 789>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.