x
Yes
No
Do you want to visit DriveHQ English website?
首页
产品服务
价格
免费试用
下载客户端
关于我们
云文件服务
|
云备份服务
|
FTP服务
|
企业邮箱服务
|
网站托管
|
客户端软件
云文件服务
云备份服务
FTP服务
企业级邮箱服务
网站托管
客户端软件
expression_types.hpp - Hosted on DriveHQ Cloud IT Platform
返回上层目录
上传
下载
共享
发布
新建文件夹
新建文件
复制
剪切
删除
粘贴
评论
升级服务
路径: \\game3dprogramming\materials\GameFactory\GameFactoryDemo\references\boost_1_35_0\boost\numeric\ublas\expression_types.hpp
旋转
特效
属性
历史版本
// // Copyright (c) 2000-2002 // Joerg Walter, Mathias Koch // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // The authors gratefully acknowledge the support of // GeNeSys mbH & Co. KG in producing this work. // #ifndef _BOOST_UBLAS_EXPRESSION_TYPE_ #define _BOOST_UBLAS_EXPRESSION_TYPE_ #include
#include
#include
// Expression templates based on ideas of Todd Veldhuizen and Geoffrey Furnish // Iterators based on ideas of Jeremy Siek namespace boost { namespace numeric { namespace ublas { // Base class for uBLAS staticaly derived expressions - see the Barton Nackman trick // Provides numeric properties for linear algebra template
class ublas_expression { public: typedef E expression_type; /* E can be an incomplete type - to define the following we would need more template arguments typedef typename E::type_category type_category; typedef typename E::value_type value_type; */ // Directly implement nonassignable - simplifes debugging call trace! protected: ublas_expression () {} ~ublas_expression () {} private: const ublas_expression& operator= (const ublas_expression &); }; // Base class for Scalar Expression models - // it does not model the Scalar Expression concept but all derived types should. // The class defines a common base type and some common interface for all // statically derived Scalar Expression classes // We implement the casts to the statically derived type. template
class scalar_expression: public ublas_expression
{ public: typedef E expression_type; typedef scalar_tag type_category; BOOST_UBLAS_INLINE const expression_type &operator () () const { return *static_cast
(this); } BOOST_UBLAS_INLINE expression_type &operator () () { return *static_cast
(this); } }; template
class scalar_reference: public scalar_expression
> { typedef scalar_reference
self_type; public: typedef T value_type; typedef const value_type &const_reference; typedef typename boost::mpl::if_
, const_reference, value_type &>::type reference; typedef const self_type const_closure_type; typedef const_closure_type closure_type; // Construction and destruction BOOST_UBLAS_INLINE explicit scalar_reference (reference t): t_ (t) {} // Conversion BOOST_UBLAS_INLINE operator value_type () const { return t_; } // Assignment BOOST_UBLAS_INLINE scalar_reference &operator = (const scalar_reference &s) { t_ = s.t_; return *this; } template
BOOST_UBLAS_INLINE scalar_reference &operator = (const scalar_expression
&ae) { t_ = ae; return *this; } // Closure comparison BOOST_UBLAS_INLINE bool same_closure (const scalar_reference &sr) const { return &t_ == &sr.t_; } private: reference t_; }; template
class scalar_value: public scalar_expression
> { typedef scalar_value
self_type; public: typedef T value_type; typedef const value_type &const_reference; typedef typename boost::mpl::if_
, const_reference, value_type &>::type reference; typedef const scalar_reference
const_closure_type; typedef scalar_reference
closure_type; // Construction and destruction BOOST_UBLAS_INLINE scalar_value (): t_ () {} BOOST_UBLAS_INLINE scalar_value (const value_type &t): t_ (t) {} BOOST_UBLAS_INLINE operator value_type () const { return t_; } // Assignment BOOST_UBLAS_INLINE scalar_value &operator = (const scalar_value &s) { t_ = s.t_; return *this; } template
BOOST_UBLAS_INLINE scalar_value &operator = (const scalar_expression
&ae) { t_ = ae; return *this; } // Closure comparison BOOST_UBLAS_INLINE bool same_closure (const scalar_value &sv) const { return this == &sv; // self closing on instances value } private: value_type t_; }; // Base class for Vector Expression models - // it does not model the Vector Expression concept but all derived types should. // The class defines a common base type and some common interface for all // statically derived Vector Expression classes // We implement the casts to the statically derived type. template
class vector_expression: public ublas_expression
{ public: static const unsigned complexity = 0; typedef E expression_type; typedef vector_tag type_category; /* E can be an incomplete type - to define the following we would need more template arguments typedef typename E::size_type size_type; */ BOOST_UBLAS_INLINE const expression_type &operator () () const { return *static_cast
(this); } BOOST_UBLAS_INLINE expression_type &operator () () { return *static_cast
(this); } #ifdef BOOST_UBLAS_ENABLE_PROXY_SHORTCUTS private: // projection types typedef vector_range
vector_range_type; typedef vector_range
const_vector_range_type; typedef vector_slice
vector_slice_type; typedef vector_slice
const_vector_slice_type; // vector_indirect_type will depend on the A template parameter typedef basic_range<> default_range; // required to avoid range/slice name confusion typedef basic_slice<> default_slice; public: BOOST_UBLAS_INLINE const_vector_range_type operator () (const default_range &r) const { return const_vector_range_type (operator () (), r); } BOOST_UBLAS_INLINE vector_range_type operator () (const default_range &r) { return vector_range_type (operator () (), r); } BOOST_UBLAS_INLINE const_vector_slice_type operator () (const default_slice &s) const { return const_vector_slice_type (operator () (), s); } BOOST_UBLAS_INLINE vector_slice_type operator () (const default_slice &s) { return vector_slice_type (operator () (), s); } template
BOOST_UBLAS_INLINE const vector_indirect
operator () (const indirect_array
&ia) const { return vector_indirect
(operator () (), ia); } template
BOOST_UBLAS_INLINE vector_indirect
operator () (const indirect_array
&ia) { return vector_indirect
(operator () (), ia); } BOOST_UBLAS_INLINE const_vector_range_type project (const default_range &r) const { return const_vector_range_type (operator () (), r); } BOOST_UBLAS_INLINE vector_range_type project (const default_range &r) { return vector_range_type (operator () (), r); } BOOST_UBLAS_INLINE const_vector_slice_type project (const default_slice &s) const { return const_vector_slice_type (operator () (), s); } BOOST_UBLAS_INLINE vector_slice_type project (const default_slice &s) { return vector_slice_type (operator () (), s); } template
BOOST_UBLAS_INLINE const vector_indirect
project (const indirect_array
&ia) const { return vector_indirect
(operator () (), ia); } template
BOOST_UBLAS_INLINE vector_indirect
project (const indirect_array
&ia) { return vector_indirect
(operator () (), ia); } #endif }; // Base class for Vector container models - // it does not model the Vector concept but all derived types should. // The class defines a common base type and some common interface for all // statically derived Vector classes // We implement the casts to the statically derived type. template
class vector_container: public vector_expression
{ public: static const unsigned complexity = 0; typedef C container_type; typedef vector_tag type_category; BOOST_UBLAS_INLINE const container_type &operator () () const { return *static_cast
(this); } BOOST_UBLAS_INLINE container_type &operator () () { return *static_cast
(this); } #ifdef BOOST_UBLAS_ENABLE_PROXY_SHORTCUTS using vector_expression
::operator (); #endif }; // Base class for Matrix Expression models - // it does not model the Matrix Expression concept but all derived types should. // The class defines a common base type and some common interface for all // statically derived Matrix Expression classes // We implement the casts to the statically derived type. template
class matrix_expression: public ublas_expression
{ public: static const unsigned complexity = 0; typedef E expression_type; typedef matrix_tag type_category; /* E can be an incomplete type - to define the following we would need more template arguments typedef typename E::size_type size_type; */ BOOST_UBLAS_INLINE const expression_type &operator () () const { return *static_cast
(this); } BOOST_UBLAS_INLINE expression_type &operator () () { return *static_cast
(this); } #ifdef BOOST_UBLAS_ENABLE_PROXY_SHORTCUTS private: // projection types typedef vector_range
vector_range_type; typedef const vector_range
const_vector_range_type; typedef vector_slice
vector_slice_type; typedef const vector_slice
const_vector_slice_type; typedef matrix_row
matrix_row_type; typedef const matrix_row
const_matrix_row_type; typedef matrix_column
matrix_column_type; typedef const matrix_column
const_matrix_column_type; typedef matrix_range
matrix_range_type; typedef const matrix_range
const_matrix_range_type; typedef matrix_slice
matrix_slice_type; typedef const matrix_slice
const_matrix_slice_type; // matrix_indirect_type will depend on the A template parameter typedef basic_range<> default_range; // required to avoid range/slice name confusion typedef basic_slice<> default_slice; public: BOOST_UBLAS_INLINE const_matrix_row_type operator [] (std::size_t i) const { return const_matrix_row_type (operator () (), i); } BOOST_UBLAS_INLINE matrix_row_type operator [] (std::size_t i) { return matrix_row_type (operator () (), i); } BOOST_UBLAS_INLINE const_matrix_row_type row (std::size_t i) const { return const_matrix_row_type (operator () (), i); } BOOST_UBLAS_INLINE matrix_row_type row (std::size_t i) { return matrix_row_type (operator () (), i); } BOOST_UBLAS_INLINE const_matrix_column_type column (std::size_t j) const { return const_matrix_column_type (operator () (), j); } BOOST_UBLAS_INLINE matrix_column_type column (std::size_t j) { return matrix_column_type (operator () (), j); } BOOST_UBLAS_INLINE const_matrix_range_type operator () (const default_range &r1, const default_range &r2) const { return const_matrix_range_type (operator () (), r1, r2); } BOOST_UBLAS_INLINE matrix_range_type operator () (const default_range &r1, const default_range &r2) { return matrix_range_type (operator () (), r1, r2); } BOOST_UBLAS_INLINE const_matrix_slice_type operator () (const default_slice &s1, const default_slice &s2) const { return const_matrix_slice_type (operator () (), s1, s2); } BOOST_UBLAS_INLINE matrix_slice_type operator () (const default_slice &s1, const default_slice &s2) { return matrix_slice_type (operator () (), s1, s2); } template
BOOST_UBLAS_INLINE const matrix_indirect
operator () (const indirect_array
&ia1, const indirect_array
&ia2) const { return matrix_indirect
(operator () (), ia1, ia2); } template
BOOST_UBLAS_INLINE matrix_indirect
operator () (const indirect_array
&ia1, const indirect_array
&ia2) { return matrix_indirect
(operator () (), ia1, ia2); } BOOST_UBLAS_INLINE const_matrix_range_type project (const default_range &r1, const default_range &r2) const { return const_matrix_range_type (operator () (), r1, r2); } BOOST_UBLAS_INLINE matrix_range_type project (const default_range &r1, const default_range &r2) { return matrix_range_type (operator () (), r1, r2); } BOOST_UBLAS_INLINE const_matrix_slice_type project (const default_slice &s1, const default_slice &s2) const { return const_matrix_slice_type (operator () (), s1, s2); } BOOST_UBLAS_INLINE matrix_slice_type project (const default_slice &s1, const default_slice &s2) { return matrix_slice_type (operator () (), s1, s2); } template
BOOST_UBLAS_INLINE const matrix_indirect
project (const indirect_array
&ia1, const indirect_array
&ia2) const { return matrix_indirect
(operator () (), ia1, ia2); } template
BOOST_UBLAS_INLINE matrix_indirect
project (const indirect_array
&ia1, const indirect_array
&ia2) { return matrix_indirect
(operator () (), ia1, ia2); } #endif }; #ifdef BOOST_UBLAS_NO_NESTED_CLASS_RELATION struct iterator1_tag {}; struct iterator2_tag {}; template
BOOST_UBLAS_INLINE typename I::dual_iterator_type begin (const I &it, iterator1_tag) { return it ().find2 (1, it.index1 (), 0); } template
BOOST_UBLAS_INLINE typename I::dual_iterator_type end (const I &it, iterator1_tag) { return it ().find2 (1, it.index1 (), it ().size2 ()); } template
BOOST_UBLAS_INLINE typename I::dual_reverse_iterator_type rbegin (const I &it, iterator1_tag) { return typename I::dual_reverse_iterator_type (end (it, iterator1_tag ())); } template
BOOST_UBLAS_INLINE typename I::dual_reverse_iterator_type rend (const I &it, iterator1_tag) { return typename I::dual_reverse_iterator_type (begin (it, iterator1_tag ())); } template
BOOST_UBLAS_INLINE typename I::dual_iterator_type begin (const I &it, iterator2_tag) { return it ().find1 (1, 0, it.index2 ()); } template
BOOST_UBLAS_INLINE typename I::dual_iterator_type end (const I &it, iterator2_tag) { return it ().find1 (1, it ().size1 (), it.index2 ()); } template
BOOST_UBLAS_INLINE typename I::dual_reverse_iterator_type rbegin (const I &it, iterator2_tag) { return typename I::dual_reverse_iterator_type (end (it, iterator2_tag ())); } template
BOOST_UBLAS_INLINE typename I::dual_reverse_iterator_type rend (const I &it, iterator2_tag) { return typename I::dual_reverse_iterator_type (begin (it, iterator2_tag ())); } #endif // Base class for Matrix container models - // it does not model the Matrix concept but all derived types should. // The class defines a common base type and some common interface for all // statically derived Matrix classes // We implement the casts to the statically derived type. template
class matrix_container: public matrix_expression
{ public: static const unsigned complexity = 0; typedef C container_type; typedef matrix_tag type_category; BOOST_UBLAS_INLINE const container_type &operator () () const { return *static_cast
(this); } BOOST_UBLAS_INLINE container_type &operator () () { return *static_cast
(this); } #ifdef BOOST_UBLAS_ENABLE_PROXY_SHORTCUTS using matrix_expression
::operator (); #endif }; }}} #endif
expression_types.hpp
网页地址
文件地址
上一页
4/26
下一页
下载
( 17 KB )
Comments
Total ratings:
0
Average rating:
无评论
of 10
Would you like to comment?
Join now
, or
Logon
if you are already a member.