Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/icl/functors.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/icl/functors.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,470 @@ +/*-----------------------------------------------------------------------------+ +Copyright (c) 2007-2009: Joachim Faulhaber ++------------------------------------------------------------------------------+ + Distributed under the Boost Software License, Version 1.0. + (See accompanying file LICENCE.txt or copy at + http://www.boost.org/LICENSE_1_0.txt) ++-----------------------------------------------------------------------------*/ +#ifndef BOOST_ICL_FUNCTORS_HPP_JOFA_080315 +#define BOOST_ICL_FUNCTORS_HPP_JOFA_080315 + +#include <functional> +#include <boost/type_traits.hpp> +#include <boost/mpl/if.hpp> +#include <boost/icl/type_traits/identity_element.hpp> +#include <boost/icl/type_traits/unit_element.hpp> +#include <boost/icl/type_traits/is_set.hpp> +#include <boost/icl/type_traits/has_set_semantics.hpp> + +namespace boost{namespace icl +{ + // ------------------------------------------------------------------------ + template <typename Type> struct identity_based_inplace_combine + : public std::binary_function<Type&, const Type&, void> + { + inline static Type identity_element() { return boost::icl::identity_element<Type>::value(); } + }; + + // ------------------------------------------------------------------------ + template <typename Type> struct unit_element_based_inplace_combine + : public std::binary_function<Type&, const Type&, void> + { + inline static Type identity_element() { return boost::icl::unit_element<Type>::value(); } + }; + + // ------------------------------------------------------------------------ + template <typename Type> struct inplace_identity + : public identity_based_inplace_combine<Type> + { + typedef inplace_identity<Type> type; + void operator()(Type&, const Type&)const{} + }; + + template<> + inline std::string unary_template_to_string<inplace_identity>::apply() + { return "i="; } + + // ------------------------------------------------------------------------ + template <typename Type> struct inplace_erasure + : public identity_based_inplace_combine<Type> + { + typedef inplace_erasure<Type> type; + typedef identity_based_inplace_combine<Type> base_type; + + void operator()(Type& object, const Type& operand)const + { + if(object == operand) + //identity_element(); //JODO Old gcc-3.4.4 does not compile this + object = base_type::identity_element(); //<-- but this. + } + }; + + template<> + inline std::string unary_template_to_string<inplace_erasure>::apply() + { return "0="; } + + // ------------------------------------------------------------------------ + template <typename Type> struct inplace_plus + : public identity_based_inplace_combine<Type> + { + typedef inplace_plus<Type> type; + + void operator()(Type& object, const Type& operand)const + { object += operand; } + + static void version(Type&){} + }; + + template<> + inline std::string unary_template_to_string<inplace_plus>::apply() { return "+="; } + + // ------------------------------------------------------------------------ + template <typename Type> struct inplace_minus + : public identity_based_inplace_combine<Type> + { + typedef inplace_minus<Type> type; + + void operator()(Type& object, const Type& operand)const + { object -= operand; } + }; + + template<> + inline std::string unary_template_to_string<inplace_minus>::apply() { return "-="; } + + // ------------------------------------------------------------------------ + template <typename Type> struct inplace_bit_add + : public identity_based_inplace_combine<Type> + { + typedef inplace_bit_add<Type> type; + + void operator()(Type& object, const Type& operand)const + { object |= operand; } + + static void version(Type&){} + }; + + template<> + inline std::string unary_template_to_string<inplace_bit_add>::apply() { return "b|="; } + + // ------------------------------------------------------------------------ + template <typename Type> struct inplace_bit_subtract + : public identity_based_inplace_combine<Type> + { + typedef inplace_bit_subtract<Type> type; + + void operator()(Type& object, const Type& operand)const + { object &= ~operand; } + }; + + template<> + inline std::string unary_template_to_string<inplace_bit_subtract>::apply() { return "b-="; } + + // ------------------------------------------------------------------------ + template <typename Type> struct inplace_bit_and + : public identity_based_inplace_combine<Type> + { + typedef inplace_bit_and<Type> type; + + void operator()(Type& object, const Type& operand)const + { object &= operand; } + }; + + template<> + inline std::string unary_template_to_string<inplace_bit_and>::apply() { return "b&="; } + + // ------------------------------------------------------------------------ + template <typename Type> struct inplace_bit_xor + : public identity_based_inplace_combine<Type> + { + typedef inplace_bit_xor<Type> type; + + void operator()(Type& object, const Type& operand)const + { object ^= operand; } + }; + + // ------------------------------------------------------------------------ + template <typename Type> struct inplace_et + : public identity_based_inplace_combine<Type> + { + typedef inplace_et<Type> type; + + void operator()(Type& object, const Type& operand)const + { object &= operand; } + }; + + template<> + inline std::string unary_template_to_string<inplace_et>::apply() { return "&="; } + + // ------------------------------------------------------------------------ + template <typename Type> struct inplace_caret + : public identity_based_inplace_combine<Type> + { + typedef inplace_caret<Type> type; + + void operator()(Type& object, const Type& operand)const + { object ^= operand; } + }; + + template<> + inline std::string unary_template_to_string<inplace_caret>::apply() { return "^="; } + + // ------------------------------------------------------------------------ + template <typename Type> struct inplace_insert + : public identity_based_inplace_combine<Type> + { + typedef inplace_insert<Type> type; + + void operator()(Type& object, const Type& operand)const + { insert(object,operand); } + }; + + template<> + inline std::string unary_template_to_string<inplace_insert>::apply() { return "ins="; } + + // ------------------------------------------------------------------------ + template <typename Type> struct inplace_erase + : public identity_based_inplace_combine<Type> + { + typedef inplace_erase<Type> type; + + void operator()(Type& object, const Type& operand)const + { erase(object,operand); } + }; + + template<> + inline std::string unary_template_to_string<inplace_erase>::apply() { return "ers="; } + + // ------------------------------------------------------------------------ + template <typename Type> struct inplace_star + : public identity_based_inplace_combine<Type> //JODO unit_element_ + { + typedef inplace_star<Type> type; + + void operator()(Type& object, const Type& operand)const + { object *= operand; } + }; + + template<> + inline std::string unary_template_to_string<inplace_star>::apply() { return "*="; } + + // ------------------------------------------------------------------------ + template <typename Type> struct inplace_slash + : public identity_based_inplace_combine<Type> //JODO unit_element_ + { + typedef inplace_slash<Type> type; + + void operator()(Type& object, const Type& operand)const + { object /= operand; } + }; + + template<> + inline std::string unary_template_to_string<inplace_slash>::apply() { return "/="; } + + // ------------------------------------------------------------------------ + template <typename Type> struct inplace_max + : public identity_based_inplace_combine<Type> + { + typedef inplace_max<Type> type; + + void operator()(Type& object, const Type& operand)const + { + if(object < operand) + object = operand; + } + }; + + template<> + inline std::string unary_template_to_string<inplace_max>::apply() { return "max="; } + + // ------------------------------------------------------------------------ + template <typename Type> struct inplace_min + : public identity_based_inplace_combine<Type> + { + typedef inplace_min<Type> type; + + void operator()(Type& object, const Type& operand)const + { + if(object > operand) + object = operand; + } + }; + + template<> + inline std::string unary_template_to_string<inplace_min>::apply() { return "min="; } + + //-------------------------------------------------------------------------- + // Inter_section functor + //-------------------------------------------------------------------------- + template<class Type> struct inter_section + : public identity_based_inplace_combine<Type> + { + typedef typename boost::mpl:: + if_<has_set_semantics<Type>, + icl::inplace_et<Type>, + icl::inplace_plus<Type> + >::type + type; + + void operator()(Type& object, const Type& operand)const + { + type()(object, operand); + } + }; + + //-------------------------------------------------------------------------- + // Inverse functor + //-------------------------------------------------------------------------- + template<class Functor> struct inverse; + + template<class Type> + struct inverse<icl::inplace_plus<Type> > + { typedef icl::inplace_minus<Type> type; }; + + template<class Type> + struct inverse<icl::inplace_minus<Type> > + { typedef icl::inplace_plus<Type> type; }; + + template<class Type> + struct inverse<icl::inplace_bit_add<Type> > + { typedef icl::inplace_bit_subtract<Type> type; }; + + template<class Type> + struct inverse<icl::inplace_bit_subtract<Type> > + { typedef icl::inplace_bit_add<Type> type; }; + + template<class Type> + struct inverse<icl::inplace_et<Type> > + { typedef icl::inplace_caret<Type> type; }; + + template<class Type> + struct inverse<icl::inplace_caret<Type> > + { typedef icl::inplace_et<Type> type; }; + + template<class Type> + struct inverse<icl::inplace_bit_and<Type> > + { typedef icl::inplace_bit_xor<Type> type; }; + + template<class Type> + struct inverse<icl::inplace_bit_xor<Type> > + { typedef icl::inplace_bit_and<Type> type; }; + + template<class Type> + struct inverse<icl::inplace_star<Type> > + { typedef icl::inplace_slash<Type> type; }; + + template<class Type> + struct inverse<icl::inplace_slash<Type> > + { typedef icl::inplace_star<Type> type; }; + + template<class Type> + struct inverse<icl::inplace_max<Type> > + { typedef icl::inplace_min<Type> type; }; + + template<class Type> + struct inverse<icl::inplace_min<Type> > + { typedef icl::inplace_max<Type> type; }; + + template<class Type> + struct inverse<icl::inplace_identity<Type> > + { typedef icl::inplace_erasure<Type> type; }; + + // If a Functor + template<class Functor> + struct inverse + { + typedef typename + remove_reference<typename Functor::first_argument_type>::type argument_type; + typedef icl::inplace_erasure<argument_type> type; + }; + + + //-------------------------------------------------------------------------- + // Inverse inter_section functor + //-------------------------------------------------------------------------- + template<class Type> + struct inverse<icl::inter_section<Type> > + : public identity_based_inplace_combine<Type> + { + typedef typename boost::mpl:: + if_<has_set_semantics<Type>, + icl::inplace_caret<Type>, + icl::inplace_minus<Type> + >::type + type; + + void operator()(Type& object, const Type& operand)const + { + type()(object, operand); + } + }; + + + //-------------------------------------------------------------------------- + // Positive or negative functor trait + //-------------------------------------------------------------------------- + + // A binary operation - is negative (or inverting) with respect to the + // neutral element iff it yields the inverse element if it is applied to the + // identity element: + // 0 - x = -x + // For a functor that wraps the inplace of op-assign version this is + // equivalent to + // + // T x = ..., y; + // y = Functor::identity_element(); + // Functor()(y, x); // y == inverse_of(x) + + template<class Functor> struct is_negative; + + template<class Functor> + struct is_negative + { + typedef is_negative<Functor> type; + BOOST_STATIC_CONSTANT(bool, value = false); + }; + + template<class Type> + struct is_negative<icl::inplace_minus<Type> > + { + typedef is_negative type; + BOOST_STATIC_CONSTANT(bool, value = true); + }; + + template<class Type> + struct is_negative<icl::inplace_bit_subtract<Type> > + { + typedef is_negative type; + BOOST_STATIC_CONSTANT(bool, value = true); + }; + + //-------------------------------------------------------------------------- + // Pro- or in-version functor + //-------------------------------------------------------------------------- + template<class Combiner> struct conversion; + + template<class Combiner> + struct conversion + { + typedef conversion<Combiner> type; + typedef typename + remove_const< + typename remove_reference<typename Combiner::first_argument_type + >::type + >::type + argument_type; + // The proversion of an op-assign functor o= lets the value unchanged + // (0 o= x) == x; + // Example += : (0 += x) == x + static argument_type proversion(const argument_type& value) + { + return value; + } + + // The inversion of an op-assign functor o= inverts the value x + // to it's inverse element -x + // (0 o= x) == -x; + // Example -= : (0 -= x) == -x + static argument_type inversion(const argument_type& value) + { + argument_type inverse = Combiner::identity_element(); + Combiner()(inverse, value); + return inverse; + } + }; + + template<class Combiner> struct version : public conversion<Combiner> + { + typedef version<Combiner> type; + typedef conversion<Combiner> base_type; + typedef typename base_type::argument_type argument_type; + + argument_type operator()(const argument_type& value) + { return base_type::proversion(value); } + }; + + template<>struct version<icl::inplace_minus<short > >{short operator()(short val){return -val;}}; + template<>struct version<icl::inplace_minus<int > >{int operator()(int val){return -val;}}; + template<>struct version<icl::inplace_minus<long > >{long operator()(long val){return -val;}}; + template<>struct version<icl::inplace_minus<long long > >{long long operator()(long long val){return -val;}}; + template<>struct version<icl::inplace_minus<float > >{float operator()(float val){return -val;}}; + template<>struct version<icl::inplace_minus<double > >{double operator()(double val){return -val;}}; + template<>struct version<icl::inplace_minus<long double> >{long double operator()(long double val){return -val;}}; + + template<class Type> + struct version<icl::inplace_minus<Type> > : public conversion<icl::inplace_minus<Type> > + { + typedef version<icl::inplace_minus<Type> > type; + typedef conversion<icl::inplace_minus<Type> > base_type; + typedef typename base_type::argument_type argument_type; + + Type operator()(const Type& value) + { + return base_type::inversion(value); + } + }; + +}} // namespace icl boost + +#endif + +