mirror of
https://github.com/cemu-project/vcpkg.git
synced 2025-02-25 03:53:32 +01:00

* Introduce buffered_print class to manage buffered write patterns like in the ci command. * Remove --purge-tombstones option. * Law of demeter. * Make buffered_print imobile. * buffered_print => BufferedPrint * Fix merge conflict.
68 lines
2.1 KiB
C++
68 lines
2.1 KiB
C++
#pragma once
|
|
|
|
#include <vcpkg/base/strings.h>
|
|
#include <vcpkg/base/view.h>
|
|
|
|
namespace vcpkg::System
|
|
{
|
|
enum class Color
|
|
{
|
|
success = 10,
|
|
error = 12,
|
|
warning = 14,
|
|
};
|
|
|
|
namespace details
|
|
{
|
|
void print(StringView message);
|
|
void print(const Color c, StringView message);
|
|
}
|
|
|
|
template<class Arg1, class... Args>
|
|
void printf(const char* message_template, const Arg1& message_arg1, const Args&... message_args)
|
|
{
|
|
return ::vcpkg::System::details::print(Strings::format(message_template, message_arg1, message_args...));
|
|
}
|
|
|
|
template<class Arg1, class... Args>
|
|
void printf(const Color c, const char* message_template, const Arg1& message_arg1, const Args&... message_args)
|
|
{
|
|
return ::vcpkg::System::details::print(c, Strings::format(message_template, message_arg1, message_args...));
|
|
}
|
|
|
|
template<class... Args>
|
|
void print2(const Color c, const Args&... args)
|
|
{
|
|
::vcpkg::System::details::print(c, Strings::concat_or_view(args...));
|
|
}
|
|
|
|
template<class... Args>
|
|
void print2(const Args&... args)
|
|
{
|
|
::vcpkg::System::details::print(Strings::concat_or_view(args...));
|
|
}
|
|
|
|
class BufferedPrint
|
|
{
|
|
::std::string stdout_buffer;
|
|
static constexpr ::std::size_t buffer_size_target = 2048;
|
|
static constexpr ::std::size_t expected_maximum_print = 256;
|
|
static constexpr ::std::size_t alloc_size = buffer_size_target + expected_maximum_print;
|
|
|
|
public:
|
|
BufferedPrint() { stdout_buffer.reserve(alloc_size); }
|
|
BufferedPrint(const BufferedPrint&) = delete;
|
|
BufferedPrint& operator=(const BufferedPrint&) = delete;
|
|
void append(::vcpkg::StringView nextView)
|
|
{
|
|
stdout_buffer.append(nextView.data(), nextView.size());
|
|
if (stdout_buffer.size() > buffer_size_target)
|
|
{
|
|
::vcpkg::System::details::print(stdout_buffer);
|
|
stdout_buffer.clear();
|
|
}
|
|
}
|
|
~BufferedPrint() { ::vcpkg::System::details::print(stdout_buffer); }
|
|
};
|
|
}
|