Opened 4 years ago

Closed 4 years ago

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

WW #18

Reported by: Surkov Petr Owned by: Egor Suvorov
Component: WW_format Version: 3.0
Keywords: Cc:

Description


Change History (5)

comment:1 Changed 4 years ago by Egor Suvorov

Owner: changed from Egor Suvorov to Surkov Petr
Type: ожидается проверкаожидаются исправления

Корректность:

  • Не компилируется Clang'ом. И, если не ошибаюсь, он по стандарту прав. У кого-то из ваших коллег такие проблемы уже были.
      In file included from tests/01_smoke_test.cpp:1:
    ../../../cpp19/surkov.petr/lab_18/include/format.hpp:110:60: error: template parameter redefines default argument
    template<typename T, std::enable_if_t<isFormattable<T>>* = nullptr>
                                                               ^
    ../../../cpp19/surkov.petr/lab_18/include/format.hpp:48:60: note: previous default template argument defined here
    template<typename T, std::enable_if_t<isFormattable<T>>* = nullptr>
                                                               ^
    ../../../cpp19/surkov.petr/lab_18/include/format.hpp:89:22: error: no matching function for call to 'make_string'
                s.append(make_string(value[i]));
                         ^~~~~~~~~~~
    ../../../cpp19/surkov.petr/lab_18/include/format.hpp:115:12: note: in instantiation of function template specialization 'format::FormatHelper<std::__1::vector<bool, std::__1::allocator<bool> > >::append_to<std::__1::vector<bool, std::__1::allocator<bool> >, nullptr>' requested here
        helper.append_to(formatted);
               ^
    tests/01_smoke_test.cpp:60:19: note: in instantiation of function template specialization 'format::make_string<std::__1::vector<bool, std::__1::allocator<bool> >, nullptr>' requested here
        CHECK(format::make_string(std::vector<bool>{}) == "{}");
                      ^
    /usr/include/doctest.h:2471:15: note: expanded from macro 'CHECK'
    #define CHECK DOCTEST_CHECK
                  ^
    ../../../cpp19/surkov.petr/lab_18/include/format.hpp:49:13: note: candidate template ignored: requirement 'isFormattable<std::__1::__bit_const_reference<std::__1::vector<bool, std::__1::allocator<bool> > > >' was not satisfied [with T = std::__1::__bit_const_reference<std::__1::vector<bool, std::__1::allocator<bool> > >]
    std::string make_string(const T &value);
                ^
    2 errors generated.
    make: *** [bin/01_smoke_test] Error 1
    

Стиль:

  • Очень перемешаны разные виды форматирования, сложно читать. Сделайте через специализации FormatHelper, а не через кучу перегрузок функций.
  • isFormattable сейчас вообще никак не связан с FormatHelper, а зря. Но это всё равно полностью перепишется, должно стать сильно лучше.

comment:2 Changed 4 years ago by Surkov Petr

Owner: changed from Surkov Petr to Egor Suvorov
Type: ожидаются исправленияожидается проверка
Version: 1.02.0

comment:3 Changed 4 years ago by Egor Suvorov

Owner: changed from Egor Suvorov to Surkov Petr
Type: ожидается проверкаожидаются исправления

Корректность 4/7:

  • estimate_size для целочисленных типов неверен.
  • append_to для чисел выделяет строчку в куче не по делу.

Стиль 0.5/3:

  • estimate_size() для вектора непонятен по коду: формула верная, но, например, неочевидно, где учли фигурные скобки.
  • isFormattableImpl дублирует логику из специализаций FormatHelper. Лучше сделать как-то так, чтобы при добавлении новой специализации вообще не приходилось менять оставшийся код.
  • isVector не нужен, лучше честно сделать специализацию.
  • Комментарии vector/bool полностью дублируют код и добавляют простор для ошибок: поменяли специализацию, забыли поменять комментарий, теперь он путает.
  • Лучше += вместо append.
  • MAX_BOOL_LEN — деталь реализации конкретного FormatHelper, должна быть объявлена внутри.
  • MAX_FORMATTED_LEN = 10 — неверное утверждение, бывают отформатриованные строчки длиннее 10.

comment:4 Changed 4 years ago by Surkov Petr

Owner: changed from Surkov Petr to Egor Suvorov
Type: ожидаются исправленияожидается проверка
Version: 2.03.0

comment:5 Changed 4 years ago by Egor Suvorov

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

Попытка уже после дедлайна, так что не на баллы. Но было бы так:

Корректность 5/7:

  • Для контейнеров кроме vector может прийти hard compilation error. Потому что value_type есть, а вот [] нет.

Стиль 2/3:

  • template<> FormatHelper<bool> вместо is_same_v<T, bool>
  • Для целочисленных:
    • Буфер лучше сделать локальным для append_to, чтобы место не занимать
    • assert(ec == std::errc()); — проверяется, что ошибок у to_chars нет. Например, буфера хватило. std::errc — какой-то новый тип, его значение по умолчанию — "ошибок нет".
  • Для векторов:
    • Лучше специализацию vector<T>, чем лезть в value_type. Тем более что теперь у вас не только для векторов работает и из-за этого рушится корректность.
Note: See TracTickets for help on using tickets.