transitive_closure_concepts.h

Back to Functional transitive closure

pastel/sys/graph/transitive_closure/

// Description: Concepts for the functional transitive closure

#ifndef PASTELSYS_TRANSITIVE_CLOSURE_CONCEPTS_H
#define PASTELSYS_TRANSITIVE_CLOSURE_CONCEPTS_H

#include "pastel/sys/graph/transitive_closure.h"

#include <functional>

namespace Pastel
{

    namespace TransitiveClosure_Concepts
    {

        //! The elements of the set X.
        class Domain {};

        //! The elements Y of the commutative monoid (Y, +).
        class Codomain {};

        //! The commutative monoid operator + : Y^2 --> Y.
        class CodomainOperator
        {
        public:
            //! Returns left + right.
            /*!
           Must be associative, commutative, and have
           the identity element I. Note that the 'left'
           argument is passed by rvalue-reference:
           this can be used to optimize the operation.
           */
            Codomain operator()(
                Codomain&& left, 
                const Codomain& right) const;
        };

        //! The function f : X --> Y.
        class Function
        {
        public:
            //! Returns f(x).
            /*!
           Note: you might want to return by const reference
           instead for performance. However, this is not 
           required.
           */
            Codomain operator()(const Domain& x) const;
        };

        //! Visits each x in X.
        class ForEachDomain
        {
        public:
            //! Visits each x in X.
            void operator()(
                const std::function<void(const Domain&)>& visitor) const;
        };

        //! Visits each x' in X such that x ~ x'.
        class ForEachRelated
        {
        public:
            //! Visits each x' in X such that x ~ x'.
            void operator()(
                const Domain& x,
                const std::function<void(const Domain&)>& visit) const;
        };

        class Closure_Output
        {
        public:
            //! Reports the value of the closure-function at x.
            void operator()(
                const Domain& x,
                Codomain&& closure) const;
        };

    }

}

#endif