...
This commit is contained in:
82
mcc_utils.h
82
mcc_utils.h
@@ -8,6 +8,8 @@
|
||||
#include <numbers>
|
||||
#include <ranges>
|
||||
#include <regex>
|
||||
|
||||
#include "mcc_constants.h"
|
||||
#include "mcc_traits.h"
|
||||
|
||||
namespace mcc::utils
|
||||
@@ -758,4 +760,84 @@ protected:
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/* a base class for some sequence of elements with delimiter */
|
||||
|
||||
struct mcc_elem_sequence_with_delim_t {
|
||||
virtual ~mcc_elem_sequence_with_delim_t() = default;
|
||||
|
||||
// set delimiter for elements of the range-type serialized value
|
||||
template <traits::mcc_input_char_range R>
|
||||
void setSeqDelimiter(R const& delim)
|
||||
{
|
||||
if constexpr (std::is_array_v<std::decay_t<R>>) {
|
||||
setSeqDelimiter(std::string_view{delim});
|
||||
} else {
|
||||
_seqDelimiter.clear();
|
||||
std::ranges::copy(delim, std::back_inserter(_seqDelimiter));
|
||||
}
|
||||
}
|
||||
|
||||
template <traits::mcc_view_or_output_char_range R>
|
||||
R getSeqDelimiter() const
|
||||
{
|
||||
if constexpr (std::same_as<R, decltype(_seqDelimiter)>) {
|
||||
return _seqDelimiter;
|
||||
} else if constexpr (std::ranges::view<R>) {
|
||||
return R{_seqDelimiter.begin(), _seqDelimiter.end()};
|
||||
} else {
|
||||
R r;
|
||||
std::ranges::copy(_seqDelimiter, std::back_inserter(r));
|
||||
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
||||
std::string getSeqDelimiter() const
|
||||
{
|
||||
return getSeqDelimiter<std::string>();
|
||||
}
|
||||
|
||||
|
||||
template <traits::mcc_input_char_range R>
|
||||
void setElemDelimiter(R const& delim)
|
||||
{
|
||||
if constexpr (std::is_array_v<std::decay_t<R>>) {
|
||||
setElemDelimiter(std::string_view{delim});
|
||||
} else {
|
||||
_elementDelimiter.clear();
|
||||
std::ranges::copy(delim, std::back_inserter(_seqDelimiter));
|
||||
}
|
||||
}
|
||||
|
||||
template <traits::mcc_view_or_output_char_range R>
|
||||
R getElemDelimiter() const
|
||||
{
|
||||
if constexpr (std::same_as<R, decltype(_seqDelimiter)>) {
|
||||
return _elementDelimiter;
|
||||
} else if constexpr (std::ranges::view<R>) {
|
||||
return R{_elementDelimiter.begin(), _elementDelimiter.end()};
|
||||
} else {
|
||||
R r;
|
||||
std::ranges::copy(_elementDelimiter, std::back_inserter(r));
|
||||
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
||||
std::string getElemDelimiter() const
|
||||
{
|
||||
return getElemDelimiter<std::string>();
|
||||
}
|
||||
|
||||
protected:
|
||||
mcc_elem_sequence_with_delim_t() = default;
|
||||
|
||||
// delimiter for sequence of serializing values
|
||||
std::string _seqDelimiter{MCC_DEFAULT_SEQ_DELIMITER};
|
||||
|
||||
// delimiter for aggregative (multi-element) serializing value
|
||||
std::string _elementDelimiter{MCC_DEFAULT_ELEM_DELIMITER};
|
||||
};
|
||||
|
||||
} // namespace mcc::utils
|
||||
|
||||
Reference in New Issue
Block a user