/* */ #ifndef _D_A2_FUNCTIONAL_H_ #define _D_A2_FUNCTIONAL_H_ #include #include "SharedHandle.h" #include "A2STR.h" #include namespace aria2 { // mem_fun_t for SharedHandle template class mem_fun_sh_t:public std::unary_function< SharedHandle, ReturnType> { private: ReturnType (ClassType::*f)(); public: mem_fun_sh_t(ReturnType (ClassType::*f)()):f(f) {} ReturnType operator()(const SharedHandle& x) const { return (x.get()->*f)(); } }; // const_mem_fun_t for SharedHandle template class const_mem_fun_sh_t:public std::unary_function< SharedHandle, ReturnType> { private: ReturnType (ClassType::*f)() const; public: const_mem_fun_sh_t(ReturnType (ClassType::*f)() const):f(f) {} ReturnType operator()(const SharedHandle& x) const { return (x.get()->*f)(); } }; template mem_fun_sh_t mem_fun_sh(ReturnType (ClassType::*f)()) { return mem_fun_sh_t(f); }; template const_mem_fun_sh_t mem_fun_sh(ReturnType (ClassType::*f)() const) { return const_mem_fun_sh_t(f); }; // mem_fun1_t for SharedHandle template class mem_fun1_sh_t:public std::binary_function, ArgType, ReturnType> { private: ReturnType (ClassType::*f)(ArgType); public: mem_fun1_sh_t(ReturnType (ClassType::*f)(ArgType)):f(f) {} ReturnType operator()(const SharedHandle& x, ArgType a) const { return (x.get()->*f)(a); } }; template mem_fun1_sh_t mem_fun_sh(ReturnType (ClassType::*f)(ArgType)) { return mem_fun1_sh_t(f); }; template class adopt2nd_t:public std::binary_function { private: BinaryOp _binaryOp; UnaryOp _unaryOp; public: adopt2nd_t(const BinaryOp& b, const UnaryOp& u): _binaryOp(b), _unaryOp(u) {} typename BinaryOp::result_type operator()(const typename BinaryOp::first_argument_type& x, const typename UnaryOp::argument_type& y) { return _binaryOp(x, _unaryOp(y)); } }; template inline adopt2nd_t adopt2nd(const BinaryOp& binaryOp, const UnaryOp& unaryOp) { return adopt2nd_t(binaryOp, unaryOp); }; template class Ascend1st:public std::binary_function { public: bool operator()(const Pair& p1, const Pair& p2) const { return p1.first < p2.first; } }; template class select2nd { public: typename Pair::second_type operator()(const Pair& p) const { return p.second; } typename Pair::second_type operator()(Pair& p) const { return p.second; } }; class Deleter { public: template void operator()(T* ptr) { delete ptr; } }; template class Append { private: T& _to; T _delim; public: template Append(T& to, const S& delim):_to(to), _delim(delim) {} template void operator()(const S& s) { _to += s+_delim; } }; typedef Append StringAppend; template class auto_delete { private: T _obj; void (*_deleter)(T); public: auto_delete(T obj, void (*deleter)(T)):_obj(obj), _deleter(deleter) {} ~auto_delete() { _deleter(_obj); } }; template std::string strjoin(InputIterator first, InputIterator last, const DelimiterType& delim) { std::string result; if(first == last) { return result; } InputIterator beforeLast = last-1; for(; first != beforeLast; ++first) { result += *first; result += delim; } result += *beforeLast; return result; } template inline std::string strconcat(const T1& a1, const T2& a2) { return std::string(a1).append(a2); } template inline std::string strconcat(const T1& a1, const T2& a2, const T3& a3) { return std::string(a1).append(a2).append(a3); } template inline std::string strconcat(const T1& a1, const T2& a2, const T3& a3, const T4& a4) { return std::string(a1).append(a2).append(a3).append(a4); } template inline std::string strconcat(const T1& a1, const T2& a2, const T3& a3, const T4& a4, const T5& a5) { return std::string(a1).append(a2).append(a3).append(a4).append(a5); } template inline std::string strconcat(const T1& a1, const T2& a2, const T3& a3, const T4& a4, const T5& a5, const T6& a6) { return std::string(a1).append(a2).append(a3).append(a4).append(a5).append(a6); } template inline std::string strconcat(const T1& a1, const T2& a2, const T3& a3, const T4& a4, const T5& a5, const T6& a6, const T7& a7) { return std::string(a1).append(a2).append(a3).append(a4).append(a5).append(a6).append(a7); } template inline std::string strconcat(const T1& a1, const T2& a2, const T3& a3, const T4& a4, const T5& a5, const T6& a6, const T7& a7, const T8& a8) { return std::string(a1).append(a2).append(a3).append(a4).append(a5).append(a6).append(a7).append(a8); } template inline std::string strconcat(const T1& a1, const T2& a2, const T3& a3, const T4& a4, const T5& a5, const T6& a6, const T7& a7, const T8& a8, const T9& a9) { return std::string(a1).append(a2).append(a3).append(a4).append(a5).append(a6).append(a7).append(a8).append(a9); } template inline std::string strconcat(const T1& a1, const T2& a2, const T3& a3, const T4& a4, const T5& a5, const T6& a6, const T7& a7, const T8& a8, const T9& a9, const T10& a10) { return std::string(a1).append(a2).append(a3).append(a4).append(a5).append(a6).append(a7).append(a8).append(a9).append(a10); } template inline std::string strconcat(const T1& a1, const T2& a2, const T3& a3, const T4& a4, const T5& a5, const T6& a6, const T7& a7, const T8& a8, const T9& a9, const T10& a10, const T11& a11) { return std::string(a1).append(a2).append(a3).append(a4).append(a5).append(a6).append(a7).append(a8).append(a9).append(a10).append(a11); } template inline std::string strconcat(const T1& a1, const T2& a2, const T3& a3, const T4& a4, const T5& a5, const T6& a6, const T7& a7, const T8& a8, const T9& a9, const T10& a10, const T11& a11, const T12& a12) { return std::string(a1).append(a2).append(a3).append(a4).append(a5).append(a6).append(a7).append(a8).append(a9).append(a10).append(a11).append(a12); } template inline void strappend(std::string& base, const T1& a1, const T2& a2) { base.append(a1).append(a2); } template inline void strappend(std::string& base, const T1& a1, const T2& a2, const T3& a3) { base.append(a1).append(a2).append(a3); } template inline void strappend(std::string& base, const T1& a1, const T2& a2, const T3& a3, const T4& a4) { base.append(a1).append(a2).append(a3).append(a4); } template inline void strappend(std::string& base, const T1& a1, const T2& a2, const T3& a3, const T4& a4, const T5& a5) { base.append(a1).append(a2).append(a3).append(a4).append(a5); } template inline void strappend(std::string& base, const T1& a1, const T2& a2, const T3& a3, const T4& a4, const T5& a5, const T6& a6) { base.append(a1).append(a2).append(a3).append(a4).append(a5).append(a6); } template inline void strappend(std::string& base, const T1& a1, const T2& a2, const T3& a3, const T4& a4, const T5& a5, const T6& a6, const T7& a7) { base.append(a1).append(a2).append(a3).append(a4).append(a5).append(a6).append(a7); } template inline void strappend(std::string& base, const T1& a1, const T2& a2, const T3& a3, const T4& a4, const T5& a5, const T6& a6, const T7& a7, const T8& a8) { base.append(a1).append(a2).append(a3).append(a4).append(a5).append(a6).append(a7).append(a8); } } // namespace aria2 #endif // _D_A2_FUNCTIONAL_H_