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 Sokolov Viacheslav

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

15 std::unique_ptr<T[]> data;

противоречит условию

Этот контейнер представляет собой обёртку над обычным массивом, в частности:
Все элементы расположены в памяти друг за другом внутри my_array (а не в динамической памяти, как в случае с my_vector).

нужны operator= и copy-ctor для array

34 array_bool_proxy operator=(array_bool_proxy &other);
35 bool operator=(bool value);

почему такой интерфейс?

в некоторых местах не хватает noexcept

comment:2 Changed 4 years ago by Surkov Petr

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

comment:3 Changed 4 years ago by Sokolov Viacheslav

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 Sokolov Viacheslav

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 Surkov Petr

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

comment:6 Changed 4 years ago by Sokolov Viacheslav

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

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 - методы плохо протестированы, поэтому осталась незамеченой.

Note: See TracTickets for help on using tickets.