Recently, I came across Barry Revzin's blog discussing inefficiencies in the C++ ranges library when filtering or reversing is mixed into an adaptor chain. To tackle this, I developed a library called undercurrent through experimentation. The core idea is a customization point object uc::advance_while, which recursively descends the iterator hierarchy rather than operating at the top level. This allows algorithms to perform their tasks at the lowest iterator level, avoiding redundant predicate evaluations.
I observed a significant performance improvement with an adaptor chain like take_while | transform | filter | reverse. On Clang 22 + libc++, my implementation achieves roughly a 16x speedup over std::ranges, while MSVC shows a smaller improvement (~2x). Currently, it supports a minimal set of adaptors and algorithms, and GCC is not yet functional, likely due to module-related issues.
I welcome any feedback, thoughts, or edge cases to consider!
GitHub link: undercurrent
Barry Revzin's blog: link
Blogger's Review: The design approach of this library is ingenious, optimizing performance through recursive descent of iterators, showcasing the flexibility and potential of C++. Addressing the performance discrepancies across different compilers will be crucial for future compatibility and adaptability. Looking forward to seeing more adaptors and algorithms supported!