Billy O'Neal 309f6fc9bc
[vcpkg] Delete unused --purge-tombstones and introduce BufferedPrint class (#12049)
* 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.
2020-06-26 12:16:17 -07:00

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); }
};
}