...
This commit is contained in:
@@ -122,84 +122,14 @@ concept mcc_serializer_c = std::derived_from<T, mcc_serializer_interface_t<typen
|
||||
namespace details
|
||||
{
|
||||
|
||||
struct MccSerializerBase : mcc_serializer_interface_t<impl::MccError> {
|
||||
struct MccSerializerBase : mcc_serializer_interface_t<impl::MccError>, utils::mcc_elem_sequence_with_delim_t {
|
||||
using typename mcc_serializer_interface_t<impl::MccError>::error_t;
|
||||
|
||||
virtual ~MccSerializerBase() = 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:
|
||||
MccSerializerBase() = 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};
|
||||
|
||||
template <typename VT, typename R>
|
||||
requires(std::ranges::input_range<R> && std::same_as<VT, std::ranges::range_value_t<R>>)
|
||||
error_t serializingRange(mcc_serializer_c auto& sr,
|
||||
|
||||
Reference in New Issue
Block a user