From bbcdd15a1144c3c17dc51e4b3fa4a7d58ba16c43 Mon Sep 17 00:00:00 2001 From: rexy712 Date: Sat, 15 Aug 2020 14:04:08 -0700 Subject: [PATCH] Fix standard compliance with matrix class --- include/detail/math.hpp | 18 +++++++++++ include/detail/matrix.hpp | 66 +++++++++++++++++++++++++-------------- include/mat.hpp | 52 +++++++++++++++--------------- 3 files changed, 86 insertions(+), 50 deletions(-) diff --git a/include/detail/math.hpp b/include/detail/math.hpp index 5423df9..f5997bf 100644 --- a/include/detail/math.hpp +++ b/include/detail/math.hpp @@ -1,3 +1,21 @@ +/** + This file is a part of the rexy/r0nk/atlas project + Copyright (C) 2020 rexy712 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + #ifndef REXY_DETAIL_MATH_HPP #define REXY_DETAIL_MATH_HPP diff --git a/include/detail/matrix.hpp b/include/detail/matrix.hpp index ec7e492..f4c471c 100644 --- a/include/detail/matrix.hpp +++ b/include/detail/matrix.hpp @@ -1,3 +1,21 @@ +/** + This file is a part of the rexy/r0nk/atlas project + Copyright (C) 2020 rexy712 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + #ifndef REXY_DETAIL_MATRIX_HPP #define REXY_DETAIL_MATRIX_HPP @@ -7,48 +25,48 @@ namespace math::detail{ template - struct gen_id_tup{ + struct gen_id_tup { using tup = typename gen_id_tup::tup; }; template - struct gen_id_tup{ + struct gen_id_tup { using tup = typename gen_id_tup::tup; }; template - struct gen_id_tup{ + struct gen_id_tup { using tup = typename gen_id_tup::tup; }; template - struct gen_id_tup{ + struct gen_id_tup { using tup = std::integer_sequence; }; template - struct gen_zero_tup{ + struct gen_zero_tup { using tup = typename gen_zero_tup::tup; }; template - struct gen_zero_tup<0,Args...>{ + struct gen_zero_tup<0,Args...> { using tup = std::integer_sequence; }; template - struct id_initialization_matrix{ + struct id_initialization_matrix { using tuple = typename gen_id_tup::tup; }; template - struct default_initialization_matrix{ + struct default_initialization_matrix { using tuple = typename gen_zero_tup::tup; }; template - struct default_initialization_matrix{ + struct default_initialization_matrix { using tuple = typename id_initialization_matrix::tuple; }; - template + template class mat_ref_obj { public: @@ -68,7 +86,7 @@ namespace math::detail{ } }; - template + template class matrix_base { static_assert(W > 0, "Cannot have 0 columns matrix"); @@ -94,14 +112,14 @@ namespace math::detail{ public: //Default construct as identity when square, zero otherwise - constexpr matrix_base(void): + constexpr matrix_base(): matrix_base(typename detail::default_initialization_matrix::tuple{}){} //Range initializing constructors constexpr explicit matrix_base(zero_initialize_t): m_data{}{} constexpr explicit matrix_base(no_initialize_t){} - template + template constexpr explicit matrix_base(id_initialize_t): matrix_base() { @@ -113,23 +131,23 @@ namespace math::detail{ for(size_type i = 0;i < Columns*Rows;++i) m_data[i] = v; } - template + template constexpr explicit matrix_base(Args&&... args): m_data{std::forward(args)...}{} //Copying constructors constexpr matrix_base(const matrix_base&) = default; constexpr matrix_base(matrix_base&&) = default; - template + template constexpr matrix_base(const matrix_base& m){ using mat = decltype(m); for(typename mat::size_type i = 0;i < mat::Columns*mat::Rows;++i) m_data[i] = m.get(i); } - ~matrix_base(void) = default; + ~matrix_base() = default; //Assignement - template + template constexpr matrix_base& operator=(const matrix_base& m){ using mat = decltype(m); for(typename mat::size_type i = 0;i < mat::Columns*mat::Rows;++i) @@ -160,26 +178,26 @@ namespace math::detail{ return m_data[i]; } - constexpr size_type columns(void)const{ + constexpr size_type columns()const{ return Columns; } - constexpr size_type rows(void)const{ + constexpr size_type rows()const{ return Rows; } - constexpr size_type size(void)const{ + constexpr size_type size()const{ return Columns*Rows; } - constexpr pointer raw(void){ + constexpr pointer raw(){ return m_data; } - constexpr const_pointer raw(void)const{ + constexpr const_pointer raw()const{ return m_data; } - constexpr operator pointer(void){ + constexpr operator pointer(){ return m_data; } - constexpr operator const_pointer(void)const{ + constexpr operator const_pointer()const{ return m_data; } diff --git a/include/mat.hpp b/include/mat.hpp index 1446265..ccc97aa 100644 --- a/include/mat.hpp +++ b/include/mat.hpp @@ -28,7 +28,7 @@ namespace math{ - template + template class matrix : public detail::matrix_base { private: @@ -45,7 +45,7 @@ namespace math{ using detail::matrix_base::operator=; }; - template + template class matrix : public detail::matrix_base { private: @@ -61,13 +61,13 @@ namespace math{ using detail::matrix_base::matrix_base; using detail::matrix_base::operator=; - template + template static constexpr matrix rotation(value_type angle){ value_type c = std::cos(angle); value_type s = std::sin(angle); return rotation(s, c); } - template + template static constexpr matrix rotation(value_type sin, value_type cos){ return matrix(cos, -sin, 0, sin, cos, 0, @@ -80,9 +80,9 @@ namespace math{ namespace detail{ - template - struct is_matrix_helper{ - template + template + struct is_matrix_helper { + template static std::true_type test(matrix*); static std::false_type test(void*); @@ -91,28 +91,28 @@ namespace math{ } - template - struct is_matrix{ + template + struct is_matrix { static constexpr bool value = (detail::is_matrix_helper::value && ...); }; namespace detail{ - template - struct are_same_size_matrix{ + template + struct are_same_size_matrix { using l = std::decay_t; using r = std::decay_t; static constexpr bool value = is_matrix::value && l::Columns == r::Columns && l::Rows == r::Rows; }; - template + template using enable_if_matrix = std::enable_if_t::value,int>; - template + template using enable_if_eq_matrix = std::enable_if_t::value,int>; } - template + template constexpr bool operator==(const matrix& left, const matrix right){ for(size_t i = 0;i < left.size();++i){ if(left.get(i) != right.get(i)) @@ -120,12 +120,12 @@ namespace math{ } return true; } - template + template constexpr bool operator!=(const matrix& left, const matrix right){ return !(left == right); } - template + template constexpr auto operator*(const matrix& left, const matrix& right){ using res_t = decltype(std::declval() * std::declval()); matrix res(no_initialize); @@ -140,7 +140,7 @@ namespace math{ } return res; } - template + template constexpr auto operator*(const matrix& left, U&& right){ using res_t = decltype(std::declval() * std::declval()); matrix res(no_initialize); @@ -149,7 +149,7 @@ namespace math{ } return res; } - template + template constexpr auto operator/(const matrix& left, U&& right){ using res_t = decltype(std::declval() / std::declval()); matrix res(no_initialize); @@ -158,7 +158,7 @@ namespace math{ } return res; } - template + template constexpr auto operator+(const matrix& left, const matrix& right){ using res_t = decltype(std::declval() + std::declval()); matrix res(no_initialize); @@ -167,7 +167,7 @@ namespace math{ } return res; } - template + template constexpr auto operator-(const matrix& left, const matrix& right){ using res_t = decltype(std::declval() - std::declval()); matrix res(no_initialize); @@ -176,7 +176,7 @@ namespace math{ } return res; } - template + template constexpr auto operator-(const matrix& left){ using res_t = decltype(std::declval() - std::declval()); matrix res(no_initialize); @@ -187,34 +187,34 @@ namespace math{ } - template + template constexpr decltype(auto) operator*=(matrix& left, const matrix& right){ //have to evaluate entire expression first since matrix multiplication depends on reusing many elements //cannot be expression templatized, TODO return (left = (left * right)); } - template + template constexpr decltype(auto) operator*=(matrix& left, U&& right){ for(size_t i = 0;i < left.size();++i){ left.get(i) = left.get(i) * std::forward(right); } return left; } - template + template constexpr decltype(auto) operator/=(matrix& left, U&& right){ for(size_t i = 0;i < left.size();++i){ left.get(i) = left.get(i) / std::forward(right); } return left; } - template + template constexpr decltype(auto) operator+=(matrix& left, const matrix& right){ for(size_t i = 0;i < left.size();++i){ left.get(i) = left.get(i) + right.get(i); } return left; } - template + template constexpr decltype(auto) operator-=(matrix& left, const matrix& right){ for(size_t i = 0;i < left.size();++i){ left.get(i) = left.get(i) - right.get(i);