Add hinting optimization to arrays

This commit is contained in:
ThePhD 2016-08-19 21:08:03 -04:00
parent 1ae78e1b54
commit e31ed71006
6 changed files with 51 additions and 10 deletions

@ -1 +1 @@
Subproject commit c386acbdf2d6ae368de7cba55801b06d362bdaac
Subproject commit 45112c085a4ca75b5591dde3bf46faf4969c3026

View File

@ -20,8 +20,8 @@
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// This file was generated with a script.
// Generated 2016-08-19 03:51:21.744027 UTC
// This header was generated with sol v2.11.4 (revision c8ea9f7)
// Generated 2016-08-20 01:06:43.957511 UTC
// This header was generated with sol v2.11.4 (revision 1ae78e1)
// https://github.com/ThePhD/sol2
#ifndef SOL_SINGLE_INCLUDE_HPP
@ -736,8 +736,6 @@ namespace sol {
// beginning of sol/optional.hpp
#if defined(SOL_USE_BOOST)
#include <boost/optional.hpp>
// beginning of sol/in_place.hpp
namespace sol {
@ -767,6 +765,8 @@ namespace sol {
// end of sol/in_place.hpp
#if defined(SOL_USE_BOOST)
#include <boost/optional.hpp>
#else
// beginning of Optional/optional.hpp
@ -3837,6 +3837,8 @@ namespace sol {
// end of sol/tie.hpp
#include <vector>
namespace sol {
namespace detail {
struct as_reference_tag {};
@ -3859,6 +3861,19 @@ namespace sol {
(dx)(memory);
return 0;
}
template <typename T>
void reserve(T&, std::size_t) {}
template <typename T, typename Al>
void reserve(std::vector<T, Al>& arr, std::size_t hint) {
arr.reserve(hint);
}
template <typename T, typename Tr, typename Al>
void reserve(std::basic_string<T, Tr, Al>& arr, std::size_t hint) {
arr.reserve(hint);
}
} // detail
namespace stack {
@ -4842,8 +4857,13 @@ namespace sol {
typedef typename T::value_type V;
tracking.use(1);
T arr;
index = lua_absindex(L, index);
T arr;
get_field<false, true>(L, static_cast<lua_Integer>(-1), index);
optional<std::size_t> sizehint = pop<optional<std::size_t>>(L);
if (sizehint) {
detail::reserve(arr, *sizehint);
}
#if SOL_LUA_VERSION >= 503
// This method is HIGHLY performant over regular table iteration thanks to the Lua API changes in 5.3
for (lua_Integer i = 0; ; ++i, lua_pop(L, 1)) {
@ -5606,6 +5626,7 @@ namespace sol {
for (auto&& i : cont) {
set_field(L, index++, i, tableindex);
}
set_field(L, -1, cont.size());
return 1;
}
};
@ -9701,8 +9722,6 @@ namespace sol {
// beginning of sol/simple_usertype_metatable.hpp
#include <vector>
namespace sol {
struct simple_tag {} const simple{};

View File

@ -22,9 +22,9 @@
#ifndef SOL_OPTIONAL_HPP
#define SOL_OPTIONAL_HPP
#include "in_place.hpp"
#if defined(SOL_USE_BOOST)
#include <boost/optional.hpp>
#include "../sol/in_place.hpp"
#else
#include "../Optional/optional.hpp"
#endif // Boost vs. Better optional

View File

@ -29,6 +29,8 @@
#include "tuple.hpp"
#include "traits.hpp"
#include "tie.hpp"
#include <vector>
#include <string>
namespace sol {
namespace detail {
@ -52,6 +54,19 @@ namespace sol {
(dx)(memory);
return 0;
}
template <typename T>
void reserve(T&, std::size_t) {}
template <typename T, typename Al>
void reserve(std::vector<T, Al>& arr, std::size_t hint) {
arr.reserve(hint);
}
template <typename T, typename Tr, typename Al>
void reserve(std::basic_string<T, Tr, Al>& arr, std::size_t hint) {
arr.reserve(hint);
}
} // detail
namespace stack {

View File

@ -83,8 +83,14 @@ namespace sol {
typedef typename T::value_type V;
tracking.use(1);
T arr;
index = lua_absindex(L, index);
T arr;
get_field<false, true>(L, static_cast<lua_Integer>(-1), index);
optional<std::size_t> sizehint = pop<optional<std::size_t>>(L);
if (sizehint) {
detail::reserve(arr, *sizehint);
}
#if SOL_LUA_VERSION >= 503
// This method is HIGHLY performant over regular table iteration thanks to the Lua API changes in 5.3
for (lua_Integer i = 0; ; ++i, lua_pop(L, 1)) {

View File

@ -168,6 +168,7 @@ namespace sol {
for (auto&& i : cont) {
set_field(L, index++, i, tableindex);
}
set_field(L, -1, cont.size());
return 1;
}
};