Warning, file /include/boost/qvm/vec_traits.hpp was not indexed
or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001 #ifndef BOOST_QVM_VEC_TRAITS_HPP_INCLUDED
0002 #define BOOST_QVM_VEC_TRAITS_HPP_INCLUDED
0003
0004
0005
0006
0007
0008 #include <boost/qvm/is_scalar.hpp>
0009 #include <boost/qvm/enable_if.hpp>
0010 #include <boost/qvm/config.hpp>
0011
0012 namespace boost { namespace qvm {
0013
0014 template <class V>
0015 struct
0016 vec_traits
0017 {
0018 static int const dim=0;
0019 typedef void scalar_type;
0020 };
0021
0022 template <class T>
0023 struct
0024 is_vec
0025 {
0026 static bool const value = is_scalar<typename vec_traits<T>::scalar_type>::value && vec_traits<T>::dim>0;
0027 };
0028
0029 namespace
0030 qvm_detail
0031 {
0032 template <class T, T>
0033 struct
0034 vtr_dispatch_yes
0035 {
0036 char x, y;
0037 };
0038 }
0039
0040 template <class T>
0041 class
0042 vec_write_element_ref
0043 {
0044 template <class U>
0045 static qvm_detail::vtr_dispatch_yes<typename vec_traits<U>::scalar_type & (*)( U & ), &vec_traits<U>::template write_element<0> > check(int);
0046
0047 template <class>
0048 static char check(long);
0049
0050 public:
0051
0052 static bool const value = sizeof(check<T>(0)) > 1;
0053 };
0054
0055 template <int I, class V>
0056 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
0057 typename enable_if_c<
0058 vec_write_element_ref<V>::value,
0059 void>::type
0060 write_vec_element( V & v, typename vec_traits<V>::scalar_type s )
0061 {
0062 vec_traits<V>::template write_element<I>(v) = s;
0063 }
0064
0065 template <int I, class V>
0066 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
0067 typename enable_if_c<
0068 !vec_write_element_ref<V>::value,
0069 void>::type
0070 write_vec_element( V & v, typename vec_traits<V>::scalar_type s )
0071 {
0072 vec_traits<V>::template write_element<I>(v, s);
0073 }
0074
0075 template <class V>
0076 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
0077 typename enable_if_c<
0078 vec_write_element_ref<V>::value,
0079 void>::type
0080 write_vec_element_idx( int i, V & v, typename vec_traits<V>::scalar_type s )
0081 {
0082 vec_traits<V>::write_element_idx(i, v) = s;
0083 }
0084
0085 template <class V>
0086 BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
0087 typename enable_if_c<
0088 !vec_write_element_ref<V>::value,
0089 void>::type
0090 write_vec_element_idx( int i, V & v, typename vec_traits<V>::scalar_type s )
0091 {
0092 vec_traits<V>::write_element_idx(i, v, s);
0093 }
0094
0095 } }
0096
0097 #endif