- Header-only design: All functionality contained within a single
.hpp
file ininclude/pgbar
. - Low-overhead updates: Nanosecond level cost per call.1
- C++11 & later compatible: Supports all standard revisions from C++11 through C++23.
- Unicode support: Parse each string in UTF-8 encoding.
- RGB color support: Customizable progress bar colors.
- Thread-safe design: Can be safely used in multi-threaded environments.
tqdm
-like interface: Chainable methods powered by template metaprogramming.- Modern C++ core: Leverages
constexpr
, RAII, and type traits for zero-cost abstractions.
{LeftBorder}{Prefix}{Percent}{Starting}{Filler}{Lead}{Remains}{Ending}{Counter}{Speed}{Elapsed}{Countdown}{Postfix}{RightBorder}
30.87% | [=========> ] | 662933732/2147483647 | 11.92 MHz | 00:00:55 < 00:02:03
{LeftBorder}{Prefix}{Percent}{Starting}{BlockBar}{Ending}{Counter}{Speed}{Elapsed}{Countdown}{Postfix}{RightBorder}
35.22% | ██████████▋ | 47275560/134217727 | 16.80 MHz | 00:00:02 < 00:00:05
{LeftBorder}{Prefix}{Percent}{Starting}{Filler}{Lead}{Filler}{Ending}{Counter}{Speed}{Elapsed}{Countdown}{Postfix}{RightBorder}
39.82% | [---------------------<==>----] | 53458698/134217727 | 17.89 MHz | 00:00:02 < 00:00:04
{LeftBorder}{Prefix}{Lead}{Percent}{Counter}{Speed}{Elapsed}{Countdown}{Postfix}{RightBorder}
\ | 48.64% | 65288807/134217727 | 17.84 MHz | 00:00:03 < 00:00:03
#include "pgbar/pgbar.hpp"
int main()
{
pgbar::ProgressBar<> bar { pgbar::option::Remains( "-" ),
pgbar::option::Filler( "=" ),
pgbar::option::Styles( pgbar::config::Line::Entire ),
pgbar::option::RemainsColor( "#A52A2A" ),
pgbar::option::FillerColor( 0x0099FF ),
pgbar::option::InfoColor( pgbar::color::Yellow ),
pgbar::option::Tasks( 100 ) };
for ( auto _ = 0; _ < 100; ++_ )
bar.tick();
}
For more examples, see QuickStart.md and demo/.
You can copy pgbar/pgbar.hpp
to the inclusion path of the project, and then directly include the corresponding header file within the source file.
Use git
to introduce pgbar
as a sub-module into your project directory:
git submodule add https://github.com/Konvt/pgbar external/pgbar
git submodule update --init --recursive
Then, add the following lines to your CMakeLists.txt
:
add_subdirectory(${CMAKE_SOURCE_DIR}/external/pgbar)
# ...
add_executable(TargetName ${SOURCES})
target_link_libraries(TargetName PRIVATE pgbar)
The sample files under demo/
can be compiled using the following commands.
cmake -S . -DPGBAR_BUILD_DEMO=ON -B build
cmake --build build --target demo
# Or use demo_{filename} to compile the specified file under demo/
Or compile directly using the make
command in the demo/
folder.
make all
# Or use {filename} to compile the specified file under demo/
Execute the following commands to install pgbar
to the default directory of the system.
cmake -S . -DPGBAR_INSTALL=ON -B build
# Or install it to the specified directory:
# cmake -S . -DPGBAR_INSTALL=ON -DCMAKE_INSTALL_PREFIX=/usr -B build
cmake --install build
# Equivalent instructions can be:
# cmake --build build --target install
When uninstalling, it needs to rely on the cache files generated during installation. If the cache files has been removed, the installation command generation can be executed again.
Execute the following commands to remove pgbar
from the system.
cmake --build build --target uninstall
No, as mentioned in the Features section, updating the progress bar has essentially zero overhead.
With O2/O3
optimizations enabled, the performance overhead of the second iteration in the code below will approach that of the first iteration.2
#include "pgbar/pgbar.hpp"
int main()
{
std::size_t count = 0;
for ( std::size_t _ = 0; _ < 2147483647; ++_ )
++count;
pgbar::ProgressBar<> bar { pgbar::option::Tasks( 2147483647 ) };
for ( std::size_t _ = 0; _ < 2147483647; ++_ )
bar.tick();
}
However, the smoothness of the display will depend on the single-core performance of your processor.
Absolutely. I designed this library to work seamlessly on both systems, providing a unified visualization of iteration progress.
Btw, it should be noted that if it is on the Windows platform, then pgbar
will depend on the Windows.h
header file; Moreover, NOMINMAX
will be defined to disable the min
and max
macros.
As pointed out at the beginning, there is no problem.
Although only UTF-8 encoded strings are currently supported, using any non-UTF-8 encoded string will result in an exception.
If you are using the C++20, pgbar
's functions also support u8string
.
This project is licensed under the MIT license.