1

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}

4
  • 1
    @KamilCuk #include <fmt/ranges.h> godbolt.org/z/PsdG93hhK Commented Sep 18, 2022 at 8:18
  • 1
    Thanks! The godbolt link does not execute the program. When I compiled the program locally, the program just blocks with no output, with stacktrace inside fmt. Please post all the information needed to reproduce the output you are getting. What compiler are you using? What library versions? What operating system? What are you using to view the output, i.e. might the output be post-processed? I am on ArchLinux gcc12.2.0 fmt9.1.0 range-v3 0.12.0 Commented Sep 18, 2022 at 8:20
  • @KamilCuk you had godbolt configured for an Executor rather than a Compiler and you can only execute the code with the Compiler. Commented Sep 18, 2022 at 8:36
  • @KamilCuk But it turns out you are right, the gcc version doesn't truncate and exits with a non-zero exit code presumably because it's trying to print the whole range Commented Sep 18, 2022 at 8:37

1 Answer 1

3

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

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.