📄 bind.hpp
字号:
#ifndef BOOST_BIND_HPP_INCLUDED#define BOOST_BIND_HPP_INCLUDED// MS compatible compilers support #pragma once#if defined(_MSC_VER) && (_MSC_VER >= 1020)# pragma once#endif//// bind.hpp - binds function objects to arguments//// Copyright (c) 2001-2004 Peter Dimov and Multi Media Ltd.// Copyright (c) 2001 David Abrahams// Copyright (c) 2005 Peter Dimov//// Distributed under the Boost Software License, Version 1.0. (See// accompanying file LICENSE_1_0.txt or copy at// http://www.boost.org/LICENSE_1_0.txt)//// See http://www.boost.org/libs/bind/bind.html for documentation.//#include <sysc/packages/boost/config.hpp>#include <sysc/packages/boost/ref.hpp>#include <sysc/packages/boost/mem_fn.hpp>#include <sysc/packages/boost/type.hpp>#include <sysc/packages/boost/bind/arg.hpp>#include <sysc/packages/boost/detail/workaround.hpp>// Borland-specific bug, visit_each() silently fails to produce code#if defined(__BORLANDC__)# define BOOST_BIND_VISIT_EACH boost::visit_each#else# define BOOST_BIND_VISIT_EACH visit_each#endif#ifdef BOOST_MSVC# pragma warning(push)# pragma warning(disable: 4512) // assignment operator could not be generated#endifnamespace boost{namespace _bi // implementation details{// result_traitstemplate<class R, class F> struct result_traits{ typedef R type;};#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)struct unspecified {};template<class F> struct result_traits<unspecified, F>{ typedef typename F::result_type type;};template<class F> struct result_traits< unspecified, reference_wrapper<F> >{ typedef typename F::result_type type;};#endif// ref_comparetemplate<class T> bool ref_compare(T const & a, T const & b, long){ return a == b;}template<class T> bool ref_compare(reference_wrapper<T> const & a, reference_wrapper<T> const & b, int){ return a.get_pointer() == b.get_pointer();}// bind_t forward declaration for listNtemplate<class R, class F, class L> class bind_t;// valuetemplate<class T> class value{public: value(T const & t): t_(t) {} T & get() { return t_; } T const & get() const { return t_; } bool operator==(value const & rhs) const { return t_ == rhs.t_; }private: T t_;};// typetemplate<class T> class type {};// unwraptemplate<class F> inline F & unwrap(F * f, long){ return *f;}template<class F> inline F & unwrap(reference_wrapper<F> * f, int){ return f->get();}template<class F> inline F & unwrap(reference_wrapper<F> const * f, int){ return f->get();}#if !( defined(__MWERKS__) && BOOST_WORKAROUND(__MWERKS__, <= 0x3004) )template<class R, class T> inline _mfi::dm<R, T> unwrap(R T::* * pm, int){ return _mfi::dm<R, T>(*pm);}#if !BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600))// IBM/VisualAge 6.0 is not able to handle this overload.template<class R, class T> inline _mfi::dm<R, T> unwrap(R T::* const * pm, int){ return _mfi::dm<R, T>(*pm);}#endif#endif// listNclass list0{public: list0() {} template<class T> T & operator[] (_bi::value<T> & v) const { return v.get(); } template<class T> T const & operator[] (_bi::value<T> const & v) const { return v.get(); } template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); } template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); } template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); } template<class R, class F, class A> R operator()(type<R>, F & f, A &, long) { return unwrap(&f, 0)(); } template<class R, class F, class A> R operator()(type<R>, F const & f, A &, long) const { return unwrap(&f, 0)(); } template<class F, class A> void operator()(type<void>, F & f, A &, int) { unwrap(&f, 0)(); } template<class F, class A> void operator()(type<void>, F const & f, A &, int) const { unwrap(&f, 0)(); } template<class V> void accept(V &) const { } bool operator==(list0 const &) const { return true; }};template<class A1> class list1{public: explicit list1(A1 a1): a1_(a1) {} A1 operator[] (boost::arg<1>) const { return a1_; } A1 operator[] (boost::arg<1> (*) ()) const { return a1_; } template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); } template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); } template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); } template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); } template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); } template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long) { return unwrap(&f, 0)(a[a1_]); } template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const { return unwrap(&f, 0)(a[a1_]); } template<class F, class A> void operator()(type<void>, F & f, A & a, int) { unwrap(&f, 0)(a[a1_]); } template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const { unwrap(&f, 0)(a[a1_]); } template<class V> void accept(V & v) const { BOOST_BIND_VISIT_EACH(v, a1_, 0); } bool operator==(list1 const & rhs) const { return ref_compare(a1_, rhs.a1_, 0); }private: A1 a1_;};template<class A1, class A2> class list2{public: list2(A1 a1, A2 a2): a1_(a1), a2_(a2) {} A1 operator[] (boost::arg<1>) const { return a1_; } A2 operator[] (boost::arg<2>) const { return a2_; } A1 operator[] (boost::arg<1> (*) ()) const { return a1_; } A2 operator[] (boost::arg<2> (*) ()) const { return a2_; } template<class T> T & operator[] (_bi::value<T> & v) const { return v.get(); } template<class T> T const & operator[] (_bi::value<T> const & v) const { return v.get(); } template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); } template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); } template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); } template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long) { return unwrap(&f, 0)(a[a1_], a[a2_]); } template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const { return unwrap(&f, 0)(a[a1_], a[a2_]); } template<class F, class A> void operator()(type<void>, F & f, A & a, int) { unwrap(&f, 0)(a[a1_], a[a2_]); } template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const { unwrap(&f, 0)(a[a1_], a[a2_]); } template<class V> void accept(V & v) const { BOOST_BIND_VISIT_EACH(v, a1_, 0); BOOST_BIND_VISIT_EACH(v, a2_, 0); } bool operator==(list2 const & rhs) const { return ref_compare(a1_, rhs.a1_, 0) && ref_compare(a2_, rhs.a2_, 0); }private: A1 a1_; A2 a2_;};template<class A1, class A2, class A3> class list3{public: list3(A1 a1, A2 a2, A3 a3): a1_(a1), a2_(a2), a3_(a3) {} A1 operator[] (boost::arg<1>) const { return a1_; } A2 operator[] (boost::arg<2>) const { return a2_; } A3 operator[] (boost::arg<3>) const { return a3_; } A1 operator[] (boost::arg<1> (*) ()) const { return a1_; } A2 operator[] (boost::arg<2> (*) ()) const { return a2_; } A3 operator[] (boost::arg<3> (*) ()) const { return a3_; } template<class T> T & operator[] (_bi::value<T> & v) const { return v.get(); } template<class T> T const & operator[] (_bi::value<T> const & v) const { return v.get(); } template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); } template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); } template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); } template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long) { return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_]); } template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const { return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_]); } template<class F, class A> void operator()(type<void>, F & f, A & a, int) { unwrap(&f, 0)(a[a1_], a[a2_], a[a3_]); } template<class F, class A> void operator()(type<void>, F const & f, A & a, int) const { unwrap(&f, 0)(a[a1_], a[a2_], a[a3_]); } template<class V> void accept(V & v) const { BOOST_BIND_VISIT_EACH(v, a1_, 0); BOOST_BIND_VISIT_EACH(v, a2_, 0); BOOST_BIND_VISIT_EACH(v, a3_, 0); } bool operator==(list3 const & rhs) const { return ref_compare(a1_, rhs.a1_, 0) && ref_compare(a2_, rhs.a2_, 0) && ref_compare(a3_, rhs.a3_, 0); }private: A1 a1_; A2 a2_; A3 a3_;};template<class A1, class A2, class A3, class A4> class list4{public: list4(A1 a1, A2 a2, A3 a3, A4 a4): a1_(a1), a2_(a2), a3_(a3), a4_(a4) {} A1 operator[] (boost::arg<1>) const { return a1_; } A2 operator[] (boost::arg<2>) const { return a2_; } A3 operator[] (boost::arg<3>) const { return a3_; } A4 operator[] (boost::arg<4>) const { return a4_; } A1 operator[] (boost::arg<1> (*) ()) const { return a1_; } A2 operator[] (boost::arg<2> (*) ()) const { return a2_; } A3 operator[] (boost::arg<3> (*) ()) const { return a3_; } A4 operator[] (boost::arg<4> (*) ()) const { return a4_; } template<class T> T & operator[] (_bi::value<T> & v) const { return v.get(); } template<class T> T const & operator[] (_bi::value<T> const & v) const { return v.get(); } template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); } template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); } template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); } template<class R, class F, class A> R operator()(type<R>, F & f, A & a, long) { return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_]); } template<class R, class F, class A> R operator()(type<R>, F const & f, A & a, long) const { return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_]); } template<class F, class A> void operator()(type<void>, F & f, A & a, int)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -