Opened 4 years ago

Closed 4 years ago

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

WW #13

Reported by: Alexander Morozov Owned by: Sokolov Viacheslav
Component: WW_array Version: 2.0
Keywords: Cc:

Description


Change History (3)

comment:1 Changed 4 years ago by Sokolov Viacheslav

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

Просьба разбить обьявление и определение. Так стоит делать, чтобы отдельно смотреть на интерфейс, отдельно - на реализацию. Зачастую интересна не реализация, а интерфейс.

11 if (index < 0
index >= N)

12 throw std::out_of_range("Element index is out of range");
<0 не может быть

Сообщение стоит расширить, добавить информацию об индексе, по которому было обращение

22 T &operator[](size_t index) { return _data[index]; }
assert все же не повредит
также можно дописать noexcept

на самом деле почти все методы можно пометить как constexpr

final у классов?

сейчас a[0] = a[1] работает неправильно у bool-специализации. Нужно написать на это тест. Причина в автосгенерированном
proxy& operator=(proxy&&);

57 constexpr static size_t SIZE = (N + 7) / 8;

может переполниться (переполнение беззнакового - не UB, поэтому скомпилируется)

69 return _data[index / 8] >> (index % 8);
здесь ошибка. Нужен тест.

84 void fill(bool val) noexcept { std::fill(_data, _data + SIZE, val * 0xff); }
кажется, val ? 255u : 0u понятнее и сильно длиннее, чем val * 0xff

comment:2 Changed 4 years ago by Alexander Morozov

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

Вроде бы все это исправил. Из-за за того, что вынес реализацию, получилось нагромождение темплейтов, возможно, что-то сделал неоптимально. Хотел сделать proxy приватным, поэтому он получился свой для каждого N. Впрочем, это не должно влиять на производительность.

comment:3 Changed 4 years ago by Sokolov Viacheslav

Resolution: задача сдана
Status: assignedclosed
 67   if (index >= N)
 68     throw std::out_of_range("Element index is out of range: index " +
 69                             std::to_string(index) + " in array with size " +
 70                             std::to_string(N));

можно было бы не дублировать 4 раза, вынести в функцию

стоило бы все же добавить assert-ы для обращений через []

33 proxy &operator=(proxy &other) = delete;
35 bool operator=(proxy &&other);

первая строчка не удаляет
proxy &operator=(const proxy &other)
и при этом такой (non-const) оператор все равно не генерируется автоматически, то есть она не имеет смысла в данном случае. Стоило бы добавить

33 proxy &operator=(const proxy &other) = delete;

109 _val &= ~(1 << _bit_num);
110 _val = val << _bit_num;
здесь стоило бы вести работу с беззнаковыми типами, потому что знаковые и беззнаковые битовые операции могут работать по-разному. Кроме того, лучше минимизировать количество implicit преобразований, в данном случае - integer promotion можно было бы избежать при помощи явного static_cast

35 bool operator=(proxy &&other);
noexcept?

Note: See TracTickets for help on using tickets.