84 lines
3.3 KiB
C++
84 lines
3.3 KiB
C++
//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)
|
|
|
|
#include <boost/qvm/vec_traits_array.hpp>
|
|
#include <boost/qvm/vec_operations.hpp>
|
|
#include <boost/detail/lightweight_test.hpp>
|
|
|
|
template <class T,class U>
|
|
struct same_type;
|
|
|
|
template <class T>
|
|
struct
|
|
same_type<T,T>
|
|
{
|
|
};
|
|
|
|
template <class T,class P>
|
|
void
|
|
test_ref_cast( T & v, P * ptr )
|
|
{
|
|
using namespace boost::qvm;
|
|
BOOST_QVM_STATIC_ASSERT(is_vec<T>::value);
|
|
BOOST_QVM_STATIC_ASSERT(vec_traits<T>::dim==3);
|
|
BOOST_TEST(vec_traits<T>::template read_element<0>(v)==ptr[0]);
|
|
BOOST_TEST(vec_traits<T>::template read_element<1>(v)==ptr[1]);
|
|
BOOST_TEST(vec_traits<T>::template read_element<2>(v)==ptr[2]);
|
|
BOOST_TEST(&vec_traits<T>::template write_element<0>(v)==&ptr[0]);
|
|
BOOST_TEST(&vec_traits<T>::template write_element<1>(v)==&ptr[1]);
|
|
BOOST_TEST(&vec_traits<T>::template write_element<2>(v)==&ptr[2]);
|
|
BOOST_TEST(&v[0]==&ptr[0]);
|
|
BOOST_TEST(&v[1]==&ptr[1]);
|
|
BOOST_TEST(&v[2]==&ptr[2]);
|
|
}
|
|
|
|
int
|
|
main()
|
|
{
|
|
using namespace boost::qvm;
|
|
{
|
|
BOOST_QVM_STATIC_ASSERT(is_vec<int[3]>::value);
|
|
BOOST_QVM_STATIC_ASSERT(!is_vec<int[3][3]>::value);
|
|
BOOST_QVM_STATIC_ASSERT(!is_vec<int[3][3][3]>::value);
|
|
BOOST_QVM_STATIC_ASSERT((vec_traits<int[3]>::dim==3));
|
|
same_type<vec_traits<int[3]>::scalar_type,int>();
|
|
same_type< vec<int,3>, deduce_vec<int[3]>::type >();
|
|
same_type< vec<int,3>, deduce_vec<int const[3]>::type >();
|
|
int arr[3] = {0,1,2};
|
|
BOOST_TEST((vec_traits<int[3]>::read_element<0>(arr)==0));
|
|
BOOST_TEST((vec_traits<int[3]>::read_element<1>(arr)==1));
|
|
BOOST_TEST((vec_traits<int[3]>::read_element<2>(arr)==2));
|
|
BOOST_TEST((vec_traits<int const[3]>::read_element<0>(arr)==0));
|
|
BOOST_TEST((vec_traits<int const[3]>::read_element<1>(arr)==1));
|
|
BOOST_TEST((vec_traits<int const[3]>::read_element<2>(arr)==2));
|
|
BOOST_TEST((vec_traits<int[3]>::read_element_idx(0,arr)==0));
|
|
BOOST_TEST((vec_traits<int[3]>::read_element_idx(1,arr)==1));
|
|
BOOST_TEST((vec_traits<int[3]>::read_element_idx(2,arr)==2));
|
|
BOOST_TEST((vec_traits<int const[3]>::read_element_idx(0,arr)==0));
|
|
BOOST_TEST((vec_traits<int const[3]>::read_element_idx(1,arr)==1));
|
|
BOOST_TEST((vec_traits<int const[3]>::read_element_idx(2,arr)==2));
|
|
BOOST_TEST((&vec_traits<int[3]>::write_element<0>(arr)==&arr[0]));
|
|
BOOST_TEST((&vec_traits<int[3]>::write_element<1>(arr)==&arr[1]));
|
|
BOOST_TEST((&vec_traits<int[3]>::write_element<2>(arr)==&arr[2]));
|
|
BOOST_TEST((&vec_traits<int[3]>::write_element_idx(0,arr)==&arr[0]));
|
|
BOOST_TEST((&vec_traits<int[3]>::write_element_idx(1,arr)==&arr[1]));
|
|
BOOST_TEST((&vec_traits<int[3]>::write_element_idx(2,arr)==&arr[2]));
|
|
}
|
|
{
|
|
int arr[42] = {0};
|
|
int * ptr=arr+5;
|
|
ptr[0]=42;
|
|
ptr[1]=43;
|
|
ptr[2]=44;
|
|
test_ref_cast(ptr_vref<3>(ptr),ptr);
|
|
int v[3] = {1,1,1};
|
|
ptr_vref<3>(ptr) += vref(v);
|
|
BOOST_TEST(ptr[0]==43);
|
|
BOOST_TEST(ptr[1]==44);
|
|
BOOST_TEST(ptr[2]==45);
|
|
}
|
|
return boost::report_errors();
|
|
}
|