6#ifndef NURI_CORE_CONTAINER_PROPERTY_MAP_H_
7#define NURI_CORE_CONTAINER_PROPERTY_MAP_H_
17#include <boost/container/flat_map.hpp>
22 using PropertyMap = boost::container::flat_map<
23 std::string, std::string, std::less<>,
24 std::vector<std::pair<std::string, std::string>>>;
27 constexpr std::string_view kNameKey =
"_Name";
31 std::enable_if_t<std::is_same_v<PropertyMap, std::decay_t<PT>>,
int> = 0>
32 auto find_key(PT &props, std::string_view key) {
33 return props.find(key);
38 std::enable_if_t<std::is_same_v<PropertyMap, std::decay_t<PT>>,
int> = 0>
39 bool has_key(PT &props, std::string_view key) {
40 return props.contains(key);
45 std::enable_if_t<std::is_same_v<PropertyMap, std::decay_t<PT>>,
int> = 0>
46 std::string_view get_key(PT &props, std::string_view key) {
47 auto it = find_key(props, key);
48 if (it == props.end())
55 std::enable_if_t<std::is_same_v<PropertyMap, std::decay_t<PT>>,
int> = 0>
56 void set_key(PT &props, std::string_view key, ST &&value) {
57 auto it = props.lower_bound(key);
59 if (it != props.end() && it->first == key) {
60 it->second = std::forward<ST>(value);
62 props.emplace_hint(it, key, std::forward<ST>(value));
68 std::enable_if_t<std::is_same_v<PropertyMap, std::decay_t<PT>>,
int> = 0>
69 auto find_name(PT &props) ->
decltype(props.begin()) {
70 return find_key(props, kNameKey);
75 std::enable_if_t<std::is_same_v<PropertyMap, std::decay_t<PT>>,
int> = 0>
76 bool has_name(PT &props) {
77 return has_key(props, kNameKey);
82 std::enable_if_t<std::is_same_v<PropertyMap, std::decay_t<PT>>,
int> = 0>
83 std::string_view get_name(PT &props) {
84 return get_key(props, kNameKey);
89 std::enable_if_t<std::is_same_v<PropertyMap, std::decay_t<PT>>,
int> = 0>
90 void set_name(PT &props, ST &&name) {
91 set_key(props, kNameKey, std::forward<ST>(name));