Opened 4 years ago

Closed 4 years ago

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

WW_linq

Reported by: Vavilov Mark Owned by: Дмитрий Свиридкин
Component: WW_linq Version: 2.0
Keywords: Cc:

Description


Change History (4)

comment:1 Changed 4 years ago by Дмитрий Свиридкин

Owner: changed from Дмитрий Свиридкин to Vavilov Mark
Type: ожидается проверкаожидаются исправления
  • Не копирйте функторы там, где их можно переместить (у вас не везде)
  • реализуйте to_vector через copy_to, чтоб не дублировать код
  • {{{

drop_enumerator& operator++() override { Переход к следующему элементу

count_++;
drop_();

}}}
Зачем здесь count_++?
drop нужно сделать только в одном месте, например, в операторе приведения к bool

  • перегрузки оператора bool тоже надо пометить override
  • есть виртуальные методы, но нет виртуального деструктора
  • поскольку приведение к bool может перемещать итераторы, использование assert(parent_) меняет поведение программы в релизной и дебажной сборках
  • в where у вас предикат может вызываться по нескольку раз на одном и том же элементе
  • функтор в select тоже может вызываться несколько раз, если следующий в цепочке итератор, например, проверяет предикат.

4 + 2

comment:2 Changed 4 years ago by Vavilov Mark

Owner: changed from Vavilov Mark to Дмитрий Свиридкин
Type: ожидаются исправленияожидается проверка
Version: 1.02.0

comment:3 Changed 4 years ago by Дмитрий Свиридкин

в until, where и select теперь UB

*

   auto where_neq(const T& value) {
                return where([&](T x) { return x != value; });
            }

Нельзя захватывать value по ссылке.

  • деструктора достаточно только в базовом классе.
  •  T operator*() override { // Получает текущий элемент.
         if (!parent_)
             assert(false);
    

Теперь побочные эффекты от оператора bool будут всегда. Наверное, это не то, чего хотелось бы в операторе *.

  •    if (*parent_ != last_element_)
          last_element_ = *parent_, f_of_last_element_ = predicate_(last_element_);
    

Во-первых, элемент запрашивается дважды. Во-вторых, оператора сравнения может и не быть.

Last edited 4 years ago by Дмитрий Свиридкин (previous) (diff)

comment:4 Changed 4 years ago by Дмитрий Свиридкин

Resolution: задача сдана
Status: assignedclosed
Note: See TracTickets for help on using tickets.