1 //Copyright (c) 2008-2016 Emil Dotchevski and Reverge Studios, Inc.
\r
3 //Distributed under the Boost Software License, Version 1.0. (See accompanying
\r
4 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
\r
6 #ifndef UUID_384AFF3AD23A11DFA80B754FE0D72085
\r
7 #define UUID_384AFF3AD23A11DFA80B754FE0D72085
\r
9 #include <boost/qvm/vec_operations2.hpp>
\r
10 #include <boost/qvm/vec_operations3.hpp>
\r
11 #include <boost/qvm/vec_operations4.hpp>
\r
12 #include <boost/qvm/assert.hpp>
\r
13 #include <boost/qvm/scalar_traits.hpp>
\r
25 BOOST_QVM_INLINE_CRITICAL
\r
27 get_valid_ptr_vec_operations()
\r
29 static int const obj=0;
\r
34 ////////////////////////////////////////////////
\r
37 qvm_to_string_detail
\r
40 std::string to_string( T const & x );
\r
50 static bool const value=false;
\r
53 template <int I,int DimMinusOne>
\r
55 to_string_vector_elements
\r
62 using namespace qvm_to_string_detail;
\r
63 return to_string(vec_traits<A>::template read_element<I>(a))+','+to_string_vector_elements<I+1,DimMinusOne>::f(a);
\r
67 template <int DimMinusOne>
\r
69 to_string_vector_elements<DimMinusOne,DimMinusOne>
\r
76 using namespace qvm_to_string_detail;
\r
77 return to_string(vec_traits<A>::template read_element<DimMinusOne>(a));
\r
84 typename boost::enable_if_c<
\r
86 !qvm_detail::to_string_v_defined<vec_traits<A>::dim>::value,
\r
88 to_string( A const & a )
\r
90 return '('+qvm_detail::to_string_vector_elements<0,vec_traits<A>::dim-1>::f(a)+')';
\r
93 ////////////////////////////////////////////////
\r
102 static bool const value=false;
\r
105 template <int I,int N>
\r
107 copy_vector_elements
\r
109 template <class A,class B>
\r
112 f( A & a, B const & b )
\r
114 vec_traits<A>::template write_element<I>(a)=vec_traits<B>::template read_element<I>(b);
\r
115 copy_vector_elements<I+1,N>::f(a,b);
\r
121 copy_vector_elements<N,N>
\r
123 template <class A,class B>
\r
126 f( A &, B const & )
\r
132 template <class A,class B>
\r
134 typename boost::enable_if_c<
\r
135 is_vec<A>::value && is_vec<B>::value &&
\r
136 vec_traits<A>::dim==vec_traits<B>::dim &&
\r
137 !qvm_detail::assign_vv_defined<vec_traits<A>::dim>::value,
\r
139 assign( A & a, B const & b )
\r
141 qvm_detail::copy_vector_elements<0,vec_traits<A>::dim>::f(a,b);
\r
145 ////////////////////////////////////////////////
\r
152 convert_to_v_defined
\r
154 static bool const value=false;
\r
158 template <class R,class A>
\r
159 BOOST_QVM_INLINE_TRIVIAL
\r
160 typename enable_if_c<
\r
161 is_vec<R>::value && is_vec<A>::value &&
\r
162 vec_traits<R>::dim==vec_traits<A>::dim &&
\r
163 !qvm_detail::convert_to_v_defined<vec_traits<R>::dim>::value,
\r
165 convert_to( A const & a )
\r
171 ////////////////////////////////////////////////
\r
173 template <class A,class B>
\r
174 BOOST_QVM_INLINE_OPERATIONS
\r
175 typename lazy_enable_if_c<
\r
176 is_vec<A>::value && is_vec<B>::value &&
\r
177 vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
\r
178 deduce_vec2<A,B,3> >::type
\r
179 cross( A const & a, B const & b )
\r
181 typedef typename deduce_vec2<A,B,3>::type R;
\r
183 vec_traits<R>::template write_element<0>(r)=
\r
184 vec_traits<A>::template read_element<1>(a)*vec_traits<B>::template read_element<2>(b)-
\r
185 vec_traits<A>::template read_element<2>(a)*vec_traits<B>::template read_element<1>(b);
\r
186 vec_traits<R>::template write_element<1>(r)=
\r
187 vec_traits<A>::template read_element<2>(a)*vec_traits<B>::template read_element<0>(b)-
\r
188 vec_traits<A>::template read_element<0>(a)*vec_traits<B>::template read_element<2>(b);
\r
189 vec_traits<R>::template write_element<2>(r)=
\r
190 vec_traits<A>::template read_element<0>(a)*vec_traits<B>::template read_element<1>(b)-
\r
191 vec_traits<A>::template read_element<1>(a)*vec_traits<B>::template read_element<0>(b);
\r
195 ////////////////////////////////////////////////
\r
197 template <class A,class B,class Cmp>
\r
198 BOOST_QVM_INLINE_OPERATIONS
\r
199 typename enable_if_c<
\r
200 is_vec<A>::value && is_vec<B>::value &&
\r
201 vec_traits<A>::dim==vec_traits<B>::dim,
\r
203 cmp( A const & a, B const & b, Cmp f )
\r
205 typedef typename deduce_scalar<
\r
206 typename vec_traits<A>::scalar_type,
\r
207 typename vec_traits<B>::scalar_type>::type T;
\r
208 int const dim=vec_traits<A>::dim;
\r
209 T v1[dim]; assign(v1,a);
\r
210 T v2[dim]; assign(v2,b);
\r
211 for( int i=0; i!=dim; ++i )
\r
212 if( !f(v1[i],v2[i]) )
\r
217 ////////////////////////////////////////////////
\r
222 template <class T,int Dim>
\r
226 zero_vec_( zero_vec_ const & );
\r
227 zero_vec_ & operator=( zero_vec_ const & );
\r
233 BOOST_QVM_INLINE_TRIVIAL
\r
246 template <class T,int Dim>
\r
248 vec_traits< qvm_detail::zero_vec_<T,Dim> >
\r
250 typedef qvm_detail::zero_vec_<T,Dim> this_vector;
\r
251 typedef T scalar_type;
\r
252 static int const dim=Dim;
\r
256 BOOST_QVM_INLINE_CRITICAL
\r
258 read_element( this_vector const & )
\r
260 BOOST_QVM_STATIC_ASSERT(I>=0);
\r
261 BOOST_QVM_STATIC_ASSERT(I<Dim);
\r
262 return scalar_traits<scalar_type>::value(0);
\r
266 BOOST_QVM_INLINE_CRITICAL
\r
268 read_element_idx( int i, this_vector const & )
\r
270 BOOST_QVM_ASSERT(i>=0);
\r
271 BOOST_QVM_ASSERT(i<Dim);
\r
272 return scalar_traits<scalar_type>::value(0);
\r
276 template <class T,int Dim,int D>
\r
278 deduce_vec<qvm_detail::zero_vec_<T,Dim>,D>
\r
280 typedef vec<T,D> type;
\r
283 template <class T,int Dim>
\r
284 BOOST_QVM_INLINE_TRIVIAL
\r
285 qvm_detail::zero_vec_<T,Dim> const &
\r
288 return *(qvm_detail::zero_vec_<T,Dim> const *)qvm_detail::get_valid_ptr_vec_operations();
\r
292 BOOST_QVM_INLINE_OPERATIONS
\r
293 typename enable_if_c<
\r
298 assign(a,zero_vec<typename vec_traits<A>::scalar_type,vec_traits<A>::dim>());
\r
301 ////////////////////////////////////////////////
\r
306 template <class OriginalType,class Scalar>
\r
308 vector_scalar_cast_
\r
310 vector_scalar_cast_( vector_scalar_cast_ const & );
\r
311 vector_scalar_cast_ & operator=( vector_scalar_cast_ const & );
\r
312 ~vector_scalar_cast_();
\r
317 BOOST_QVM_INLINE_TRIVIAL
\r
318 vector_scalar_cast_ &
\r
319 operator=( T const & x )
\r
326 BOOST_QVM_INLINE_TRIVIAL
\r
335 template <bool> struct scalar_cast_vector_filter { };
\r
336 template <> struct scalar_cast_vector_filter<true> { typedef int type; };
\r
339 template <class OriginalType,class Scalar>
\r
341 vec_traits< qvm_detail::vector_scalar_cast_<OriginalType,Scalar> >
\r
343 typedef Scalar scalar_type;
\r
344 typedef qvm_detail::vector_scalar_cast_<OriginalType,Scalar> this_vector;
\r
345 static int const dim=vec_traits<OriginalType>::dim;
\r
349 BOOST_QVM_INLINE_CRITICAL
\r
351 read_element( this_vector const & x )
\r
353 BOOST_QVM_STATIC_ASSERT(I>=0);
\r
354 BOOST_QVM_STATIC_ASSERT(I<dim);
\r
355 return scalar_type(vec_traits<OriginalType>::template read_element<I>(reinterpret_cast<OriginalType const &>(x)));
\r
359 BOOST_QVM_INLINE_CRITICAL
\r
361 read_element_idx( int i, this_vector const & x )
\r
363 BOOST_QVM_ASSERT(i>=0);
\r
364 BOOST_QVM_ASSERT(i<dim);
\r
365 return scalar_type(vec_traits<OriginalType>::read_element_idx(i,reinterpret_cast<OriginalType const &>(x)));
\r
369 template <class OriginalType,class Scalar,int D>
\r
371 deduce_vec<qvm_detail::vector_scalar_cast_<OriginalType,Scalar>,D>
\r
373 typedef vec<Scalar,D> type;
\r
376 template <class Scalar,class T>
\r
377 BOOST_QVM_INLINE_TRIVIAL
\r
378 qvm_detail::vector_scalar_cast_<T,Scalar> const &
\r
379 scalar_cast( T const & x, typename qvm_detail::scalar_cast_vector_filter<is_vec<T>::value>::type=0 )
\r
381 return reinterpret_cast<qvm_detail::vector_scalar_cast_<T,Scalar> const &>(x);
\r
384 ////////////////////////////////////////////////
\r
393 static bool const value=false;
\r
397 template <class A,class B>
\r
398 BOOST_QVM_INLINE_OPERATIONS
\r
399 typename enable_if_c<
\r
400 is_vec<A>::value && is_scalar<B>::value &&
\r
401 !qvm_detail::div_eq_vs_defined<vec_traits<A>::dim>::value,
\r
403 operator/=( A & a, B b )
\r
405 for( int i=0; i!=vec_traits<A>::dim; ++i )
\r
406 vec_traits<A>::write_element_idx(i,a)/=b;
\r
410 ////////////////////////////////////////////////
\r
419 static bool const value=false;
\r
423 template <class A,class B>
\r
424 BOOST_QVM_INLINE_OPERATIONS
\r
425 typename lazy_enable_if_c<
\r
426 is_vec<A>::value && is_scalar<B>::value &&
\r
427 !qvm_detail::div_vs_defined<vec_traits<A>::dim>::value,
\r
428 deduce_vec<A> >::type
\r
429 operator/( A const & a, B b )
\r
431 typedef typename deduce_vec<A>::type R;
\r
433 for( int i=0; i!=vec_traits<A>::dim; ++i )
\r
434 vec_traits<R>::write_element_idx(i,r)=vec_traits<A>::read_element_idx(i,a)/b;
\r
438 ////////////////////////////////////////////////
\r
447 static bool const value=false;
\r
451 template <class A,class B>
\r
452 BOOST_QVM_INLINE_OPERATIONS
\r
453 typename lazy_enable_if_c<
\r
454 is_vec<A>::value && is_vec<B>::value &&
\r
455 vec_traits<A>::dim==vec_traits<B>::dim &&
\r
456 !qvm_detail::dot_vv_defined<vec_traits<A>::dim>::value,
\r
457 deduce_scalar<typename vec_traits<A>::scalar_type,typename vec_traits<B>::scalar_type> >::type
\r
458 dot( A const & a, B const & b )
\r
460 typedef typename deduce_scalar<typename vec_traits<A>::scalar_type,typename vec_traits<B>::scalar_type>::type T;
\r
461 T m(scalar_traits<T>::value(0));
\r
462 for( int i=0; i!=vec_traits<A>::dim; ++i )
\r
463 m+=vec_traits<A>::read_element_idx(i,a)*vec_traits<B>::read_element_idx(i,b);
\r
467 ////////////////////////////////////////////////
\r
476 static bool const value=false;
\r
480 template <class A,class B>
\r
481 BOOST_QVM_INLINE_OPERATIONS
\r
482 typename enable_if_c<
\r
483 is_vec<A>::value && is_vec<B>::value &&
\r
484 vec_traits<A>::dim==vec_traits<B>::dim &&
\r
485 !qvm_detail::eq_vv_defined<vec_traits<A>::dim>::value,
\r
487 operator==( A const & a, B const & b )
\r
489 for( int i=0; i!=vec_traits<A>::dim; ++i )
\r
490 if( vec_traits<A>::read_element_idx(i,a)!=vec_traits<B>::read_element_idx(i,b) )
\r
495 ////////////////////////////////////////////////
\r
504 static bool const value=false;
\r
509 BOOST_QVM_INLINE_OPERATIONS
\r
510 typename enable_if_c<
\r
511 is_vec<A>::value &&
\r
512 !qvm_detail::mag_sqr_v_defined<vec_traits<A>::dim>::value,
\r
513 typename vec_traits<A>::scalar_type>::type
\r
514 mag_sqr( A const & a )
\r
516 typedef typename vec_traits<A>::scalar_type T;
\r
517 T m(scalar_traits<T>::value(0));
\r
518 for( int i=0; i!=vec_traits<A>::dim; ++i )
\r
520 T x=vec_traits<A>::read_element_idx(i,a);
\r
526 ////////////////////////////////////////////////
\r
535 static bool const value=false;
\r
540 BOOST_QVM_INLINE_OPERATIONS
\r
541 typename enable_if_c<
\r
542 is_vec<A>::value &&
\r
543 !qvm_detail::mag_v_defined<vec_traits<A>::dim>::value,
\r
544 typename vec_traits<A>::scalar_type>::type
\r
547 typedef typename vec_traits<A>::scalar_type T;
\r
548 T m(scalar_traits<T>::value(0));
\r
549 for( int i=0; i!=vec_traits<A>::dim; ++i )
\r
551 T x=vec_traits<A>::read_element_idx(i,a);
\r
557 ////////////////////////////////////////////////
\r
564 minus_eq_vv_defined
\r
566 static bool const value=false;
\r
570 template <class A,class B>
\r
571 BOOST_QVM_INLINE_OPERATIONS
\r
572 typename enable_if_c<
\r
573 is_vec<A>::value && is_vec<B>::value &&
\r
574 vec_traits<A>::dim==vec_traits<B>::dim &&
\r
575 !qvm_detail::minus_eq_vv_defined<vec_traits<A>::dim>::value,
\r
577 operator-=( A & a, B const & b )
\r
579 for( int i=0; i!=vec_traits<A>::dim; ++i )
\r
580 vec_traits<A>::write_element_idx(i,a)-=vec_traits<B>::read_element_idx(i,b);
\r
584 ////////////////////////////////////////////////
\r
593 static bool const value=false;
\r
598 BOOST_QVM_INLINE_OPERATIONS
\r
599 typename lazy_enable_if_c<
\r
600 is_vec<A>::value &&
\r
601 !qvm_detail::minus_v_defined<vec_traits<A>::dim>::value,
\r
602 deduce_vec<A> >::type
\r
603 operator-( A const & a )
\r
605 typedef typename deduce_vec<A>::type R;
\r
607 for( int i=0; i!=vec_traits<A>::dim; ++i )
\r
608 vec_traits<R>::write_element_idx(i,r)=-vec_traits<A>::read_element_idx(i,a);
\r
612 ////////////////////////////////////////////////
\r
621 static bool const value=false;
\r
625 template <class A,class B>
\r
626 BOOST_QVM_INLINE_OPERATIONS
\r
627 typename lazy_enable_if_c<
\r
628 is_vec<A>::value && is_vec<B>::value &&
\r
629 vec_traits<A>::dim==vec_traits<B>::dim &&
\r
630 !qvm_detail::minus_vv_defined<vec_traits<A>::dim>::value,
\r
631 deduce_vec2<A,B,vec_traits<A>::dim> >::type
\r
632 operator-( A const & a, B const & b )
\r
634 typedef typename deduce_vec2<A,B,vec_traits<A>::dim>::type R;
\r
636 for( int i=0; i!=vec_traits<A>::dim; ++i )
\r
637 vec_traits<R>::write_element_idx(i,r)=vec_traits<A>::read_element_idx(i,a)-vec_traits<B>::read_element_idx(i,b);
\r
641 ////////////////////////////////////////////////
\r
650 static bool const value=false;
\r
654 template <class A,class B>
\r
655 BOOST_QVM_INLINE_OPERATIONS
\r
656 typename enable_if_c<
\r
657 is_vec<A>::value && is_scalar<B>::value &&
\r
658 !qvm_detail::mul_eq_vs_defined<vec_traits<A>::dim>::value,
\r
660 operator*=( A & a, B b )
\r
662 for( int i=0; i!=vec_traits<A>::dim; ++i )
\r
663 vec_traits<A>::write_element_idx(i,a)*=b;
\r
667 ////////////////////////////////////////////////
\r
676 static bool const value=false;
\r
680 template <class A,class B>
\r
681 BOOST_QVM_INLINE_OPERATIONS
\r
682 typename lazy_enable_if_c<
\r
683 is_vec<A>::value && is_scalar<B>::value &&
\r
684 !qvm_detail::mul_vs_defined<vec_traits<A>::dim>::value,
\r
685 deduce_vec<A> >::type
\r
686 operator*( A const & a, B b )
\r
688 typedef typename deduce_vec<A>::type R;
\r
690 for( int i=0; i!=vec_traits<A>::dim; ++i )
\r
691 vec_traits<R>::write_element_idx(i,r)=vec_traits<A>::read_element_idx(i,a)*b;
\r
695 ////////////////////////////////////////////////
\r
704 static bool const value=false;
\r
708 template <class A,class B>
\r
709 BOOST_QVM_INLINE_OPERATIONS
\r
710 typename lazy_enable_if_c<
\r
711 is_scalar<A>::value && is_vec<B>::value &&
\r
712 !qvm_detail::mul_sv_defined<vec_traits<B>::dim>::value,
\r
713 deduce_vec<B> >::type
\r
714 operator*( A a, B const & b )
\r
716 typedef typename deduce_vec<B>::type R;
\r
718 for( int i=0; i!=vec_traits<B>::dim; ++i )
\r
719 vec_traits<R>::write_element_idx(i,r)=a*vec_traits<B>::read_element_idx(i,b);
\r
723 ////////////////////////////////////////////////
\r
732 static bool const value=false;
\r
736 template <class A,class B>
\r
737 BOOST_QVM_INLINE_OPERATIONS
\r
738 typename enable_if_c<
\r
739 is_vec<A>::value && is_vec<B>::value &&
\r
740 vec_traits<A>::dim==vec_traits<B>::dim &&
\r
741 !qvm_detail::neq_vv_defined<vec_traits<A>::dim>::value,
\r
743 operator!=( A const & a, B const & b )
\r
745 for( int i=0; i!=vec_traits<A>::dim; ++i )
\r
746 if( vec_traits<A>::read_element_idx(i,a)!=vec_traits<B>::read_element_idx(i,b) )
\r
751 ////////////////////////////////////////////////
\r
758 normalize_v_defined
\r
760 static bool const value=false;
\r
765 BOOST_QVM_INLINE_OPERATIONS
\r
766 typename lazy_enable_if_c<
\r
767 is_vec<A>::value &&
\r
768 !qvm_detail::normalize_v_defined<vec_traits<A>::dim>::value,
\r
769 deduce_vec<A> >::type
\r
770 normalized( A const & a )
\r
772 typedef typename vec_traits<A>::scalar_type T;
\r
773 T m(scalar_traits<T>::value(0));
\r
774 for( int i=0; i!=vec_traits<A>::dim; ++i )
\r
776 T x=vec_traits<A>::read_element_idx(i,a);
\r
779 if( m==scalar_traits<T>::value(0) )
\r
780 BOOST_QVM_THROW_EXCEPTION(zero_magnitude_error());
\r
781 T rm=scalar_traits<T>::value(1)/sqrt<T>(m);
\r
782 typedef typename deduce_vec<A>::type R;
\r
784 for( int i=0; i!=vec_traits<A>::dim; ++i )
\r
785 vec_traits<R>::write_element_idx(i,r)=vec_traits<A>::read_element_idx(i,a)*rm;
\r
790 BOOST_QVM_INLINE_OPERATIONS
\r
791 typename enable_if_c<
\r
792 is_vec<A>::value &&
\r
793 !qvm_detail::normalize_v_defined<vec_traits<A>::dim>::value,
\r
797 typedef typename vec_traits<A>::scalar_type T;
\r
798 T m(scalar_traits<T>::value(0));
\r
799 for( int i=0; i!=vec_traits<A>::dim; ++i )
\r
801 T x=vec_traits<A>::read_element_idx(i,a);
\r
804 if( m==scalar_traits<T>::value(0) )
\r
805 BOOST_QVM_THROW_EXCEPTION(zero_magnitude_error());
\r
806 T rm=scalar_traits<T>::value(1)/sqrt<T>(m);
\r
807 for( int i=0; i!=vec_traits<A>::dim; ++i )
\r
808 vec_traits<A>::write_element_idx(i,a)*=rm;
\r
811 ////////////////////////////////////////////////
\r
820 static bool const value=false;
\r
824 template <class A,class B>
\r
825 BOOST_QVM_INLINE_OPERATIONS
\r
826 typename enable_if_c<
\r
827 is_vec<A>::value && is_vec<B>::value &&
\r
828 vec_traits<A>::dim==vec_traits<B>::dim &&
\r
829 !qvm_detail::plus_eq_vv_defined<vec_traits<A>::dim>::value,
\r
831 operator+=( A & a, B const & b )
\r
833 for( int i=0; i!=vec_traits<A>::dim; ++i )
\r
834 vec_traits<A>::write_element_idx(i,a)+=vec_traits<B>::read_element_idx(i,b);
\r
838 ////////////////////////////////////////////////
\r
847 static bool const value=false;
\r
851 template <class A,class B>
\r
852 BOOST_QVM_INLINE_OPERATIONS
\r
853 typename lazy_enable_if_c<
\r
854 is_vec<A>::value && is_vec<B>::value &&
\r
855 vec_traits<A>::dim==vec_traits<B>::dim &&
\r
856 !qvm_detail::plus_vv_defined<vec_traits<A>::dim>::value,
\r
857 deduce_vec2<A,B,vec_traits<A>::dim> >::type
\r
858 operator+( A const & a, B const & b )
\r
860 typedef typename deduce_vec2<A,B,vec_traits<A>::dim>::type R;
\r
862 for( int i=0; i!=vec_traits<A>::dim; ++i )
\r
863 vec_traits<R>::write_element_idx(i,r)=vec_traits<A>::read_element_idx(i,a)+vec_traits<B>::read_element_idx(i,b);
\r
867 ////////////////////////////////////////////////
\r
876 vref_( vref_ const & );
\r
877 vref_ & operator=( vref_ const & );
\r
883 BOOST_QVM_INLINE_TRIVIAL
\r
885 operator=( R const & x )
\r
892 BOOST_QVM_INLINE_TRIVIAL
\r
904 vec_traits< qvm_detail::vref_<V> >
\r
906 typedef typename vec_traits<V>::scalar_type scalar_type;
\r
907 typedef qvm_detail::vref_<V> this_vector;
\r
908 static int const dim=vec_traits<V>::dim;
\r
912 BOOST_QVM_INLINE_CRITICAL
\r
914 read_element( this_vector const & x )
\r
916 BOOST_QVM_STATIC_ASSERT(I>=0);
\r
917 BOOST_QVM_STATIC_ASSERT(I<dim);
\r
918 return vec_traits<V>::template read_element<I>(reinterpret_cast<V const &>(x));
\r
923 BOOST_QVM_INLINE_CRITICAL
\r
925 write_element( this_vector & x )
\r
927 BOOST_QVM_STATIC_ASSERT(I>=0);
\r
928 BOOST_QVM_STATIC_ASSERT(I<dim);
\r
929 return vec_traits<V>::template write_element<I>(reinterpret_cast<V &>(x));
\r
933 BOOST_QVM_INLINE_CRITICAL
\r
935 read_element_idx( int i, this_vector const & x )
\r
937 BOOST_QVM_ASSERT(i>=0);
\r
938 BOOST_QVM_ASSERT(i<dim);
\r
939 return vec_traits<V>::read_element_idx(i,reinterpret_cast<V const &>(x));
\r
943 BOOST_QVM_INLINE_CRITICAL
\r
945 write_element_idx( int i, this_vector & x )
\r
947 BOOST_QVM_ASSERT(i>=0);
\r
948 BOOST_QVM_ASSERT(i<dim);
\r
949 return vec_traits<V>::write_element_idx(i,reinterpret_cast<V &>(x));
\r
953 template <class V,int D>
\r
955 deduce_vec<qvm_detail::vref_<V>,D>
\r
957 typedef vec<typename vec_traits<V>::scalar_type,D> type;
\r
961 BOOST_QVM_INLINE_TRIVIAL
\r
962 typename enable_if_c<
\r
964 qvm_detail::vref_<V> const &>::type
\r
965 vref( V const & a )
\r
967 return reinterpret_cast<qvm_detail::vref_<V> const &>(a);
\r
971 BOOST_QVM_INLINE_TRIVIAL
\r
972 typename enable_if_c<
\r
974 qvm_detail::vref_<V> &>::type
\r
977 return reinterpret_cast<qvm_detail::vref_<V> &>(a);
\r
980 ////////////////////////////////////////////////
\r
985 using ::boost::qvm::to_string;
\r
986 using ::boost::qvm::assign;
\r
987 using ::boost::qvm::convert_to;
\r
988 using ::boost::qvm::cross;
\r
989 using ::boost::qvm::cmp;
\r
990 using ::boost::qvm::set_zero;
\r
991 using ::boost::qvm::scalar_cast;
\r
992 using ::boost::qvm::operator/=;
\r
993 using ::boost::qvm::operator/;
\r
994 using ::boost::qvm::dot;
\r
995 using ::boost::qvm::operator==;
\r
996 using ::boost::qvm::mag_sqr;
\r
997 using ::boost::qvm::mag;
\r
998 using ::boost::qvm::operator-=;
\r
999 using ::boost::qvm::operator-;
\r
1000 using ::boost::qvm::operator*=;
\r
1001 using ::boost::qvm::operator*;
\r
1002 using ::boost::qvm::operator!=;
\r
1003 using ::boost::qvm::normalized;
\r
1004 using ::boost::qvm::normalize;
\r
1005 using ::boost::qvm::operator+=;
\r
1006 using ::boost::qvm::operator+;
\r
1007 using ::boost::qvm::vref;
\r
1010 ////////////////////////////////////////////////
\r