Opened 4 years ago

Closed 4 years ago

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

WW_format

Reported by: tarasov.denis Owned by: Egor Suvorov
Component: WW_format Version: 3.0
Keywords: Cc:

Description

Generally, it's not a good idea to depend on experimental features. https://stackoverflow.com/a/43318673

haha std::experimental go brrrrrrrr

Change History (10)

comment:1 Changed 4 years ago by Egor Suvorov

Owner: changed from Egor Suvorov to tarasov.denis

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

  • Уберите is_detected_v, это задание на SFINAE (поэтому так мало за корректность). Но вообще зачёт-зачёт, что нашли.
  • Для целых чисел
    • Неверно оценивается размер для отрицательных чисел.
    • Присутствуют лишние выделения памяти независимо от этого.
  • Для векторов
    • Совершенно неточно оценивается длина, только по первому элементу.
  • Не компилируется из-за нарушения стандарта и того, что в vector<T>::const_reference != const T& для vector<bool>
    In file included from tests/01_smoke_test.cpp:1:
    ../../../cpp19/tarasov.denis/lab_18/include/format.hpp:150:86: error: template parameter redefines default argument
    template<typename T, typename std::enable_if<FormatHelper<T>::isValid, int>::type* = nullptr>
                                                                                         ^
    ../../../cpp19/tarasov.denis/lab_18/include/format.hpp:23:86: note: previous default template argument defined here
    template<typename T, typename std::enable_if<FormatHelper<T>::isValid, int>::type* = nullptr>
                                                                                         ^
    ../../../cpp19/tarasov.denis/lab_18/include/format.hpp:135:16: error: call to deleted function 'make_string'
          s.append(make_string(value_[i - 1]));
                   ^~~~~~~~~~~
    ../../../cpp19/tarasov.denis/lab_18/include/format.hpp:155:12: note: in instantiation of member function 'format::FormatHelper<std::__1::vector<bool, std::__1::allocator<bool> >, void>::append_to' 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/tarasov.denis/lab_18/include/format.hpp:16:13: note: candidate function has been explicitly deleted
    std::string make_string(...) = delete;
                ^
    ../../../cpp19/tarasov.denis/lab_18/include/format.hpp:24:13: note: candidate template ignored: requirement 'FormatHelper<std::__1::__bit_const_reference<std::__1::vector<bool, std::__1::allocator<bool> > >, void>::isValid' 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);
                ^
    ../../../cpp19/tarasov.denis/lab_18/include/format.hpp:139:16: error: call to deleted function 'make_string'
          s.append(make_string(value_[value_.size() - 1]));
                   ^~~~~~~~~~~
    ../../../cpp19/tarasov.denis/lab_18/include/format.hpp:16:13: note: candidate function has been explicitly deleted
    std::string make_string(...) = delete;
                ^
    ../../../cpp19/tarasov.denis/lab_18/include/format.hpp:24:13: note: candidate template ignored: requirement 'FormatHelper<std::__1::__bit_const_reference<std::__1::vector<bool, std::__1::allocator<bool> > >, void>::isValid' 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);
                ^
    3 errors generated.
    make: *** [bin/01_smoke_test] Error 1
    01_smoke_test: failed compilation.
    

Стиль 0.5/3:

  • MAX_OUTPUT_SIZE is a highly misleading name. It is not MAX.
  • Очень стрёмно, что потребовалась перегрузка make_string(...)
  • `experimental_
  • enable_if --> enable_if_t, аналогично is_same --> is_same_v.
  • После == — ровно один пробел.
  • В цикле по элементам вектора лучше сделать i = 0; i + 1 < size.
  • Вместо append/push_back лучше +=.

comment:2 Changed 4 years ago by Egor Suvorov

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

comment:3 Changed 4 years ago by tarasov.denis

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

std::experimental is no more. He was like a father to me.

comment:4 Changed 4 years ago by tarasov.denis

Owner: changed from tarasov.denis to Egor Suvorov

comment:5 Changed 4 years ago by Egor Suvorov

Owner: changed from Egor Suvorov to tarasov.denis

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

  • Есть UB при форматировании чисел на границе. И заодно неверно выдаётся estimate_size().

Стиль 1.5/3:

  • BIGGEST_POSSIBLE_SEQUENCE_LENGTH — абсолютно неверное название. Легко подберу вектор, который при форматировании будет длиннее.
    • Подсказка: вероятно, эта константа вообще имеет отношение не ко всему форматированию в целом, а только к одному конкретному случаю? Где она и должна находиться.
  • isValid --> IS_VALID
  • Случай для целых чисел
    • Из объяснения "represented without loss" не становится понятнее. Вспомните, как вы пытались понять эту же формулировку из стандарта, пожалейте читателей, разъясните.
    • И строковые комментарии лучше через //
  • Случай для .format(): неясно, зачем заводить поле.
  • Непонятный код в оценке длины для вектора. Например, почему для пустого надо добавить 2, а для непустого не надо? Чем эти случаи отличаются? Да ничем.
    • Если посидеть-подумать, то можно внезапно заметить, что там есть -1 и длины строк , и {} совпадают, но это неочевидно и путает. Лучше написать один общий случай, пишите код для человека. Компилятор соптимизирует.

comment:6 Changed 4 years ago by Egor Suvorov

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

comment:7 Changed 4 years ago by tarasov.denis

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

comment:8 Changed 4 years ago by Egor Suvorov

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

Корректность 7/7.

Стиль 2.25/3:

  • FORMAT_FUNCTION_OUTPUT_LENGTH_LIMIT — неверное название, это не ограничение на размер вывода format().
  • enable_if_t<A, int>* — лучше второй параметр сделать void. Каноничнее. Иначе возникает ощущение, что этот int что-то значит. А ещё лучше — убрать, он возьмёт тип по умолчанию, т.е. void.
  • Стоит проверить, что to_chars вернул успех. Рекомендую сразу брать structured binding.
  • Можно избавиться от +1 для C-terminated string, если воспользоваться string_view.
  • NUMBER_OF_POSSIBLE_SYMBOLS_IN_DECIMAL_FORM --> MAX_DECIMAL_LENGTH

comment:9 Changed 4 years ago by tarasov.denis

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

Версии кончились.

Прости, Егор, что задолбал тебя.

comment:10 Changed 4 years ago by Egor Suvorov

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

Всё хорошо, версий в лабах специально исходно не предполагается :)

По стилю тоже успех.

Note: See TracTickets for help on using tickets.