/* */ #ifndef D_A2_FUNCTIONAL_H #define D_A2_FUNCTIONAL_H #include "common.h" #include #include #include #include #include "A2STR.h" namespace aria2 { class Deleter { public: template void operator()(T* ptr) { delete ptr; } }; 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 std::shared_ptr& lhs, const std::shared_ptr& 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 std::shared_ptr& lhs, const std::shared_ptr& rhs) const { return lhs.get() < rhs.get(); } }; template typename std::enable_if::value, std::unique_ptr>::type make_unique(U&&... u) { return std::unique_ptr(new T(std::forward(u)...)); } template typename std::enable_if::value, std::unique_ptr>::type make_unique(size_t size) { return std::unique_ptr(new typename std::remove_extent::type[size]()); } } // namespace aria2 #endif // D_A2_FUNCTIONAL_H