Skip to content

Releases: eliaskosunen/scnlib

4.0.1

03 Nov 23:10
e937be1
Compare
Choose a tag to compare
  • Fix documentation generation

Full Changelog: v4.0.0...v4.0.1

4.0.0

03 Nov 22:16
f877beb
Compare
Choose a tag to compare

Breaking changes

  • scanner::parse now returns Iterator, not scan_expected<Iterator>
    • Errors are reported by throwing a scan_format_string_error, or by calling ParseContext::on_error.
  • Optimize the way scan calls vscan to remove extra copies/moves
// Dummy-implementation of `scan`
// Before (v3):
auto args = make_scan_args<scan_context, Args...>();
auto result = vscan(std::forward<Source>(source), format, args);
return make_scan_result(std::move(result), std::move(args.args()));

// Now (v4):
auto result = make_scan_result<Source, Args...>();
fill_scan_result(result, vscan(std::forward<Source>(source), format,
                               make_scan_args(result->values())));
return result;
  • Changes to scan_error
    • Success state removed: use expected<void, scan_error> instead.
    • scan_error::value_out_of_range split into value_positive_overflow, value_negative_overflow,
      value_positive_underflow, and value_negative_overflow.
    • end_of_range renamed to end_of_input.
    • invalid_literal, invalid_fill, length_too_short, and invalid_source_state added.
  • basic_scan_context is now templated on the range type

Features

  • <chrono> scanning
  • Scanning of pointers (void* and const void*)
  • Ability to disable dependency on FastFloat with SCN_DISABLE_FAST_FLOAT
    • FastFloat used to be the only required external dependency
    • If disabled, std::from_chars for floating-point values is required

Changes

  • Deprecate visit_scan_arg, add basic_scan_arg::visit
  • Remove thousands separator checking when scanning localized numbers
  • scan_error::invalid_source_state is now returned if syncing with the underlying source fails after scan
    (like for example, std::ungetc fails)

Full Changelog: v3.0.2...v4.0.0

3.0.2

03 Nov 15:00
1d456d7
Compare
Choose a tag to compare

Full Changelog: v3.0.1...v3.0.2

3.0.1

15 Jun 17:07
bdd6c09
Compare
Choose a tag to compare
  • Bump SOVERSION to 3 (reported in #117, thanks @xvitaly (Vitaly))
  • Call find_package in CMake iff a target is not already defined (reported in #118, thanks @ajtribick)
  • Remove find_dependency(Threads) from scn-config.cmake

Full Changelog: v3.0.0...v3.0.1

3.0.0

07 Jun 21:45
cd7fd4f
Compare
Choose a tag to compare

Breaking changes

  • The default behavior for scanning integers is now d (decimal) instead of i (detect base from prefix).
// v3
auto result = scn::scan<int>("077", "{}");
// result->value() == 77
result = scn::scan<int>("078", "{}");
// result->value() == 78

// v2
auto result = scn::scan<int>("077", "{}");
// result->value() == 63
result = scn::scan<int>("078", "{}");
// result->value() == 7
// result->range() == "8"
// (Because of the '0' prefix, an octal number is expected,
//  and '8' is not a valid octal digit, so reading is stopped)
  • A large part of the bundled <ranges>-implementation is removed.
    Only the parts strictly needed for the library are included.
    • The library no longer uses a stdlib provided <ranges>, even if available.
    • This cut down compile times massively for library consumers
    • You now may need to specialize scn::ranges::enable_borrowed_range for your own range types,
      even if you've already specialized std::ranges::enable_borrowed_range.
      Specializations of std::basic_string_view are already borrowed out of the box.
// std::span is a borrowed_range,
// but scnlib doesn't know about it
auto result = scn::scan<...>(std::span{...}, ...);
// decltype(result->range()) is scn::ranges::dangling

namespace scn::ranges {
template <typename T, size_t E>
inline constexpr bool enable_borrowed_range<std::span<T, E>> = true;
}

auto result = scn::scan<...>(std::span{...}, ...);
// decltype(result->range()) is a scn::ranges::subrange<const T*>
  • scn::span is removed
  • scan_arg_store and borrowed_subrange_with_sentinel are removed from the public interface
  • scan_arg_store is changed to be non-copyable and non-movable, for correctness reasons
    (it holds references to itself, copying and moving would be needlessly expensive)
  • The interface of make_scan_result is changed to take a tuple instead of the now unmovable scan_arg_store.
// v3
auto args = make_scan_args<scan_context, Args...>();
auto result = vscan(source, format, args);
return make_scan_result(std::move(result), std::move(args.args()));

// v2
auto args = make_scan_args<scan_context, Args...>();
auto result = vscan(source, format, args);
return make_scan_result(std::move(result), std::move(args));
  • The meaning of the "width" field in format specifiers is changed to mean the minimum field width
    (like in std::format), instead of the maximum (sort of like in scanf)
// v3
auto result = std::scan<int>("123", "{:2}");
// result->value() == 123
// result->range() == ""

// v2
auto result = std::scan<int>("123", "{:2}");
// result->value() == 12
// result->range() == "3"

Features

  • The "precision" field is added as a format specifier,
    which specifies the maximum fields width to scan (like in std::format)
// Scan up to 2 width units
auto result = scn::scan<int>("123", "{:.2}");
// result->value() == 12
// result->range() == "3"
  • Support for field fill and alignment is added.
    This interacts well with the new width and precision fields
// Read an integer, aligned to the right ('>'), with asterisks ('*')
auto result = std::scan<int>("***42", "{:*>}");
// result->value() == 42
// result->range() == ""

// Read an integer, aligned to the left ('<'), with whitespace (default),
// with a maximum total width of 3
auto result = std::scan<int>("42  ", "{:<.3}");
// result->value() == 42
// result->range() == " "
  • In general, there seems to be a ~10% to 20% improvement in run-time performance.

Changes

  • The dependency on simdutf is removed. The library now has no external dependencies to compiled libraries
    (FastFloat, an internal dependency, is a header-only library)
  • The number of source files is dramatically decreased: there are now just the public headers,
    a private implementation header, and a private implementation source file. This cuts down the time needed to
    compile the library, and any user code including it to a half (yes, really!)

Fixes

Full Changelog: v2.0.3...v3.0.0

2.0.3

19 May 21:15
88892f3
Compare
Choose a tag to compare

Fixes:

  • Fix documentation: default format type specifier for integers is i, not d:
    when not explicitly specified by a format specifier, the base of an integer is determined based on its prefix:
    0x... is hexadecimal, 0... or 0o... is octal, 0b... is binary, and everything else is decimal.
  • Fix a compilation error which would occur when scanning more than 11 arguments with scn::scan.
  • Small CMake adjustments to better support use as a subproject (#113, thanks @frankmiller (Frank Miller))
  • Fix misplaced include of GNUInstallDirs in CMake (#111, thanks @WangWeiLin-MV)
  • Allow for externally installed versions for GTest and Google Benchmark (#112, thanks @xvitaly (Vitaly))
  • Adjust the definition of SCN_COMPILER to fix usage with a recent Clang using modules (#109, thanks @Delta-dev-99 (Armando Martin))
  • Allow for more versions of dependencies (simdutf, fast_float)
  • Fix C++23 build failure caused by missing inclusion of <utility> for std::unreachable

Full Changelog: v2.0.2...v2.0.3

2.0.2

19 Feb 20:46
f9bc96e
Compare
Choose a tag to compare

Minor fixes:

  • Fix segfault when runtime-parsing {:[^ as a format string.
  • Fix compilation of scan_buffer.cpp on some MSVC versions.
  • Remove stray test/ folder

Full Changelog: v2.0.1...v2.0.2

2.0.1

12 Feb 20:59
d026afb
Compare
Choose a tag to compare

Minor bugfixes

Full Changelog: v2.0.0...v2.0.1

2.0.0

19 Jan 22:10
bca5308
Compare
Choose a tag to compare

Major overhaul, both internally and in terms of the library interface. The library is rewritten in its entirety. See the documentation at https://scnlib.dev/, namely the Migration guide for more details.

The changes below are relative to v1. See CHANGELOG.md for changes relative to v2.0.0-beta.

Major changes include:

  • C++17 is required.
  • Several names are changed to include the scan_ prefix.
  • scn::scan returns the scanned values by value. Output parameters are no longer used.
  • scn::scan now accepts all forward_ranges (v1: bidirectional_range + default- and move constructible).
  • scn::scan returns a view (subrange) into its input, and never takes ownership.
  • Scope is more focused: list operations, ignore, getline, and file have been removed.
  • Support for regular expressions.
  • Better Unicode support.
  • Performance improvements.
  • Completely reworked internals.

Full Changelog: v2.0.0-beta...v2.0.0

1.1.3

05 Nov 00:31
eac40e8
Compare
Choose a tag to compare

Expected to be the last release in the v1-branch.
Development efforts are now fully directed towards v2.

Features

  • Allow disabling support for individual types with SCN_DISABLE_TYPE_* (#70, thanks @cjvaughter (CJ Vaughter))
    • Also, allow for disabling the fallbacks to std::from_chars and std::strtod when scanning floats
    • This provides possible binary size reductions, and allows better use in e.g. embedded platforms
  • Allow disabling runtime localization with SCN_DISABLE_LOCALE (#71, thanks @cjvaughter (CJ Vaughter))
  • Parse leading + signs in floats (reported in #77)

Fixes

  • Fix scn::wrap(std::string_view&&) being ambiguous on gcc (reported in #83)
  • Fix compiler error in scn::basic_string_view<CharT>::substr (reported in #86)
  • Fix memory safety issues found with ASan and UBsan in
    small_vector, detail::utf16::validate_next, and detail::get_buffer.
  • Add COMPONENT to CMake install targets (#80, thanks @pawelwod)
  • Fix calculation of SCN_MSVC from _MSC_FULL_VER (#62, thanks @matbech (Mathias Berchtold))
  • Fix MSVC C4146 warning in integer_scanner (#64, thanks @matbech (Mathias Berchtold))
  • Use if constexpr and std::unreachable if available (#61, #78, thanks @matbech (Mathias Berchtold))
  • Improve error messages given from the float parser