// Description: Search for the first modeled concept
#ifndef PASTELSYS_FIRST_MODELED_CONCEPT_H
#define PASTELSYS_FIRST_MODELED_CONCEPT_H
#include "pastel/sys/concept/models.h"
#include <type_traits>
namespace Pastel
{
namespace FirstModeledConcept_
{
template <
typename Type,
typename... ConceptSet>
struct FirstModeledConcept_F;
template <
typename Type,
typename Concept,
typename... ConceptSet>
struct FirstModeledConcept_F<Type, Concept, ConceptSet...>
: std::conditional<
Models<Type, Concept>::value,
Concept,
typename FirstModeledConcept_F<Type, ConceptSet...>::type
>
{};
template <typename Type>
struct FirstModeledConcept_F<Type>
: Identity_F<void>
{};
}
}
namespace Pastel
{
//! Returns the first modeled concept.
/*!
returns:
The first concept in ConceptSet whose model Type is.
If there is no such concept, then void.
*/
template <
typename Type,
typename... ConceptSet>
using FirstModeledConcept_F =
FirstModeledConcept_::FirstModeledConcept_F<Type, ConceptSet...>;
template <
typename Type,
typename... ConceptSet>
using FirstModeledConcept =
typename FirstModeledConcept_F<Type, ConceptSet...>::type;
}
#endif