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: ожидается проверкаожидаются исправления

вы бы хотя бы пустой main положили, а то makefile есть, а make падает.

Почти всё работает. Но иногда происходит копирование функции в until, where и select. Пример теста вот такой

template<typename F>
auto force_move(F &&f) {
  return NonCopyableFunctorWrapper<F>(std::move(f));
}
// NonCopyableFunctorWrapper - это класс-обёртка над указателем на функцию с правильно определённым оператором() и говорящим конструктором копирования

    auto xs = std::vector<int>{9, 4, 8, 1, -3, 8, 7};
    auto res = from(xs.begin(), xs.end()).until(force_move([](int x) { return x < 0; })).to_vector();

    assert((std::vector<int>{9, 4, 8, 1}) == res);

заголовочный файл, пожалуйста, называйте linq.hpp - для тестов это удобнее

6/10

comment:2 Changed 3 years ago by martynov.maksim

Type: ожидаются исправленияожидается проверка
Version: 1.02.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

Last edited 3 years ago by Антон Филатов (previous) (diff)

comment:4 Changed 3 years ago by martynov.maksim

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 martynov.maksim

Type: ожидаются исправленияожидается проверка
Version: 2.03.0

Спасибо за обертку над функцией!
Потестил с ней и нашел ошибки
Сейчас лишних копирований не должно быть

comment:7 Changed 3 years ago by Антон Филатов

Resolution: задача сдана
Status: assignedclosed

По прежнему падает тест на селект из пустого файла. Остальное всё проходит
9/10

Note: See TracTickets for help on using tickets.