pointset_range.h

Back to Point-set

pastel/sys/pointset/

// Description: Set of a point-set
// DocumentationOf: pointset_concept.h

#ifndef PASTELSYS_POINTSET_SET_H
#define PASTELSYS_POINTSET_SET_H

#include "pastel/sys/pointset/pointset_concept.h"

namespace Pastel
{

    template <typename T>
    concept HasMemberPointSet__ = requires(T t) {
        addConst(t).pointSetRange();
    };

    template <typename T>
    concept HasMemberPointSet_ = 
        HasMemberPointSet__<RemoveCvRef<T>>;

    template <typename Type>
    using HasMemberPointSet = 
        std::bool_constant<HasMemberPointSet_<Type>>;

    template <HasMemberPointSet_ Type>
    decltype(auto) pointSetRange(Type&& that)
    {
        return std::forward<Type>(that).pointSetRange();
    }

    template <Range_Concept Set>
    requires 
        // Give priority to the member-locator.
        (!HasMemberPointSet<Set>::value)
    decltype(auto) pointSetRange(Set&& set)
    {
        return std::forward<Set>(set);
    }

}

namespace Pastel
{

    template <PointSet_Concept PointSet>
    using PointSet_Range = RemoveCvRef<decltype(pointSetRange(std::declval<PointSet>()))>;

}

#endif