ordered_monoid_concept.h

Back to Algebra

pastel/sys/algebra/

// Description: Ordered additive monoid concept
// Documentation: algebra.txt

#ifndef PASTELSYS_ORDERED_MONOID_CONCEPT_H
#define PASTELSYS_ORDERED_MONOID_CONCEPT_H

#include "pastel/sys/algebra/ordered_semigroup_concept.h"
#include "pastel/sys/algebra/monoid_concept.h"

#include "pastel/sys/algebra/native_ordered_monoid.h"

namespace Pastel 
{

    //! An ordered additive monoid.
    /*! 
   An ordered monoid (X, +, 0) is an additive monoid (X, +, 0)
   which is also an ordered additive semigroup.
   */
    template <typename T>
    concept Ordered_Additive_Monoid_Concept_ =
        Ordered_Additive_SemiGroup_Concept<T> && 
        Additive_Monoid_Concept<T> && 
        requires(T t) {
        //! Returns whether 'that' > 0.
        {positive(t)} -> std::convertible_to<bool>;
        //! Returns whether 'that' < 0.
        {negative(t)} -> std::convertible_to<bool>;
        //! Returns the absolute value of 'that'.
        {abs(t)} -> std::convertible_to<T>;
    };

    template <typename T>
    concept Ordered_Additive_Monoid_Concept =
        Ordered_Additive_Monoid_Concept_<RemoveCvRef<T>>;

}

#endif