84 #ifndef GNC_KVP_FRAME_TYPE 85 #define GNC_KVP_FRAME_TYPE 87 #include "kvp-value.hpp" 94 using Path = std::vector<std::string>;
95 using KvpEntry = std::pair <std::vector <std::string>, KvpValue*>;
115 bool operator()(
const char * one,
const char * two)
const 117 auto ret = std::strcmp(one, two) < 0;
121 using map_type = std::map<const char *, KvpValue*, cstring_comparer>;
159 KvpValue*
set(Path path, KvpValue* newvalue) noexcept;
171 KvpValue*
set_path(Path path, KvpValue* newvalue) noexcept;
194 KvpValue*
get_slot(Path keys) noexcept;
200 template <typename func_type, typename data_type>
203 template <typename func_type>
210 template <typename func_type, typename data_type>
213 template <typename func_type>
220 std::vector <KvpEntry>
226 bool empty() const noexcept {
return m_valuemap.empty(); }
229 map_type::iterator begin() {
return m_valuemap.begin(); }
230 map_type::iterator end() {
return m_valuemap.end(); }
235 KvpFrame * get_child_frame_or_nullptr (Path
const &) noexcept;
236 KvpFrame * get_child_frame_or_create (Path
const &) noexcept;
237 void flatten_kvp_impl(std::vector <std::string>, std::vector <KvpEntry> &)
const noexcept;
238 KvpValue * set_impl (std::string
const &, KvpValue *) noexcept;
241 template<
typename func_type,
typename data_type>
242 void KvpFrame::for_each_slot_prefix(std::string
const & prefix,
243 func_type
const & func, data_type & data)
const noexcept
245 std::for_each (m_valuemap.begin(), m_valuemap.end(),
246 [&prefix,&func,&data](
const KvpFrameImpl::map_type::value_type & a)
249 if (strncmp(a.first, prefix.c_str(), prefix.size()) == 0)
250 func (&a.first[prefix.size()], a.second, data);
255 template <
typename func_type>
256 void KvpFrame::for_each_slot_temp(func_type
const & func)
const noexcept
258 std::for_each (m_valuemap.begin(), m_valuemap.end(),
259 [&func](
const KvpFrameImpl::map_type::value_type & a)
261 func (a.first, a.second);
266 template <
typename func_type,
typename data_type>
267 void KvpFrame::for_each_slot_temp(func_type
const & func, data_type & data)
const noexcept
269 std::for_each (m_valuemap.begin(), m_valuemap.end(),
270 [&func,&data](
const KvpFrameImpl::map_type::value_type & a)
272 func (a.first, a.second, data);
void for_each_slot_temp(func_type const &, data_type &) const noexcept
The function should be of the form: <anything> func (char const *, KvpValue *, data_type &); Do not p...
~KvpFrameImpl() noexcept
Perform a deep delete.
std::string to_string() const noexcept
Make a string representation of the frame.
std::vector< KvpEntry > flatten_kvp(void) const noexcept
Returns all keys and values of this frame recursively, flattening the frame-containing values...
KvpValue * set(Path path, KvpValue *newvalue) noexcept
Set the value with the key in the immediate frame, replacing and returning the old value if it exists...
bool empty() const noexcept
Test for emptiness.
void for_each_slot_prefix(std::string const &prefix, func_type const &, data_type &) const noexcept
Like for_each_slot, but doesn't traverse nested values.
friend int compare(const KvpFrameImpl &, const KvpFrameImpl &) noexcept
If the first KvpFrameImpl has an item that the second does not, 1 is returned.
std::vector< std::string > get_keys() const noexcept
Report the keys in the immediate frame.
KvpValue * get_slot(Path keys) noexcept
Get the value for the tail of the path or nullptr if it doesn't exist.
KvpValue * set_path(Path path, KvpValue *newvalue) noexcept
Set the value with the key in a subframe following the keys in path, replacing and returning the old ...