/* */ #ifndef D_ARRAY_FUN_H #define D_ARRAY_FUN_H #include "common.h" #include #include namespace aria2 { template constexpr size_t arraySize(T (&)[N]) { return N; } template class array_wrapper { private: T array_[N]; public: array_wrapper() {} operator T*() { return array_; } operator const T*() const { return array_; } size_t size() const { return N; } }; // Expression Template for array namespace expr { template struct BinExpr { BinExpr(L l, R r):l_(l), r_(r) {} typedef typename OpTag::returnType returnType; returnType operator[](size_t index) const { return OpTag::apply(l_[index], r_[index]); } const L l_; const R r_; }; template struct UnExpr { UnExpr(A a):a_(a) {} typedef typename OpTag::returnType returnType; returnType operator[](size_t index) const { return OpTag::apply(a_[index]); } const A a_; }; template struct And { typedef T returnType; static inline returnType apply(T lhs, T rhs) { return lhs&rhs; } }; template struct Or { typedef T returnType; static inline returnType apply(T lhs, T rhs) { return lhs|rhs; } }; template struct Negate { typedef T returnType; static inline returnType apply(T a) { return ~a; } }; template struct Array { typedef T returnType; Array(const T* t):t_(t) {} const T* t_; returnType operator[](size_t index) const { return t_[index]; } }; template Array array(const T* t) { return Array(t); } template BinExpr, R> operator&(const L& l, const R& r) { return BinExpr, R>(l, r); } template BinExpr, R> operator|(const L& l, const R& r) { return BinExpr, R>(l, r); } template UnExpr, A> operator~(const A& a) { return UnExpr, A>(a); } } // namespace expr } // namespace aria2 #endif // D_ARRAY_FUN_H