###

#

# Concepts

All constructs in GIL are models of GIL concepts. A concept is a set of requirements that a type (or a set of related types) must fulfill to be used correctly in generic algorithms. The requirements include syntactic and algorithmic guarantees. For example, GIL class `pixel` is a model of GIL `PixelConcept`. The user may substitute the pixel class with one of their own, and, as long as it satisfies the requirements of `PixelConcept`, all other GIL classes and algorithms can be used with it. See more about concepts at Generic Programming in ConceptC++

In this document we will use a syntax for defining concepts that is described in the C++ standard proposal paper [N2081] Concepts.

Here are some common concepts that will be used in GIL. Most of them are defined at the ConceptC++ Concept Web:

    auto concept DefaultConstructible<typename T>
    {
        T::T();
    };

    auto concept CopyConstructible<typename T>
    {
        T::T(T);
        T::~T();
    };

    auto concept Assignable<typename T, typename U = T>
    {
        typename result_type;
        result_type operator=(T&, U);
    };

    auto concept EqualityComparable<typename T, typename U = T>
    {
        bool operator==(T x, U y);
        bool operator!=(T x, U y) { return !(x==y); }
    };

    concept SameType<typename T, typename U> { /* unspecified */ };
    template<typename T> concept_map SameType<T, T> { /* unspecified */ };

    auto concept Swappable<typename T>
    {
        void swap(T& t, T& u);
    };

Here are some additional basic concepts that GIL needs:

    auto concept Regular<typename T> :
        DefaultConstructible<T>,
        CopyConstructible<T>,
        EqualityComparable<T>,
        Assignable<T>,
        Swappable<T>
    {};

    auto concept Metafunction<typename T>
    {
        typename type;
    };