1 /* ///////////////////////////////////////////////////////////////////////
7 * Brief: the vvector_expr class
10 * Copyright (c) 2008-2020, Waruqi All rights reserved.
11 * //////////////////////////////////////////////////////////////////// */
13 #ifndef EXTL_MATH_DETAIL_VVECTOR_EXPR_H
14 #define EXTL_MATH_DETAIL_VVECTOR_EXPR_H
16 /* ///////////////////////////////////////////////////////////////////////
19 #include "../prefix.h"
22 /* ///////////////////////////////////////////////////////////////////////
23 * ::extl::detail namespace
26 EXTL_DETAIL_BEGIN_NAMESPACE
28 /* \brief vvector_expr
30 * \param T The value type
31 * \param E The expression type: e.g. eop_add<eop_mul<...> ...> or eop_scalar<>
34 template< typename_param_k T
41 typedef vvector_expr class_type
;
42 typedef typename_type_k
expr_type::value_type value_type
;
43 typedef typename_type_k
expr_type::pointer pointer
;
44 typedef typename_type_k
expr_type::const_pointer const_pointer
;
45 typedef typename_type_k
expr_type::reference reference
;
46 typedef typename_type_k
expr_type::const_reference const_reference
;
47 typedef typename_type_k
expr_type::size_type size_type
;
48 typedef typename_type_k
expr_type::bool_type bool_type
;
49 typedef typename_type_k
expr_type::difference_type difference_type
;
50 typedef typename_type_k
expr_type::int_type int_type
;
51 typedef typename_type_k
expr_type::index_type index_type
;
57 explicit_k
vvector_expr(expr_type
const& expr
)
63 size_type
size() const { return m_expr
.size(); }
66 value_type
operator [](index_type index
) const { return m_expr
[index
]; }
69 expr_type
& expr() { return m_expr
; }
70 expr_type
const& expr() const { return m_expr
; }
74 template< typename_param_k T
81 operator +(vvector_expr
<T
, E1
> const& expr1
, vvector_expr
<T
, E2
> const& expr2
)
83 return vvector_expr
< T
94 template< typename_param_k T
101 operator -(vvector_expr
<T
, E1
> const& expr1
, vvector_expr
<T
, E2
> const& expr2
)
103 return vvector_expr
< T
104 , eop_sub
<T
, E1
, E2
>
106 ( eop_sub
<T
, E1
, E2
>
113 #ifdef EXTL_MATH_EOP_SCALAR_SUPPORT
115 template< typename_param_k T
116 , typename_param_k E1
124 operator +(vvector_expr
<T
, E1
> const& expr1
, T
const& value
)
126 return vvector_expr
< T
137 , eop_scalar
<T
>(value
) // temporary copy
142 template< typename_param_k T
143 , typename_param_k E2
151 operator +(T
const& value
, vvector_expr
<T
, E2
> const& expr2
)
153 return vvector_expr
< T
163 ( eop_scalar
<T
>(value
) // temporary copy
170 template< typename_param_k T
171 , typename_param_k E1
179 operator -(vvector_expr
<T
, E1
> const& expr1
, T
const& value
)
181 return vvector_expr
< T
192 , eop_scalar
<T
>(value
) // temporary copy
197 template< typename_param_k T
198 , typename_param_k E2
206 operator -(T
const& value
, vvector_expr
<T
, E2
> const& expr2
)
208 return vvector_expr
< T
218 ( eop_scalar
<T
>(value
) // temporary copy
225 template< typename_param_k T
226 , typename_param_k E1
234 operator *(vvector_expr
<T
, E1
> const& expr1
, T
const& value
)
236 return vvector_expr
< T
247 , eop_scalar
<T
>(value
) // temporary copy
252 template< typename_param_k T
253 , typename_param_k E2
261 operator *(T
const& value
, vvector_expr
<T
, E2
> const& expr2
)
263 return vvector_expr
< T
273 ( eop_scalar
<T
>(value
) // temporary copy
279 template< typename_param_k T
280 , typename_param_k E1
288 operator /(vvector_expr
<T
, E1
> const& expr1
, T
const& value
)
290 return vvector_expr
< T
301 , eop_scalar
<T
>(value
) // temporary copy
306 template< typename_param_k T
307 , typename_param_k E2
315 operator /(T
const& value
, vvector_expr
<T
, E2
> const& expr2
)
317 return vvector_expr
< T
327 ( eop_scalar
<T
>(value
) // temporary copy
333 /* ///////////////////////////////////////////////////////////////////////
334 * ::extl::detail namespace
336 EXTL_DETAIL_END_NAMESPACE
339 /* //////////////////////////////////////////////////////////////////// */
340 #endif /* EXTL_MATH_DETAIL_VVECTOR_EXPR_H */
341 /* //////////////////////////////////////////////////////////////////// */