stabilize build system: depends, installer, boost/bdb fixes, cross targets groundwork

This commit is contained in:
2026-02-24 18:38:47 +00:00
parent da8c28aaeb
commit 65cb2619a7
13106 changed files with 2484322 additions and 1804 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,714 @@
//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 BOOST_QVM_61CDD11E9D9C167272E61DF0844F4A77
#define BOOST_QVM_61CDD11E9D9C167272E61DF0844F4A77
//This file was generated by a program. Do not edit manually.
#include <boost/qvm/detail/swizzle_traits.hpp>
#include <boost/qvm/enable_if.hpp>
#include <boost/qvm/inline.hpp>
namespace
boost
{
namespace
qvm
{
BOOST_QVM_INLINE_TRIVIAL
qvm_detail::sw01_<qvm_detail::swizzle_idx<-2,qvm_detail::swizzle_idx<-2 > > > const &
_11()
{
return *reinterpret_cast<qvm_detail::sw01_<qvm_detail::swizzle_idx<-2,qvm_detail::swizzle_idx<-2 > > > const *>(qvm_detail::get_null());
}
BOOST_QVM_INLINE_TRIVIAL
qvm_detail::sw01_<qvm_detail::swizzle_idx<-1,qvm_detail::swizzle_idx<-2 > > > const &
_01()
{
return *reinterpret_cast<qvm_detail::sw01_<qvm_detail::swizzle_idx<-1,qvm_detail::swizzle_idx<-2 > > > const *>(qvm_detail::get_null());
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=4,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<3,qvm_detail::swizzle_idx<-2 > > > const &>::type
W1( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<3,qvm_detail::swizzle_idx<-2 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=4,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<3,qvm_detail::swizzle_idx<-2 > > > &>::type
W1( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<3,qvm_detail::swizzle_idx<-2 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=3,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<2,qvm_detail::swizzle_idx<-2 > > > const &>::type
Z1( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<2,qvm_detail::swizzle_idx<-2 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=3,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<2,qvm_detail::swizzle_idx<-2 > > > &>::type
Z1( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<2,qvm_detail::swizzle_idx<-2 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=2,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<1,qvm_detail::swizzle_idx<-2 > > > const &>::type
Y1( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<1,qvm_detail::swizzle_idx<-2 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=2,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<1,qvm_detail::swizzle_idx<-2 > > > &>::type
Y1( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<1,qvm_detail::swizzle_idx<-2 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=1,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<-2 > > > const &>::type
X1( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<-2 > > > const &>(a);
}
template <class S>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_scalar<S>::value,
qvm_detail::sws_<S,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<-2 > > > const &>::type
X1( S const & a )
{
return reinterpret_cast<qvm_detail::sws_<S,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<-2 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=1,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<-2 > > > &>::type
X1( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<-2 > > > &>(a);
}
template <class S>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_scalar<S>::value,
qvm_detail::sws_<S,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<-2 > > > &>::type
X1( S & a )
{
return reinterpret_cast<qvm_detail::sws_<S,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<-2 > > > &>(a);
}
BOOST_QVM_INLINE_TRIVIAL
qvm_detail::sw01_<qvm_detail::swizzle_idx<-2,qvm_detail::swizzle_idx<-1 > > > const &
_10()
{
return *reinterpret_cast<qvm_detail::sw01_<qvm_detail::swizzle_idx<-2,qvm_detail::swizzle_idx<-1 > > > const *>(qvm_detail::get_null());
}
BOOST_QVM_INLINE_TRIVIAL
qvm_detail::sw01_<qvm_detail::swizzle_idx<-1,qvm_detail::swizzle_idx<-1 > > > const &
_00()
{
return *reinterpret_cast<qvm_detail::sw01_<qvm_detail::swizzle_idx<-1,qvm_detail::swizzle_idx<-1 > > > const *>(qvm_detail::get_null());
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=4,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<3,qvm_detail::swizzle_idx<-1 > > > const &>::type
W0( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<3,qvm_detail::swizzle_idx<-1 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=4,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<3,qvm_detail::swizzle_idx<-1 > > > &>::type
W0( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<3,qvm_detail::swizzle_idx<-1 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=3,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<2,qvm_detail::swizzle_idx<-1 > > > const &>::type
Z0( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<2,qvm_detail::swizzle_idx<-1 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=3,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<2,qvm_detail::swizzle_idx<-1 > > > &>::type
Z0( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<2,qvm_detail::swizzle_idx<-1 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=2,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<1,qvm_detail::swizzle_idx<-1 > > > const &>::type
Y0( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<1,qvm_detail::swizzle_idx<-1 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=2,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<1,qvm_detail::swizzle_idx<-1 > > > &>::type
Y0( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<1,qvm_detail::swizzle_idx<-1 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=1,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<-1 > > > const &>::type
X0( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<-1 > > > const &>(a);
}
template <class S>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_scalar<S>::value,
qvm_detail::sws_<S,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<-1 > > > const &>::type
X0( S const & a )
{
return reinterpret_cast<qvm_detail::sws_<S,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<-1 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=1,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<-1 > > > &>::type
X0( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<-1 > > > &>(a);
}
template <class S>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_scalar<S>::value,
qvm_detail::sws_<S,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<-1 > > > &>::type
X0( S & a )
{
return reinterpret_cast<qvm_detail::sws_<S,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<-1 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=4,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<-2,qvm_detail::swizzle_idx<3 > > > const &>::type
_1W( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<-2,qvm_detail::swizzle_idx<3 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=4,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<-2,qvm_detail::swizzle_idx<3 > > > &>::type
_1W( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<-2,qvm_detail::swizzle_idx<3 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=4,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<-1,qvm_detail::swizzle_idx<3 > > > const &>::type
_0W( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<-1,qvm_detail::swizzle_idx<3 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=4,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<-1,qvm_detail::swizzle_idx<3 > > > &>::type
_0W( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<-1,qvm_detail::swizzle_idx<3 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=4,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<3,qvm_detail::swizzle_idx<3 > > > const &>::type
WW( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<3,qvm_detail::swizzle_idx<3 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=4,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<3,qvm_detail::swizzle_idx<3 > > > &>::type
WW( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<3,qvm_detail::swizzle_idx<3 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=4,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<2,qvm_detail::swizzle_idx<3 > > > const &>::type
ZW( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<2,qvm_detail::swizzle_idx<3 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=4,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<2,qvm_detail::swizzle_idx<3 > > > &>::type
ZW( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<2,qvm_detail::swizzle_idx<3 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=4,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<1,qvm_detail::swizzle_idx<3 > > > const &>::type
YW( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<1,qvm_detail::swizzle_idx<3 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=4,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<1,qvm_detail::swizzle_idx<3 > > > &>::type
YW( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<1,qvm_detail::swizzle_idx<3 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=4,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<3 > > > const &>::type
XW( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<3 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=4,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<3 > > > &>::type
XW( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<3 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=3,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<-2,qvm_detail::swizzle_idx<2 > > > const &>::type
_1Z( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<-2,qvm_detail::swizzle_idx<2 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=3,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<-2,qvm_detail::swizzle_idx<2 > > > &>::type
_1Z( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<-2,qvm_detail::swizzle_idx<2 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=3,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<-1,qvm_detail::swizzle_idx<2 > > > const &>::type
_0Z( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<-1,qvm_detail::swizzle_idx<2 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=3,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<-1,qvm_detail::swizzle_idx<2 > > > &>::type
_0Z( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<-1,qvm_detail::swizzle_idx<2 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=4,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<3,qvm_detail::swizzle_idx<2 > > > const &>::type
WZ( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<3,qvm_detail::swizzle_idx<2 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=4,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<3,qvm_detail::swizzle_idx<2 > > > &>::type
WZ( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<3,qvm_detail::swizzle_idx<2 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=3,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<2,qvm_detail::swizzle_idx<2 > > > const &>::type
ZZ( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<2,qvm_detail::swizzle_idx<2 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=3,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<2,qvm_detail::swizzle_idx<2 > > > &>::type
ZZ( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<2,qvm_detail::swizzle_idx<2 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=3,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<1,qvm_detail::swizzle_idx<2 > > > const &>::type
YZ( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<1,qvm_detail::swizzle_idx<2 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=3,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<1,qvm_detail::swizzle_idx<2 > > > &>::type
YZ( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<1,qvm_detail::swizzle_idx<2 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=3,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<2 > > > const &>::type
XZ( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<2 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=3,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<2 > > > &>::type
XZ( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<2 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=2,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<-2,qvm_detail::swizzle_idx<1 > > > const &>::type
_1Y( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<-2,qvm_detail::swizzle_idx<1 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=2,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<-2,qvm_detail::swizzle_idx<1 > > > &>::type
_1Y( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<-2,qvm_detail::swizzle_idx<1 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=2,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<-1,qvm_detail::swizzle_idx<1 > > > const &>::type
_0Y( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<-1,qvm_detail::swizzle_idx<1 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=2,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<-1,qvm_detail::swizzle_idx<1 > > > &>::type
_0Y( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<-1,qvm_detail::swizzle_idx<1 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=4,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<3,qvm_detail::swizzle_idx<1 > > > const &>::type
WY( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<3,qvm_detail::swizzle_idx<1 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=4,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<3,qvm_detail::swizzle_idx<1 > > > &>::type
WY( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<3,qvm_detail::swizzle_idx<1 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=3,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<2,qvm_detail::swizzle_idx<1 > > > const &>::type
ZY( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<2,qvm_detail::swizzle_idx<1 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=3,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<2,qvm_detail::swizzle_idx<1 > > > &>::type
ZY( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<2,qvm_detail::swizzle_idx<1 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=2,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<1,qvm_detail::swizzle_idx<1 > > > const &>::type
YY( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<1,qvm_detail::swizzle_idx<1 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=2,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<1,qvm_detail::swizzle_idx<1 > > > &>::type
YY( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<1,qvm_detail::swizzle_idx<1 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=2,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<1 > > > const &>::type
XY( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<1 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=2,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<1 > > > &>::type
XY( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<1 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=1,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<-2,qvm_detail::swizzle_idx<0 > > > const &>::type
_1X( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<-2,qvm_detail::swizzle_idx<0 > > > const &>(a);
}
template <class S>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_scalar<S>::value,
qvm_detail::sws_<S,qvm_detail::swizzle_idx<-2,qvm_detail::swizzle_idx<0 > > > const &>::type
_1X( S const & a )
{
return reinterpret_cast<qvm_detail::sws_<S,qvm_detail::swizzle_idx<-2,qvm_detail::swizzle_idx<0 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=1,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<-2,qvm_detail::swizzle_idx<0 > > > &>::type
_1X( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<-2,qvm_detail::swizzle_idx<0 > > > &>(a);
}
template <class S>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_scalar<S>::value,
qvm_detail::sws_<S,qvm_detail::swizzle_idx<-2,qvm_detail::swizzle_idx<0 > > > &>::type
_1X( S & a )
{
return reinterpret_cast<qvm_detail::sws_<S,qvm_detail::swizzle_idx<-2,qvm_detail::swizzle_idx<0 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=1,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<-1,qvm_detail::swizzle_idx<0 > > > const &>::type
_0X( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<-1,qvm_detail::swizzle_idx<0 > > > const &>(a);
}
template <class S>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_scalar<S>::value,
qvm_detail::sws_<S,qvm_detail::swizzle_idx<-1,qvm_detail::swizzle_idx<0 > > > const &>::type
_0X( S const & a )
{
return reinterpret_cast<qvm_detail::sws_<S,qvm_detail::swizzle_idx<-1,qvm_detail::swizzle_idx<0 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=1,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<-1,qvm_detail::swizzle_idx<0 > > > &>::type
_0X( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<-1,qvm_detail::swizzle_idx<0 > > > &>(a);
}
template <class S>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_scalar<S>::value,
qvm_detail::sws_<S,qvm_detail::swizzle_idx<-1,qvm_detail::swizzle_idx<0 > > > &>::type
_0X( S & a )
{
return reinterpret_cast<qvm_detail::sws_<S,qvm_detail::swizzle_idx<-1,qvm_detail::swizzle_idx<0 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=4,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<3,qvm_detail::swizzle_idx<0 > > > const &>::type
WX( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<3,qvm_detail::swizzle_idx<0 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=4,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<3,qvm_detail::swizzle_idx<0 > > > &>::type
WX( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<3,qvm_detail::swizzle_idx<0 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=3,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<2,qvm_detail::swizzle_idx<0 > > > const &>::type
ZX( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<2,qvm_detail::swizzle_idx<0 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=3,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<2,qvm_detail::swizzle_idx<0 > > > &>::type
ZX( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<2,qvm_detail::swizzle_idx<0 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=2,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<1,qvm_detail::swizzle_idx<0 > > > const &>::type
YX( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<1,qvm_detail::swizzle_idx<0 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=2,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<1,qvm_detail::swizzle_idx<0 > > > &>::type
YX( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<1,qvm_detail::swizzle_idx<0 > > > &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=1,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<0 > > > const &>::type
XX( V const & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<0 > > > const &>(a);
}
template <class S>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_scalar<S>::value,
qvm_detail::sws_<S,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<0 > > > const &>::type
XX( S const & a )
{
return reinterpret_cast<qvm_detail::sws_<S,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<0 > > > const &>(a);
}
template <class V>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_vec<V>::value && vec_traits<V>::dim>=1,
qvm_detail::sw_<V,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<0 > > > &>::type
XX( V & a )
{
return reinterpret_cast<qvm_detail::sw_<V,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<0 > > > &>(a);
}
template <class S>
BOOST_QVM_INLINE_TRIVIAL
typename enable_if_c<
is_scalar<S>::value,
qvm_detail::sws_<S,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<0 > > > &>::type
XX( S & a )
{
return reinterpret_cast<qvm_detail::sws_<S,qvm_detail::swizzle_idx<0,qvm_detail::swizzle_idx<0 > > > &>(a);
}
}
}
#endif
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,113 @@
//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 BOOST_QVM_F622919DE18B1FDAB0CA992B9729D49
#define BOOST_QVM_F622919DE18B1FDAB0CA992B9729D49
//This file was generated by a program. Do not edit manually.
#include <boost/qvm/deduce_vec.hpp>
#include <boost/qvm/enable_if.hpp>
#include <boost/qvm/inline.hpp>
#include <boost/qvm/mat_traits.hpp>
namespace
boost
{
namespace
qvm
{
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
mat_traits<A>::rows==2 && mat_traits<A>::cols==2 &&
vec_traits<B>::dim==2,
deduce_vec2<A,B,2> >::type
operator*( A const & a, B const & b )
{
typedef typename mat_traits<A>::scalar_type Ta;
typedef typename vec_traits<B>::scalar_type Tb;
Ta const a00 = mat_traits<A>::template read_element<0,0>(a);
Ta const a01 = mat_traits<A>::template read_element<0,1>(a);
Ta const a10 = mat_traits<A>::template read_element<1,0>(a);
Ta const a11 = mat_traits<A>::template read_element<1,1>(a);
Tb const b0 = vec_traits<B>::template read_element<0>(b);
Tb const b1 = vec_traits<B>::template read_element<1>(b);
typedef typename deduce_vec2<A,B,2>::type R;
BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==2);
R r;
vec_traits<R>::template write_element<0>(r)=a00*b0+a01*b1;
vec_traits<R>::template write_element<1>(r)=a10*b0+a11*b1;
return r;
}
namespace
sfinae
{
using ::boost::qvm::operator*;
}
namespace
qvm_detail
{
template <int R,int C>
struct mul_mv_defined;
template <>
struct
mul_mv_defined<2,2>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
mat_traits<B>::rows==2 && mat_traits<B>::cols==2 &&
vec_traits<A>::dim==2,
deduce_vec2<A,B,2> >::type
operator*( A const & a, B const & b )
{
typedef typename vec_traits<A>::scalar_type Ta;
typedef typename mat_traits<B>::scalar_type Tb;
Ta const a0 = vec_traits<A>::template read_element<0>(a);
Ta const a1 = vec_traits<A>::template read_element<1>(a);
Tb const b00 = mat_traits<B>::template read_element<0,0>(b);
Tb const b01 = mat_traits<B>::template read_element<0,1>(b);
Tb const b10 = mat_traits<B>::template read_element<1,0>(b);
Tb const b11 = mat_traits<B>::template read_element<1,1>(b);
typedef typename deduce_vec2<A,B,2>::type R;
BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==2);
R r;
vec_traits<R>::template write_element<0>(r)=a0*b00+a1*b10;
vec_traits<R>::template write_element<1>(r)=a0*b01+a1*b11;
return r;
}
namespace
sfinae
{
using ::boost::qvm::operator*;
}
namespace
qvm_detail
{
template <int R,int C>
struct mul_vm_defined;
template <>
struct
mul_vm_defined<2,2>
{
static bool const value=true;
};
}
}
}
#endif
@@ -0,0 +1,127 @@
//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 BOOST_QVM_2C807EC599D5E980B2EAC9CC53BF67D6
#define BOOST_QVM_2C807EC599D5E980B2EAC9CC53BF67D6
//This file was generated by a program. Do not edit manually.
#include <boost/qvm/deduce_vec.hpp>
#include <boost/qvm/enable_if.hpp>
#include <boost/qvm/inline.hpp>
#include <boost/qvm/mat_traits.hpp>
namespace
boost
{
namespace
qvm
{
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
mat_traits<A>::rows==3 && mat_traits<A>::cols==3 &&
vec_traits<B>::dim==3,
deduce_vec2<A,B,3> >::type
operator*( A const & a, B const & b )
{
typedef typename mat_traits<A>::scalar_type Ta;
typedef typename vec_traits<B>::scalar_type Tb;
Ta const a00 = mat_traits<A>::template read_element<0,0>(a);
Ta const a01 = mat_traits<A>::template read_element<0,1>(a);
Ta const a02 = mat_traits<A>::template read_element<0,2>(a);
Ta const a10 = mat_traits<A>::template read_element<1,0>(a);
Ta const a11 = mat_traits<A>::template read_element<1,1>(a);
Ta const a12 = mat_traits<A>::template read_element<1,2>(a);
Ta const a20 = mat_traits<A>::template read_element<2,0>(a);
Ta const a21 = mat_traits<A>::template read_element<2,1>(a);
Ta const a22 = mat_traits<A>::template read_element<2,2>(a);
Tb const b0 = vec_traits<B>::template read_element<0>(b);
Tb const b1 = vec_traits<B>::template read_element<1>(b);
Tb const b2 = vec_traits<B>::template read_element<2>(b);
typedef typename deduce_vec2<A,B,3>::type R;
BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==3);
R r;
vec_traits<R>::template write_element<0>(r)=a00*b0+a01*b1+a02*b2;
vec_traits<R>::template write_element<1>(r)=a10*b0+a11*b1+a12*b2;
vec_traits<R>::template write_element<2>(r)=a20*b0+a21*b1+a22*b2;
return r;
}
namespace
sfinae
{
using ::boost::qvm::operator*;
}
namespace
qvm_detail
{
template <int R,int C>
struct mul_mv_defined;
template <>
struct
mul_mv_defined<3,3>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
mat_traits<B>::rows==3 && mat_traits<B>::cols==3 &&
vec_traits<A>::dim==3,
deduce_vec2<A,B,3> >::type
operator*( A const & a, B const & b )
{
typedef typename vec_traits<A>::scalar_type Ta;
typedef typename mat_traits<B>::scalar_type Tb;
Ta const a0 = vec_traits<A>::template read_element<0>(a);
Ta const a1 = vec_traits<A>::template read_element<1>(a);
Ta const a2 = vec_traits<A>::template read_element<2>(a);
Tb const b00 = mat_traits<B>::template read_element<0,0>(b);
Tb const b01 = mat_traits<B>::template read_element<0,1>(b);
Tb const b02 = mat_traits<B>::template read_element<0,2>(b);
Tb const b10 = mat_traits<B>::template read_element<1,0>(b);
Tb const b11 = mat_traits<B>::template read_element<1,1>(b);
Tb const b12 = mat_traits<B>::template read_element<1,2>(b);
Tb const b20 = mat_traits<B>::template read_element<2,0>(b);
Tb const b21 = mat_traits<B>::template read_element<2,1>(b);
Tb const b22 = mat_traits<B>::template read_element<2,2>(b);
typedef typename deduce_vec2<A,B,3>::type R;
BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==3);
R r;
vec_traits<R>::template write_element<0>(r)=a0*b00+a1*b10+a2*b20;
vec_traits<R>::template write_element<1>(r)=a0*b01+a1*b11+a2*b21;
vec_traits<R>::template write_element<2>(r)=a0*b02+a1*b12+a2*b22;
return r;
}
namespace
sfinae
{
using ::boost::qvm::operator*;
}
namespace
qvm_detail
{
template <int R,int C>
struct mul_vm_defined;
template <>
struct
mul_vm_defined<3,3>
{
static bool const value=true;
};
}
}
}
#endif
@@ -0,0 +1,145 @@
//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 BOOST_QVM_BF14D67E2DDC8E6683EF574961FF698F
#define BOOST_QVM_BF14D67E2DDC8E6683EF574961FF698F
//This file was generated by a program. Do not edit manually.
#include <boost/qvm/deduce_vec.hpp>
#include <boost/qvm/enable_if.hpp>
#include <boost/qvm/inline.hpp>
#include <boost/qvm/mat_traits.hpp>
namespace
boost
{
namespace
qvm
{
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
mat_traits<A>::rows==4 && mat_traits<A>::cols==4 &&
vec_traits<B>::dim==4,
deduce_vec2<A,B,4> >::type
operator*( A const & a, B const & b )
{
typedef typename mat_traits<A>::scalar_type Ta;
typedef typename vec_traits<B>::scalar_type Tb;
Ta const a00 = mat_traits<A>::template read_element<0,0>(a);
Ta const a01 = mat_traits<A>::template read_element<0,1>(a);
Ta const a02 = mat_traits<A>::template read_element<0,2>(a);
Ta const a03 = mat_traits<A>::template read_element<0,3>(a);
Ta const a10 = mat_traits<A>::template read_element<1,0>(a);
Ta const a11 = mat_traits<A>::template read_element<1,1>(a);
Ta const a12 = mat_traits<A>::template read_element<1,2>(a);
Ta const a13 = mat_traits<A>::template read_element<1,3>(a);
Ta const a20 = mat_traits<A>::template read_element<2,0>(a);
Ta const a21 = mat_traits<A>::template read_element<2,1>(a);
Ta const a22 = mat_traits<A>::template read_element<2,2>(a);
Ta const a23 = mat_traits<A>::template read_element<2,3>(a);
Ta const a30 = mat_traits<A>::template read_element<3,0>(a);
Ta const a31 = mat_traits<A>::template read_element<3,1>(a);
Ta const a32 = mat_traits<A>::template read_element<3,2>(a);
Ta const a33 = mat_traits<A>::template read_element<3,3>(a);
Tb const b0 = vec_traits<B>::template read_element<0>(b);
Tb const b1 = vec_traits<B>::template read_element<1>(b);
Tb const b2 = vec_traits<B>::template read_element<2>(b);
Tb const b3 = vec_traits<B>::template read_element<3>(b);
typedef typename deduce_vec2<A,B,4>::type R;
BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==4);
R r;
vec_traits<R>::template write_element<0>(r)=a00*b0+a01*b1+a02*b2+a03*b3;
vec_traits<R>::template write_element<1>(r)=a10*b0+a11*b1+a12*b2+a13*b3;
vec_traits<R>::template write_element<2>(r)=a20*b0+a21*b1+a22*b2+a23*b3;
vec_traits<R>::template write_element<3>(r)=a30*b0+a31*b1+a32*b2+a33*b3;
return r;
}
namespace
sfinae
{
using ::boost::qvm::operator*;
}
namespace
qvm_detail
{
template <int R,int C>
struct mul_mv_defined;
template <>
struct
mul_mv_defined<4,4>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
mat_traits<B>::rows==4 && mat_traits<B>::cols==4 &&
vec_traits<A>::dim==4,
deduce_vec2<A,B,4> >::type
operator*( A const & a, B const & b )
{
typedef typename vec_traits<A>::scalar_type Ta;
typedef typename mat_traits<B>::scalar_type Tb;
Ta const a0 = vec_traits<A>::template read_element<0>(a);
Ta const a1 = vec_traits<A>::template read_element<1>(a);
Ta const a2 = vec_traits<A>::template read_element<2>(a);
Ta const a3 = vec_traits<A>::template read_element<3>(a);
Tb const b00 = mat_traits<B>::template read_element<0,0>(b);
Tb const b01 = mat_traits<B>::template read_element<0,1>(b);
Tb const b02 = mat_traits<B>::template read_element<0,2>(b);
Tb const b03 = mat_traits<B>::template read_element<0,3>(b);
Tb const b10 = mat_traits<B>::template read_element<1,0>(b);
Tb const b11 = mat_traits<B>::template read_element<1,1>(b);
Tb const b12 = mat_traits<B>::template read_element<1,2>(b);
Tb const b13 = mat_traits<B>::template read_element<1,3>(b);
Tb const b20 = mat_traits<B>::template read_element<2,0>(b);
Tb const b21 = mat_traits<B>::template read_element<2,1>(b);
Tb const b22 = mat_traits<B>::template read_element<2,2>(b);
Tb const b23 = mat_traits<B>::template read_element<2,3>(b);
Tb const b30 = mat_traits<B>::template read_element<3,0>(b);
Tb const b31 = mat_traits<B>::template read_element<3,1>(b);
Tb const b32 = mat_traits<B>::template read_element<3,2>(b);
Tb const b33 = mat_traits<B>::template read_element<3,3>(b);
typedef typename deduce_vec2<A,B,4>::type R;
BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==4);
R r;
vec_traits<R>::template write_element<0>(r)=a0*b00+a1*b10+a2*b20+a3*b30;
vec_traits<R>::template write_element<1>(r)=a0*b01+a1*b11+a2*b21+a3*b31;
vec_traits<R>::template write_element<2>(r)=a0*b02+a1*b12+a2*b22+a3*b32;
vec_traits<R>::template write_element<3>(r)=a0*b03+a1*b13+a2*b23+a3*b33;
return r;
}
namespace
sfinae
{
using ::boost::qvm::operator*;
}
namespace
qvm_detail
{
template <int R,int C>
struct mul_vm_defined;
template <>
struct
mul_vm_defined<4,4>
{
static bool const value=true;
};
}
}
}
#endif
@@ -0,0 +1,666 @@
//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 BOOST_QVM_5DD4CBFC96F5453B13D89A1CDBAE32
#define BOOST_QVM_5DD4CBFC96F5453B13D89A1CDBAE32
//This file was generated by a program. Do not edit manually.
#include <boost/qvm/deduce_scalar.hpp>
#include <boost/qvm/deduce_vec.hpp>
#include <boost/qvm/enable_if.hpp>
#include <boost/qvm/error.hpp>
#include <boost/qvm/inline.hpp>
#include <boost/qvm/math.hpp>
#include <boost/qvm/static_assert.hpp>
#include <boost/qvm/throw_exception.hpp>
#include <boost/qvm/vec_traits.hpp>
namespace
boost
{
namespace
qvm
{
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
vec_traits<A>::dim==2 && vec_traits<B>::dim==2,
deduce_vec2<A,B,2> >::type
operator+( A const & a, B const & b )
{
typedef typename deduce_vec2<A,B,2>::type R;
BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==2);
R r;
vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)+vec_traits<B>::template read_element<0>(b);
vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)+vec_traits<B>::template read_element<1>(b);
return r;
}
namespace
sfinae
{
using ::boost::qvm::operator+;
}
namespace
qvm_detail
{
template <int D>
struct plus_vv_defined;
template <>
struct
plus_vv_defined<2>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
vec_traits<A>::dim==2 && vec_traits<B>::dim==2,
deduce_vec2<A,B,2> >::type
operator-( A const & a, B const & b )
{
typedef typename deduce_vec2<A,B,2>::type R;
BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==2);
R r;
vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)-vec_traits<B>::template read_element<0>(b);
vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)-vec_traits<B>::template read_element<1>(b);
return r;
}
namespace
sfinae
{
using ::boost::qvm::operator-;
}
namespace
qvm_detail
{
template <int D>
struct minus_vv_defined;
template <>
struct
minus_vv_defined<2>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
vec_traits<A>::dim==2 && vec_traits<B>::dim==2,
A &>::type
operator+=( A & a, B const & b )
{
vec_traits<A>::template write_element<0>(a)+=vec_traits<B>::template read_element<0>(b);
vec_traits<A>::template write_element<1>(a)+=vec_traits<B>::template read_element<1>(b);
return a;
}
namespace
sfinae
{
using ::boost::qvm::operator+=;
}
namespace
qvm_detail
{
template <int D>
struct plus_eq_vv_defined;
template <>
struct
plus_eq_vv_defined<2>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
vec_traits<A>::dim==2 && vec_traits<B>::dim==2,
A &>::type
operator-=( A & a, B const & b )
{
vec_traits<A>::template write_element<0>(a)-=vec_traits<B>::template read_element<0>(b);
vec_traits<A>::template write_element<1>(a)-=vec_traits<B>::template read_element<1>(b);
return a;
}
namespace
sfinae
{
using ::boost::qvm::operator-=;
}
namespace
qvm_detail
{
template <int D>
struct minus_eq_vv_defined;
template <>
struct
minus_eq_vv_defined<2>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
vec_traits<A>::dim==2 && is_scalar<B>::value,
deduce_vec<A> >::type
operator*( A const & a, B b )
{
typedef typename deduce_vec<A>::type R;
R r;
vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)*b;
vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)*b;
return r;
}
namespace
sfinae
{
using ::boost::qvm::operator*;
}
namespace
qvm_detail
{
template <int D>
struct mul_vs_defined;
template <>
struct
mul_vs_defined<2>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
is_scalar<A>::value && vec_traits<B>::dim==2,
deduce_vec<B> >::type
operator*( A a, B const & b )
{
typedef typename deduce_vec<B>::type R;
R r;
vec_traits<R>::template write_element<0>(r)=a*vec_traits<B>::template read_element<0>(b);
vec_traits<R>::template write_element<1>(r)=a*vec_traits<B>::template read_element<1>(b);
return r;
}
namespace
sfinae
{
using ::boost::qvm::operator*;
}
namespace
qvm_detail
{
template <int D>
struct mul_sv_defined;
template <>
struct
mul_sv_defined<2>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
vec_traits<A>::dim==2 && is_scalar<B>::value,
A &>::type
operator*=( A & a, B b )
{
vec_traits<A>::template write_element<0>(a)*=b;
vec_traits<A>::template write_element<1>(a)*=b;
return a;
}
namespace
sfinae
{
using ::boost::qvm::operator*=;
}
namespace
qvm_detail
{
template <int D>
struct mul_eq_vs_defined;
template <>
struct
mul_eq_vs_defined<2>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
vec_traits<A>::dim==2 && is_scalar<B>::value,
deduce_vec<A> >::type
operator/( A const & a, B b )
{
typedef typename deduce_vec<A>::type R;
R r;
vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)/b;
vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)/b;
return r;
}
namespace
sfinae
{
using ::boost::qvm::operator/;
}
namespace
qvm_detail
{
template <int D>
struct div_vs_defined;
template <>
struct
div_vs_defined<2>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
vec_traits<A>::dim==2 && is_scalar<B>::value,
A &>::type
operator/=( A & a, B b )
{
vec_traits<A>::template write_element<0>(a)/=b;
vec_traits<A>::template write_element<1>(a)/=b;
return a;
}
namespace
sfinae
{
using ::boost::qvm::operator/=;
}
namespace
qvm_detail
{
template <int D>
struct div_eq_vs_defined;
template <>
struct
div_eq_vs_defined<2>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
vec_traits<A>::dim==2 && vec_traits<B>::dim==2,
A &>::type
assign( A & a, B const & b )
{
vec_traits<A>::template write_element<0>(a)=vec_traits<B>::template read_element<0>(b);
vec_traits<A>::template write_element<1>(a)=vec_traits<B>::template read_element<1>(b);
return a;
}
namespace
sfinae
{
using ::boost::qvm::assign;
}
namespace
qvm_detail
{
template <int D>
struct assign_vv_defined;
template <>
struct
assign_vv_defined<2>
{
static bool const value=true;
};
}
template <class R,class A>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
is_vec<A>::value &&
vec_traits<R>::dim==2 && vec_traits<A>::dim==2,
R>::type
convert_to( A const & a )
{
R r;
vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a);
vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a);
return r;
}
namespace
sfinae
{
using ::boost::qvm::convert_to;
}
namespace
qvm_detail
{
template <int D>
struct convert_to_v_defined;
template <>
struct
convert_to_v_defined<2>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
vec_traits<A>::dim==2 && vec_traits<B>::dim==2,
bool>::type
operator==( A const & a, B const & b )
{
return
vec_traits<A>::template read_element<0>(a)==vec_traits<B>::template read_element<0>(b) &&
vec_traits<A>::template read_element<1>(a)==vec_traits<B>::template read_element<1>(b);
}
namespace
sfinae
{
using ::boost::qvm::operator==;
}
namespace
qvm_detail
{
template <int D>
struct eq_vv_defined;
template <>
struct
eq_vv_defined<2>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
vec_traits<A>::dim==2 && vec_traits<B>::dim==2,
bool>::type
operator!=( A const & a, B const & b )
{
return
!(vec_traits<A>::template read_element<0>(a)==vec_traits<B>::template read_element<0>(b)) ||
!(vec_traits<A>::template read_element<1>(a)==vec_traits<B>::template read_element<1>(b));
}
namespace
sfinae
{
using ::boost::qvm::operator!=;
}
namespace
qvm_detail
{
template <int D>
struct neq_vv_defined;
template <>
struct
neq_vv_defined<2>
{
static bool const value=true;
};
}
template <class A>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
vec_traits<A>::dim==2,
deduce_vec<A> >::type
operator-( A const & a )
{
typedef typename deduce_vec<A>::type R;
R r;
vec_traits<R>::template write_element<0>(r)=-vec_traits<A>::template read_element<0>(a);
vec_traits<R>::template write_element<1>(r)=-vec_traits<A>::template read_element<1>(a);
return r;
}
namespace
sfinae
{
using ::boost::qvm::operator-;
}
namespace
qvm_detail
{
template <int D>
struct minus_v_defined;
template <>
struct
minus_v_defined<2>
{
static bool const value=true;
};
}
template <class A>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
is_vec<A>::value && vec_traits<A>::dim==2,
typename vec_traits<A>::scalar_type>::type
mag( A const & a )
{
typedef typename vec_traits<A>::scalar_type T;
T const a0=vec_traits<A>::template read_element<0>(a);
T const a1=vec_traits<A>::template read_element<1>(a);
T const m2=a0*a0+a1*a1;
T const mag=sqrt<T>(m2);
return mag;
}
namespace
sfinae
{
using ::boost::qvm::mag;
}
namespace
qvm_detail
{
template <int D>
struct mag_v_defined;
template <>
struct
mag_v_defined<2>
{
static bool const value=true;
};
}
template <class A>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
is_vec<A>::value && vec_traits<A>::dim==2,
typename vec_traits<A>::scalar_type>::type
mag_sqr( A const & a )
{
typedef typename vec_traits<A>::scalar_type T;
T const a0=vec_traits<A>::template read_element<0>(a);
T const a1=vec_traits<A>::template read_element<1>(a);
T const m2=a0*a0+a1*a1;
return m2;
}
namespace
sfinae
{
using ::boost::qvm::mag_sqr;
}
namespace
qvm_detail
{
template <int D>
struct mag_sqr_v_defined;
template <>
struct
mag_sqr_v_defined<2>
{
static bool const value=true;
};
}
template <class A>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
vec_traits<A>::dim==2,
deduce_vec<A> >::type
normalized( A const & a )
{
typedef typename vec_traits<A>::scalar_type T;
T const a0=vec_traits<A>::template read_element<0>(a);
T const a1=vec_traits<A>::template read_element<1>(a);
T const m2=a0*a0+a1*a1;
if( m2==scalar_traits<typename vec_traits<A>::scalar_type>::value(0) )
BOOST_QVM_THROW_EXCEPTION(zero_magnitude_error());
T const rm=scalar_traits<T>::value(1)/sqrt<T>(m2);
typedef typename deduce_vec<A>::type R;
R r;
vec_traits<R>::template write_element<0>(r)=a0*rm;
vec_traits<R>::template write_element<1>(r)=a1*rm;
return r;
}
namespace
sfinae
{
using ::boost::qvm::normalized;
}
template <class A>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
vec_traits<A>::dim==2,
void>::type
normalize( A & a )
{
typedef typename vec_traits<A>::scalar_type T;
T const a0=vec_traits<A>::template read_element<0>(a);
T const a1=vec_traits<A>::template read_element<1>(a);
T const m2=a0*a0+a1*a1;
if( m2==scalar_traits<typename vec_traits<A>::scalar_type>::value(0) )
BOOST_QVM_THROW_EXCEPTION(zero_magnitude_error());
T const rm=scalar_traits<T>::value(1)/sqrt<T>(m2);
vec_traits<A>::template write_element<0>(a)*=rm;
vec_traits<A>::template write_element<1>(a)*=rm;
}
namespace
sfinae
{
using ::boost::qvm::normalize;
}
namespace
qvm_detail
{
template <int D>
struct normalize_v_defined;
template <>
struct
normalize_v_defined<2>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
vec_traits<A>::dim==2 && vec_traits<B>::dim==2,
deduce_scalar<typename vec_traits<A>::scalar_type,typename vec_traits<B>::scalar_type> >::type
dot( A const & a, B const & b )
{
typedef typename vec_traits<A>::scalar_type Ta;
typedef typename vec_traits<B>::scalar_type Tb;
typedef typename deduce_scalar<Ta,Tb>::type Tr;
Ta const a0=vec_traits<A>::template read_element<0>(a);
Ta const a1=vec_traits<A>::template read_element<1>(a);
Tb const b0=vec_traits<B>::template read_element<0>(b);
Tb const b1=vec_traits<B>::template read_element<1>(b);
Tr const dot=a0*b0+a1*b1;
return dot;
}
namespace
sfinae
{
using ::boost::qvm::dot;
}
namespace
qvm_detail
{
template <int D>
struct dot_vv_defined;
template <>
struct
dot_vv_defined<2>
{
static bool const value=true;
};
}
}
}
#endif
@@ -0,0 +1,688 @@
//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 BOOST_QVM_209A50EE407836FD124932F69E7D49DC
#define BOOST_QVM_209A50EE407836FD124932F69E7D49DC
//This file was generated by a program. Do not edit manually.
#include <boost/qvm/deduce_scalar.hpp>
#include <boost/qvm/deduce_vec.hpp>
#include <boost/qvm/enable_if.hpp>
#include <boost/qvm/error.hpp>
#include <boost/qvm/inline.hpp>
#include <boost/qvm/math.hpp>
#include <boost/qvm/static_assert.hpp>
#include <boost/qvm/throw_exception.hpp>
#include <boost/qvm/vec_traits.hpp>
namespace
boost
{
namespace
qvm
{
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
deduce_vec2<A,B,3> >::type
operator+( A const & a, B const & b )
{
typedef typename deduce_vec2<A,B,3>::type R;
BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==3);
R r;
vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)+vec_traits<B>::template read_element<0>(b);
vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)+vec_traits<B>::template read_element<1>(b);
vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)+vec_traits<B>::template read_element<2>(b);
return r;
}
namespace
sfinae
{
using ::boost::qvm::operator+;
}
namespace
qvm_detail
{
template <int D>
struct plus_vv_defined;
template <>
struct
plus_vv_defined<3>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
deduce_vec2<A,B,3> >::type
operator-( A const & a, B const & b )
{
typedef typename deduce_vec2<A,B,3>::type R;
BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==3);
R r;
vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)-vec_traits<B>::template read_element<0>(b);
vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)-vec_traits<B>::template read_element<1>(b);
vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)-vec_traits<B>::template read_element<2>(b);
return r;
}
namespace
sfinae
{
using ::boost::qvm::operator-;
}
namespace
qvm_detail
{
template <int D>
struct minus_vv_defined;
template <>
struct
minus_vv_defined<3>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
A &>::type
operator+=( A & a, B const & b )
{
vec_traits<A>::template write_element<0>(a)+=vec_traits<B>::template read_element<0>(b);
vec_traits<A>::template write_element<1>(a)+=vec_traits<B>::template read_element<1>(b);
vec_traits<A>::template write_element<2>(a)+=vec_traits<B>::template read_element<2>(b);
return a;
}
namespace
sfinae
{
using ::boost::qvm::operator+=;
}
namespace
qvm_detail
{
template <int D>
struct plus_eq_vv_defined;
template <>
struct
plus_eq_vv_defined<3>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
A &>::type
operator-=( A & a, B const & b )
{
vec_traits<A>::template write_element<0>(a)-=vec_traits<B>::template read_element<0>(b);
vec_traits<A>::template write_element<1>(a)-=vec_traits<B>::template read_element<1>(b);
vec_traits<A>::template write_element<2>(a)-=vec_traits<B>::template read_element<2>(b);
return a;
}
namespace
sfinae
{
using ::boost::qvm::operator-=;
}
namespace
qvm_detail
{
template <int D>
struct minus_eq_vv_defined;
template <>
struct
minus_eq_vv_defined<3>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
vec_traits<A>::dim==3 && is_scalar<B>::value,
deduce_vec<A> >::type
operator*( A const & a, B b )
{
typedef typename deduce_vec<A>::type R;
R r;
vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)*b;
vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)*b;
vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)*b;
return r;
}
namespace
sfinae
{
using ::boost::qvm::operator*;
}
namespace
qvm_detail
{
template <int D>
struct mul_vs_defined;
template <>
struct
mul_vs_defined<3>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
is_scalar<A>::value && vec_traits<B>::dim==3,
deduce_vec<B> >::type
operator*( A a, B const & b )
{
typedef typename deduce_vec<B>::type R;
R r;
vec_traits<R>::template write_element<0>(r)=a*vec_traits<B>::template read_element<0>(b);
vec_traits<R>::template write_element<1>(r)=a*vec_traits<B>::template read_element<1>(b);
vec_traits<R>::template write_element<2>(r)=a*vec_traits<B>::template read_element<2>(b);
return r;
}
namespace
sfinae
{
using ::boost::qvm::operator*;
}
namespace
qvm_detail
{
template <int D>
struct mul_sv_defined;
template <>
struct
mul_sv_defined<3>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
vec_traits<A>::dim==3 && is_scalar<B>::value,
A &>::type
operator*=( A & a, B b )
{
vec_traits<A>::template write_element<0>(a)*=b;
vec_traits<A>::template write_element<1>(a)*=b;
vec_traits<A>::template write_element<2>(a)*=b;
return a;
}
namespace
sfinae
{
using ::boost::qvm::operator*=;
}
namespace
qvm_detail
{
template <int D>
struct mul_eq_vs_defined;
template <>
struct
mul_eq_vs_defined<3>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
vec_traits<A>::dim==3 && is_scalar<B>::value,
deduce_vec<A> >::type
operator/( A const & a, B b )
{
typedef typename deduce_vec<A>::type R;
R r;
vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)/b;
vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)/b;
vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)/b;
return r;
}
namespace
sfinae
{
using ::boost::qvm::operator/;
}
namespace
qvm_detail
{
template <int D>
struct div_vs_defined;
template <>
struct
div_vs_defined<3>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
vec_traits<A>::dim==3 && is_scalar<B>::value,
A &>::type
operator/=( A & a, B b )
{
vec_traits<A>::template write_element<0>(a)/=b;
vec_traits<A>::template write_element<1>(a)/=b;
vec_traits<A>::template write_element<2>(a)/=b;
return a;
}
namespace
sfinae
{
using ::boost::qvm::operator/=;
}
namespace
qvm_detail
{
template <int D>
struct div_eq_vs_defined;
template <>
struct
div_eq_vs_defined<3>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
A &>::type
assign( A & a, B const & b )
{
vec_traits<A>::template write_element<0>(a)=vec_traits<B>::template read_element<0>(b);
vec_traits<A>::template write_element<1>(a)=vec_traits<B>::template read_element<1>(b);
vec_traits<A>::template write_element<2>(a)=vec_traits<B>::template read_element<2>(b);
return a;
}
namespace
sfinae
{
using ::boost::qvm::assign;
}
namespace
qvm_detail
{
template <int D>
struct assign_vv_defined;
template <>
struct
assign_vv_defined<3>
{
static bool const value=true;
};
}
template <class R,class A>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
is_vec<A>::value &&
vec_traits<R>::dim==3 && vec_traits<A>::dim==3,
R>::type
convert_to( A const & a )
{
R r;
vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a);
vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a);
vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a);
return r;
}
namespace
sfinae
{
using ::boost::qvm::convert_to;
}
namespace
qvm_detail
{
template <int D>
struct convert_to_v_defined;
template <>
struct
convert_to_v_defined<3>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
bool>::type
operator==( A const & a, B const & b )
{
return
vec_traits<A>::template read_element<0>(a)==vec_traits<B>::template read_element<0>(b) &&
vec_traits<A>::template read_element<1>(a)==vec_traits<B>::template read_element<1>(b) &&
vec_traits<A>::template read_element<2>(a)==vec_traits<B>::template read_element<2>(b);
}
namespace
sfinae
{
using ::boost::qvm::operator==;
}
namespace
qvm_detail
{
template <int D>
struct eq_vv_defined;
template <>
struct
eq_vv_defined<3>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
bool>::type
operator!=( A const & a, B const & b )
{
return
!(vec_traits<A>::template read_element<0>(a)==vec_traits<B>::template read_element<0>(b)) ||
!(vec_traits<A>::template read_element<1>(a)==vec_traits<B>::template read_element<1>(b)) ||
!(vec_traits<A>::template read_element<2>(a)==vec_traits<B>::template read_element<2>(b));
}
namespace
sfinae
{
using ::boost::qvm::operator!=;
}
namespace
qvm_detail
{
template <int D>
struct neq_vv_defined;
template <>
struct
neq_vv_defined<3>
{
static bool const value=true;
};
}
template <class A>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
vec_traits<A>::dim==3,
deduce_vec<A> >::type
operator-( A const & a )
{
typedef typename deduce_vec<A>::type R;
R r;
vec_traits<R>::template write_element<0>(r)=-vec_traits<A>::template read_element<0>(a);
vec_traits<R>::template write_element<1>(r)=-vec_traits<A>::template read_element<1>(a);
vec_traits<R>::template write_element<2>(r)=-vec_traits<A>::template read_element<2>(a);
return r;
}
namespace
sfinae
{
using ::boost::qvm::operator-;
}
namespace
qvm_detail
{
template <int D>
struct minus_v_defined;
template <>
struct
minus_v_defined<3>
{
static bool const value=true;
};
}
template <class A>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
is_vec<A>::value && vec_traits<A>::dim==3,
typename vec_traits<A>::scalar_type>::type
mag( A const & a )
{
typedef typename vec_traits<A>::scalar_type T;
T const a0=vec_traits<A>::template read_element<0>(a);
T const a1=vec_traits<A>::template read_element<1>(a);
T const a2=vec_traits<A>::template read_element<2>(a);
T const m2=a0*a0+a1*a1+a2*a2;
T const mag=sqrt<T>(m2);
return mag;
}
namespace
sfinae
{
using ::boost::qvm::mag;
}
namespace
qvm_detail
{
template <int D>
struct mag_v_defined;
template <>
struct
mag_v_defined<3>
{
static bool const value=true;
};
}
template <class A>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
is_vec<A>::value && vec_traits<A>::dim==3,
typename vec_traits<A>::scalar_type>::type
mag_sqr( A const & a )
{
typedef typename vec_traits<A>::scalar_type T;
T const a0=vec_traits<A>::template read_element<0>(a);
T const a1=vec_traits<A>::template read_element<1>(a);
T const a2=vec_traits<A>::template read_element<2>(a);
T const m2=a0*a0+a1*a1+a2*a2;
return m2;
}
namespace
sfinae
{
using ::boost::qvm::mag_sqr;
}
namespace
qvm_detail
{
template <int D>
struct mag_sqr_v_defined;
template <>
struct
mag_sqr_v_defined<3>
{
static bool const value=true;
};
}
template <class A>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
vec_traits<A>::dim==3,
deduce_vec<A> >::type
normalized( A const & a )
{
typedef typename vec_traits<A>::scalar_type T;
T const a0=vec_traits<A>::template read_element<0>(a);
T const a1=vec_traits<A>::template read_element<1>(a);
T const a2=vec_traits<A>::template read_element<2>(a);
T const m2=a0*a0+a1*a1+a2*a2;
if( m2==scalar_traits<typename vec_traits<A>::scalar_type>::value(0) )
BOOST_QVM_THROW_EXCEPTION(zero_magnitude_error());
T const rm=scalar_traits<T>::value(1)/sqrt<T>(m2);
typedef typename deduce_vec<A>::type R;
R r;
vec_traits<R>::template write_element<0>(r)=a0*rm;
vec_traits<R>::template write_element<1>(r)=a1*rm;
vec_traits<R>::template write_element<2>(r)=a2*rm;
return r;
}
namespace
sfinae
{
using ::boost::qvm::normalized;
}
template <class A>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
vec_traits<A>::dim==3,
void>::type
normalize( A & a )
{
typedef typename vec_traits<A>::scalar_type T;
T const a0=vec_traits<A>::template read_element<0>(a);
T const a1=vec_traits<A>::template read_element<1>(a);
T const a2=vec_traits<A>::template read_element<2>(a);
T const m2=a0*a0+a1*a1+a2*a2;
if( m2==scalar_traits<typename vec_traits<A>::scalar_type>::value(0) )
BOOST_QVM_THROW_EXCEPTION(zero_magnitude_error());
T const rm=scalar_traits<T>::value(1)/sqrt<T>(m2);
vec_traits<A>::template write_element<0>(a)*=rm;
vec_traits<A>::template write_element<1>(a)*=rm;
vec_traits<A>::template write_element<2>(a)*=rm;
}
namespace
sfinae
{
using ::boost::qvm::normalize;
}
namespace
qvm_detail
{
template <int D>
struct normalize_v_defined;
template <>
struct
normalize_v_defined<3>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
vec_traits<A>::dim==3 && vec_traits<B>::dim==3,
deduce_scalar<typename vec_traits<A>::scalar_type,typename vec_traits<B>::scalar_type> >::type
dot( A const & a, B const & b )
{
typedef typename vec_traits<A>::scalar_type Ta;
typedef typename vec_traits<B>::scalar_type Tb;
typedef typename deduce_scalar<Ta,Tb>::type Tr;
Ta const a0=vec_traits<A>::template read_element<0>(a);
Ta const a1=vec_traits<A>::template read_element<1>(a);
Ta const a2=vec_traits<A>::template read_element<2>(a);
Tb const b0=vec_traits<B>::template read_element<0>(b);
Tb const b1=vec_traits<B>::template read_element<1>(b);
Tb const b2=vec_traits<B>::template read_element<2>(b);
Tr const dot=a0*b0+a1*b1+a2*b2;
return dot;
}
namespace
sfinae
{
using ::boost::qvm::dot;
}
namespace
qvm_detail
{
template <int D>
struct dot_vv_defined;
template <>
struct
dot_vv_defined<3>
{
static bool const value=true;
};
}
}
}
#endif
@@ -0,0 +1,710 @@
//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 BOOST_QVM_AD4F14F2444066D06BC430B7323BA122
#define BOOST_QVM_AD4F14F2444066D06BC430B7323BA122
//This file was generated by a program. Do not edit manually.
#include <boost/qvm/deduce_scalar.hpp>
#include <boost/qvm/deduce_vec.hpp>
#include <boost/qvm/enable_if.hpp>
#include <boost/qvm/error.hpp>
#include <boost/qvm/inline.hpp>
#include <boost/qvm/math.hpp>
#include <boost/qvm/static_assert.hpp>
#include <boost/qvm/throw_exception.hpp>
#include <boost/qvm/vec_traits.hpp>
namespace
boost
{
namespace
qvm
{
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
vec_traits<A>::dim==4 && vec_traits<B>::dim==4,
deduce_vec2<A,B,4> >::type
operator+( A const & a, B const & b )
{
typedef typename deduce_vec2<A,B,4>::type R;
BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==4);
R r;
vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)+vec_traits<B>::template read_element<0>(b);
vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)+vec_traits<B>::template read_element<1>(b);
vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)+vec_traits<B>::template read_element<2>(b);
vec_traits<R>::template write_element<3>(r)=vec_traits<A>::template read_element<3>(a)+vec_traits<B>::template read_element<3>(b);
return r;
}
namespace
sfinae
{
using ::boost::qvm::operator+;
}
namespace
qvm_detail
{
template <int D>
struct plus_vv_defined;
template <>
struct
plus_vv_defined<4>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
vec_traits<A>::dim==4 && vec_traits<B>::dim==4,
deduce_vec2<A,B,4> >::type
operator-( A const & a, B const & b )
{
typedef typename deduce_vec2<A,B,4>::type R;
BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==4);
R r;
vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)-vec_traits<B>::template read_element<0>(b);
vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)-vec_traits<B>::template read_element<1>(b);
vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)-vec_traits<B>::template read_element<2>(b);
vec_traits<R>::template write_element<3>(r)=vec_traits<A>::template read_element<3>(a)-vec_traits<B>::template read_element<3>(b);
return r;
}
namespace
sfinae
{
using ::boost::qvm::operator-;
}
namespace
qvm_detail
{
template <int D>
struct minus_vv_defined;
template <>
struct
minus_vv_defined<4>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
vec_traits<A>::dim==4 && vec_traits<B>::dim==4,
A &>::type
operator+=( A & a, B const & b )
{
vec_traits<A>::template write_element<0>(a)+=vec_traits<B>::template read_element<0>(b);
vec_traits<A>::template write_element<1>(a)+=vec_traits<B>::template read_element<1>(b);
vec_traits<A>::template write_element<2>(a)+=vec_traits<B>::template read_element<2>(b);
vec_traits<A>::template write_element<3>(a)+=vec_traits<B>::template read_element<3>(b);
return a;
}
namespace
sfinae
{
using ::boost::qvm::operator+=;
}
namespace
qvm_detail
{
template <int D>
struct plus_eq_vv_defined;
template <>
struct
plus_eq_vv_defined<4>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
vec_traits<A>::dim==4 && vec_traits<B>::dim==4,
A &>::type
operator-=( A & a, B const & b )
{
vec_traits<A>::template write_element<0>(a)-=vec_traits<B>::template read_element<0>(b);
vec_traits<A>::template write_element<1>(a)-=vec_traits<B>::template read_element<1>(b);
vec_traits<A>::template write_element<2>(a)-=vec_traits<B>::template read_element<2>(b);
vec_traits<A>::template write_element<3>(a)-=vec_traits<B>::template read_element<3>(b);
return a;
}
namespace
sfinae
{
using ::boost::qvm::operator-=;
}
namespace
qvm_detail
{
template <int D>
struct minus_eq_vv_defined;
template <>
struct
minus_eq_vv_defined<4>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
vec_traits<A>::dim==4 && is_scalar<B>::value,
deduce_vec<A> >::type
operator*( A const & a, B b )
{
typedef typename deduce_vec<A>::type R;
R r;
vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)*b;
vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)*b;
vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)*b;
vec_traits<R>::template write_element<3>(r)=vec_traits<A>::template read_element<3>(a)*b;
return r;
}
namespace
sfinae
{
using ::boost::qvm::operator*;
}
namespace
qvm_detail
{
template <int D>
struct mul_vs_defined;
template <>
struct
mul_vs_defined<4>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
is_scalar<A>::value && vec_traits<B>::dim==4,
deduce_vec<B> >::type
operator*( A a, B const & b )
{
typedef typename deduce_vec<B>::type R;
R r;
vec_traits<R>::template write_element<0>(r)=a*vec_traits<B>::template read_element<0>(b);
vec_traits<R>::template write_element<1>(r)=a*vec_traits<B>::template read_element<1>(b);
vec_traits<R>::template write_element<2>(r)=a*vec_traits<B>::template read_element<2>(b);
vec_traits<R>::template write_element<3>(r)=a*vec_traits<B>::template read_element<3>(b);
return r;
}
namespace
sfinae
{
using ::boost::qvm::operator*;
}
namespace
qvm_detail
{
template <int D>
struct mul_sv_defined;
template <>
struct
mul_sv_defined<4>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
vec_traits<A>::dim==4 && is_scalar<B>::value,
A &>::type
operator*=( A & a, B b )
{
vec_traits<A>::template write_element<0>(a)*=b;
vec_traits<A>::template write_element<1>(a)*=b;
vec_traits<A>::template write_element<2>(a)*=b;
vec_traits<A>::template write_element<3>(a)*=b;
return a;
}
namespace
sfinae
{
using ::boost::qvm::operator*=;
}
namespace
qvm_detail
{
template <int D>
struct mul_eq_vs_defined;
template <>
struct
mul_eq_vs_defined<4>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
vec_traits<A>::dim==4 && is_scalar<B>::value,
deduce_vec<A> >::type
operator/( A const & a, B b )
{
typedef typename deduce_vec<A>::type R;
R r;
vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)/b;
vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)/b;
vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)/b;
vec_traits<R>::template write_element<3>(r)=vec_traits<A>::template read_element<3>(a)/b;
return r;
}
namespace
sfinae
{
using ::boost::qvm::operator/;
}
namespace
qvm_detail
{
template <int D>
struct div_vs_defined;
template <>
struct
div_vs_defined<4>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
vec_traits<A>::dim==4 && is_scalar<B>::value,
A &>::type
operator/=( A & a, B b )
{
vec_traits<A>::template write_element<0>(a)/=b;
vec_traits<A>::template write_element<1>(a)/=b;
vec_traits<A>::template write_element<2>(a)/=b;
vec_traits<A>::template write_element<3>(a)/=b;
return a;
}
namespace
sfinae
{
using ::boost::qvm::operator/=;
}
namespace
qvm_detail
{
template <int D>
struct div_eq_vs_defined;
template <>
struct
div_eq_vs_defined<4>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
vec_traits<A>::dim==4 && vec_traits<B>::dim==4,
A &>::type
assign( A & a, B const & b )
{
vec_traits<A>::template write_element<0>(a)=vec_traits<B>::template read_element<0>(b);
vec_traits<A>::template write_element<1>(a)=vec_traits<B>::template read_element<1>(b);
vec_traits<A>::template write_element<2>(a)=vec_traits<B>::template read_element<2>(b);
vec_traits<A>::template write_element<3>(a)=vec_traits<B>::template read_element<3>(b);
return a;
}
namespace
sfinae
{
using ::boost::qvm::assign;
}
namespace
qvm_detail
{
template <int D>
struct assign_vv_defined;
template <>
struct
assign_vv_defined<4>
{
static bool const value=true;
};
}
template <class R,class A>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
is_vec<A>::value &&
vec_traits<R>::dim==4 && vec_traits<A>::dim==4,
R>::type
convert_to( A const & a )
{
R r;
vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a);
vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a);
vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a);
vec_traits<R>::template write_element<3>(r)=vec_traits<A>::template read_element<3>(a);
return r;
}
namespace
sfinae
{
using ::boost::qvm::convert_to;
}
namespace
qvm_detail
{
template <int D>
struct convert_to_v_defined;
template <>
struct
convert_to_v_defined<4>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
vec_traits<A>::dim==4 && vec_traits<B>::dim==4,
bool>::type
operator==( A const & a, B const & b )
{
return
vec_traits<A>::template read_element<0>(a)==vec_traits<B>::template read_element<0>(b) &&
vec_traits<A>::template read_element<1>(a)==vec_traits<B>::template read_element<1>(b) &&
vec_traits<A>::template read_element<2>(a)==vec_traits<B>::template read_element<2>(b) &&
vec_traits<A>::template read_element<3>(a)==vec_traits<B>::template read_element<3>(b);
}
namespace
sfinae
{
using ::boost::qvm::operator==;
}
namespace
qvm_detail
{
template <int D>
struct eq_vv_defined;
template <>
struct
eq_vv_defined<4>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
vec_traits<A>::dim==4 && vec_traits<B>::dim==4,
bool>::type
operator!=( A const & a, B const & b )
{
return
!(vec_traits<A>::template read_element<0>(a)==vec_traits<B>::template read_element<0>(b)) ||
!(vec_traits<A>::template read_element<1>(a)==vec_traits<B>::template read_element<1>(b)) ||
!(vec_traits<A>::template read_element<2>(a)==vec_traits<B>::template read_element<2>(b)) ||
!(vec_traits<A>::template read_element<3>(a)==vec_traits<B>::template read_element<3>(b));
}
namespace
sfinae
{
using ::boost::qvm::operator!=;
}
namespace
qvm_detail
{
template <int D>
struct neq_vv_defined;
template <>
struct
neq_vv_defined<4>
{
static bool const value=true;
};
}
template <class A>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
vec_traits<A>::dim==4,
deduce_vec<A> >::type
operator-( A const & a )
{
typedef typename deduce_vec<A>::type R;
R r;
vec_traits<R>::template write_element<0>(r)=-vec_traits<A>::template read_element<0>(a);
vec_traits<R>::template write_element<1>(r)=-vec_traits<A>::template read_element<1>(a);
vec_traits<R>::template write_element<2>(r)=-vec_traits<A>::template read_element<2>(a);
vec_traits<R>::template write_element<3>(r)=-vec_traits<A>::template read_element<3>(a);
return r;
}
namespace
sfinae
{
using ::boost::qvm::operator-;
}
namespace
qvm_detail
{
template <int D>
struct minus_v_defined;
template <>
struct
minus_v_defined<4>
{
static bool const value=true;
};
}
template <class A>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
is_vec<A>::value && vec_traits<A>::dim==4,
typename vec_traits<A>::scalar_type>::type
mag( A const & a )
{
typedef typename vec_traits<A>::scalar_type T;
T const a0=vec_traits<A>::template read_element<0>(a);
T const a1=vec_traits<A>::template read_element<1>(a);
T const a2=vec_traits<A>::template read_element<2>(a);
T const a3=vec_traits<A>::template read_element<3>(a);
T const m2=a0*a0+a1*a1+a2*a2+a3*a3;
T const mag=sqrt<T>(m2);
return mag;
}
namespace
sfinae
{
using ::boost::qvm::mag;
}
namespace
qvm_detail
{
template <int D>
struct mag_v_defined;
template <>
struct
mag_v_defined<4>
{
static bool const value=true;
};
}
template <class A>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
is_vec<A>::value && vec_traits<A>::dim==4,
typename vec_traits<A>::scalar_type>::type
mag_sqr( A const & a )
{
typedef typename vec_traits<A>::scalar_type T;
T const a0=vec_traits<A>::template read_element<0>(a);
T const a1=vec_traits<A>::template read_element<1>(a);
T const a2=vec_traits<A>::template read_element<2>(a);
T const a3=vec_traits<A>::template read_element<3>(a);
T const m2=a0*a0+a1*a1+a2*a2+a3*a3;
return m2;
}
namespace
sfinae
{
using ::boost::qvm::mag_sqr;
}
namespace
qvm_detail
{
template <int D>
struct mag_sqr_v_defined;
template <>
struct
mag_sqr_v_defined<4>
{
static bool const value=true;
};
}
template <class A>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
vec_traits<A>::dim==4,
deduce_vec<A> >::type
normalized( A const & a )
{
typedef typename vec_traits<A>::scalar_type T;
T const a0=vec_traits<A>::template read_element<0>(a);
T const a1=vec_traits<A>::template read_element<1>(a);
T const a2=vec_traits<A>::template read_element<2>(a);
T const a3=vec_traits<A>::template read_element<3>(a);
T const m2=a0*a0+a1*a1+a2*a2+a3*a3;
if( m2==scalar_traits<typename vec_traits<A>::scalar_type>::value(0) )
BOOST_QVM_THROW_EXCEPTION(zero_magnitude_error());
T const rm=scalar_traits<T>::value(1)/sqrt<T>(m2);
typedef typename deduce_vec<A>::type R;
R r;
vec_traits<R>::template write_element<0>(r)=a0*rm;
vec_traits<R>::template write_element<1>(r)=a1*rm;
vec_traits<R>::template write_element<2>(r)=a2*rm;
vec_traits<R>::template write_element<3>(r)=a3*rm;
return r;
}
namespace
sfinae
{
using ::boost::qvm::normalized;
}
template <class A>
BOOST_QVM_INLINE_OPERATIONS
typename enable_if_c<
vec_traits<A>::dim==4,
void>::type
normalize( A & a )
{
typedef typename vec_traits<A>::scalar_type T;
T const a0=vec_traits<A>::template read_element<0>(a);
T const a1=vec_traits<A>::template read_element<1>(a);
T const a2=vec_traits<A>::template read_element<2>(a);
T const a3=vec_traits<A>::template read_element<3>(a);
T const m2=a0*a0+a1*a1+a2*a2+a3*a3;
if( m2==scalar_traits<typename vec_traits<A>::scalar_type>::value(0) )
BOOST_QVM_THROW_EXCEPTION(zero_magnitude_error());
T const rm=scalar_traits<T>::value(1)/sqrt<T>(m2);
vec_traits<A>::template write_element<0>(a)*=rm;
vec_traits<A>::template write_element<1>(a)*=rm;
vec_traits<A>::template write_element<2>(a)*=rm;
vec_traits<A>::template write_element<3>(a)*=rm;
}
namespace
sfinae
{
using ::boost::qvm::normalize;
}
namespace
qvm_detail
{
template <int D>
struct normalize_v_defined;
template <>
struct
normalize_v_defined<4>
{
static bool const value=true;
};
}
template <class A,class B>
BOOST_QVM_INLINE_OPERATIONS
typename lazy_enable_if_c<
vec_traits<A>::dim==4 && vec_traits<B>::dim==4,
deduce_scalar<typename vec_traits<A>::scalar_type,typename vec_traits<B>::scalar_type> >::type
dot( A const & a, B const & b )
{
typedef typename vec_traits<A>::scalar_type Ta;
typedef typename vec_traits<B>::scalar_type Tb;
typedef typename deduce_scalar<Ta,Tb>::type Tr;
Ta const a0=vec_traits<A>::template read_element<0>(a);
Ta const a1=vec_traits<A>::template read_element<1>(a);
Ta const a2=vec_traits<A>::template read_element<2>(a);
Ta const a3=vec_traits<A>::template read_element<3>(a);
Tb const b0=vec_traits<B>::template read_element<0>(b);
Tb const b1=vec_traits<B>::template read_element<1>(b);
Tb const b2=vec_traits<B>::template read_element<2>(b);
Tb const b3=vec_traits<B>::template read_element<3>(b);
Tr const dot=a0*b0+a1*b1+a2*b2+a3*b3;
return dot;
}
namespace
sfinae
{
using ::boost::qvm::dot;
}
namespace
qvm_detail
{
template <int D>
struct dot_vv_defined;
template <>
struct
dot_vv_defined<4>
{
static bool const value=true;
};
}
}
}
#endif