Opened 4 years ago
Closed 4 years ago
#868 closed ожидается проверка (задача сдана)
WW #13
Reported by: | Surkov Petr | Owned by: | Sokolov Viacheslav |
---|---|---|---|
Component: | WW_array | Version: | 3.0 |
Keywords: | Cc: |
Description
Change History (6)
comment:1 Changed 4 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 4 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
comment:3 Changed 4 years ago by
include/my_array_impl.hpp:58:11: error: ‘assert’ was not declared in this scope
58 | assert(index < size());
|
~
include/my_array_impl.hpp:5:1: note: ‘assert’ is defined in header ‘<cassert>’; did you forget to ‘#include <cassert>’?
4 | #include "my_array.h"
+++ |+#include <cassert>
comment:4 Changed 4 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
29 unsigned char data[(N + 7) >> 3];
может переполниться при достаточно большом N
на самом деле везде можно дописать constexpr
13 class my_array
27 class my_array<bool, N>
30 struct array_bool_proxy
final?
struct и private непонятно, зачем сочетать. Хотите приватные поля - используйте класс.
32 array_bool_proxy(array_bool_proxy &other) = delete;
rvalue?
9 template<typename T, size_t N>
10 T &my_array<T, N>::operator[](size_t index) noexcept {
11 return data[index];
12 }
13
14 template<typename T, size_t N>
15 const T &my_array<T, N>::operator[](size_t index) const noexcept {
16 return data[index];
17 }
18
assert все же не помешает
45 template<typename T, size_t N>
46 void my_array<T, N>::fill(T val) & {
47 static_assert(std::is_copy_assignable<T>::value);
48 std::for_each(data, data + N, [&val](T &i) {i = val;});
49 }
непонятно, зачем аргумент принимать по значению, если оно не модифицируется. Стоит либо const& принимать, либо сделать move в конце.
52 template<size_t N>
53 my_array<bool, N>::my_array() noexcept {
54 fill(false);
55 }
кажется, этого не просили в условии?
97 std::for_each(data, data + ((N + 7) >> 3), [val_int = static_cast<int>(val)](unsigned char &i) {i = val_int * 255;});
можно эффективнее с помощью memset; в unsigned зачем-то записывается signed значение, чего легко избежать
105 *byte = (((*byte >> pos) & 1) << pos);
проще *byte &= ~(1u << pos);
Пока что v[i] = v[i+1] не работает корректно для bool-специализации; кроме того, не все методы покрыты тестами. Покройте тестами как минимум то, что не работает.
comment:5 Changed 4 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 2.0 → 3.0 |
comment:6 Changed 4 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
64 template<size_t N>
65 constexpr bool my_array<bool, N>::operator[](size_t index) const noexcept {
66 assert(index < size());
67 return (data[index >> 3] >> index) & 1;
68 }
здесь ошибка. const - методы плохо протестированы, поэтому осталась незамеченой.
противоречит условию
нужны operator= и copy-ctor для array
почему такой интерфейс?
в некоторых местах не хватает noexcept