mirror of https://github.com/CGAL/cgal
3297 lines
87 KiB
C++
3297 lines
87 KiB
C++
// Copyright (c) 2003 Utrecht University (The Netherlands),
|
|
// ETH Zurich (Switzerland), Freie Universitaet Berlin (Germany),
|
|
// INRIA Sophia-Antipolis (France), Martin-Luther-University Halle-Wittenberg
|
|
// (Germany), Max-Planck-Institute Saarbruecken (Germany), RISC Linz (Austria),
|
|
// and Tel-Aviv University (Israel). All rights reserved.
|
|
//
|
|
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
|
|
// modify it under the terms of the GNU Lesser General Public License as
|
|
// published by the Free Software Foundation; version 2.1 of the License.
|
|
// See the file LICENSE.LGPL distributed with CGAL.
|
|
//
|
|
// Licensees holding a valid commercial license may use this file in
|
|
// accordance with the commercial license agreement provided with the software.
|
|
//
|
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
//
|
|
// $Source$
|
|
// $Revision$ $Date$
|
|
// $Name$
|
|
//
|
|
// Author(s) : Michael Hoffmann <hoffmann@inf.ethz.ch>
|
|
// Lutz Kettner <kettner@mpi-sb.mpg.de>
|
|
// Sylvain Pion <Sylvain.Pion@sophia.inria.fr>
|
|
|
|
#ifndef CGAL_FUNCTIONAL_H
|
|
#define CGAL_FUNCTIONAL_H 1
|
|
|
|
#include <CGAL/functional_base.h>
|
|
|
|
CGAL_BEGIN_NAMESPACE
|
|
|
|
// +----------------------------------------------------------------------+
|
|
// | A functor adaptor to define an arity explicitly
|
|
// +----------------------------------------------------------------------+
|
|
|
|
namespace CGALi {
|
|
|
|
template < class F, int a > struct Set_arity_helper;
|
|
|
|
template < class F >
|
|
struct Set_arity_helper< F, 0 > {
|
|
typedef Arity_tag< 0 > Arity;
|
|
typedef typename F::result_type result_type;
|
|
|
|
Set_arity_helper(const F& f) : f_(f) {}
|
|
|
|
|
|
result_type operator()
|
|
()
|
|
const
|
|
{ return f_(); }
|
|
|
|
protected:
|
|
F f_;
|
|
};
|
|
|
|
template < class F >
|
|
struct Set_arity_helper< F, 1 > {
|
|
typedef Arity_tag< 1 > Arity;
|
|
typedef typename F::result_type result_type;
|
|
|
|
Set_arity_helper(const F& f) : f_(f) {}
|
|
|
|
template < class A1 >
|
|
result_type operator()
|
|
(const A1& a1)
|
|
const
|
|
{ return f_(a1); }
|
|
|
|
protected:
|
|
F f_;
|
|
};
|
|
|
|
template < class F >
|
|
struct Set_arity_helper< F, 2 > {
|
|
typedef Arity_tag< 2 > Arity;
|
|
typedef typename F::result_type result_type;
|
|
|
|
Set_arity_helper(const F& f) : f_(f) {}
|
|
|
|
template < class A1, class A2 >
|
|
result_type operator()
|
|
(const A1& a1, const A2& a2)
|
|
const
|
|
{ return f_(a1, a2); }
|
|
|
|
protected:
|
|
F f_;
|
|
};
|
|
|
|
template < class F >
|
|
struct Set_arity_helper< F, 3 > {
|
|
typedef Arity_tag< 3 > Arity;
|
|
typedef typename F::result_type result_type;
|
|
|
|
Set_arity_helper(const F& f) : f_(f) {}
|
|
|
|
template < class A1, class A2, class A3 >
|
|
result_type operator()
|
|
(const A1& a1, const A2& a2, const A3& a3)
|
|
const
|
|
{ return f_(a1, a2, a3); }
|
|
|
|
protected:
|
|
F f_;
|
|
};
|
|
|
|
template < class F >
|
|
struct Set_arity_helper< F, 4 > {
|
|
typedef Arity_tag< 4 > Arity;
|
|
typedef typename F::result_type result_type;
|
|
|
|
Set_arity_helper(const F& f) : f_(f) {}
|
|
|
|
template < class A1, class A2, class A3, class A4 >
|
|
result_type operator()
|
|
(const A1& a1, const A2& a2, const A3& a3, const A4& a4)
|
|
const
|
|
{ return f_(a1, a2, a3, a4); }
|
|
|
|
protected:
|
|
F f_;
|
|
};
|
|
|
|
template < class F >
|
|
struct Set_arity_helper< F, 5 > {
|
|
typedef Arity_tag< 5 > Arity;
|
|
typedef typename F::result_type result_type;
|
|
|
|
Set_arity_helper(const F& f) : f_(f) {}
|
|
|
|
template < class A1, class A2, class A3, class A4, class A5 >
|
|
result_type operator()
|
|
(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5)
|
|
const
|
|
{ return f_(a1, a2, a3, a4, a5); }
|
|
|
|
protected:
|
|
F f_;
|
|
};
|
|
|
|
|
|
} // namespace CGALi
|
|
|
|
template < class F, int a >
|
|
struct Set_arity {
|
|
typedef CGALi::Set_arity_helper< F, a > Type;
|
|
};
|
|
|
|
template < class F >
|
|
inline
|
|
typename Set_arity< F, 0 >::Type
|
|
set_arity_0(const F& f)
|
|
{
|
|
typedef typename Set_arity< F, 0 >::Type Type;
|
|
return Type(f);
|
|
}
|
|
|
|
template < class F >
|
|
inline
|
|
typename Set_arity< F, 1 >::Type
|
|
set_arity_1(const F& f)
|
|
{
|
|
typedef typename Set_arity< F, 1 >::Type Type;
|
|
return Type(f);
|
|
}
|
|
|
|
template < class F >
|
|
inline
|
|
typename Set_arity< F, 2 >::Type
|
|
set_arity_2(const F& f)
|
|
{
|
|
typedef typename Set_arity< F, 2 >::Type Type;
|
|
return Type(f);
|
|
}
|
|
|
|
template < class F >
|
|
inline
|
|
typename Set_arity< F, 3 >::Type
|
|
set_arity_3(const F& f)
|
|
{
|
|
typedef typename Set_arity< F, 3 >::Type Type;
|
|
return Type(f);
|
|
}
|
|
|
|
template < class F >
|
|
inline
|
|
typename Set_arity< F, 4 >::Type
|
|
set_arity_4(const F& f)
|
|
{
|
|
typedef typename Set_arity< F, 4 >::Type Type;
|
|
return Type(f);
|
|
}
|
|
|
|
template < class F >
|
|
inline
|
|
typename Set_arity< F, 5 >::Type
|
|
set_arity_5(const F& f)
|
|
{
|
|
typedef typename Set_arity< F, 5 >::Type Type;
|
|
return Type(f);
|
|
}
|
|
|
|
|
|
// +----------------------------------------------------------------------+
|
|
// | Functor Adaptors for Swapping Arguments
|
|
// +----------------------------------------------------------------------+
|
|
|
|
namespace CGALi {
|
|
|
|
template < class F, int i, class A > struct Swapper;
|
|
|
|
template < class F >
|
|
struct Swapper< F, 1, Arity_tag< 2 > > {
|
|
typedef typename F::result_type result_type;
|
|
typedef typename F::Arity Arity;
|
|
|
|
Swapper(const F& f_) : f(f_) {}
|
|
|
|
template < class A1, class A2 >
|
|
result_type operator()
|
|
(const A1& a1, const A2& a2) const
|
|
{ return f(a2, a1); }
|
|
|
|
protected:
|
|
F f;
|
|
};
|
|
|
|
template < class F >
|
|
struct Swapper< F, 1, Arity_tag< 3 > > {
|
|
typedef typename F::result_type result_type;
|
|
typedef typename F::Arity Arity;
|
|
|
|
Swapper(const F& f_) : f(f_) {}
|
|
|
|
template < class A1, class A2, class A3 >
|
|
result_type operator()
|
|
(const A1& a1, const A2& a2, const A3& a3) const
|
|
{ return f(a2, a1, a3); }
|
|
|
|
protected:
|
|
F f;
|
|
};
|
|
|
|
template < class F >
|
|
struct Swapper< F, 2, Arity_tag< 3 > > {
|
|
typedef typename F::result_type result_type;
|
|
typedef typename F::Arity Arity;
|
|
|
|
Swapper(const F& f_) : f(f_) {}
|
|
|
|
template < class A1, class A2, class A3 >
|
|
result_type operator()
|
|
(const A1& a1, const A2& a2, const A3& a3) const
|
|
{ return f(a1, a3, a2); }
|
|
|
|
protected:
|
|
F f;
|
|
};
|
|
|
|
template < class F >
|
|
struct Swapper< F, 1, Arity_tag< 4 > > {
|
|
typedef typename F::result_type result_type;
|
|
typedef typename F::Arity Arity;
|
|
|
|
Swapper(const F& f_) : f(f_) {}
|
|
|
|
template < class A1, class A2, class A3, class A4 >
|
|
result_type operator()
|
|
(const A1& a1, const A2& a2, const A3& a3, const A4& a4) const
|
|
{ return f(a2, a1, a3, a4); }
|
|
|
|
protected:
|
|
F f;
|
|
};
|
|
|
|
template < class F >
|
|
struct Swapper< F, 2, Arity_tag< 4 > > {
|
|
typedef typename F::result_type result_type;
|
|
typedef typename F::Arity Arity;
|
|
|
|
Swapper(const F& f_) : f(f_) {}
|
|
|
|
template < class A1, class A2, class A3, class A4 >
|
|
result_type operator()
|
|
(const A1& a1, const A2& a2, const A3& a3, const A4& a4) const
|
|
{ return f(a1, a3, a2, a4); }
|
|
|
|
protected:
|
|
F f;
|
|
};
|
|
|
|
template < class F >
|
|
struct Swapper< F, 3, Arity_tag< 4 > > {
|
|
typedef typename F::result_type result_type;
|
|
typedef typename F::Arity Arity;
|
|
|
|
Swapper(const F& f_) : f(f_) {}
|
|
|
|
template < class A1, class A2, class A3, class A4 >
|
|
result_type operator()
|
|
(const A1& a1, const A2& a2, const A3& a3, const A4& a4) const
|
|
{ return f(a1, a2, a4, a3); }
|
|
|
|
protected:
|
|
F f;
|
|
};
|
|
|
|
template < class F >
|
|
struct Swapper< F, 1, Arity_tag< 5 > > {
|
|
typedef typename F::result_type result_type;
|
|
typedef typename F::Arity Arity;
|
|
|
|
Swapper(const F& f_) : f(f_) {}
|
|
|
|
template < class A1, class A2, class A3, class A4, class A5 >
|
|
result_type operator()
|
|
(const A1& a1, const A2& a2, const A3& a3,
|
|
const A4& a4, const A5& a5) const
|
|
{ return f(a2, a1, a3, a4, a5); }
|
|
|
|
protected:
|
|
F f;
|
|
};
|
|
|
|
template < class F >
|
|
struct Swapper< F, 2, Arity_tag< 5 > > {
|
|
typedef typename F::result_type result_type;
|
|
typedef typename F::Arity Arity;
|
|
|
|
Swapper(const F& f_) : f(f_) {}
|
|
|
|
template < class A1, class A2, class A3, class A4, class A5 >
|
|
result_type operator()
|
|
(const A1& a1, const A2& a2, const A3& a3,
|
|
const A4& a4, const A5& a5) const
|
|
{ return f(a1, a3, a2, a4, a5); }
|
|
|
|
protected:
|
|
F f;
|
|
};
|
|
|
|
template < class F >
|
|
struct Swapper< F, 3, Arity_tag< 5 > > {
|
|
typedef typename F::result_type result_type;
|
|
typedef typename F::Arity Arity;
|
|
|
|
Swapper(const F& f_) : f(f_) {}
|
|
|
|
template < class A1, class A2, class A3, class A4, class A5 >
|
|
result_type operator()
|
|
(const A1& a1, const A2& a2, const A3& a3,
|
|
const A4& a4, const A5& a5) const
|
|
{ return f(a1, a2, a4, a3, a5); }
|
|
|
|
protected:
|
|
F f;
|
|
};
|
|
|
|
template < class F >
|
|
struct Swapper< F, 4, Arity_tag< 5 > > {
|
|
typedef typename F::result_type result_type;
|
|
typedef typename F::Arity Arity;
|
|
|
|
Swapper(const F& f_) : f(f_) {}
|
|
|
|
template < class A1, class A2, class A3, class A4, class A5 >
|
|
result_type operator()
|
|
(const A1& a1, const A2& a2, const A3& a3,
|
|
const A4& a4, const A5& a5) const
|
|
{ return f(a1, a2, a3, a5, a4); }
|
|
|
|
protected:
|
|
F f;
|
|
};
|
|
|
|
|
|
} // namespace CGALi
|
|
|
|
template < class F, int i = 1 >
|
|
struct Swap {
|
|
typedef CGALi::Swapper< F, i, typename Arity_traits< F >::Arity > Type;
|
|
};
|
|
|
|
template < class F > inline
|
|
typename Swap< F, 1 >::Type
|
|
swap_1(const F& f) {
|
|
typedef typename Swap< F, 1 >::Type S;
|
|
return S(f);
|
|
}
|
|
|
|
template < class F > inline
|
|
typename Swap< F, 2 >::Type
|
|
swap_2(const F& f) {
|
|
typedef typename Swap< F, 2 >::Type S;
|
|
return S(f);
|
|
}
|
|
|
|
template < class F > inline
|
|
typename Swap< F, 3 >::Type
|
|
swap_3(const F& f) {
|
|
typedef typename Swap< F, 3 >::Type S;
|
|
return S(f);
|
|
}
|
|
|
|
template < class F > inline
|
|
typename Swap< F, 4 >::Type
|
|
swap_4(const F& f) {
|
|
typedef typename Swap< F, 4 >::Type S;
|
|
return S(f);
|
|
}
|
|
|
|
// +----------------------------------------------------------------------+
|
|
// | Binding Arguments of a Functor
|
|
// +----------------------------------------------------------------------+
|
|
|
|
namespace CGALi {
|
|
// Using (F::arity - 1) here gives an ICE on gcc 2.95
|
|
template < class F, class R, class A, int i >
|
|
struct Binder;
|
|
|
|
template < class F, class A >
|
|
struct Binder< F, Arity_tag< 1 >, A, 1 > {
|
|
typedef typename F::result_type result_type;
|
|
typedef Arity_tag< 1 - 1 > Arity;
|
|
|
|
Binder(const F& f_, const A& a_) : f(f_), a(a_) {}
|
|
|
|
|
|
result_type operator()( ) const
|
|
{ return f(a); }
|
|
|
|
protected:
|
|
F f;
|
|
A a;
|
|
};
|
|
|
|
template < class F, class A >
|
|
struct Binder< F, Arity_tag< 2 >, A, 1 > {
|
|
typedef typename F::result_type result_type;
|
|
typedef Arity_tag< 2 - 1 > Arity;
|
|
|
|
Binder(const F& f_, const A& a_) : f(f_), a(a_) {}
|
|
|
|
template < class A1 >
|
|
result_type operator()(const A1& a1) const
|
|
{ return f(a, a1); }
|
|
|
|
protected:
|
|
F f;
|
|
A a;
|
|
};
|
|
|
|
template < class F, class A >
|
|
struct Binder< F, Arity_tag< 2 >, A, 2 > {
|
|
typedef typename F::result_type result_type;
|
|
typedef Arity_tag< 2 - 1 > Arity;
|
|
|
|
Binder(const F& f_, const A& a_) : f(f_), a(a_) {}
|
|
|
|
template < class A1 >
|
|
result_type operator()(const A1& a1) const
|
|
{ return f(a1, a); }
|
|
|
|
protected:
|
|
F f;
|
|
A a;
|
|
};
|
|
|
|
template < class F, class A >
|
|
struct Binder< F, Arity_tag< 3 >, A, 1 > {
|
|
typedef typename F::result_type result_type;
|
|
typedef Arity_tag< 3 - 1 > Arity;
|
|
|
|
Binder(const F& f_, const A& a_) : f(f_), a(a_) {}
|
|
|
|
template < class A1, class A2 >
|
|
result_type operator()(
|
|
const A1& a1, const A2& a2) const
|
|
{ return f(a, a1, a2); }
|
|
|
|
protected:
|
|
F f;
|
|
A a;
|
|
};
|
|
|
|
template < class F, class A >
|
|
struct Binder< F, Arity_tag< 3 >, A, 2 > {
|
|
typedef typename F::result_type result_type;
|
|
typedef Arity_tag< 3 - 1 > Arity;
|
|
|
|
Binder(const F& f_, const A& a_) : f(f_), a(a_) {}
|
|
|
|
template < class A1, class A2 >
|
|
result_type operator()(
|
|
const A1& a1, const A2& a2) const
|
|
{ return f(a1, a, a2); }
|
|
|
|
protected:
|
|
F f;
|
|
A a;
|
|
};
|
|
|
|
template < class F, class A >
|
|
struct Binder< F, Arity_tag< 3 >, A, 3 > {
|
|
typedef typename F::result_type result_type;
|
|
typedef Arity_tag< 3 - 1 > Arity;
|
|
|
|
Binder(const F& f_, const A& a_) : f(f_), a(a_) {}
|
|
|
|
template < class A1, class A2 >
|
|
result_type operator()(
|
|
const A1& a1, const A2& a2) const
|
|
{ return f(a1, a2, a); }
|
|
|
|
protected:
|
|
F f;
|
|
A a;
|
|
};
|
|
|
|
template < class F, class A >
|
|
struct Binder< F, Arity_tag< 4 >, A, 1 > {
|
|
typedef typename F::result_type result_type;
|
|
typedef Arity_tag< 4 - 1 > Arity;
|
|
|
|
Binder(const F& f_, const A& a_) : f(f_), a(a_) {}
|
|
|
|
template < class A1, class A2, class A3 >
|
|
result_type operator()(
|
|
const A1& a1, const A2& a2, const A3& a3) const
|
|
{ return f(a, a1, a2, a3); }
|
|
|
|
protected:
|
|
F f;
|
|
A a;
|
|
};
|
|
|
|
template < class F, class A >
|
|
struct Binder< F, Arity_tag< 4 >, A, 2 > {
|
|
typedef typename F::result_type result_type;
|
|
typedef Arity_tag< 4 - 1 > Arity;
|
|
|
|
Binder(const F& f_, const A& a_) : f(f_), a(a_) {}
|
|
|
|
template < class A1, class A2, class A3 >
|
|
result_type operator()(
|
|
const A1& a1, const A2& a2, const A3& a3) const
|
|
{ return f(a1, a, a2, a3); }
|
|
|
|
protected:
|
|
F f;
|
|
A a;
|
|
};
|
|
|
|
template < class F, class A >
|
|
struct Binder< F, Arity_tag< 4 >, A, 3 > {
|
|
typedef typename F::result_type result_type;
|
|
typedef Arity_tag< 4 - 1 > Arity;
|
|
|
|
Binder(const F& f_, const A& a_) : f(f_), a(a_) {}
|
|
|
|
template < class A1, class A2, class A3 >
|
|
result_type operator()(
|
|
const A1& a1, const A2& a2, const A3& a3) const
|
|
{ return f(a1, a2, a, a3); }
|
|
|
|
protected:
|
|
F f;
|
|
A a;
|
|
};
|
|
|
|
template < class F, class A >
|
|
struct Binder< F, Arity_tag< 4 >, A, 4 > {
|
|
typedef typename F::result_type result_type;
|
|
typedef Arity_tag< 4 - 1 > Arity;
|
|
|
|
Binder(const F& f_, const A& a_) : f(f_), a(a_) {}
|
|
|
|
template < class A1, class A2, class A3 >
|
|
result_type operator()(
|
|
const A1& a1, const A2& a2, const A3& a3) const
|
|
{ return f(a1, a2, a3, a); }
|
|
|
|
protected:
|
|
F f;
|
|
A a;
|
|
};
|
|
|
|
template < class F, class A >
|
|
struct Binder< F, Arity_tag< 5 >, A, 1 > {
|
|
typedef typename F::result_type result_type;
|
|
typedef Arity_tag< 5 - 1 > Arity;
|
|
|
|
Binder(const F& f_, const A& a_) : f(f_), a(a_) {}
|
|
|
|
template < class A1, class A2, class A3, class A4 >
|
|
result_type operator()(
|
|
const A1& a1, const A2& a2, const A3& a3,
|
|
const A4& a4) const
|
|
{ return f(a, a1, a2, a3, a4); }
|
|
|
|
protected:
|
|
F f;
|
|
A a;
|
|
};
|
|
|
|
template < class F, class A >
|
|
struct Binder< F, Arity_tag< 5 >, A, 2 > {
|
|
typedef typename F::result_type result_type;
|
|
typedef Arity_tag< 5 - 1 > Arity;
|
|
|
|
Binder(const F& f_, const A& a_) : f(f_), a(a_) {}
|
|
|
|
template < class A1, class A2, class A3, class A4 >
|
|
result_type operator()(
|
|
const A1& a1, const A2& a2, const A3& a3,
|
|
const A4& a4) const
|
|
{ return f(a1, a, a2, a3, a4); }
|
|
|
|
protected:
|
|
F f;
|
|
A a;
|
|
};
|
|
|
|
template < class F, class A >
|
|
struct Binder< F, Arity_tag< 5 >, A, 3 > {
|
|
typedef typename F::result_type result_type;
|
|
typedef Arity_tag< 5 - 1 > Arity;
|
|
|
|
Binder(const F& f_, const A& a_) : f(f_), a(a_) {}
|
|
|
|
template < class A1, class A2, class A3, class A4 >
|
|
result_type operator()(
|
|
const A1& a1, const A2& a2, const A3& a3,
|
|
const A4& a4) const
|
|
{ return f(a1, a2, a, a3, a4); }
|
|
|
|
protected:
|
|
F f;
|
|
A a;
|
|
};
|
|
|
|
template < class F, class A >
|
|
struct Binder< F, Arity_tag< 5 >, A, 4 > {
|
|
typedef typename F::result_type result_type;
|
|
typedef Arity_tag< 5 - 1 > Arity;
|
|
|
|
Binder(const F& f_, const A& a_) : f(f_), a(a_) {}
|
|
|
|
template < class A1, class A2, class A3, class A4 >
|
|
result_type operator()(
|
|
const A1& a1, const A2& a2, const A3& a3,
|
|
const A4& a4) const
|
|
{ return f(a1, a2, a3, a, a4); }
|
|
|
|
protected:
|
|
F f;
|
|
A a;
|
|
};
|
|
|
|
template < class F, class A >
|
|
struct Binder< F, Arity_tag< 5 >, A, 5 > {
|
|
typedef typename F::result_type result_type;
|
|
typedef Arity_tag< 5 - 1 > Arity;
|
|
|
|
Binder(const F& f_, const A& a_) : f(f_), a(a_) {}
|
|
|
|
template < class A1, class A2, class A3, class A4 >
|
|
result_type operator()(
|
|
const A1& a1, const A2& a2, const A3& a3,
|
|
const A4& a4) const
|
|
{ return f(a1, a2, a3, a4, a); }
|
|
|
|
protected:
|
|
F f;
|
|
A a;
|
|
};
|
|
|
|
|
|
} // namespace CGALi
|
|
|
|
template < class T, class A, int i >
|
|
struct Bind {
|
|
typedef CGALi::Binder< T, typename Arity_traits< T >::Arity, A, i > Type;
|
|
};
|
|
template < class F, class A >
|
|
inline typename Bind< F, A, 1 >::Type
|
|
bind_1(const F& f, const A& a) {
|
|
typedef typename Bind< F, A, 1 >::Type B;
|
|
return B(f, a);
|
|
}
|
|
|
|
template < class F, class A >
|
|
inline typename Bind< F, A, 2 >::Type
|
|
bind_2(const F& f, const A& a) {
|
|
typedef typename Bind< F, A, 2 >::Type B;
|
|
return B(f, a);
|
|
}
|
|
|
|
template < class F, class A >
|
|
inline typename Bind< F, A, 3 >::Type
|
|
bind_3(const F& f, const A& a) {
|
|
typedef typename Bind< F, A, 3 >::Type B;
|
|
return B(f, a);
|
|
}
|
|
|
|
template < class F, class A >
|
|
inline typename Bind< F, A, 4 >::Type
|
|
bind_4(const F& f, const A& a) {
|
|
typedef typename Bind< F, A, 4 >::Type B;
|
|
return B(f, a);
|
|
}
|
|
|
|
template < class F, class A >
|
|
inline typename Bind< F, A, 5 >::Type
|
|
bind_5(const F& f, const A& a) {
|
|
typedef typename Bind< F, A, 5 >::Type B;
|
|
return B(f, a);
|
|
}
|
|
|
|
|
|
// +----------------------------------------------------------------------+
|
|
// | Composing Functors
|
|
// +----------------------------------------------------------------------+
|
|
|
|
namespace CGALi {
|
|
struct Not_used { typedef Arity_tag< -1 > Arity; };
|
|
|
|
template < class F0, class A0,
|
|
class F1, class A1,
|
|
class F2 = CGALi::Not_used, class A2 = Arity_tag< -1 >,
|
|
class F3 = CGALi::Not_used, class A3 = Arity_tag< -1 > >
|
|
struct Composer;
|
|
|
|
template < class F0, class A0,
|
|
class F1, class A1,
|
|
class F2, class A2,
|
|
class F3 = CGALi::Not_used, class A3 = Arity_tag< -1 > >
|
|
struct Composer_shared;
|
|
|
|
// ------------------------------------------------------------------------
|
|
// one function to compose
|
|
// ------------------------------------------------------------------------
|
|
|
|
template < class F0, class F1 >
|
|
struct Composer< F0, Arity_tag< 1 >,
|
|
F1, Arity_tag< 0 >,
|
|
CGALi::Not_used, Arity_tag< -1 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_) : f0(f0_), f1(f1_) {}
|
|
|
|
|
|
result_type operator()( ) const
|
|
{ return f0(f1( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
};
|
|
|
|
template < class F0, class F1 >
|
|
struct Composer< F0, Arity_tag< 1 >,
|
|
F1, Arity_tag< 1 >,
|
|
CGALi::Not_used, Arity_tag< -1 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 1 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_) : f0(f0_), f1(f1_) {}
|
|
|
|
template < class A1 >
|
|
result_type operator()(const A1& a1) const
|
|
{ return f0(f1(a1)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
};
|
|
|
|
template < class F0, class F1 >
|
|
struct Composer< F0, Arity_tag< 1 >,
|
|
F1, Arity_tag< 2 >,
|
|
CGALi::Not_used, Arity_tag< -1 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 2 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_) : f0(f0_), f1(f1_) {}
|
|
|
|
template < class A1, class A2 >
|
|
result_type operator()(const A1& a1, const A2& a2) const
|
|
{ return f0(f1(a1, a2)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
};
|
|
|
|
template < class F0, class F1 >
|
|
struct Composer< F0, Arity_tag< 1 >,
|
|
F1, Arity_tag< 3 >,
|
|
CGALi::Not_used, Arity_tag< -1 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 3 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_) : f0(f0_), f1(f1_) {}
|
|
|
|
template < class A1, class A2, class A3 >
|
|
result_type operator()(const A1& a1, const A2& a2,
|
|
const A3& a3) const
|
|
{ return f0(f1(a1, a2, a3)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
};
|
|
|
|
template < class F0, class F1 >
|
|
struct Composer< F0, Arity_tag< 1 >,
|
|
F1, Arity_tag< 4 >,
|
|
CGALi::Not_used, Arity_tag< -1 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 4 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_) : f0(f0_), f1(f1_) {}
|
|
|
|
template < class A1, class A2, class A3, class A4 >
|
|
result_type operator()(
|
|
const A1& a1, const A2& a2,
|
|
const A3& a3, const A4& a4) const
|
|
{ return f0(f1(a1, a2, a3, a4)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
};
|
|
|
|
template < class F0, class F1 >
|
|
struct Composer< F0, Arity_tag< 1 >,
|
|
F1, Arity_tag< 5 >,
|
|
CGALi::Not_used, Arity_tag< -1 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 5 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_) : f0(f0_), f1(f1_) {}
|
|
|
|
template < class A1, class A2, class A3, class A4,
|
|
class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,
|
|
const A3& a3, const A4& a4, const A5& a5) const
|
|
{ return f0(f1(a1, a2, a3, a4, a5)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
};
|
|
|
|
|
|
// ------------------------------------------------------------------------
|
|
// two functions to compose
|
|
// ------------------------------------------------------------------------
|
|
|
|
template < class F0, class F1, class F2 >
|
|
struct Composer< F0, Arity_tag< 2 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 0 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 + 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_)
|
|
: f0(f0_), f1(f1_), f2(f2_)
|
|
{}
|
|
|
|
|
|
result_type operator()( ) const
|
|
{ return f0(f1( ), f2( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
};
|
|
|
|
|
|
// unary functions
|
|
template < class F0, class F1, class F2 >
|
|
struct Composer< F0, Arity_tag< 2 >,
|
|
F1, Arity_tag< 1 >,
|
|
F2, Arity_tag< 0 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 1 + 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_)
|
|
: f0(f0_), f1(f1_), f2(f2_)
|
|
{}
|
|
|
|
template < class A1 >
|
|
result_type operator()(const A1& a1) const
|
|
{ return f0(f1(a1), f2( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
};
|
|
|
|
template < class F0, class F1, class F2 >
|
|
struct Composer< F0, Arity_tag< 2 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 1 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 + 1 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_)
|
|
: f0(f0_), f1(f1_), f2(f2_)
|
|
{}
|
|
|
|
template < class A1 >
|
|
result_type operator()(const A1& a1) const
|
|
{ return f0(f1( ), f2(a1)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
};
|
|
|
|
|
|
// binary functions
|
|
template < class F0, class F1, class F2 >
|
|
struct Composer< F0, Arity_tag< 2 >,
|
|
F1, Arity_tag< 2 >,
|
|
F2, Arity_tag< 0 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 2 + 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_)
|
|
: f0(f0_), f1(f1_), f2(f2_)
|
|
{}
|
|
|
|
template < class A1, class A2 >
|
|
result_type operator()(const A1& a1, const A2& a2) const
|
|
{ return f0(f1(a1, a2), f2( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
};
|
|
|
|
template < class F0, class F1, class F2 >
|
|
struct Composer< F0, Arity_tag< 2 >,
|
|
F1, Arity_tag< 1 >,
|
|
F2, Arity_tag< 1 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 1 + 1 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_)
|
|
: f0(f0_), f1(f1_), f2(f2_)
|
|
{}
|
|
|
|
template < class A1, class A2 >
|
|
result_type operator()(const A1& a1, const A2& a2) const
|
|
{ return f0(f1(a1), f2(a2)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
};
|
|
|
|
template < class F0, class F1, class F2 >
|
|
struct Composer< F0, Arity_tag< 2 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 2 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 + 2 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_)
|
|
: f0(f0_), f1(f1_), f2(f2_)
|
|
{}
|
|
|
|
template < class A1, class A2 >
|
|
result_type operator()(const A1& a1, const A2& a2) const
|
|
{ return f0(f1(), f2(a1, a2)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
};
|
|
|
|
|
|
// 3-arg functions
|
|
template < class F0, class F1, class F2 >
|
|
struct Composer< F0, Arity_tag< 2 >,
|
|
F1, Arity_tag< 3 >,
|
|
F2, Arity_tag< 0 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 3 + 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_)
|
|
: f0(f0_), f1(f1_), f2(f2_)
|
|
{}
|
|
|
|
template < class A1, class A2, class A3 >
|
|
result_type operator()(const A1& a1, const A2& a2,
|
|
const A3& a3) const
|
|
{ return f0(f1(a1, a2, a3), f2( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
};
|
|
|
|
template < class F0, class F1, class F2 >
|
|
struct Composer< F0, Arity_tag< 2 >,
|
|
F1, Arity_tag< 2 >,
|
|
F2, Arity_tag< 1 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 2 + 1 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_)
|
|
: f0(f0_), f1(f1_), f2(f2_)
|
|
{}
|
|
|
|
template < class A1, class A2, class A3 >
|
|
result_type operator()(const A1& a1, const A2& a2,
|
|
const A3& a3) const
|
|
{ return f0(f1(a1, a2), f2(a3)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
};
|
|
|
|
template < class F0, class F1, class F2 >
|
|
struct Composer< F0, Arity_tag< 2 >,
|
|
F1, Arity_tag< 1 >,
|
|
F2, Arity_tag< 2 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 1 + 2 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_)
|
|
: f0(f0_), f1(f1_), f2(f2_)
|
|
{}
|
|
|
|
template < class A1, class A2, class A3 >
|
|
result_type operator()(const A1& a1, const A2& a2,
|
|
const A3& a3) const
|
|
{ return f0(f1(a1), f2(a2, a3)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
};
|
|
|
|
template < class F0, class F1, class F2 >
|
|
struct Composer< F0, Arity_tag< 2 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 3 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 + 3 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_)
|
|
: f0(f0_), f1(f1_), f2(f2_)
|
|
{}
|
|
|
|
template < class A1, class A2, class A3 >
|
|
result_type operator()(const A1& a1, const A2& a2,
|
|
const A3& a3) const
|
|
{ return f0(f1( ), f2(a1, a2, a3)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
};
|
|
|
|
|
|
// 4-arg functions
|
|
template < class F0, class F1, class F2 >
|
|
struct Composer< F0, Arity_tag< 2 >,
|
|
F1, Arity_tag< 4 >,
|
|
F2, Arity_tag< 0 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 4 + 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_)
|
|
: f0(f0_), f1(f1_), f2(f2_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3, class A4 >
|
|
result_type operator()(const A1& a1, const A2& a2,
|
|
const A3& a3, const A4& a4) const
|
|
{ return f0(f1(a1, a2, a3, a4), f2( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
};
|
|
|
|
template < class F0, class F1, class F2 >
|
|
struct Composer< F0, Arity_tag< 2 >,
|
|
F1, Arity_tag< 3 >,
|
|
F2, Arity_tag< 1 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 3 + 1 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_)
|
|
: f0(f0_), f1(f1_), f2(f2_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3, class A4 >
|
|
result_type operator()(const A1& a1, const A2& a2,
|
|
const A3& a3, const A4& a4) const
|
|
{ return f0(f1(a1, a2, a3), f2(a4)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
};
|
|
|
|
template < class F0, class F1, class F2 >
|
|
struct Composer< F0, Arity_tag< 2 >,
|
|
F1, Arity_tag< 2 >,
|
|
F2, Arity_tag< 2 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 2 + 2 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_)
|
|
: f0(f0_), f1(f1_), f2(f2_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3, class A4 >
|
|
result_type operator()(const A1& a1, const A2& a2,
|
|
const A3& a3, const A4& a4) const
|
|
{ return f0(f1(a1, a2), f2(a3, a4)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
};
|
|
|
|
template < class F0, class F1, class F2 >
|
|
struct Composer< F0, Arity_tag< 2 >,
|
|
F1, Arity_tag< 1 >,
|
|
F2, Arity_tag< 3 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 1 + 3 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_)
|
|
: f0(f0_), f1(f1_), f2(f2_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3, class A4 >
|
|
result_type operator()(const A1& a1, const A2& a2,
|
|
const A3& a3, const A4& a4) const
|
|
{ return f0(f1(a1), f2(a2, a3, a4)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
};
|
|
|
|
template < class F0, class F1, class F2 >
|
|
struct Composer< F0, Arity_tag< 2 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 4 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 + 4 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_)
|
|
: f0(f0_), f1(f1_), f2(f2_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3, class A4 >
|
|
result_type operator()(const A1& a1, const A2& a2,
|
|
const A3& a3, const A4& a4) const
|
|
{ return f0(f1( ), f2(a1, a2, a3, a4)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
};
|
|
|
|
|
|
// 5-arg functions
|
|
template < class F0, class F1, class F2 >
|
|
struct Composer< F0, Arity_tag< 2 >,
|
|
F1, Arity_tag< 5 >,
|
|
F2, Arity_tag< 0 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 5 + 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_)
|
|
: f0(f0_), f1(f1_), f2(f2_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3, class A4, class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,
|
|
const A3& a3, const A4& a4, const A5& a5) const
|
|
{ return f0(f1(a1, a2, a3, a4, a5), f2( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
};
|
|
|
|
template < class F0, class F1, class F2 >
|
|
struct Composer< F0, Arity_tag< 2 >,
|
|
F1, Arity_tag< 4 >,
|
|
F2, Arity_tag< 1 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 4 + 1 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_)
|
|
: f0(f0_), f1(f1_), f2(f2_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3, class A4, class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,
|
|
const A3& a3, const A4& a4, const A5& a5) const
|
|
{ return f0(f1(a1, a2, a3, a4), f2(a5)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
};
|
|
|
|
template < class F0, class F1, class F2 >
|
|
struct Composer< F0, Arity_tag< 2 >,
|
|
F1, Arity_tag< 3 >,
|
|
F2, Arity_tag< 2 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 3 + 2 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_)
|
|
: f0(f0_), f1(f1_), f2(f2_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3, class A4, class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,
|
|
const A3& a3, const A4& a4, const A5& a5) const
|
|
{ return f0(f1(a1, a2, a3), f2(a4, a5)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
};
|
|
|
|
template < class F0, class F1, class F2 >
|
|
struct Composer< F0, Arity_tag< 2 >,
|
|
F1, Arity_tag< 2 >,
|
|
F2, Arity_tag< 3 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 2 + 3 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_)
|
|
: f0(f0_), f1(f1_), f2(f2_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3, class A4, class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,
|
|
const A3& a3, const A4& a4, const A5& a5) const
|
|
{ return f0(f1(a1, a2), f2(a3, a4, a5)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
};
|
|
|
|
template < class F0, class F1, class F2 >
|
|
struct Composer< F0, Arity_tag< 2 >,
|
|
F1, Arity_tag< 1 >,
|
|
F2, Arity_tag< 4 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 1 + 4 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_)
|
|
: f0(f0_), f1(f1_), f2(f2_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3, class A4, class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,
|
|
const A3& a3, const A4& a4, const A5& a5) const
|
|
{ return f0(f1(a1), f2(a2, a3, a4, a5)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
};
|
|
|
|
template < class F0, class F1, class F2 >
|
|
struct Composer< F0, Arity_tag< 2 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 5 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 + 5 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_)
|
|
: f0(f0_), f1(f1_), f2(f2_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3, class A4, class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,
|
|
const A3& a3, const A4& a4, const A5& a5) const
|
|
{ return f0(f1( ), f2(a1, a2, a3, a4, a5)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template < class F0, class F1, class F2 >
|
|
struct Composer_shared< F0, Arity_tag< 2 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 0 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 > Arity;
|
|
|
|
Composer_shared(const F0& f0_, const F1& f1_, const F2& f2_)
|
|
: f0(f0_), f1(f1_), f2(f2_)
|
|
{}
|
|
|
|
|
|
result_type
|
|
operator()( ) const
|
|
{ return f0(f1( ), f2( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
};
|
|
|
|
template < class F0, class F1, class F2 >
|
|
struct Composer_shared< F0, Arity_tag< 2 >,
|
|
F1, Arity_tag< 1 >,
|
|
F2, Arity_tag< 1 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 1 > Arity;
|
|
|
|
Composer_shared(const F0& f0_, const F1& f1_, const F2& f2_)
|
|
: f0(f0_), f1(f1_), f2(f2_)
|
|
{}
|
|
|
|
template < class A1 >
|
|
result_type
|
|
operator()(const A1& a1) const
|
|
{ return f0(f1(a1), f2(a1)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
};
|
|
|
|
template < class F0, class F1, class F2 >
|
|
struct Composer_shared< F0, Arity_tag< 2 >,
|
|
F1, Arity_tag< 2 >,
|
|
F2, Arity_tag< 2 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 2 > Arity;
|
|
|
|
Composer_shared(const F0& f0_, const F1& f1_, const F2& f2_)
|
|
: f0(f0_), f1(f1_), f2(f2_)
|
|
{}
|
|
|
|
template < class A1, class A2 >
|
|
result_type
|
|
operator()(const A1& a1, const A2& a2) const
|
|
{ return f0(f1(a1, a2), f2(a1, a2)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
};
|
|
|
|
template < class F0, class F1, class F2 >
|
|
struct Composer_shared< F0, Arity_tag< 2 >,
|
|
F1, Arity_tag< 3 >,
|
|
F2, Arity_tag< 3 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 3 > Arity;
|
|
|
|
Composer_shared(const F0& f0_, const F1& f1_, const F2& f2_)
|
|
: f0(f0_), f1(f1_), f2(f2_)
|
|
{}
|
|
|
|
template < class A1, class A2, class A3 >
|
|
result_type
|
|
operator()( const A1& a1, const A2& a2, const A3& a3) const
|
|
{ return f0(f1( a1, a2, a3), f2( a1, a2, a3)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
};
|
|
|
|
template < class F0, class F1, class F2 >
|
|
struct Composer_shared< F0, Arity_tag< 2 >,
|
|
F1, Arity_tag< 4 >,
|
|
F2, Arity_tag< 4 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 4 > Arity;
|
|
|
|
Composer_shared(const F0& f0_, const F1& f1_, const F2& f2_)
|
|
: f0(f0_), f1(f1_), f2(f2_)
|
|
{}
|
|
|
|
template < class A1, class A2, class A3, class A4 >
|
|
result_type
|
|
operator()( const A1& a1, const A2& a2, const A3& a3, const A4& a4) const
|
|
{ return f0(f1( a1, a2, a3, a4), f2( a1, a2, a3, a4)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
};
|
|
|
|
template < class F0, class F1, class F2 >
|
|
struct Composer_shared< F0, Arity_tag< 2 >,
|
|
F1, Arity_tag< 5 >,
|
|
F2, Arity_tag< 5 >,
|
|
CGALi::Not_used, Arity_tag< -1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 5 > Arity;
|
|
|
|
Composer_shared(const F0& f0_, const F1& f1_, const F2& f2_)
|
|
: f0(f0_), f1(f1_), f2(f2_)
|
|
{}
|
|
|
|
template < class A1, class A2, class A3, class A4, class A5 >
|
|
result_type
|
|
operator()( const A1& a1, const A2& a2, const A3& a3,
|
|
const A4& a4, const A5& a5) const
|
|
{ return f0(f1( a1, a2, a3, a4, a5), f2( a1, a2, a3, a4, a5)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
};
|
|
|
|
|
|
|
|
// ------------------------------------------------------------------------
|
|
// three functions to compose
|
|
// ------------------------------------------------------------------------
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 0 >,
|
|
F3, Arity_tag< 0 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 + 0 + 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
result_type operator()( ) const
|
|
{ return f0(f1( ), f2( ), f3( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
|
|
// unary functions
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 1 >,
|
|
F2, Arity_tag< 0 >,
|
|
F3, Arity_tag< 0 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 1 + 0 + 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
template < class A1 >
|
|
result_type operator()(const A1& a1) const
|
|
{ return f0(f1(a1), f2( ), f3( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 1 >,
|
|
F3, Arity_tag< 0 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 + 1 + 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
template < class A1 >
|
|
result_type operator()(const A1& a1) const
|
|
{ return f0(f1( ), f2(a1), f3( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 0 >,
|
|
F3, Arity_tag< 1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 + 0 + 1 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
template < class A1 >
|
|
result_type operator()(const A1& a1) const
|
|
{ return f0(f1( ), f2( ), f3(a1)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
|
|
// binary functions
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 2 >,
|
|
F2, Arity_tag< 0 >,
|
|
F3, Arity_tag< 0 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 2 + 0 + 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2 >
|
|
result_type operator()(const A1& a1, const A2& a2) const
|
|
{ return f0(f1(a1, a2), f2( ), f3( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 2 >,
|
|
F3, Arity_tag< 0 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 + 2 + 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2 >
|
|
result_type operator()(const A1& a1, const A2& a2) const
|
|
{ return f0(f1( ), f2(a1, a2), f3( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 0 >,
|
|
F3, Arity_tag< 2 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 + 0 + 2 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2 >
|
|
result_type operator()(const A1& a1, const A2& a2) const
|
|
{ return f0(f1( ), f2( ), f3(a1, a2)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 1 >,
|
|
F2, Arity_tag< 1 >,
|
|
F3, Arity_tag< 0 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 1 + 1 + 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2 >
|
|
result_type operator()(const A1& a1, const A2& a2) const
|
|
{ return f0(f1(a1), f2(a2), f3( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 1 >,
|
|
F2, Arity_tag< 0 >,
|
|
F3, Arity_tag< 1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 1 + 0 + 1 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2 >
|
|
result_type operator()(const A1& a1, const A2& a2) const
|
|
{ return f0(f1(a1), f2( ), f3(a2 )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 1 >,
|
|
F3, Arity_tag< 1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 + 1 + 1 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2 >
|
|
result_type operator()(const A1& a1, const A2& a2) const
|
|
{ return f0(f1( ), f2(a1), f3(a2 )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
|
|
// 3-arg functions
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 3 >,
|
|
F2, Arity_tag< 0 >,
|
|
F3, Arity_tag< 0 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 3 + 0 + 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3 >
|
|
result_type operator()(
|
|
const A1& a1, const A2& a2, const A3& a3) const
|
|
{ return f0(f1(a1, a2, a3), f2( ), f3( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 3 >,
|
|
F3, Arity_tag< 0 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 + 3 + 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3 >
|
|
result_type operator()(
|
|
const A1& a1, const A2& a2, const A3& a3) const
|
|
{ return f0(f1( ), f2(a1, a2, a3), f3( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 0 >,
|
|
F3, Arity_tag< 3 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 + 0 + 3 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3 >
|
|
result_type operator()(
|
|
const A1& a1, const A2& a2, const A3& a3) const
|
|
{ return f0(f1( ), f2( ), f3(a1, a2, a3)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 2 >,
|
|
F2, Arity_tag< 1 >,
|
|
F3, Arity_tag< 0 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 2 + 1 + 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3 >
|
|
result_type operator()(
|
|
const A1& a1, const A2& a2, const A3& a3) const
|
|
{ return f0(f1(a1, a2), f2(a3), f3( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 2 >,
|
|
F2, Arity_tag< 0 >,
|
|
F3, Arity_tag< 1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 2 + 0 + 1 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3 >
|
|
result_type operator()(
|
|
const A1& a1, const A2& a2, const A3& a3) const
|
|
{ return f0(f1(a1, a2), f2( ), f3(a3)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 1 >,
|
|
F2, Arity_tag< 2 >,
|
|
F3, Arity_tag< 0 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 1 + 2 + 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3 >
|
|
result_type operator()(
|
|
const A1& a1, const A2& a2, const A3& a3) const
|
|
{ return f0(f1(a1), f2(a2, a3), f3( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 2 >,
|
|
F3, Arity_tag< 1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 + 2 + 1 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3 >
|
|
result_type operator()(
|
|
const A1& a1, const A2& a2, const A3& a3) const
|
|
{ return f0(f1( ), f2(a1, a2), f3(a3)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 1 >,
|
|
F2, Arity_tag< 0 >,
|
|
F3, Arity_tag< 2 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 1 + 0 + 2 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3 >
|
|
result_type operator()(
|
|
const A1& a1, const A2& a2, const A3& a3) const
|
|
{ return f0(f1(a1), f2( ), f3(a2, a3)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 1 >,
|
|
F3, Arity_tag< 2 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 + 1 + 2 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3 >
|
|
result_type operator()(
|
|
const A1& a1, const A2& a2, const A3& a3) const
|
|
{ return f0(f1( ), f2(a1), f3(a2, a3)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 1 >,
|
|
F2, Arity_tag< 1 >,
|
|
F3, Arity_tag< 1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 1 + 1 + 1 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3 >
|
|
result_type operator()(
|
|
const A1& a1, const A2& a2, const A3& a3) const
|
|
{ return f0(f1(a1), f2(a2), f3(a3)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
|
|
// 4-arg functions
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 4 >,
|
|
F2, Arity_tag< 0 >,
|
|
F3, Arity_tag< 0 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 4 + 0 + 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4 >
|
|
result_type operator()(const A1& a1, const A2& a2, const A3& a3,
|
|
const A4& a4) const
|
|
{ return f0(f1(a1, a2, a3, a4), f2( ), f3( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 4 >,
|
|
F3, Arity_tag< 0 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 + 4 + 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4 >
|
|
result_type operator()(const A1& a1, const A2& a2, const A3& a3,
|
|
const A4& a4) const
|
|
{ return f0(f1( ), f2(a1, a2, a3, a4), f3( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 0 >,
|
|
F3, Arity_tag< 4 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 + 0 + 4 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4 >
|
|
result_type operator()(const A1& a1, const A2& a2, const A3& a3,
|
|
const A4& a4) const
|
|
{ return f0(f1( ), f2( ), f3(a1, a2, a3, a4)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 3 >,
|
|
F2, Arity_tag< 1 >,
|
|
F3, Arity_tag< 0 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 3 + 1 + 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4 >
|
|
result_type operator()(const A1& a1, const A2& a2, const A3& a3,
|
|
const A4& a4) const
|
|
{ return f0(f1(a1, a2, a3), f2(a4), f3( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 3 >,
|
|
F2, Arity_tag< 0 >,
|
|
F3, Arity_tag< 1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 3 + 0 + 1 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4 >
|
|
result_type operator()(const A1& a1, const A2& a2, const A3& a3,
|
|
const A4& a4) const
|
|
{ return f0(f1(a1, a2, a3), f2( ), f3(a4)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 1 >,
|
|
F2, Arity_tag< 3 >,
|
|
F3, Arity_tag< 0 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 1 + 3 + 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4 >
|
|
result_type operator()(const A1& a1, const A2& a2, const A3& a3,
|
|
const A4& a4) const
|
|
{ return f0(f1(a1), f2(a2, a3, a4), f3( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 3 >,
|
|
F3, Arity_tag< 1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 + 3 + 1 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4 >
|
|
result_type operator()(const A1& a1, const A2& a2, const A3& a3,
|
|
const A4& a4) const
|
|
{ return f0(f1( ), f2(a1, a2, a3), f3(a4)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 1 >,
|
|
F2, Arity_tag< 0 >,
|
|
F3, Arity_tag< 3 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 1 + 0 + 3 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4 >
|
|
result_type operator()(const A1& a1, const A2& a2, const A3& a3,
|
|
const A4& a4) const
|
|
{ return f0(f1(a1), f2( ), f3(a2, a3, a4)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 1 >,
|
|
F3, Arity_tag< 3 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 + 1 + 3 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4 >
|
|
result_type operator()(const A1& a1, const A2& a2, const A3& a3,
|
|
const A4& a4) const
|
|
{ return f0(f1( ), f2(a1), f3(a2, a3, a4)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 2 >,
|
|
F2, Arity_tag< 2 >,
|
|
F3, Arity_tag< 0 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 2 + 2 + 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4 >
|
|
result_type operator()(const A1& a1, const A2& a2, const A3& a3,
|
|
const A4& a4) const
|
|
{ return f0(f1(a1, a2), f2(a3, a4), f3( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 2 >,
|
|
F2, Arity_tag< 0 >,
|
|
F3, Arity_tag< 2 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 2 + 0 + 2 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4 >
|
|
result_type operator()(const A1& a1, const A2& a2, const A3& a3,
|
|
const A4& a4) const
|
|
{ return f0(f1(a1, a2), f2( ), f3(a3, a4)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 2 >,
|
|
F3, Arity_tag< 2 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 + 2 + 2 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4 >
|
|
result_type operator()(const A1& a1, const A2& a2, const A3& a3,
|
|
const A4& a4) const
|
|
{ return f0(f1( ), f2(a1, a2), f3(a3, a4)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 2 >,
|
|
F2, Arity_tag< 1 >,
|
|
F3, Arity_tag< 1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 2 + 1 + 1 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4 >
|
|
result_type operator()(const A1& a1, const A2& a2, const A3& a3,
|
|
const A4& a4) const
|
|
{ return f0(f1(a1, a2), f2(a3), f3(a4)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 1 >,
|
|
F2, Arity_tag< 2 >,
|
|
F3, Arity_tag< 1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 1 + 2 + 1 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4 >
|
|
result_type operator()(const A1& a1, const A2& a2, const A3& a3,
|
|
const A4& a4) const
|
|
{ return f0(f1(a1), f2(a2, a3), f3(a4)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 1 >,
|
|
F2, Arity_tag< 1 >,
|
|
F3, Arity_tag< 2 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 1 + 1 + 2 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4 >
|
|
result_type operator()(const A1& a1, const A2& a2, const A3& a3,
|
|
const A4& a4) const
|
|
{ return f0(f1(a1), f2(a2), f3(a3, a4)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
|
|
// 5-arg functions
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 5 >,
|
|
F2, Arity_tag< 0 >,
|
|
F3, Arity_tag< 0 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 5 + 0 + 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4, class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,const A3& a3,
|
|
const A4& a4, const A5& a5) const
|
|
{ return f0(f1(a1, a2, a3, a4, a5), f2( ), f3( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 5 >,
|
|
F3, Arity_tag< 0 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 + 5 + 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4, class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,const A3& a3,
|
|
const A4& a4, const A5& a5) const
|
|
{ return f0(f1( ), f2(a1, a2, a3, a4, a5), f3( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 0 >,
|
|
F3, Arity_tag< 5 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 + 0 + 5 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4, class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,const A3& a3,
|
|
const A4& a4, const A5& a5) const
|
|
{ return f0(f1( ), f2( ), f3(a1, a2, a3, a4, a5)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 4 >,
|
|
F2, Arity_tag< 1 >,
|
|
F3, Arity_tag< 0 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 4 + 1 + 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4, class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,const A3& a3,
|
|
const A4& a4, const A5& a5) const
|
|
{ return f0(f1(a1, a2, a3, a4), f2(a5), f3( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 4 >,
|
|
F2, Arity_tag< 0 >,
|
|
F3, Arity_tag< 1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 4 + 0 + 1 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4, class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,const A3& a3,
|
|
const A4& a4, const A5& a5) const
|
|
{ return f0(f1(a1, a2, a3, a4), f2( ), f3(a5)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 1 >,
|
|
F2, Arity_tag< 4 >,
|
|
F3, Arity_tag< 0 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 1 + 4 + 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4, class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,const A3& a3,
|
|
const A4& a4, const A5& a5) const
|
|
{ return f0(f1(a1), f2(a2, a3, a4, a5), f3( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 4 >,
|
|
F3, Arity_tag< 1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 + 4 + 1 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4, class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,const A3& a3,
|
|
const A4& a4, const A5& a5) const
|
|
{ return f0(f1( ), f2(a1, a2, a3, a4), f3(a5)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 1 >,
|
|
F2, Arity_tag< 0 >,
|
|
F3, Arity_tag< 4 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 1 + 0 + 4 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4, class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,const A3& a3,
|
|
const A4& a4, const A5& a5) const
|
|
{ return f0(f1(a1), f2( ), f3(a2, a3, a4, a5)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 1 >,
|
|
F3, Arity_tag< 4 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 + 1 + 4 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4, class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,const A3& a3,
|
|
const A4& a4, const A5& a5) const
|
|
{ return f0(f1( ), f2(a1), f3(a2, a3, a4, a5)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 3 >,
|
|
F2, Arity_tag< 2 >,
|
|
F3, Arity_tag< 0 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 3 + 2 + 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4, class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,const A3& a3,
|
|
const A4& a4, const A5& a5) const
|
|
{ return f0(f1(a1, a2, a3), f2(a4, a5), f3( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 3 >,
|
|
F2, Arity_tag< 0 >,
|
|
F3, Arity_tag< 2 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 3 + 0 + 2 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4, class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,const A3& a3,
|
|
const A4& a4, const A5& a5) const
|
|
{ return f0(f1(a1, a2, a3), f2( ), f3(a4, a5)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 2 >,
|
|
F2, Arity_tag< 3 >,
|
|
F3, Arity_tag< 0 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 2 + 3 + 0 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4, class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,const A3& a3,
|
|
const A4& a4, const A5& a5) const
|
|
{ return f0(f1(a1, a2), f2(a3, a4, a5), f3( )); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 3 >,
|
|
F3, Arity_tag< 2 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 + 3 + 2 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4, class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,const A3& a3,
|
|
const A4& a4, const A5& a5) const
|
|
{ return f0(f1( ), f2(a1, a2, a3), f3(a4, a5)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 2 >,
|
|
F2, Arity_tag< 0 >,
|
|
F3, Arity_tag< 3 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 2 + 0 + 3 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4, class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,const A3& a3,
|
|
const A4& a4, const A5& a5) const
|
|
{ return f0(f1(a1, a2), f2( ), f3(a3, a4, a5)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 2 >,
|
|
F3, Arity_tag< 3 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 + 2 + 3 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4, class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,const A3& a3,
|
|
const A4& a4, const A5& a5) const
|
|
{ return f0(f1( ), f2(a1, a2), f3(a3, a4, a5)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 3 >,
|
|
F2, Arity_tag< 1 >,
|
|
F3, Arity_tag< 1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 3 + 1 + 1 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4, class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,const A3& a3,
|
|
const A4& a4, const A5& a5) const
|
|
{ return f0(f1(a1, a2, a3), f2(a4), f3(a5)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 1 >,
|
|
F2, Arity_tag< 3 >,
|
|
F3, Arity_tag< 1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 1 + 3 + 1 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4, class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,const A3& a3,
|
|
const A4& a4, const A5& a5) const
|
|
{ return f0(f1(a1), f2(a2, a3, a4), f3(a5)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 1 >,
|
|
F2, Arity_tag< 1 >,
|
|
F3, Arity_tag< 3 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 1 + 1 + 3 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4, class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,const A3& a3,
|
|
const A4& a4, const A5& a5) const
|
|
{ return f0(f1(a1), f2(a2), f3(a3, a4, a5)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 2 >,
|
|
F2, Arity_tag< 2 >,
|
|
F3, Arity_tag< 1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 2 + 2 + 1 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4, class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,const A3& a3,
|
|
const A4& a4, const A5& a5) const
|
|
{ return f0(f1(a1, a2), f2(a3, a4), f3(a5)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 2 >,
|
|
F2, Arity_tag< 1 >,
|
|
F3, Arity_tag< 2 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 2 + 1 + 2 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4, class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,const A3& a3,
|
|
const A4& a4, const A5& a5) const
|
|
{ return f0(f1(a1, a2), f2(a3), f3(a4, a5)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 1 >,
|
|
F2, Arity_tag< 2 >,
|
|
F3, Arity_tag< 2 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 1 + 2 + 2 > Arity;
|
|
|
|
Composer(const F0& f0_, const F1& f1_, const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
template < class A1, class A2, class A3,
|
|
class A4, class A5 >
|
|
result_type operator()(const A1& a1, const A2& a2,const A3& a3,
|
|
const A4& a4, const A5& a5) const
|
|
{ return f0(f1(a1), f2(a2, a3), f3(a4, a5)); }
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer_shared< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 0 >,
|
|
F2, Arity_tag< 0 >,
|
|
F3, Arity_tag< 0 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 0 > Arity;
|
|
|
|
Composer_shared(const F0& f0_, const F1& f1_,
|
|
const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
|
|
result_type
|
|
operator()( ) const
|
|
{ return f0(f1( ),
|
|
f2( ),
|
|
f3( ));
|
|
}
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer_shared< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 1 >,
|
|
F2, Arity_tag< 1 >,
|
|
F3, Arity_tag< 1 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 1 > Arity;
|
|
|
|
Composer_shared(const F0& f0_, const F1& f1_,
|
|
const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
template < class A1 >
|
|
result_type
|
|
operator()(const A1& a1) const
|
|
{ return f0(f1(a1),
|
|
f2(a1),
|
|
f3(a1));
|
|
}
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer_shared< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 2 >,
|
|
F2, Arity_tag< 2 >,
|
|
F3, Arity_tag< 2 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 2 > Arity;
|
|
|
|
Composer_shared(const F0& f0_, const F1& f1_,
|
|
const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
template < class A1, class A2 >
|
|
result_type
|
|
operator()(const A1& a1, const A2& a2) const
|
|
{ return f0(f1(a1, a2),
|
|
f2(a1, a2),
|
|
f3(a1, a2));
|
|
}
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer_shared< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 3 >,
|
|
F2, Arity_tag< 3 >,
|
|
F3, Arity_tag< 3 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 3 > Arity;
|
|
|
|
Composer_shared(const F0& f0_, const F1& f1_,
|
|
const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
template < class A1, class A2, class A3 >
|
|
result_type
|
|
operator()( const A1& a1, const A2& a2, const A3& a3) const
|
|
{ return f0(f1( a1, a2, a3),
|
|
f2( a1, a2, a3),
|
|
f3( a1, a2, a3));
|
|
}
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer_shared< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 4 >,
|
|
F2, Arity_tag< 4 >,
|
|
F3, Arity_tag< 4 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 4 > Arity;
|
|
|
|
Composer_shared(const F0& f0_, const F1& f1_,
|
|
const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
template < class A1, class A2, class A3, class A4 >
|
|
result_type
|
|
operator()( const A1& a1, const A2& a2, const A3& a3, const A4& a4) const
|
|
{ return f0(f1( a1, a2, a3, a4),
|
|
f2( a1, a2, a3, a4),
|
|
f3( a1, a2, a3, a4));
|
|
}
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
struct Composer_shared< F0, Arity_tag< 3 >,
|
|
F1, Arity_tag< 5 >,
|
|
F2, Arity_tag< 5 >,
|
|
F3, Arity_tag< 5 > >
|
|
{
|
|
typedef typename F0::result_type result_type;
|
|
typedef Arity_tag< 5 > Arity;
|
|
|
|
Composer_shared(const F0& f0_, const F1& f1_,
|
|
const F2& f2_, const F3& f3_)
|
|
: f0(f0_), f1(f1_), f2(f2_), f3(f3_)
|
|
{}
|
|
|
|
template < class A1, class A2, class A3, class A4, class A5 >
|
|
result_type
|
|
operator()( const A1& a1, const A2& a2, const A3& a3,
|
|
const A4& a4, const A5& a5) const
|
|
{ return f0(f1( a1, a2, a3, a4, a5),
|
|
f2( a1, a2, a3, a4, a5),
|
|
f3( a1, a2, a3, a4, a5));
|
|
}
|
|
|
|
protected:
|
|
F0 f0;
|
|
F1 f1;
|
|
F2 f2;
|
|
F3 f3;
|
|
};
|
|
|
|
|
|
} // namespace CGALi
|
|
|
|
// ------------------------------------------------------------------------
|
|
// Encapsulate the composition type ==> can be adapted
|
|
// ------------------------------------------------------------------------
|
|
|
|
template < class F0, class F1,
|
|
class F2 = CGALi::Not_used,
|
|
class F3 = CGALi::Not_used >
|
|
struct Compose {
|
|
typedef CGALi::Composer< F0, typename Arity_traits< F0 >::Arity,
|
|
F1, typename Arity_traits< F1 >::Arity,
|
|
F2, typename Arity_traits< F2 >::Arity,
|
|
F3, typename Arity_traits< F3 >::Arity > Type;
|
|
};
|
|
|
|
template < class F0, class F1, class F2, class F3 = CGALi::Not_used >
|
|
struct Compose_shared {
|
|
typedef CGALi::Composer_shared< F0, typename Arity_traits< F0 >::Arity,
|
|
F1, typename Arity_traits< F1 >::Arity,
|
|
F2, typename Arity_traits< F2 >::Arity,
|
|
F3, typename Arity_traits< F3 >::Arity >
|
|
Type;
|
|
};
|
|
// ------------------------------------------------------------------------
|
|
// compose helper functions
|
|
// ------------------------------------------------------------------------
|
|
|
|
template < class F0, class F1 >
|
|
inline typename Compose< F0, F1 >::Type
|
|
compose(const F0& f0, const F1& f1) {
|
|
typedef typename Compose< F0, F1 >::Type C;
|
|
return C(f0, f1);
|
|
}
|
|
|
|
template < class F0, class F1, class F2 >
|
|
inline typename Compose< F0, F1, F2 >::Type
|
|
compose(const F0& f0, const F1& f1, const F2& f2)
|
|
{
|
|
typedef typename Compose< F0, F1, F2 >::Type C;
|
|
return C(f0, f1, f2);
|
|
}
|
|
|
|
template < class F0, class F1, class F2 >
|
|
inline typename Compose_shared< F0, F1, F2 >::Type
|
|
compose_shared(const F0& f0, const F1& f1, const F2& f2)
|
|
{
|
|
typedef typename Compose_shared< F0, F1, F2 >::Type C;
|
|
return C(f0, f1, f2);
|
|
}
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
inline typename Compose< F0, F1, F2, F3 >::Type
|
|
compose(const F0& f0, const F1& f1, const F2& f2, const F3& f3)
|
|
{
|
|
typedef typename Compose< F0, F1, F2, F3 >::Type C;
|
|
return C(f0, f1, f2, f3);
|
|
}
|
|
|
|
template < class F0, class F1, class F2, class F3 >
|
|
inline typename Compose_shared< F0, F1, F2, F3 >::Type
|
|
compose_shared(const F0& f0, const F1& f1, const F2& f2, const F3& f3)
|
|
{
|
|
typedef typename Compose_shared< F0, F1, F2, F3 >::Type C;
|
|
return C(f0, f1, f2, f3);
|
|
}
|
|
|
|
// adaptor for not/negation
|
|
template < typename F > inline
|
|
typename Compose< std::logical_not<typename F::result_type>, F >::Type
|
|
negate(const F& f)
|
|
{
|
|
return compose(std::logical_not<typename F::result_type>(), f);
|
|
}
|
|
|
|
CGAL_END_NAMESPACE
|
|
|
|
#endif // CGAL_FUNCTIONAL_H //
|
|
|
|
// EOF //
|