| 22086 | namespace sol { |
| 22087 | template <typename Table, typename Key> |
| 22088 | struct usertype_proxy : public proxy_base<usertype_proxy<Table, Key>> { |
| 22089 | private: |
| 22090 | using key_type = detail::proxy_key_t<Key>; |
| 22091 | |
| 22092 | template <typename T, std::size_t... I> |
| 22093 | decltype(auto) tuple_get(std::index_sequence<I...>) const & { |
| 22094 | return tbl.template traverse_get<T>(std::get<I>(key)...); |
| 22095 | } |
| 22096 | |
| 22097 | template <typename T, std::size_t... I> |
| 22098 | decltype(auto) tuple_get(std::index_sequence<I...>) && { |
| 22099 | return tbl.template traverse_get<T>(std::get<I>(std::move(key))...); |
| 22100 | } |
| 22101 | |
| 22102 | template <std::size_t... I, typename T> |
| 22103 | void tuple_set(std::index_sequence<I...>, T&& value) & { |
| 22104 | if constexpr (sizeof...(I) > 1) { |
| 22105 | tbl.traverse_set(std::get<I>(key)..., std::forward<T>(value)); |
| 22106 | } |
| 22107 | else { |
| 22108 | tbl.set(std::get<I>(key)..., std::forward<T>(value)); |
| 22109 | } |
| 22110 | } |
| 22111 | |
| 22112 | template <std::size_t... I, typename T> |
| 22113 | void tuple_set(std::index_sequence<I...>, T&& value) && { |
| 22114 | if constexpr (sizeof...(I) > 1) { |
| 22115 | tbl.traverse_set(std::get<I>(std::move(key))..., std::forward<T>(value)); |
| 22116 | } |
| 22117 | else { |
| 22118 | tbl.set(std::get<I>(std::move(key))..., std::forward<T>(value)); |
| 22119 | } |
| 22120 | } |
| 22121 | |
| 22122 | public: |
| 22123 | Table tbl; |
| 22124 | key_type key; |
| 22125 | |
| 22126 | template <typename T> |
| 22127 | usertype_proxy(Table table, T&& k) |
| 22128 | : tbl(table), key(std::forward<T>(k)) { |
| 22129 | } |
| 22130 | |
| 22131 | template <typename T> |
| 22132 | usertype_proxy& set(T&& item) & { |
| 22133 | using idx_seq = std::make_index_sequence<std::tuple_size_v<meta::unqualified_t<key_type>>>; |
| 22134 | tuple_set(idx_seq(), std::forward<T>(item)); |
| 22135 | return *this; |
| 22136 | } |
| 22137 | |
| 22138 | template <typename T> |
| 22139 | usertype_proxy&& set(T&& item) && { |
| 22140 | using idx_seq = std::make_index_sequence<std::tuple_size_v<meta::unqualified_t<key_type>>>; |
| 22141 | std::move(*this).tuple_set(idx_seq(), std::forward<T>(item)); |
| 22142 | return std::move(*this); |
| 22143 | } |
| 22144 | |
| 22145 | template <typename T> |