/* */ #ifndef D_A2_FUNCTIONAL_H #define D_A2_FUNCTIONAL_H #include "common.h" #include #include #include #include "SharedHandle.h" #include "A2STR.h" 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 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 class auto_delete_d { private: T obj_; public: auto_delete_d(T obj):obj_(obj) {} ~auto_delete_d() { delete obj_; } }; template class auto_delete_r { private: T obj_; R (*deleter_)(T); public: auto_delete_r(T obj, R (*deleter)(T)):obj_(obj), deleter_(deleter) {} ~auto_delete_r() { (void)deleter_(obj_); } }; template class auto_delete_container { private: Container* c_; public: auto_delete_container(Container* c):c_(c) {} ~auto_delete_container() { std::for_each(c_->begin(), c_->end(), Deleter()); delete c_; } }; 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; } // Applies unaryOp through first to last and joins the result with // delimiter delim. template std::string strjoin(InputIterator first, InputIterator last, const DelimiterType& delim, const UnaryOp& unaryOp) { std::string result; if(first == last) { return result; } InputIterator beforeLast = last-1; for(; first != beforeLast; ++first) { result += unaryOp(*first); result += delim; } result += unaryOp(*beforeLast); return result; } template class LeastRecentAccess:public std::binary_function { public: bool operator()(const SharedHandle& lhs, const SharedHandle& rhs) const { return lhs->getLastAccessTime() < rhs->getLastAccessTime(); } bool operator()(const T& lhs, const T& rhs) const { return lhs.getLastAccessTime() < rhs.getLastAccessTime(); } }; template bool in(T x, S s, S t) { return s <= x && x <= t; } template struct DerefLess { bool operator()(const T& lhs, const T& rhs) const { return *lhs < *rhs; } }; template struct DerefEqualTo { bool operator()(const T& lhs, const T& rhs) const { return *lhs == *rhs; } }; template struct DerefEqual { T target; DerefEqual(const T& t):target(t) {} bool operator()(const T& other) const { return *target == *other; } }; template struct DerefEqual derefEqual(const T& t) { return DerefEqual(t); } template struct RefLess { bool operator()(const SharedHandle& lhs, const SharedHandle& rhs) const { return lhs.get() < rhs.get(); } }; } // namespace aria2 #endif // D_A2_FUNCTIONAL_H