Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F91759540
aka_static_if.hh
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Thu, Nov 14, 04:28
Size
3 KB
Mime Type
text/x-c++
Expires
Sat, Nov 16, 04:28 (2 d)
Engine
blob
Format
Raw Data
Handle
22309395
Attached To
rAKA akantu
aka_static_if.hh
View Options
// Copyright (c) 2016 Vittorio Romeo
// License: AFL 3.0 | https://opensource.org/licenses/AFL-3.0
// http://vittorioromeo.info | vittorio.romeo@outlook.com
#ifndef AKANTU_AKA_STATIC_IF_HH
#define AKANTU_AKA_STATIC_IF_HH
#ifndef AKANTU_ITERATORS_NAMESPACE
#define AKANTU_ITERATORS_NAMESPACE akantu
#endif
#include <utility>
#define FWD(...) ::std::forward<decltype(__VA_ARGS__)>(__VA_ARGS__)
namespace
AKANTU_ITERATORS_NAMESPACE
{
template
<
typename
TPredicate
>
auto
static_if
(
TPredicate
/*unused*/
)
noexcept
;
namespace
impl
{
template
<
bool
TPredicateResult
>
struct
static_if_impl
;
template
<
typename
TFunctionToCall
>
struct
static_if_result
;
template
<
typename
TF
>
auto
make_static_if_result
(
TF
&&
f
)
noexcept
;
template
<>
struct
static_if_impl
<
true
>
{
template
<
typename
TF
>
auto
&
else_
(
TF
&&
/*unused*/
)
noexcept
{
// Ignore `else_`, as the predicate is true.
return
*
this
;
}
template
<
typename
TPredicate
>
auto
&
else_if
(
TPredicate
/*unused*/
)
noexcept
{
// Ignore `else_if`, as the predicate is true.
return
*
this
;
}
template
<
typename
TF
>
auto
then
(
TF
&&
f
)
noexcept
{
// We found a matching branch, just make a result and
// ignore everything else.
return
make_static_if_result
(
FWD
(
f
));
}
};
template
<>
struct
static_if_impl
<
false
>
{
template
<
typename
TF
>
auto
&
then
(
TF
&&
/*unused*/
)
noexcept
{
// Ignore `then`, as the predicate is false.
return
*
this
;
}
template
<
typename
TF
>
auto
else_
(
TF
&&
f
)
noexcept
{
// (Assuming that `else_` is after all `else_if` calls.)
// We found a matching branch, just make a result and
// ignore everything else.
return
make_static_if_result
(
FWD
(
f
));
}
template
<
typename
TPredicate
>
auto
else_if
(
TPredicate
/*unused*/
)
noexcept
{
return
static_if
(
TPredicate
{});
}
template
<
typename
...
Ts
>
auto
operator
()(
Ts
&&
...
/*unused*/
)
noexcept
{
// If there are no `else` branches, we must ignore calls
// to a failed `static_if` matching.
}
};
template
<
typename
TFunctionToCall
>
struct
static_if_result
:
TFunctionToCall
{
// Perfect-forward the function in the result instance.
template
<
typename
TFFwd
>
explicit
static_if_result
(
TFFwd
&&
f
)
noexcept
:
TFunctionToCall
(
FWD
(
f
))
{}
static_if_result
(
const
static_if_result
&
/* unused */
)
=
delete
;
static_if_result
(
static_if_result
&&
/* unused */
)
=
delete
;
// Ignore everything, we found a result.
template
<
typename
TF
>
auto
&
then
(
TF
&&
/*unused*/
)
noexcept
{
return
*
this
;
}
template
<
typename
TPredicate
>
auto
&
else_if
(
TPredicate
/*unused*/
)
noexcept
{
return
*
this
;
}
template
<
typename
TF
>
auto
&
else_
(
TF
&&
/*unused*/
)
noexcept
{
return
*
this
;
}
};
template
<
typename
TF
>
auto
make_static_if_result
(
TF
&&
f
)
noexcept
{
return
static_if_result
<
TF
>
{
FWD
(
f
)};
}
}
// namespace impl
template
<
typename
TPredicate
>
auto
static_if
(
TPredicate
/*unused*/
)
noexcept
{
return
impl
::
static_if_impl
<
TPredicate
{}
>
{};
}
#undef FWD
}
// namespace AKANTU_ITERATORS_NAMESPACE
#endif
/* AKANTU_AKA_STATIC_IF_HH */
Event Timeline
Log In to Comment