How does Nuget fmtlib truncate ranges?

Viewed 58

By default fmtlib only prints the first 257 elemnents

fmt::print("{}\n", ranges::views::ints(0u, ~0u));

{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256 ... <other elements>}

Is there anyway to control where the truncation happens?

It turns out truncation is only the default behaviour for my msvc nuget fmtlib. GCC doesn't truncate: https://www.godbolt.org/z/nWEe3Kcbb

Can anyone explain how this truncation can be configured? (I cant reproduce truncation on msvc godbolt with msvc. Can't even figure out the linker flags?)

Is there anyway to print the end of the range as well? i.e.

auto rng = ranges::views::ints(0u, ~0u);
fmt::print("{} ... {}\n", rng | ranges::views::take(12), rng | ranges::views::take_last(6));

{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... ,4294967289, 4294967290, 4294967291, 4294967292, 4294967293, 4294967294}

1 Answers

I don't know how you would change the truncation point when printing a range directly as it is probably specified by the formatter in the library but to achieve the second desire, you can give the illusion of printing some from the front and some from the back of a range using fmt::join() on the 'taken' sub-ranges. This has the added benefit over the built-in formatter for ranges as it doesn't include the square brackets around the two ranges.

#include <fmt/core.h>
#include <fmt/format.h>
#include <range/v3/all.hpp>

auto main() -> int
{
    auto rng = ranges::views::ints(0u, ~0u);
    auto fst = rng | ranges::views::take(12);
    auto lst = rng | ranges::views::take_last(6);

    fmt::print("{} ... {}\n", fmt::join(fst, ", "), fmt::join(lst, ", "));
    return 0;
}

godbolt

Related