Add support for const table operator[] retrieval

This commit is contained in:
Rapptz 2013-12-13 15:40:20 -05:00
parent b2e83d4fca
commit ebbceeb9e2
2 changed files with 20 additions and 6 deletions

View File

@ -41,7 +41,7 @@ T* get_ptr(T* val) {
} // detail } // detail
class table : virtual public reference { class table : virtual public reference {
template<typename T> struct proxy; template<typename T, typename U> struct proxy;
public: public:
table() noexcept : reference() {} table() noexcept : reference() {}
table(lua_State* L, int index = -1) : reference(L, index) { table(lua_State* L, int index = -1) : reference(L, index) {
@ -82,8 +82,13 @@ public:
} }
template<typename T> template<typename T>
proxy<T> operator[](T&& key) { auto operator[](T&& key) -> decltype(proxy<decltype(*this), T>(*this, std::forward<T>(key))) {
return proxy<T>(*this, std::forward<T>(key)); return proxy<decltype(*this), T>(*this, std::forward<T>(key));
}
template<typename T>
auto operator[](T&& key) const -> decltype(proxy<decltype(*this), T>(*this, std::forward<T>(key))) {
return proxy<decltype(*this), T>(*this, std::forward<T>(key));
} }
size_t size() const { size_t size() const {
@ -91,13 +96,13 @@ public:
return lua_rawlen(state(), -1); return lua_rawlen(state(), -1);
} }
private: private:
template<typename T> template<typename Table, typename T>
struct proxy { struct proxy {
private: private:
table& t; Table t;
T& key; T& key;
public: public:
proxy(table& t, T& key) : t(t), key(key) {} proxy(Table t, T& key) : t(t), key(key) {}
template<typename U> template<typename U>
EnableIf<Function<Unqualified<U>>> operator=(U&& other) { EnableIf<Function<Unqualified<U>>> operator=(U&& other) {

View File

@ -233,4 +233,13 @@ TEST_CASE("tables/operator[]", "Check if operator[] retrieval and setting works
// function retrieval of a lambda // function retrieval of a lambda
sol::function lamb = lua["lamb"]; sol::function lamb = lua["lamb"];
REQUIRE(lamb.call<int>(220) == 440); REQUIRE(lamb.call<int>(220) == 440);
// test const table retrieval
auto assert1 = [](const sol::table& t) {
std::string a = t["foo"];
int b = t["bar"];
std::cout << a << ',' << b << '\n';
};
REQUIRE_NOTHROW(assert1(lua.global_table()));
} }