fmt 10.0.0

good-penguin.png

После восьми месяцев разработки состоялся выпуск 10.0.0 библиотеки форматирования данных fmt — быстрой и безопасной альтернативы stdio и iostreams для C++.

#include 

int main() {
    fmt::print(fmt::emphasis::bold | fg(fmt::color::red),
           "Elapsed time: {0:.2f} seconds", 1.23);
}

Список изменений:

  • для форматирования чисел с плавающей точкой с заданной точностью взамен алгоритма Grisu используется алгоритм Dragonbox, что дало существенное улучшение производительности;
  • для форматирования чисел с плавающей точкой в шестнадцатеричном представлении вместо ранее использованного snprintf применяется собственная реализация;
  • улучшена поддержка модулей C++20;
  • format_as теперь поддерживает любой пользовательский тип, а не только перечисления:
#include 

struct floaty_mc_floatface {
  double value;
};

auto format_as(floaty_mc_floatface f) { return f.value; }

int main() {
  fmt::print("{:8}\n", floaty_mc_floatface{0.42}); // prints "    0.42"
}
  • для совместимости с std::format удалены устаревшие неявные преобразования для перечислений и преобразования к примитивным типам;
  • улучшена поддержка std::chrono:
#include 

int main() {
  // prints "    2023"
  fmt::print("{:>8%Y}\n", std::chrono::system_clock::now());
}

#include 

int main() {
  // prints 01.234567
  fmt::print("{:%S}\n", std::chrono::microseconds(1234567));
}
  • добавлена поддержка std::utc_time;
  • добавлена поддержка std::exception:
#include 
#include 

int main() {
  // prints: "vector::_M_range_check: __n (which is 0) >= this->size() (which is 0)"
  try {
    std::vector().at(0);
  } catch(const std::exception& e) {
    fmt::print("{}", e);
  }
}
  • улучшена поддержка стандартных контейнеров:
#include 
#include 
#include 

int main() {
  auto s = std::stack>();
  for (auto b: {true, false, true}) s.push(b);
  fmt::print("{}\n", s); // prints [true, false, true]
}
  • добавлена поддержка std::optional;
  • в fmt::ptr добавлена поддержка unique_ptr с пользовательским деструктором;
  • улучшена обработка некорректного Юникода в путях файлов;
  • добавлена экспериментальная поддержка Юникодных разделителей цифр :
c++
auto loc = std::locale(
  std::locale(), new fmt::format_facet("’"));
auto s = fmt::format(loc, "{:L}", 1000);
  • для совместимости с basic_format_string добавлена fmt::basic_format_string::get();
  • для совместимости с C++23 добавлена функция println;
  • улучшения документации и тестов.

Множество других исправлений и улучшений.

>>> Подробности

©  Linux.org.ru