/* */ #ifndef _D_ARRAY_FUN_H_ #define _D_ARRAY_FUN_H_ #include #include namespace aria2 { template class bit_negate:public std::unary_function { public: T operator()(const T& t) const { return ~t; } }; template class bit_and:public std::binary_function { public: T operator()(const T& t1, const T& t2) const { return t1&t2; } }; template class array_function_base { public: virtual ~array_function_base() {} virtual R operator[](size_t index) const = 0; virtual array_function_base* clone() const = 0; }; template class array_unary_function:public array_function_base { private: A _a; F _f; public: array_unary_function(A a, F f):_a(a), _f(f) {} virtual typename F::result_type operator[](size_t index) const { return _f(_a[index]); } virtual array_function_base* clone() const { return new array_unary_function(*this); } }; template class array_binary_function:public array_function_base{ private: A _a; B _b; F _f; public: array_binary_function(A a, B b, F f):_a(a), _b(b), _f(f) {} virtual typename F::result_type operator[](size_t index) const { return _f(_a[index], _b[index]); } virtual array_function_base* clone() const { return new array_binary_function(*this); } }; template class array_fun { private: array_function_base* _p; public: template array_fun(A a, F f):_p(new array_unary_function(a, f)) {} template array_fun(A a, B b, F f):_p(new array_binary_function(a, b, f)) {} array_fun(const array_fun& af):_p(af._p->clone()) {} ~array_fun() { delete _p; } array_fun& operator=(const array_fun& af) { if(this != &af) { delete _p; _p = af._p->clone(); } return *this; } R operator[](size_t index) const { return (*_p)[index]; } typedef R result_type; }; template array_fun array_negate(A a) { return array_fun(a, bit_negate()); } template array_fun array_negate(T* a) { return array_fun(a, bit_negate()); } template array_fun array_negate(A a) { return array_fun(a, bit_negate()); } template array_fun array_and(A a, B b) { return array_fun(a, b, bit_and()); } template array_fun array_and(T* a, T* b) { return array_fun(a, b, bit_and()); } template array_fun array_and(T a, T b) { return array_fun(a, b, bit_and()); } template array_fun array_and(A a, B b) { return array_fun(a, b, bit_and()); } template array_fun array_and(A a, B b) { return array_fun(a, b, bit_and()); } // calculate length of array template char (&char_array_ref(T (&)[N]))[N]; template size_t arrayLength(T (&a)[N]) { return sizeof(char_array_ref(a)); } template size_t arrayLength(T (&a)[0u]) { return 0; } } // namespace aria2 #endif // _D_ARRAY_FUN_H_