| 33 | |
| 34 | template <typename Table, typename Key> |
| 35 | struct table_proxy : public proxy_base<table_proxy<Table, Key>> { |
| 36 | private: |
| 37 | using key_type = detail::proxy_key_t<Key>; |
| 38 | |
| 39 | template <typename T, std::size_t... I> |
| 40 | decltype(auto) tuple_get(std::index_sequence<I...>) const& { |
| 41 | return tbl.template traverse_get<T>(std::get<I>(key)...); |
| 42 | } |
| 43 | |
| 44 | template <typename T, std::size_t... I> |
| 45 | decltype(auto) tuple_get(std::index_sequence<I...>) && { |
| 46 | return tbl.template traverse_get<T>(std::get<I>(std::move(key))...); |
| 47 | } |
| 48 | |
| 49 | template <std::size_t... I, typename T> |
| 50 | void tuple_set(std::index_sequence<I...>, T&& value) & { |
| 51 | tbl.traverse_set(std::get<I>(key)..., std::forward<T>(value)); |
| 52 | } |
| 53 | |
| 54 | template <std::size_t... I, typename T> |
| 55 | void tuple_set(std::index_sequence<I...>, T&& value) && { |
| 56 | tbl.traverse_set(std::get<I>(std::move(key))..., std::forward<T>(value)); |
| 57 | } |
| 58 | |
| 59 | auto setup_table(std::true_type) { |
| 60 | auto p = stack::probe_get_field<std::is_same_v<meta::unqualified_t<Table>, global_table>>(lua_state(), key, tbl.stack_index()); |
| 61 | lua_pop(lua_state(), p.levels); |
| 62 | return p; |
| 63 | } |
| 64 | |
| 65 | bool is_valid(std::false_type) { |
| 66 | auto pp = stack::push_pop(tbl); |
| 67 | auto p = stack::probe_get_field<std::is_same_v<meta::unqualified_t<Table>, global_table>>(lua_state(), key, lua_gettop(lua_state())); |
| 68 | lua_pop(lua_state(), p.levels); |
| 69 | return p; |
| 70 | } |
| 71 | |
| 72 | public: |
| 73 | Table tbl; |
| 74 | key_type key; |
| 75 | |
| 76 | template <typename T> |
| 77 | table_proxy(Table table, T&& k) : tbl(table), key(std::forward<T>(k)) { |
| 78 | } |
| 79 | |
| 80 | table_proxy(const table_proxy&) = default; |
| 81 | table_proxy(table_proxy&&) = default; |
| 82 | table_proxy& operator=(const table_proxy& right) { |
| 83 | return set(right); |
| 84 | } |
| 85 | table_proxy& operator=(table_proxy&& right) { |
| 86 | return set(std::move(right)); |
| 87 | } |
| 88 | |
| 89 | template <typename T> |
| 90 | table_proxy& set(T&& item) & { |
| 91 | tuple_set(std::make_index_sequence<std::tuple_size_v<meta::unqualified_t<key_type>>>(), std::forward<T>(item)); |
| 92 | return *this; |