fold.h

Back to Type traits

pastel/sys/type_traits/

// Description: Fold types with a binary type-function
// Documentation: type_traits.txt

#ifndef PASTELSYS_FOLD_H
#define PASTELSYS_FOLD_H

#include "pastel/sys/type_traits/identity.h"

namespace Pastel
{

    namespace Fold_
    {

        template <
            template <typename, typename, typename...> class Binary_TypeFunction,
            typename Identity,
            typename... TypeSet>
        struct Fold_F_;

        template <
            template <typename, typename, typename...> class Binary_TypeFunction,
            typename Identity,
            typename Type,
            typename... TypeSet>
        struct Fold_F_<Binary_TypeFunction, Identity, Type, TypeSet...>
        : Binary_TypeFunction<
            Type,
            typename Fold_F_<Binary_TypeFunction, Identity, TypeSet...>::type
        >
        {};

        template <
            template <typename, typename, typename...> class Binary_TypeFunction,
            typename Identity,
            typename Type>
        struct Fold_F_<Binary_TypeFunction, Identity, Type>
        : Identity_F<Type>
        {};

        template <
            template <typename, typename, typename...> class Binary_TypeFunction,
            typename Identity>
        struct Fold_F_<Binary_TypeFunction, Identity>
        : Identity_F<Identity>
        {};

    }

}

namespace Pastel
{

    //! Folds types with a binary type-function.
    /*!
   Identity:
   The identity element of the binary operation. 
   This is returned for the empty fold.
   */
    template <
        template <typename, typename, typename...> class Binary_TypeFunction,
        typename Identity,
        typename... TypeSet>
    using Fold_F =
        Fold_::Fold_F_<Binary_TypeFunction, Identity, TypeSet...>;

    template <
        template <typename, typename, typename...> class Binary_TypeFunction,
        typename Identity,
        typename... TypeSet>
    using Fold = 
        typename Fold_F<Binary_TypeFunction, Identity, TypeSet...>::type;

}

#endif