0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-06-28 06:48:20 +02:00

ircd::json::tuple: Avoids PLT entries for complex templates in modules.

This commit is contained in:
Jason Volk 2020-04-03 12:07:45 -07:00
parent 47deac63d3
commit 44dce34197
6 changed files with 70 additions and 61 deletions

View file

@ -16,7 +16,7 @@ namespace json {
template<size_t hash, template<size_t hash,
class tuple> class tuple>
enable_if_tuple<tuple, const tuple_value_type<tuple, indexof<tuple, hash>()> &> inline enable_if_tuple<tuple, const tuple_value_type<tuple, indexof<tuple, hash>()> &>
at(const tuple &t) at(const tuple &t)
{ {
constexpr size_t idx constexpr size_t idx
@ -40,7 +40,7 @@ at(const tuple &t)
template<size_t hash, template<size_t hash,
class tuple> class tuple>
enable_if_tuple<tuple, tuple_value_type<tuple, indexof<tuple, hash>()> &> inline enable_if_tuple<tuple, tuple_value_type<tuple, indexof<tuple, hash>()> &>
at(tuple &t) at(tuple &t)
{ {
constexpr size_t idx constexpr size_t idx
@ -64,7 +64,7 @@ at(tuple &t)
template<const char *const &name, template<const char *const &name,
class tuple> class tuple>
enable_if_tuple<tuple, const tuple_value_type<tuple, indexof<tuple, name>()> &> inline enable_if_tuple<tuple, const tuple_value_type<tuple, indexof<tuple, name>()> &>
at(const tuple &t) at(const tuple &t)
{ {
return at<name_hash(name), tuple>(t); return at<name_hash(name), tuple>(t);
@ -72,7 +72,7 @@ at(const tuple &t)
template<const char *const &name, template<const char *const &name,
class tuple> class tuple>
enable_if_tuple<tuple, tuple_value_type<tuple, indexof<tuple, name>()> &> inline enable_if_tuple<tuple, tuple_value_type<tuple, indexof<tuple, name>()> &>
at(tuple &t) at(tuple &t)
{ {
return at<name_hash(name), tuple>(t); return at<name_hash(name), tuple>(t);
@ -81,17 +81,17 @@ at(tuple &t)
template<class tuple, template<class tuple,
class function, class function,
size_t i> size_t i>
typename std::enable_if<i == size<tuple>(), void>::type constexpr typename std::enable_if<i == size<tuple>(), void>::type
at(tuple &t, at(tuple &t,
const string_view &name, const string_view &name,
function&& f) function&& f)
{ noexcept
} {}
template<class tuple, template<class tuple,
class function, class function,
size_t i = 0> size_t i = 0>
typename std::enable_if<i < size<tuple>(), void>::type inline typename std::enable_if<i < size<tuple>(), void>::type
at(tuple &t, at(tuple &t,
const string_view &name, const string_view &name,
function&& f) function&& f)
@ -105,17 +105,17 @@ at(tuple &t,
template<class tuple, template<class tuple,
class function, class function,
size_t i> size_t i>
typename std::enable_if<i == size<tuple>(), void>::type constexpr typename std::enable_if<i == size<tuple>(), void>::type
at(const tuple &t, at(const tuple &t,
const string_view &name, const string_view &name,
function&& f) function&& f)
{ noexcept
} {}
template<class tuple, template<class tuple,
class function, class function,
size_t i = 0> size_t i = 0>
typename std::enable_if<i < size<tuple>(), void>::type inline typename std::enable_if<i < size<tuple>(), void>::type
at(const tuple &t, at(const tuple &t,
const string_view &name, const string_view &name,
function&& f) function&& f)
@ -128,7 +128,7 @@ at(const tuple &t,
template<class R, template<class R,
class tuple> class tuple>
enable_if_tuple<tuple, const R &> inline enable_if_tuple<tuple, const R &>
at(const tuple &t, at(const tuple &t,
const string_view &name) const string_view &name)
{ {
@ -161,7 +161,7 @@ at(const tuple &t,
template<class R, template<class R,
class tuple> class tuple>
enable_if_tuple<tuple, R &> inline enable_if_tuple<tuple, R &>
at(tuple &t, at(tuple &t,
const string_view &name) const string_view &name)
{ {

View file

@ -17,23 +17,25 @@ namespace json {
template<size_t i, template<size_t i,
class tuple, class tuple,
class function> class function>
typename std::enable_if<i == size<tuple>(), void>::type constexpr typename std::enable_if<i == size<tuple>(), void>::type
for_each(const tuple &t, for_each(const tuple &t,
function&& f) function&& f)
noexcept
{} {}
template<size_t i, template<size_t i,
class tuple, class tuple,
class function> class function>
typename std::enable_if<i == size<tuple>(), void>::type constexpr typename std::enable_if<i == size<tuple>(), void>::type
for_each(tuple &t, for_each(tuple &t,
function&& f) function&& f)
noexcept
{} {}
template<size_t i = 0, template<size_t i = 0,
class tuple, class tuple,
class function> class function>
typename std::enable_if<i < size<tuple>(), void>::type inline typename std::enable_if<i < size<tuple>(), void>::type
for_each(const tuple &t, for_each(const tuple &t,
function&& f) function&& f)
{ {
@ -44,7 +46,7 @@ for_each(const tuple &t,
template<size_t i = 0, template<size_t i = 0,
class tuple, class tuple,
class function> class function>
typename std::enable_if<i < size<tuple>(), void>::type inline typename std::enable_if<i < size<tuple>(), void>::type
for_each(tuple &t, for_each(tuple &t,
function&& f) function&& f)
{ {
@ -54,7 +56,7 @@ for_each(tuple &t,
template<class tuple, template<class tuple,
class function> class function>
void inline void
for_each(const tuple &t, for_each(const tuple &t,
const vector_view<const string_view> &mask, const vector_view<const string_view> &mask,
function&& f) function&& f)
@ -72,7 +74,7 @@ for_each(const tuple &t,
template<class tuple, template<class tuple,
class function> class function>
void inline void
for_each(tuple &t, for_each(tuple &t,
const vector_view<const string_view> &mask, const vector_view<const string_view> &mask,
function&& f) function&& f)
@ -91,23 +93,25 @@ for_each(tuple &t,
template<class tuple, template<class tuple,
class function, class function,
ssize_t i> ssize_t i>
typename std::enable_if<(i < 0), void>::type constexpr typename std::enable_if<(i < 0), void>::type
rfor_each(const tuple &t, rfor_each(const tuple &t,
function&& f) function&& f)
noexcept
{} {}
template<class tuple, template<class tuple,
class function, class function,
ssize_t i> ssize_t i>
typename std::enable_if<(i < 0), void>::type constexpr typename std::enable_if<(i < 0), void>::type
rfor_each(tuple &t, rfor_each(tuple &t,
function&& f) function&& f)
noexcept
{} {}
template<class tuple, template<class tuple,
class function, class function,
ssize_t i = size<tuple>() - 1> ssize_t i = size<tuple>() - 1>
typename std::enable_if<i < tuple_size<tuple>(), void>::type inline typename std::enable_if<i < tuple_size<tuple>(), void>::type
rfor_each(const tuple &t, rfor_each(const tuple &t,
function&& f) function&& f)
{ {
@ -118,7 +122,7 @@ rfor_each(const tuple &t,
template<class tuple, template<class tuple,
class function, class function,
ssize_t i = size<tuple>() - 1> ssize_t i = size<tuple>() - 1>
typename std::enable_if<i < tuple_size<tuple>(), void>::type inline typename std::enable_if<i < tuple_size<tuple>(), void>::type
rfor_each(tuple &t, rfor_each(tuple &t,
function&& f) function&& f)
{ {

View file

@ -16,7 +16,7 @@ namespace json {
template<size_t hash, template<size_t hash,
class tuple> class tuple>
enable_if_tuple<tuple, const tuple_value_type<tuple, indexof<tuple, hash>()> &> inline enable_if_tuple<tuple, const tuple_value_type<tuple, indexof<tuple, hash>()> &>
get(const tuple &t) get(const tuple &t)
noexcept noexcept
{ {
@ -35,7 +35,7 @@ noexcept
template<size_t hash, template<size_t hash,
class tuple> class tuple>
enable_if_tuple<tuple, tuple_value_type<tuple, indexof<tuple, hash>()>> inline enable_if_tuple<tuple, tuple_value_type<tuple, indexof<tuple, hash>()>>
get(const tuple &t, get(const tuple &t,
const tuple_value_type<tuple, indexof<tuple, hash>()> &def) const tuple_value_type<tuple, indexof<tuple, hash>()> &def)
noexcept noexcept
@ -55,7 +55,7 @@ noexcept
template<size_t hash, template<size_t hash,
class tuple> class tuple>
enable_if_tuple<tuple, tuple_value_type<tuple, indexof<tuple, hash>()> &> inline enable_if_tuple<tuple, tuple_value_type<tuple, indexof<tuple, hash>()> &>
get(tuple &t) get(tuple &t)
noexcept noexcept
{ {
@ -74,7 +74,7 @@ noexcept
template<size_t hash, template<size_t hash,
class tuple> class tuple>
enable_if_tuple<tuple, tuple_value_type<tuple, indexof<tuple, hash>()> &> inline enable_if_tuple<tuple, tuple_value_type<tuple, indexof<tuple, hash>()> &>
get(tuple &t, get(tuple &t,
tuple_value_type<tuple, indexof<tuple, hash>()> &def) tuple_value_type<tuple, indexof<tuple, hash>()> &def)
noexcept noexcept
@ -89,7 +89,7 @@ noexcept
template<const char *const &name, template<const char *const &name,
class tuple> class tuple>
enable_if_tuple<tuple, const tuple_value_type<tuple, indexof<tuple, name>()> &> inline enable_if_tuple<tuple, const tuple_value_type<tuple, indexof<tuple, name>()> &>
get(const tuple &t) get(const tuple &t)
noexcept noexcept
{ {
@ -98,7 +98,7 @@ noexcept
template<const char *const &name, template<const char *const &name,
class tuple> class tuple>
enable_if_tuple<tuple, tuple_value_type<tuple, indexof<tuple, name>()>> inline enable_if_tuple<tuple, tuple_value_type<tuple, indexof<tuple, name>()>>
get(const tuple &t, get(const tuple &t,
const tuple_value_type<tuple, indexof<tuple, name>()> &def) const tuple_value_type<tuple, indexof<tuple, name>()> &def)
noexcept noexcept
@ -108,7 +108,7 @@ noexcept
template<const char *const &name, template<const char *const &name,
class tuple> class tuple>
enable_if_tuple<tuple, tuple_value_type<tuple, indexof<tuple, name>()>> inline enable_if_tuple<tuple, tuple_value_type<tuple, indexof<tuple, name>()>>
get(tuple &t) get(tuple &t)
noexcept noexcept
{ {
@ -117,7 +117,7 @@ noexcept
template<const char *const &name, template<const char *const &name,
class tuple> class tuple>
enable_if_tuple<tuple, tuple_value_type<tuple, indexof<tuple, name>()>> inline enable_if_tuple<tuple, tuple_value_type<tuple, indexof<tuple, name>()>>
get(tuple &t, get(tuple &t,
tuple_value_type<tuple, indexof<tuple, hash>()> &def) tuple_value_type<tuple, indexof<tuple, hash>()> &def)
noexcept noexcept
@ -127,7 +127,7 @@ noexcept
template<class R, template<class R,
class tuple> class tuple>
enable_if_tuple<tuple, R> inline enable_if_tuple<tuple, R>
get(const tuple &t, get(const tuple &t,
const string_view &name, const string_view &name,
R ret) R ret)

View file

@ -16,7 +16,7 @@ namespace json {
template<class dst, template<class dst,
class src> class src>
typename std::enable_if inline typename std::enable_if
< <
std::is_base_of<json::string, dst>() && std::is_base_of<json::string, dst>() &&
std::is_convertible<src, ircd::string_view>(), std::is_convertible<src, ircd::string_view>(),
@ -29,7 +29,7 @@ _assign(dst &d,
template<class dst, template<class dst,
class src> class src>
typename std::enable_if inline typename std::enable_if
< <
!std::is_base_of<json::string, dst>() && !std::is_base_of<json::string, dst>() &&
std::is_convertible<src, dst>() && std::is_convertible<src, dst>() &&
@ -44,7 +44,7 @@ _assign(dst &d,
template<class dst, template<class dst,
class src> class src>
typename std::enable_if inline typename std::enable_if
< <
!std::is_base_of<json::string, dst>() && !std::is_base_of<json::string, dst>() &&
std::is_convertible<src, dst>() && std::is_convertible<src, dst>() &&
@ -60,7 +60,7 @@ _assign(dst &d,
template<class dst, template<class dst,
class src> class src>
typename std::enable_if inline typename std::enable_if
< <
std::is_arithmetic<dst>() && std::is_arithmetic<dst>() &&
std::is_base_of<std::string_view, typename std::remove_reference<src>::type>() && std::is_base_of<std::string_view, typename std::remove_reference<src>::type>() &&
@ -84,7 +84,7 @@ catch(const bad_lex_cast &e)
template<class dst, template<class dst,
class src> class src>
typename std::enable_if inline typename std::enable_if
< <
std::is_arithmetic<dst>() && std::is_arithmetic<dst>() &&
std::is_base_of<ircd::byte_view<ircd::string_view>, typename std::remove_reference<src>::type>(), std::is_base_of<ircd::byte_view<ircd::string_view>, typename std::remove_reference<src>::type>(),
@ -98,7 +98,7 @@ _assign(dst &d,
template<class dst, template<class dst,
class src> class src>
typename std::enable_if inline typename std::enable_if
< <
std::is_base_of<std::string_view, dst>() && std::is_base_of<std::string_view, dst>() &&
std::is_pod<typename std::remove_reference<src>::type>(), std::is_pod<typename std::remove_reference<src>::type>(),
@ -111,7 +111,7 @@ _assign(dst &d,
template<class dst, template<class dst,
class src> class src>
typename std::enable_if inline typename std::enable_if
< <
ircd::json::is_tuple<dst>() && ircd::json::is_tuple<dst>() &&
std::is_assignable<dst, src>(), std::is_assignable<dst, src>(),
@ -124,7 +124,7 @@ _assign(dst &d,
template<class dst, template<class dst,
class src> class src>
typename std::enable_if inline typename std::enable_if
< <
ircd::json::is_tuple<dst>() && ircd::json::is_tuple<dst>() &&
!std::is_assignable<dst, src>() && !std::is_assignable<dst, src>() &&
@ -138,7 +138,7 @@ _assign(dst &d,
template<class dst, template<class dst,
class src> class src>
typename std::enable_if inline typename std::enable_if
< <
ircd::json::is_tuple<dst>() && ircd::json::is_tuple<dst>() &&
!std::is_assignable<dst, src>() && !std::is_assignable<dst, src>() &&
@ -156,7 +156,7 @@ _assign(dst &d,
template<class V, template<class V,
class... T> class... T>
tuple<T...> & inline tuple<T...> &
set(tuple<T...> &t, set(tuple<T...> &t,
const string_view &key, const string_view &key,
V&& val) V&& val)
@ -182,7 +182,7 @@ catch(const std::exception &e)
} }
template<class... T> template<class... T>
tuple<T...> & inline tuple<T...> &
set(tuple<T...> &t, set(tuple<T...> &t,
const string_view &key, const string_view &key,
const json::value &value) const json::value &value)

View file

@ -112,14 +112,14 @@ template<class tuple,
using tuple_value_type = typename tuple_element<tuple, i>::value_type; using tuple_value_type = typename tuple_element<tuple, i>::value_type;
template<class tuple> template<class tuple>
auto & inline auto &
stdcast(const tuple &o) stdcast(const tuple &o)
{ {
return static_cast<const typename tuple::tuple_type &>(o); return static_cast<const typename tuple::tuple_type &>(o);
} }
template<class tuple> template<class tuple>
auto & inline auto &
stdcast(tuple &o) stdcast(tuple &o)
{ {
return static_cast<typename tuple::tuple_type &>(o); return static_cast<typename tuple::tuple_type &>(o);
@ -144,7 +144,7 @@ namespace json {
template<size_t i, template<size_t i,
class tuple> class tuple>
enable_if_tuple<tuple, tuple_value_type<tuple, i> &> inline enable_if_tuple<tuple, tuple_value_type<tuple, i> &>
val(tuple &t) val(tuple &t)
noexcept noexcept
{ {
@ -153,7 +153,7 @@ noexcept
template<size_t i, template<size_t i,
class tuple> class tuple>
enable_if_tuple<tuple, const tuple_value_type<tuple, i> &> inline enable_if_tuple<tuple, const tuple_value_type<tuple, i> &>
val(const tuple &t) val(const tuple &t)
noexcept noexcept
{ {
@ -304,7 +304,7 @@ const noexcept
template<class... T> template<class... T>
template<class R, template<class R,
class name> class name>
R inline R
tuple<T...>::get(name&& n, tuple<T...>::get(name&& n,
R ret) R ret)
const noexcept const noexcept
@ -315,7 +315,7 @@ const noexcept
template<class... T> template<class... T>
template<class R, template<class R,
class name> class name>
const R & inline const R &
tuple<T...>::at(name&& n) tuple<T...>::at(name&& n)
const const
{ {
@ -325,7 +325,7 @@ const
template<class... T> template<class... T>
template<class R, template<class R,
class name> class name>
R & inline R &
tuple<T...>::at(name&& n) tuple<T...>::at(name&& n)
{ {
return json::at<R>(*this, n); return json::at<R>(*this, n);

View file

@ -17,9 +17,10 @@ namespace json {
template<size_t i, template<size_t i,
class tuple, class tuple,
class function> class function>
typename std::enable_if<i == size<tuple>(), bool>::type constexpr typename std::enable_if<i == size<tuple>(), bool>::type
until(const tuple &t, until(const tuple &t,
function&& f) function&& f)
noexcept
{ {
return true; return true;
} }
@ -27,9 +28,10 @@ until(const tuple &t,
template<size_t i, template<size_t i,
class tuple, class tuple,
class function> class function>
typename std::enable_if<i == size<tuple>(), bool>::type constexpr typename std::enable_if<i == size<tuple>(), bool>::type
until(tuple &t, until(tuple &t,
function&& f) function&& f)
noexcept
{ {
return true; return true;
} }
@ -37,7 +39,7 @@ until(tuple &t,
template<size_t i = 0, template<size_t i = 0,
class tuple, class tuple,
class function> class function>
typename std::enable_if<i < size<tuple>(), bool>::type inline typename std::enable_if<i < size<tuple>(), bool>::type
until(const tuple &t, until(const tuple &t,
function&& f) function&& f)
{ {
@ -49,7 +51,7 @@ until(const tuple &t,
template<size_t i = 0, template<size_t i = 0,
class tuple, class tuple,
class function> class function>
typename std::enable_if<i < size<tuple>(), bool>::type inline typename std::enable_if<i < size<tuple>(), bool>::type
until(tuple &t, until(tuple &t,
function&& f) function&& f)
{ {
@ -61,10 +63,11 @@ until(tuple &t,
template<size_t i, template<size_t i,
class tuple, class tuple,
class function> class function>
typename std::enable_if<i == size<tuple>(), bool>::type constexpr typename std::enable_if<i == size<tuple>(), bool>::type
until(const tuple &a, until(const tuple &a,
const tuple &b, const tuple &b,
function&& f) function&& f)
noexcept
{ {
return true; return true;
} }
@ -72,7 +75,7 @@ until(const tuple &a,
template<size_t i = 0, template<size_t i = 0,
class tuple, class tuple,
class function> class function>
typename std::enable_if<i < size<tuple>(), bool>::type inline typename std::enable_if<i < size<tuple>(), bool>::type
until(const tuple &a, until(const tuple &a,
const tuple &b, const tuple &b,
function&& f) function&& f)
@ -85,9 +88,10 @@ until(const tuple &a,
template<class tuple, template<class tuple,
class function, class function,
ssize_t i> ssize_t i>
typename std::enable_if<(i < 0), bool>::type constexpr typename std::enable_if<(i < 0), bool>::type
runtil(const tuple &t, runtil(const tuple &t,
function&& f) function&& f)
noexcept
{ {
return true; return true;
} }
@ -95,9 +99,10 @@ runtil(const tuple &t,
template<class tuple, template<class tuple,
class function, class function,
ssize_t i> ssize_t i>
typename std::enable_if<(i < 0), bool>::type constexpr typename std::enable_if<(i < 0), bool>::type
runtil(tuple &t, runtil(tuple &t,
function&& f) function&& f)
noexcept
{ {
return true; return true;
} }
@ -105,7 +110,7 @@ runtil(tuple &t,
template<class tuple, template<class tuple,
class function, class function,
ssize_t i = size<tuple>() - 1> ssize_t i = size<tuple>() - 1>
typename std::enable_if<i < size<tuple>(), bool>::type inline typename std::enable_if<i < size<tuple>(), bool>::type
runtil(const tuple &t, runtil(const tuple &t,
function&& f) function&& f)
{ {
@ -117,7 +122,7 @@ runtil(const tuple &t,
template<class tuple, template<class tuple,
class function, class function,
ssize_t i = size<tuple>() - 1> ssize_t i = size<tuple>() - 1>
typename std::enable_if<i < size<tuple>(), bool>::type inline typename std::enable_if<i < size<tuple>(), bool>::type
runtil(tuple &t, runtil(tuple &t,
function&& f) function&& f)
{ {