//Copyright (c) 2008-2016 Emil Dotchevski and Reverge Studios, Inc. //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) #ifndef UUID_7FF8E2E00E5411E2AB79F7FE6188709B #define UUID_7FF8E2E00E5411E2AB79F7FE6188709B #include #include #include #include #include #include namespace boost { namespace qvm { //////////////////////////////////////////////// namespace qvm_detail { template struct vec_index_read_defined { static bool const value=false; }; template struct vector_r { template static BOOST_QVM_INLINE_CRITICAL typename vec_traits::scalar_type read_element_idx( A const & a, int i ) { return I==i? vec_traits::template read_element(a) : vector_r::read_element_idx(a,i); } }; template struct vector_r { template static BOOST_QVM_INLINE_TRIVIAL typename vec_traits::scalar_type read_element_idx( A const & a, int ) { BOOST_QVM_ASSERT(0); return vec_traits::template read_element<0>(a); } }; } template BOOST_QVM_INLINE_TRIVIAL typename boost::enable_if_c< is_vec::value && !qvm_detail::vec_index_read_defined::dim>::value, typename vec_traits::scalar_type>::type vec_index_read( A const & a, int i ) { return qvm_detail::vector_r<0,vec_traits::dim>::read_element_idx(a,i); } //////////////////////////////////////////////// namespace qvm_detail { template struct vec_index_write_defined { static bool const value=false; }; template struct vector_w { template static BOOST_QVM_INLINE_CRITICAL typename vec_traits::scalar_type & write_element_idx( A & a, int i ) { return I==i? vec_traits::template write_element(a) : vector_w::write_element_idx(a,i); } }; template struct vector_w { template static BOOST_QVM_INLINE_TRIVIAL typename vec_traits::scalar_type & write_element_idx( A & a, int ) { BOOST_QVM_ASSERT(0); return vec_traits::template write_element<0>(a); } }; } template BOOST_QVM_INLINE_TRIVIAL typename boost::enable_if_c< is_vec::value && !qvm_detail::vec_index_write_defined::dim>::value, typename vec_traits::scalar_type &>::type vec_index_write( A & a, int i ) { return qvm_detail::vector_w<0,vec_traits::dim>::write_element_idx(a,i); } //////////////////////////////////////////////// namespace sfinae { using ::boost::qvm::vec_index_read; using ::boost::qvm::vec_index_write; } //////////////////////////////////////////////// } } #endif