repr
0.1
Reconstructable string representations and more
Toggle main menu visibility
Main Page
Installation
Usage
Customization
Extending
FAQ
CI Results
Test
Benchmark
API Documentation
Namespace List
Namespace List
Namespace Members
All
_
a
c
d
e
f
g
i
l
m
n
o
p
r
s
t
u
v
w
Functions
_
a
c
d
e
f
g
i
l
m
n
o
r
s
t
u
v
w
Variables
Typedefs
Enumerations
Concept List
Class List
Class List
Class Index
Class Hierarchy
Class Members
All
_
a
b
c
d
e
f
g
h
i
k
l
m
n
o
p
q
r
s
t
u
v
w
~
Functions
_
a
c
e
f
g
i
l
m
n
o
p
r
s
t
v
w
~
Variables
a
b
c
d
e
f
g
i
k
l
m
n
o
p
q
r
s
t
u
v
Typedefs
a
c
d
e
f
g
h
l
m
p
r
s
t
u
v
w
Enumerations
Enumerator
Related Symbols
File List
File List
File Members
All
_
l
n
o
r
u
Variables
Macros
_
l
o
r
u
Examples
Source Code
•
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Pages
Concepts
Loading...
Searching...
No Matches
arity.h
Go to the documentation of this file.
#pragma once
#include <
cstddef
>
#include <
type_traits
>
namespace
librepr::detail
{
struct
Universal
{
template
<
typename
T>
/* implicit */
constexpr
operator
T();
// NOLINT
};
struct
Universal
{
…
};
template
<
typename
T>
requires
std::is_aggregate_v<T>
struct
ArityImpl
{
template
<
typename
...
Fillers
>
static
consteval
auto
array_length
(
auto
...
parameters
) {
if
constexpr
(
requires
{ T{
parameters
..., {
Fillers
{}...,
Universal
{}}}; }) {
return
array_length
<
Fillers
...,
Universal
>(
parameters
...);
}
else
{
return
sizeof
...(Fillers);
}
}
static
consteval
auto
array_length
(
auto
...
parameters
) {
…
}
static
consteval
auto
arity_simple
(
auto
...
parameters
) {
if
constexpr
(
requires
{ T{
parameters
...,
Universal
{}}; }) {
return
arity_simple
(
parameters
...,
Universal
{});
}
else
{
return
sizeof
...(parameters);
}
}
static
consteval
auto
arity_simple
(
auto
...
parameters
) {
…
}
template
<
typename
...
Trails
>
static
consteval
auto
arity_simple_ag
(
auto
...
parameters
) {
if
constexpr
(
requires
{ T{
parameters
..., {
Universal
{},
Universal
{}},
Trails
{}...,
Universal
{}}; }) {
return
arity_simple_ag
<
Trails
...,
Universal
>(
parameters
...);
}
else
{
return
sizeof
...(parameters) +
sizeof
...(
Trails
) + 1;
}
}
static
consteval
auto
arity_simple_ag
(
auto
...
parameters
) {
…
}
static
consteval
auto
arity
(
std::size_t
minus = 0,
auto
...
parameters
) {
if
constexpr
(
requires
{ T{
parameters
..., {
Universal
{},
Universal
{}}}; }) {
if
constexpr
(
arity_simple_ag
(
parameters
...) !=
arity_simple
(
parameters
...)) {
minus +=
array_length
(
parameters
...) - 1;
}
return
arity
(minus,
parameters
...,
Universal
{});
}
else
if
constexpr
(
requires
{ T{
parameters
...,
Universal
{}}; }) {
return
arity
(minus,
parameters
...,
Universal
{});
}
else
{
return
sizeof
...(parameters) - minus;
}
}
static
consteval
auto
arity
(
std::size_t
minus = 0,
auto
...
parameters
) {
…
}
};
struct
ArityImpl
{
…
};
template
<
typename
T>
requires
std::is_aggregate_v<T>
inline
constexpr
std::size_t
arity
=
ArityImpl<T>::arity
();
}
// namespace librepr::detail
include
librepr
reflection
detail
arity.h
Generated by
1.9.8, using the excellent
Doxygen Awesome
Theme