Opened 4 years ago

Closed 4 years ago

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

WW #15

Reported by: Денис Лочмелис Owned by: Дмитрий Свиридкин
Component: WW_linq Version: 1.0
Keywords: Cc:

Description

  1. Начал делать хорошие тесты, но надоело...
  2. Пытался передавать все элементы по const& / &&, но всё сломал select, причем я толком не смог понять, почему. Для однообразия все пришлось сделать по значению.

Change History (5)

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

Owner: changed from Дмитрий Свиридкин to Денис Лочмелис
Type: ожидается проверкаожидаются исправления
  • Не копируйте функторы там, где их можно переместить.
  • есть виртуальные функции, а где виртуальный деструктор?
  • реализуйте where_neq/until_eq через where/until. Зачем дважды одно и то же делать?
  • to_vector можно сделать через copy_to и не дублировать код
  • T operator*() override { return std::move(T(*begin)); } зачем тут move?
  • void doDrop() { dropped = true; } этот метод не используется.
  • if (bool(parent) && !predicate(*parent) && !flag) в таком ли порядке должны быть проверки? Зачем тогда flag?
  • Не надо называть переменные flag. Давайте имя, соответствующее условию, которое вы проверяете.
  • Из-за инвалидации ссылок при смещении итераторов, в данном случае не стоит мучаться с передачей элементов по ссылкам.
  • Если сделать реализацию полностью на шаблонах, то с помощью perfect forwarding для возвращаемого значения (decltype(auto)) можно будет передавать по ссылкам или по значению, в зависимости от того, как возвращает значения функтор в select

5 + 2

comment:2 Changed 4 years ago by Денис Лочмелис

  • копирование функторов пофиксил
  • виртуальный деструктор добавил, но зачем он тут нужен, если все равно default?
  • X_eq через X
  • to_vector через to_copy, вспомнил про back_inserter
  • move - это артефакт от попыток сделать все на временных ссылках, убрал
  • doDrop тоже артефакт
  • кажется, что главное что bool(parent) первый. Флаг нужен, если элемент встретился, но нас потом попросили сделать ++. А, нас же не попросят. Ладно, убрано
  • ну, теперь не надо переименовывать

И еще добавил пару тестов.

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

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

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

Owner: changed from Денис Лочмелис to Дмитрий Свиридкин

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

Resolution: задача сдана
Status: assignedclosed
  • T operator*() override { return std::move(*parent); } здесь move лишний и мешает RVO
  •     select_enumerator(enumerator<T>& parent_, const F& func_)
                : parent(parent_)
                , func(func_) {}
    

Тут копирование функтора
в until и where аналогично

  • в цепочке until(...).where(...) until будет проверять предикат дважды на одном и том же элементе

6 + 2

Note: See TracTickets for help on using tickets.