template<typename T>
{
{ cast<T>( std::declval<T>() ) } -> std::same_as<T>;
{
select( std::declval<mask_t<T>>(), a, a ) } -> std::convertible_to<T>;
{ lookup<T>( std::declval<std::vector<remove_packet_t<T>>>(), std::declval<size_t>(), std::declval<index_mask_t<size_t>>() ) } -> std::convertible_to<T>;
{ lookup<T>( std::declval<std::vector<T>>(), std::declval<size_t>(), std::declval<index_mask_t<size_t>>() ) } -> std::convertible_to<T>;
{ lookup<T>( std::declval<std::vector<remove_packet_t<T>>>(), std::declval<index_t<T>>(), std::declval<index_mask_t<T>>() ) } -> std::convertible_to<T>;
{ lookup<T>( std::declval<std::vector<T>>(), std::declval<index_t<T>>(), std::declval<index_mask_t<T>>() ) } -> std::convertible_to<T>;
{ lookup<T>( std::declval<std::vector<remove_packet_t<T>>>(), std::declval<size_t>() ) } -> std::convertible_to<T>;
{ lookup<T>( std::declval<std::vector<T>>(), std::declval<size_t>()) } -> std::convertible_to<T>;
{ lookup<T>( std::declval<std::vector<remove_packet_t<T>>>(), std::declval<index_t<T>>() ) } -> std::convertible_to<T>;
{ lookup<T>( std::declval<std::vector<T>>(), std::declval<index_t<T>>() ) } -> std::convertible_to<T>;
{
set( std::declval<std::vector<remove_packet_t<T>>>(), std::declval<size_t>(), std::declval<remove_packet_t<T>>(), std::declval<index_mask_t<size_t>>() ) };
{
set( std::declval<std::vector<T>>(), std::declval<size_t>(), std::declval<T>(), std::declval<index_mask_t<size_t>>() ) };
{
set( std::declval<std::vector<remove_packet_t<T>>>(), std::declval<index_t<T>>(), std::declval<T>(), std::declval<index_mask_t<T>>() ) };
{
set( std::declval<std::vector<T>>(), std::declval<index_t<T>>(), std::declval<T>(), std::declval<index_mask_t<T>>() ) };
{
set( std::declval<std::vector<remove_packet_t<T>>>(), std::declval<size_t>(), std::declval<remove_packet_t<T>>() ) };
{
set( std::declval<std::vector<T>>(), std::declval<size_t>(), std::declval<T>() ) };
{
set( std::declval<std::vector<remove_packet_t<T>>>(), std::declval<index_t<T>>(), std::declval<T>() ) };
{
set( std::declval<std::vector<T>>(), std::declval<index_t<T>>(), std::declval<T>() ) };
{
binary_search( std::declval<std::vector<T>>(), [](
const T&) {
return true; }, std::declval<index_mask_t<T>>() ) } -> std::convertible_to< index_t<T> >;
{
binary_search( std::declval<std::vector<T>>(), [](
const T&) {
return true; } ) } -> std::convertible_to< index_t<T> >;
}
A type T has valid control methods if:
Definition: control.h:33
constexpr index_t< bbm::iterable_value_t< C > > binary_search(C &&container, PRED &&predicate, const index_mask_t< bbm::iterable_value_t< C > > &mask=true)
binary search
Definition: control.h:92
constexpr auto select(MASK &&mask, const A &a, const A &b)
Definition: backbone.h:255
void set(C &&container, const Index &idx, Value &&value, const index_mask_t< Index > &mask=true)
Generalization of backbone::set to include tuples/named/reflection-supported objects.
Definition: backbone.h:352
A type T has valid control methods if:
- mask_t<T> is defined
- value_t<T> is defined
- remove_diff_t<T> is defined
- index_t<T> is defined
- cast<NewType>(oldType) cast oldType to newType
- select(Mask, T, T) returns a type T based on the mask.
- lookup<T>(container, index_t, index_mask_t) returns a type T; testing on std::vector as container
- set(container, index_t, T, index_mask_t) set a value in a container taking; similar to lookup handles packet data
- binary_search(container, predicate, index_mask_t) returns the index of the first element in container for which predicate is false.