8 #ifndef DXLE_INC_BASIC_TYPES_point3d3D_HPP_ 9 #define DXLE_INC_BASIC_TYPES_point3d3D_HPP_ 25 #include <type_traits> 97 template<typename T, enable_if_t<std::is_nothrow_move_constructible<T>::value && std::is_nothrow_move_assignable<T>::value, nullptr_t> =
nullptr>
122 this->x = std::move(r.x);
123 this->y = std::move(r.y);
124 this->z = std::move(r.z);
140 return{
static_cast<Tp2_
>(this->
x), static_cast<Tp2_>(this->y),
static_cast<Tp2_
>(this->
z) };
144 template<
typename Tp2_>
explicit operator std::tuple<Tp2_, Tp2_, Tp2_>()
const DXLE_NOEXCEPT_IF_EXPR(static_cast<Tp2_>(std::declval<value_type>()))
146 return std::forward_as_tuple(static_cast<Tp2_>(this->x), static_cast<Tp2_>(this->y), static_cast<Tp2_>(this->z));
162 return { std::get<0>(p), std::get<1>(p), std::get<2>(p) };
175 return point3d_c<T>(std::move(std::get<0>(p)), std::move(std::get<1>(p)), std::move(std::get<2>(p)));
180 template<
typename CharType,
typename po
int3dType>
184 os << static_cast<use_big_type_when_one_byte_p>(p.
x) << str << static_cast<use_big_type_when_one_byte_p>(p.
y) << str << static_cast<use_big_type_when_one_byte_p>(p.
z);
186 template<
typename CharType,
typename po
int3dType>
191 is.ignore((std::numeric_limits<std::streamsize>::max)(), dxle::char_constant::comma<CharType>());
193 is.ignore((std::numeric_limits<std::streamsize>::max)(), dxle::char_constant::comma<CharType>());
195 p.
x =
static_cast<point3dType
>(
x); p.
y =
static_cast<point3dType
>(
y); p.
z =
static_cast<point3dType
>(
z);
209 template<
typename T> std::ostream& operator<<(std::ostream& os, const point3d_c<T>& p)
211 dxle::detail::ostream_operator_helper<char, T>(os,
", ", p);
225 template<
typename T> std::wostream& operator<<(std::wostream& os, const point3d_c<T>& p)
227 dxle::detail::ostream_operator_helper<wchar_t, T>(os, L
", ", p);
243 dxle::detail::istream_operator_helper<char, T>(is, p);
259 dxle::detail::istream_operator_helper<wchar_t, T>(is, p);
272 template <
typename T>
275 return { -r.x, -r.y, -r.z };
287 template <
typename T>
299 template <
typename T>
313 template <typename T1, typename T2, enable_if_t<is_representable<T2, T1>::value, nullptr_t> =
nullptr>
333 template <typename T1, typename T2, enable_if_t<is_representable<T2, T1>::value, nullptr_t> =
nullptr>
353 template <
typename T1,
typename T2>
355 ->point3d_c<decltype(std::declval<std::remove_cv_t<T1>>() + std::declval<std::remove_cv_t<T2>>())>
357 return { l.
x + r.
x, l.
y + r.
y, l.
z + r.
z };
371 template <
typename T1,
typename T2>
373 ->point3d_c<decltype(std::declval<std::remove_cv_t<T1>>() - std::declval<std::remove_cv_t<T2>>())>
375 return { l.
x - r.
x, l.
y - r.
y, l.
z - r.
z };
389 template <
typename T1,
typename T2>
391 ->point3d_c<decltype(std::declval<std::remove_cv_t<T1>>() * std::declval<std::remove_cv_t<T2>>())>
393 return { l.
x * r, l.
y * r, l.
z * r };
407 template <
typename T1,
typename T2>
409 ->point3d_c<decltype(std::declval<std::remove_cv_t<T1>>() * std::declval<std::remove_cv_t<T2>>())>
411 return { l * r.
x, l * r.
y, l * r.
z };
425 template <typename T1, typename T2, enable_if_t<is_representable<T2, T1>::value, nullptr_t> =
nullptr>
445 template <
typename T1,
typename T2>
447 ->point3d_c<decltype(std::declval<std::remove_cv_t<T1>>() - std::declval<std::remove_cv_t<T2>>())>
449 return { l.
x / r, l.
y / r, l.
z / r};
463 template <typename T1, typename T2, enable_if_t<is_representable<T2, T1>::value, nullptr_t> =
nullptr>
483 template <
typename T>
486 return (l.
x != r.
x) || (l.
y != r.
y) || (l.
z != r.
z);
502 template <
typename T>
505 return !
static_cast<bool>(p);
521 template <
typename T>
524 return !
static_cast<bool>(p);
538 template <typename T, enable_if_t<std::is_arithmetic<T>::value, nullptr_t> =
nullptr>
554 template <
typename T>
557 return !
static_cast<bool>(p);
573 template <
typename T>
576 return !
static_cast<bool>(p);
606 template<
typename T1,
typename T2>
608 -> decltype(std::declval<std::remove_cv_t<T1>>() * std::declval<std::remove_cv_t<T2>>())
610 return p1.x * p2.x + p1.y * p2.y + p1.z * p2.z;
624 template<
typename T1,
typename T2>
626 ->point3d_c<decltype(std::declval<std::remove_cv_t<T1>>() * std::declval<std::remove_cv_t<T2>>())>
629 return { p1.y * p2.z - p1.z * p2.y, p1.z * p2.x - p1.x * p2.z, p1.x * p2.y - p1.y * p2.x };
643 template<
typename T1,
typename T2>
655 #endif //DXLE_INC_BASIC_TYPES_point3d3D_HPP_ point3d_c< std::uint8_t > point3du8i
void ostream_operator_helper(std::basic_ostream< CharType > &os, const CharType *str, const point3d_c< point3dType > &p)
DXLE_CONSTEXPR point3d_c(const point3d_c< value_type > &o) DXLE_NOEXCEPT_IF((std
DXLE_CONSTEXPR point3d_c(const value_type &x_, const value_type &y_, const value_type &z_) DXLE_NOEXCEPT_IF((std
point_c< T1 > T2 DXLE_CONSTEXPR auto dot(const point_c< T1 > &p1, const point_c< T2 > &p2) DXLE_NOEXCEPT_IF_EXPR(p1.x *p2.x+p1.y *p2.y) -> decltype(std::declval< std::remove_cv_t< T1 >>() *std::declval< std::remove_cv_t< T2 >>())
DXLE_CONSTEXPR point3d_c() DXLE_NOEXCEPT_IF(std
point3d_c< double > point3dd
DXLE_CONSTEXPR const point3d_c< T > & operator+(const point3d_c< T > &r) DXLE_NOEXCEPT_IF(std
Overload of unary operator +.
DXLE_CONSTEXPR int abs(int j) DXLE_NOEXCEPT_OR_NOTHROW
DXLE_CONSTEXPR bool operator_bool_helper(const T &first, const T &second) DXLE_NOEXCEPT_IF_EXPR(dxle
point_c< T1 > T2 DXLE_CONSTEXPR auto operator/(const point_c< T1 > &l, T2 r) DXLE_NOEXCEPT_IF_EXPR(l.x/r) -> point_c< decltype(std::declval< std::remove_cv_t< T1 >>()/std::declval< std::remove_cv_t< T2 >>())>
point3d_c & operator=(point3d_c< value_type > &&r) DXLE_NOEXCEPT_OR_NOTHROW
DXLE_CONSTEXPR auto cross(const point3d_c< T1 > &p1, const point3d_c< T2 > &p2) DXLE_NOEXCEPT_IF_EXPR(std
Computes a cross-product of two point3d_c value as vectors.
typename use_big_type_when_one_byte< T >::type use_big_type_when_one_byte_t
for int8_t/uint8_t
DXLE_CONSTEXPR point3d_c(value_type &&x_, value_type &&y_, value_type &&z_) DXLE_NOEXCEPT_OR_NOTHROW
distance_result_type_t< T1, T2 > distance(const point3d_c< T1 > &p1, const point3d_c< T2 > &p2) DXLE_NOEXCEPT_IF_EXPR(hypot(safe_dist(std
Calculate the distance of the two point3d_c class object based on the Pythagorean theorem(std::hypot)...
point3d_c< int > point3di
point3d_c & operator=(const point3d_c< value_type > &r) DXLE_NOEXCEPT_IF((std
point3d_c< T1 > & operator/=(point3d_c< T1 > &l, T2 r) DXLE_NOEXCEPT_IF_EXPR(l.x/
Overload of binary operator /=.
#define DXLE_NOEXCEPT_IF_EXPR(EXPR)
Template class for 3D points specified by its coordinates x and y.
DXLE_CONSTEXPR point3d_c< T > operator-(const point3d_c< T > &r) DXLE_NOEXCEPT_IF_EXPR(-std
Overload of unary operator -.
DXLE_CONSTEXPR auto safe_dist(const T1 &n1, const T2 &n2) DXLE_NOEXCEPT_IF_EXPR((n1 - n2)) -> decltype(n1 - n2)
DXLE_CONSTEXPR point3d_c(point3d_c< value_type > &&o) DXLE_NOEXCEPT_OR_NOTHROW
void istream_operator_helper(std::basic_istream< CharType > &is, point3d_c< point3dType > &p)
point3d_c< T > make_point3d_c(const std::tuple< T, T, T > &p) DXLE_NOEXCEPT_IF(std
conversion from std::tuple
#define DXLE_NOEXCEPT_IF(COND)
point3d_c< T > make_point3d_c(std::tuple< T, T, T > &&p) DXLE_NOEXCEPT_OR_NOTHROW
conversion from std::tuple
point3d_c< float > point3df
#define DXLE_NOEXCEPT_OR_NOTHROW
DXLE_CONSTEXPR auto operator*(const point3d_c< T1 > &l, T2 r) DXLE_NOEXCEPT_IF_EXPR(l.x *r) -> point3d_c< decltype(std::declval< std::remove_cv_t< T1 >>() *std::declval< std::remove_cv_t< T2 >>())>
Overload of binary operator *.
std::wistream & operator>>(std::wistream &is, point3d_c< T > &p)
istream operator
typename distance_result_type< T1, T2 >::type distance_result_type_t
std::istream & operator>>(std::istream &is, point3d_c< T > &p)
istream operator
point3d_c< T1 > & operator+=(point3d_c< T1 > &l, const point3d_c< T2 > &r) DXLE_NOEXCEPT_IF_EXPR(l.x+
Overload of binary operator +=.
point3d_c< std::int8_t > point3d8i
point3d_c< T1 > & operator*=(point3d_c< T1 > &l, T2 r) DXLE_NOEXCEPT_IF_EXPR(l.x *
Overload of binary operator *=.