Skip to content

Instantly share code, notes, and snippets.

@neudinger
Last active November 24, 2025 18:20
Show Gist options
  • Select an option

  • Save neudinger/273537b29036dcdfe57f4fffad5d5792 to your computer and use it in GitHub Desktop.

Select an option

Save neudinger/273537b29036dcdfe57f4fffad5d5792 to your computer and use it in GitHub Desktop.
#include <ranges>
#include <print>
#include <cctype>
#include <string>
#include <string_view>
using namespace std::literals;
using namespace std::string_view_literals;
[[nodiscard("Strips whitespace from the beginning and end of a string")]]
auto strip(std::string_view string) noexcept -> std::string_view {
auto not_space = [](unsigned char _char) -> bool {
return !std::isspace(_char);
};
auto string_view = std::string_view{string};
auto const* first_non_space{std::ranges::find_if(string_view, not_space)};
string_view.remove_prefix(first_non_space - string_view.begin());
auto const* last_non_space{
std::ranges::find_if(string_view | std::views::reverse, not_space)
.base()};
string_view.remove_suffix(string_view.end() - last_non_space);
return string_view;
}
namespace filter {
using Strip = struct Strip {};
[[nodiscard("Strips whitespace from the beginning and end of a string")]]
auto operator|(std::string_view input, filter::Strip const& filter) noexcept
-> std::string_view {
return strip(input);
};
inline constexpr Strip strip{};
} // namespace filter
// g++ -std=c++23 trim.cpp -o trim && ./trim
// https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DIApACYAQuYukl9ZATwDKjdAGFUtAK4sGe1wAyeAyYAHI%2BAEaYxCAArADMpAAOqAqETgwe3r56KWmOAkEh4SxRMQm2mPYFDEIETMQEWT5%2BXJXVGXUNBEVhkdFxiQr1jc05bcPdvSVlgwCUtqhexMjsHObxwcjeWADUJvFuxIbAmAoH2CYaAIJXt2abDNteewduScTBBBd3vw9bO0w%2B0OyAcAE8kpgfjcNgCXkC3sNPkZofdHs9XockcFgAB9ABueEwAHdUXcvGkjLtmGwFEkmKtdsN0CAQLRCNExOd4lYbhScdTWGd6YzmazsUYCUTibj2QRObRubzbjDYlY1QwMHgFKJiOgIOYzHVPkkFLtiQgOXSGUCqMRUCxdgQEECosBggwBYZ0LtXLtUFRdkwmQRkcBDXMTLEACJR2M3JheIghk0QMUgCV4wkklM4ubU1CYVSrJIEXYAWguIZZGdDOKlOZMAHZlbsg0nUAWCLjrYyDtH9mq4xAvAw0sAQj7kAgGrtcdOGvnK/FsLsIqhPPsW3c223iJgCMsGLswGB09re5gIPOZ8RIzyd1vYw%2BYTc24nk5mG8TgQP01/s1JFtM2bZ9lUfD9OzQMcCAAKl2GhiGGXFNQYHsRShYCCBrY4jDOVkaAYdBcTwKg0zrSVANILt0JtSMmzAx8AOlAA6fcWFQfFMFxD5MBoVRqDwJDu1Q2jGXLXNKNYt1gggOZ73At922TaDhnggxkNEy9m1bXc23TXDTgUAjgmI0jyLDb8tzcatWUA4yQH3LikMwajNW7S9IyUvS9JYiImCUOTQIOXTmJJNjMA4riey8Kh%2BIs%2BtAJY1w5IrXYNJEgQxMwBTfiU/dD2IY8wtJF9bgYvLrhpYUbQQuh5WILdFOufkqWNPAkl/FMvAcXZ2s6nTgrK34hw1LUdQafVDX6s0LStDCEPtR1nVdTB3QYT0qW9X0iP9QNgxAswzEjGM4zuSD/UhY4iGIZs3HImsSt2YIkiTaiaFoBrWX63ZVO%2BMwADY6s%2B6J801IsS2%2BbyKyrf8KKzaUmsfAqj1zJIIBepNcphCrhpuYJ2RCX6BGGIsPj6utOuxJJBtx8CGLbAB6RnBVpBaPoayrmd2cNLGsCtmX7Uw%2BcsB4nU%2BFgWOQJJOvLTs60dcwAaV3YWMZhXzo7XYWCYWSlyrL4kaUuGw2JmDJPDbcjrbF1aFoTtiRIWgfX2I6hua/TsNZD4vloBgDSOhW2B9fExC8IEAxPdZtwYsAOGes049p6Mk6O6jM3TymEqMeSQqYr2QB9wQ/YDswg8wEOw4jwMk5jlP4%2B1KPk9TsxM7DNuBTu4GvtrE1sZVa49wPVHsAADQASQAFVxIQ5DcNxsCEIQ85x%2BNrg4BZaE4WJeD8DgtFIVBODcax%2BYUJYVgRB4eFIAhNA3hYAGtBhYyR4kkWINEkJsAE4HniI6TZ9CcEkLve%2Bh9OC8GMhoW%2B98FhwFgDARAKAHRJDoNEcglA0AsDQfQGIwAFDMFNAgVABA%2BD1WiMZCAERwERGCA0MEnAb50OYMQMEAB5CI2hMAOCYbwbBbBBDsIYLQRh%2B9eBYAiF4YAbgxCKj4aQLAOsjDiHEYooSPDHBcWMmoosPCkxrAPl8Ko4D2QRGOGwjwWBwEKwUc5dcShoyRROITUA4iFhUAMAQgAatKdhkI94334IIEQYh2BSBkIIRQKh1BqN0G0AwRgUCn0sPoPAERjKwGqiAKgLAyHORAKGUcj95KH1LBkHR5ZBbxGjMLKwot4i8E4tET4WBMlyXaJojILgiJjFaKQQIwQ%2BilAGG0PI6QBB9NyKkCZDBpj9BiBMKoXSBBdFGJ4Foeg7ArNqCMHoQyZijNsHsqZEw9nzJGYshY59lirAkJvbeYC1FH3jqoAAHADcsANJA81BLsCARSGAlP%2BbgQgJBXbxC4HMXgd93FPziDAreHBQGkBYAiliACNBcA0GYN%2BZgmxNjeZIH%2BpA94HxeVAkAMDYVaHgUgiASAlgEFemQigEAK5gtaXoYJwhRDiAiTy6JahwHxNIMSY4SQ%2BEPI4DvUl4CXnsKTCyvaux3mfO%2Bb85A/zAXAogB4HB6DGobChTCuBCwXRMCwDEDpSKUVouJSxAGv83k/ybLEJ1R0uCxDaGSppkDbBUtgXC0gz9JAAxYu62IxLYhmA0E2AGTqmyJCRY0uVzz/U0ofsAjgZgnnkozWa0gzk0jOEkEAA%3D
auto main() -> int {
std::string const string{" hello world "};
std::println("trimmed value of '{}' is '{}'", string, strip(string));
std::println("trimmed value of '{}' is '{}'", string, string | filter::strip);
return EXIT_SUCCESS;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment