need to update add
parent
7129c929eb
commit
34184d46a3
|
@ -1,6 +1,6 @@
|
||||||
cmake_minimum_required(VERSION 3.20)
|
cmake_minimum_required(VERSION 3.20)
|
||||||
include(cmake/color.cmake)
|
include(cmake/color.cmake)
|
||||||
set(BLT_VERSION 4.0.25)
|
set(BLT_VERSION 4.0.26)
|
||||||
|
|
||||||
set(BLT_TARGET BLT)
|
set(BLT_TARGET BLT)
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <utility>
|
||||||
#include <blt/parse/argparse_v2.h>
|
#include <blt/parse/argparse_v2.h>
|
||||||
#include <blt/std/assert.h>
|
#include <blt/std/assert.h>
|
||||||
#include <blt/meta/type_traits.h>
|
#include <blt/meta/type_traits.h>
|
||||||
|
@ -91,62 +92,87 @@ namespace blt::argparse
|
||||||
return std::vector<std::string_view>{"./program", strings...};
|
return std::vector<std::string_view>{"./program", strings...};
|
||||||
}
|
}
|
||||||
|
|
||||||
class printer_mark_t
|
class aligner_t
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
void reset()
|
aligner_t(std::vector<std::string>& buffer, const size_t start_index):
|
||||||
|
buffer(buffer), start_index(start_index)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void next()
|
void align(const size_t spaces_between) const
|
||||||
{
|
{
|
||||||
|
size_t aligned_size = 0;
|
||||||
|
for (const auto& v : iterate(buffer).skip(start_index))
|
||||||
|
aligned_size = std::max(aligned_size, v.size());
|
||||||
|
aligned_size += spaces_between;
|
||||||
|
for (auto& v : iterate(buffer).skip(start_index))
|
||||||
|
{
|
||||||
|
for (size_t i = v.size(); i < aligned_size; i++)
|
||||||
|
v += ' ';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
printer_mark_t& operator+=(T&& t)
|
|
||||||
{
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
private:
|
private:
|
||||||
|
std::vector<std::string>& buffer;
|
||||||
|
size_t start_index;
|
||||||
};
|
};
|
||||||
|
|
||||||
class aligned_printer_t
|
class aligned_printer_t
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit aligned_printer_t(const size_t max_line_size = 60, const size_t spaces_per_tab = 4): max_line_size(max_line_size),
|
explicit aligned_printer_t(std::string line_begin = "\t", const size_t max_line_size = 60, const size_t spaces_per_tab = 4):
|
||||||
spaces_per_tab(spaces_per_tab)
|
line_begin(std::move(line_begin)), max_line_size(max_line_size)
|
||||||
{
|
{
|
||||||
|
buffer.emplace_back();
|
||||||
|
for (size_t i = 0; i < spaces_per_tab; i++)
|
||||||
|
spaces_from_tab += ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
auto mark()
|
||||||
|
{
|
||||||
|
return aligner_t{buffer, buffer.size() - 1};
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
aligned_printer_t& add(T&& value)
|
||||||
|
{
|
||||||
|
auto str = ensure_is_string(std::forward<T>(value));
|
||||||
|
if (buffer.back().size() + str.size() > max_line_size)
|
||||||
|
buffer.emplace_back(replace_tabs(line_begin));
|
||||||
|
buffer.back() += replace_tabs(str);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] std::string replace_tabs(std::string str) const
|
||||||
|
{
|
||||||
|
string::replaceAll(str, "\t", spaces_from_tab);
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
aligned_printer_t& operator+=(T&& value)
|
||||||
|
{
|
||||||
|
return add(std::forward<T>(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] auto iter()
|
||||||
|
{
|
||||||
|
return iterate(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] auto iter() const
|
||||||
|
{
|
||||||
|
return iterate(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string buffer;
|
std::vector<std::string> buffer;
|
||||||
size_t last_newline = 0;
|
std::string line_begin;
|
||||||
|
std::string spaces_from_tab;
|
||||||
size_t max_line_size;
|
size_t max_line_size;
|
||||||
size_t spaces_per_tab;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void add(std::string& out, T&& value, size_t line_size = 60)
|
|
||||||
{
|
|
||||||
const auto lines = string::split(out, '\n');
|
|
||||||
auto str = ensure_is_string(std::forward<T>(value));
|
|
||||||
if (lines.empty())
|
|
||||||
{
|
|
||||||
out = str;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (lines.back().size() + str.size() > line_size)
|
|
||||||
{
|
|
||||||
out += '\n';
|
|
||||||
out += '\t';
|
|
||||||
}
|
|
||||||
out += str;
|
|
||||||
}
|
|
||||||
|
|
||||||
argument_builder_t& argument_builder_t::set_action(const action_t action)
|
argument_builder_t& argument_builder_t::set_action(const action_t action)
|
||||||
{
|
{
|
||||||
m_action = action;
|
m_action = action;
|
||||||
|
|
Loading…
Reference in New Issue