Opened 3 years ago

Closed 3 years ago

#744 closed ожидается проверка (задача сдана)

WW_linq Klimov lab_14

Reported by: klimov.ivan Owned by: Антон Филатов
Component: WW_linq Version: 3.0
Keywords: Cc:

Description


Change History (5)

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

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

не компилируется кастомный main

include/linq.hpp:176:26: error: invalid covariant return type for ‘linq::impl::enumerator<T>& linq::impl::select_enumerator<T, U, F>::operator++() [with T = int; U = double; F = test_example_3()::<lambda(int)>]’
  176 |   virtual enumerator<T> &operator++() {
      |                          ^~~~~~~~
include/linq.hpp:29:23: note: overridden function is ‘linq::impl::enumerator<T>& linq::impl::enumerator<T>::operator++() [with T = double]’
   29 |   virtual enumerator& operator++() = 0;

include/linq.hpp:172:11: error: assignment of member ‘linq::impl::select_enumerator<int, char, test_select()::<lambda(int)> >::cache’ in read-only object
  172 |     cache = func_(*parent_);
      |     ~~~~~~^~~~~~~~~~~~~~~~~

В сущности minimal_smoke_test тоже не компилируется с ошибкой вот тут: cache = func_(*parent_);
Фиксить это надо так: проблема действительно в том, что вы непонятной функции передаёте parent, и компилятор думает, что эта функция нашего доблестного parent-а сломает. А не должна, ибо operator* у нас константный. Выход - вызывать функцию не во время оператора*, а заранее - в конструкторе и в операторе++ - они не константные. И это логично. Оператор* должен разыменовывать уже то, на что в данный момент enumerator показывает. А вот во время ++ надо перейти не на 1 эдемент, а ровно на столько, на сколько требует функция.

Это же касается и where. Почему-то ваш ++ делает ровно +1. until тоже работал бы правильно, если бы вы вместо if поставили бы while. Кстати говоря, в конструкторе в этих классах тоже надо вызывать переданную функцию. Вдруг оператор* сразу после создания вызовут, а первый элемент не подходит под параметры заданной функции

В остальном выглядит всё достойно, но поставить баллы пока не могу

comment:2 Changed 3 years ago by klimov.ivan

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

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

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

Почти всё работает. Но иногда происходит копирование функции в 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);

7/10

comment:4 Changed 3 years ago by klimov.ivan

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

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

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

10/10

Note: See TracTickets for help on using tickets.