00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef TVMET_ALIAS_PROXY_H
00025 #define TVMET_ALIAS_PROXY_H
00026
00027 namespace tvmet {
00028
00029
00031 template<class E> class AliasProxy;
00032
00033
00048 template<class E>
00049 AliasProxy<E> alias(E& expr) { return AliasProxy<E>(expr); }
00050
00051
00066 template<class E>
00067 class AliasProxy
00068 {
00069 AliasProxy(const AliasProxy&);
00070 AliasProxy& operator=(const AliasProxy&);
00071
00072 friend AliasProxy<E> alias<>(E& expr);
00073
00074 public:
00075 AliasProxy(E& expr) : m_expr(expr) { }
00076
00077
00078 template<class E2>
00079 E& operator=(const E2& expr) {
00080 return m_expr.alias_assign(expr);
00081 }
00082
00083 template<class E2>
00084 E& operator+=(const E2& expr) {
00085 return m_expr.alias_add_eq(expr);
00086 }
00087
00088 template<class E2>
00089 E& operator-=(const E2& expr) {
00090 return m_expr.alias_sub_eq(expr);
00091 }
00092
00093 template<class E2>
00094 E& operator*=(const E2& expr) {
00095 return m_expr.alias_mul_eq(expr);
00096 }
00097
00098 template<class E2>
00099 E& operator/=(const E2& expr) {
00100 return m_expr.alias_div_eq(expr);
00101 }
00102
00103 private:
00104 E& m_expr;
00105 };
00106
00107
00108 #if 0
00109 namespace element_wise {
00110
00111 template<class E, class E2>
00112 E& operator/=(AliasProxy<E>& proxy, const E2& rhs) {
00113 return proxy.div_upd(rhs);
00114 }
00115
00116 }
00117 #endif
00118
00119
00120 }
00121
00122
00123 #endif
00124
00125
00126
00127
00128