Opened 3 years ago
Closed 3 years ago
#739 closed ожидается проверка (задача сдана)
WW_linq Martynov hw_14
Reported by: | martynov.maksim | Owned by: | Антон Филатов |
---|---|---|---|
Component: | WW_linq | Version: | 3.0 |
Keywords: | Cc: |
Description
Change History (7)
comment:1 Changed 3 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 3 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
comment:3 Changed 3 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
make g++ -O2 -g -ggdb -Wall -Werror -std=c++17 -Iinclude -c -MMD -o obj/main.o src/main.cpp src/main.cpp: In function ‘void my_test()’: src/main.cpp:92:24: error: use of deleted function ‘functor::functor(const functor&)’ 92 | .where(func) | ^ src/main.cpp:74:5: note: declared here 74 | functor(const functor&) = delete; | ^~~~~~~ In file included from src/main.cpp:1: include/linq.hpp:67:26: note: initializing argument 1 of ‘auto linq::impl::enumerator<T>::where(F) [with F = functor; T = int]’ 67 | auto where(F func) { | ~~^~~~ Makefile:17: recipe for target 'obj/main.o' failed make: *** [obj/main.o] Error 1
Удалил весь main, но на кастомных тестах всё равно эта же ошибка - копируется обёртка над функцией.
Кстати, заметил странность: в main вы подключаете linq.hpp, а в include лежит linq.h
Оценка пока та же
6/10
comment:4 Changed 3 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|
Забыл, что переименовал файл linq.h -> linq.hpp, и в итоге нужный не залился на сервер :(
Сейчас все в порядке
Можете перепроверить, пожалуйста, а то страшно такое на последнее ревью оставлять
comment:5 Changed 3 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
Так, ну ошибка с тем, что постоянно копируется функция не пропала.
Теперь только ещё падает селект из пустого вектора.
И проверьте на валгринде селект, который извлекает квадратный корень из int и возвращает double:
int xs[] = {1, 2, 3, 4, 5}; auto res = drom(xs, xs+5).select<double>([](int x) { return std::sqrt(x); }) .to_vector();
template<typename F> struct NonCopyableFunctorWrapper { NonCopyableFunctorWrapper(F &&other) : f_(new F(std::move(other))) {} NonCopyableFunctorWrapper(const NonCopyableFunctorWrapper &other) : f_(new F(*other.f_.get())) { std::cout << "Unexpected copy\n"; } NonCopyableFunctorWrapper(NonCopyableFunctorWrapper &&other) = default; NonCopyableFunctorWrapper& operator=(NonCopyableFunctorWrapper other) { f_.swap(other.f_); } template<typename... Args> auto operator()(Args... args) { assert(f_); return (*f_)(std::forward<Args>(args)...); } template<typename... Args> auto operator()(Args... args) const { assert(f_); return static_cast<const F&>(*f_)(std::forward<Args>(args)...); } private: std::unique_ptr<F> f_; };
Держите код обёртки над функцием - может, так вам будет проще отловить ошибку.
comment:6 Changed 3 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 2.0 → 3.0 |
Спасибо за обертку над функцией!
Потестил с ней и нашел ошибки
Сейчас лишних копирований не должно быть
comment:7 Changed 3 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
По прежнему падает тест на селект из пустого файла. Остальное всё проходит
9/10
вы бы хотя бы пустой main положили, а то makefile есть, а make падает.
Почти всё работает. Но иногда происходит копирование функции в until, where и select. Пример теста вот такой
заголовочный файл, пожалуйста, называйте linq.hpp - для тестов это удобнее
6/10