...
This commit is contained in:
@@ -83,6 +83,12 @@ int main()
|
|||||||
std::println("valueSeq(4,2) = '{}'", kvl.valueSeq(4, 2));
|
std::println("valueSeq(4,2) = '{}'", kvl.valueSeq(4, 2));
|
||||||
std::println("valueSeq = '{}'", kvl.valueSeq<std::list<std::string>>());
|
std::println("valueSeq = '{}'", kvl.valueSeq<std::list<std::string>>());
|
||||||
|
|
||||||
|
std::println("\nOwning 'key-value'");
|
||||||
|
snplib_keyvalue_expr_t<std::vector<char>> kv1;
|
||||||
|
|
||||||
|
kv1.setKeyValue("KEY", 7.7);
|
||||||
|
std::println("key = '{}'", kv1.key());
|
||||||
|
std::println("value = '{}'", kv1.value());
|
||||||
|
|
||||||
snplib_random_string_generator_t<> rstr_gen;
|
snplib_random_string_generator_t<> rstr_gen;
|
||||||
|
|
||||||
|
|||||||
@@ -128,7 +128,10 @@ concept snplib_fixed_size_range_c =
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
concept snplib_non_resizable_range_c = std::ranges::range<T> && !requires(T r, std::size_t n) { r.resize(n); };
|
concept snplib_non_resizable_range_c = std::ranges::range<T> && !requires(T r, std::size_t n) { r.resize(n); };
|
||||||
|
|
||||||
|
// a range with its own data life-time management
|
||||||
|
template <typename T>
|
||||||
|
concept snplib_owning_range_c = std::ranges::range<T> && !std::is_reference_v<T> &&
|
||||||
|
!std::ranges::enable_view<std::decay_t<T>> && std::is_move_constructible_v<T>;
|
||||||
|
|
||||||
/* an concept for error-type */
|
/* an concept for error-type */
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,16 @@ public:
|
|||||||
std::string_view valseq_delim{DEFAULT_VALSEQ_DELIM_SEQ};
|
std::string_view valseq_delim{DEFAULT_VALSEQ_DELIM_SEQ};
|
||||||
};
|
};
|
||||||
|
|
||||||
constexpr snplib_keyvalue_expr_t(CharRangeT& bytes, config_t cfg = config_t{}) : _byteSeq(bytes), _config(cfg)
|
// inner char-sequence storage
|
||||||
|
constexpr snplib_keyvalue_expr_t(config_t cfg = config_t{})
|
||||||
|
requires snplib_owning_range_c<CharRangeT>
|
||||||
|
: _ownByteSeq(), _byteSeq(_ownByteSeq), _config(cfg), _isValid(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// outter char-sequence storage
|
||||||
|
constexpr snplib_keyvalue_expr_t(CharRangeT& bytes, config_t cfg = config_t{})
|
||||||
|
: _ownByteSeq(), _byteSeq(bytes), _config(cfg)
|
||||||
{
|
{
|
||||||
fromCharRange(bytes, cfg);
|
fromCharRange(bytes, cfg);
|
||||||
}
|
}
|
||||||
@@ -181,12 +190,18 @@ public:
|
|||||||
requires mutableContent
|
requires mutableContent
|
||||||
error_t setKey(KeyT&& key, SParT const& sparams = snplib_serialization_params_t{})
|
error_t setKey(KeyT&& key, SParT const& sparams = snplib_serialization_params_t{})
|
||||||
{
|
{
|
||||||
_byteSeq.clear();
|
// _byteSeq.clear();
|
||||||
|
_byteSeq = CharRangeT();
|
||||||
|
|
||||||
auto err = snplib_serializer_t<std::remove_cvref_t<KeyT>>{}(_byteSeq, std::forward<KeyT>(key), sparams);
|
auto err = snplib_serializer_t<std::remove_cvref_t<KeyT>>{}(_byteSeq, std::forward<KeyT>(key), sparams);
|
||||||
if (err) {
|
if (err) {
|
||||||
return snplib_deduced_error(err, std::make_error_code(std::errc::invalid_argument));
|
return snplib_deduced_error(err, std::make_error_code(std::errc::invalid_argument));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_key = {_byteSeq.begin(), _byteSeq.end()};
|
||||||
|
_value = {};
|
||||||
|
_valueSeq = {};
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -194,14 +209,43 @@ public:
|
|||||||
requires mutableContent
|
requires mutableContent
|
||||||
error_t setValue(ValueT&& value, SParT sparams = snplib_serialization_params_t{})
|
error_t setValue(ValueT&& value, SParT sparams = snplib_serialization_params_t{})
|
||||||
{
|
{
|
||||||
|
size_t key_sz = _key.size();
|
||||||
|
size_t keyval_delim_pos = _key.size() + _config.keyval_delim.size();
|
||||||
|
if constexpr (requires(CharRangeT t) { t.resize(std::declval<size_t>()); }) {
|
||||||
|
_byteSeq.resize(keyval_delim_pos);
|
||||||
|
} else {
|
||||||
|
auto it = _byteSeq.begin();
|
||||||
|
std::advance(it, keyval_delim_pos);
|
||||||
|
_byteSeq = {_byteSeq.begin(), it};
|
||||||
|
}
|
||||||
|
|
||||||
auto err = snplib_serializer_t<std::remove_cvref_t<ValueT>>{}(_byteSeq, std::forward<ValueT>(value), sparams);
|
auto err = snplib_serializer_t<std::remove_cvref_t<ValueT>>{}(_byteSeq, std::forward<ValueT>(value), sparams);
|
||||||
if (err) {
|
if (err) {
|
||||||
return snplib_deduced_error(err, std::make_error_code(std::errc::invalid_argument));
|
return snplib_deduced_error(err, std::make_error_code(std::errc::invalid_argument));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// it can be a reallocation of the byte sequence so one needs to reinit _key and _value
|
||||||
|
auto it = _byteSeq.begin();
|
||||||
|
std::advance(it, key_sz);
|
||||||
|
_key = {_byteSeq.begin(), it};
|
||||||
|
std::advance(it, _config.keyval_delim.size());
|
||||||
|
_value = {it, _byteSeq.end()};
|
||||||
|
// _valueSeq = snplib_split_char_range<decltype(_valueSeq)>(_value, _config.valseq_delim);
|
||||||
|
_valueSeq.resize(1);
|
||||||
|
_valueSeq[0] = _value;
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <snplib_serializable_c ValueT, snplib_serialization_params_c SParT = snplib_serialization_params_t>
|
||||||
|
requires mutableContent
|
||||||
|
error_t appendValue(ValueT&& value, SParT sparams = snplib_serialization_params_t{})
|
||||||
|
{
|
||||||
|
if (_valueSeq.empty()) {
|
||||||
|
return setValue(std::forward<ValueT>(value), std::move(sparams));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template <snplib_serializable_c KeyT,
|
template <snplib_serializable_c KeyT,
|
||||||
snplib_serializable_c ValueT,
|
snplib_serializable_c ValueT,
|
||||||
@@ -218,10 +262,12 @@ public:
|
|||||||
|
|
||||||
sparams.elem_delim = _config.valseq_delim;
|
sparams.elem_delim = _config.valseq_delim;
|
||||||
|
|
||||||
return setValue(std::forward<ValueT>(value), sparams);
|
return setValue(std::forward<ValueT>(value), std::move(sparams));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
CharRangeT _ownByteSeq{};
|
||||||
|
|
||||||
CharRangeT& _byteSeq;
|
CharRangeT& _byteSeq;
|
||||||
|
|
||||||
std::conditional_t<contiguousContent, std::string_view, std::ranges::subrange<typename CharRangeT::iterator>>
|
std::conditional_t<contiguousContent, std::string_view, std::ranges::subrange<typename CharRangeT::iterator>>
|
||||||
|
|||||||
Reference in New Issue
Block a user