Opened 4 years ago

Closed 4 years ago

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

WW #13

Reported by: Filippov Denis Owned by: Sokolov Viacheslav
Component: WW_array Version: 3.0
Keywords: Cc:

Description


Change History (6)

comment:1 Changed 4 years ago by Sokolov Viacheslav

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

10 template<std::size_t N>
11 void checkArrayIndex(std::size_t index)
12 {

13 if (index < 0
index >= N)

14 throw std::out_of_range("");
15 }

можно сообщение сделать осмысленным - написать, что произошло и индекс.
< 0 быть не может, тип беззнаковый.

29 void fill(T val) noexcept;
в текущей реализации нет смысла принимать по значению, это лишь порождает лишнюю копию.
const T& / сэкономить одно копирование с помощью std::move.
noexcept только если конструктор копирования noexcept.

38 uint8_t _data[(N + 7) / 8];

а если хочется N = 2^32 - 1? либо static_assert, либо реализацию поправить

52 *_data &= !(1 << _bit);
53 *_data |= value << _bit;
61 return *_data & (1 << _bit);


чище сделать static_cast<uint8_t>() << _bit.
Знаковый сдвиг != беззнаковый сдвиг.

91 template<typename T, std::size_t N>
92 T & my_array<T, N>::operator[](std::size_t index) noexcept
93 {
94 return _data[index];
95 }
96
97 template<typename T, std::size_t N>
98 const T & my_array<T, N>::operator[](std::size_t index) const noexcept
99 {

100 return _data[index];
101 }
assert все же не помешает

145 template<std::size_t N>
146 bool my_array<bool, N>::operator[](std::size_t index) const noexcept
147 {
148 std::size_t proxy_index = index / 8;
149 return my_array_bool_proxy((uint8_t *)(&_data[proxy_index]), index * 8 - proxy_index * 8);
150 }
а зачем proxy, если возвращаемое значение - bool? Кроме того, в реализации ошибка
Вместо c-cast здесь должен был бы быть const_cast

164 template<std::size_t N>
165 void my_array<bool, N>::fill(bool val) noexcept
166 {
167 for (size_t i = 0; i < N; i++)
168 (*this)[i] = val;
169 }
можно сделать эффективнее с помощью memset

52 *_data &= !(1 << _bit);

имелось в виду ~?

44 explicit my_array_bool_proxy(uint8_t *data, int bit)

почему int?

Сейчас a[i] = a[i + 1] работает неправильно (для bool-перегрузки)

comment:2 Changed 4 years ago by Filippov Denis

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

comment:3 Changed 4 years ago by Sokolov Viacheslav

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

bool - специализация отличается по интерфейсу:

26 const T & at(std::size_t index) const;
27 T & at(std::size_t index);
28 const T & operator[](std::size_t index) const noexcept;
29 T & operator[](std::size_t index) noexcept;

vs

78 bool at(std::size_t index) const;
79 my_array_bool_proxy at(std::size_t index);
80 my_array_bool_proxy operator[](std::size_t index) const noexcept;

(отличия в количестве операций и их свойствах)

comment:4 Changed 4 years ago by Sokolov Viacheslav

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

comment:5 Changed 4 years ago by Filippov Denis

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

comment:6 Changed 4 years ago by Sokolov Viacheslav

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

164 return my_array_bool_proxy(const_cast<uint8_t *>(&_data[proxyIndex]), index - proxyIndex * 8);

const_cast<uint8_t *> не нужен

Note: See TracTickets for help on using tickets.