0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-06-24 12:58:21 +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,
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)
{
constexpr size_t idx
@ -40,7 +40,7 @@ at(const tuple &t)
template<size_t hash,
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)
{
constexpr size_t idx
@ -64,7 +64,7 @@ at(tuple &t)
template<const char *const &name,
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)
{
return at<name_hash(name), tuple>(t);
@ -72,7 +72,7 @@ at(const tuple &t)
template<const char *const &name,
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)
{
return at<name_hash(name), tuple>(t);
@ -81,17 +81,17 @@ at(tuple &t)
template<class tuple,
class function,
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,
const string_view &name,
function&& f)
{
}
noexcept
{}
template<class tuple,
class function,
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,
const string_view &name,
function&& f)
@ -105,17 +105,17 @@ at(tuple &t,
template<class tuple,
class function,
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,
const string_view &name,
function&& f)
{
}
noexcept
{}
template<class tuple,
class function,
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,
const string_view &name,
function&& f)
@ -128,7 +128,7 @@ at(const tuple &t,
template<class R,
class tuple>
enable_if_tuple<tuple, const R &>
inline enable_if_tuple<tuple, const R &>
at(const tuple &t,
const string_view &name)
{
@ -161,7 +161,7 @@ at(const tuple &t,
template<class R,
class tuple>
enable_if_tuple<tuple, R &>
inline enable_if_tuple<tuple, R &>
at(tuple &t,
const string_view &name)
{

View file

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

View file

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

View file

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

View file

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

View file

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