Chris@49: // Copyright (C) 2009-2012 NICTA (www.nicta.com.au) Chris@49: // Copyright (C) 2009-2012 Conrad Sanderson Chris@49: // Chris@49: // This Source Code Form is subject to the terms of the Mozilla Public Chris@49: // License, v. 2.0. If a copy of the MPL was not distributed with this Chris@49: // file, You can obtain one at http://mozilla.org/MPL/2.0/. Chris@49: Chris@49: Chris@49: //! \addtogroup glue_relational Chris@49: //! @{ Chris@49: Chris@49: Chris@49: Chris@49: #undef operator_rel Chris@49: #undef operator_str Chris@49: Chris@49: #undef arma_applier_mat Chris@49: #undef arma_applier_cube Chris@49: Chris@49: Chris@49: #define arma_applier_mat(operator_rel, operator_str) \ Chris@49: {\ Chris@49: const Proxy P1(X.A);\ Chris@49: const Proxy P2(X.B);\ Chris@49: \ Chris@49: arma_debug_assert_same_size(P1, P2, operator_str);\ Chris@49: \ Chris@49: const bool bad_alias = (Proxy::has_subview && P1.is_alias(out)) || (Proxy::has_subview && P2.is_alias(out));\ Chris@49: \ Chris@49: if(bad_alias == false)\ Chris@49: {\ Chris@49: \ Chris@49: const uword n_rows = P1.get_n_rows();\ Chris@49: const uword n_cols = P1.get_n_cols();\ Chris@49: \ Chris@49: out.set_size(n_rows, n_cols);\ Chris@49: \ Chris@49: uword* out_mem = out.memptr();\ Chris@49: \ Chris@49: const bool prefer_at_accessor = (Proxy::prefer_at_accessor || Proxy::prefer_at_accessor);\ Chris@49: \ Chris@49: if(prefer_at_accessor == false)\ Chris@49: {\ Chris@49: typename Proxy::ea_type A = P1.get_ea();\ Chris@49: typename Proxy::ea_type B = P2.get_ea();\ Chris@49: \ Chris@49: const uword n_elem = out.n_elem;\ Chris@49: \ Chris@49: for(uword i=0; i::stored_type> tmp1(P1.Q, P1.is_alias(out));\ Chris@49: const unwrap_check::stored_type> tmp2(P2.Q, P2.is_alias(out));\ Chris@49: \ Chris@49: out = (tmp1.M) operator_rel (tmp2.M);\ Chris@49: }\ Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: Chris@49: #define arma_applier_cube(operator_rel, operator_str) \ Chris@49: {\ Chris@49: const ProxyCube P1(X.A);\ Chris@49: const ProxyCube P2(X.B);\ Chris@49: \ Chris@49: arma_debug_assert_same_size(P1, P2, operator_str);\ Chris@49: \ Chris@49: const bool bad_alias = (ProxyCube::has_subview && P1.is_alias(out)) || (ProxyCube::has_subview && P2.is_alias(out));\ Chris@49: \ Chris@49: if(bad_alias == false)\ Chris@49: {\ Chris@49: \ Chris@49: const uword n_rows = P1.get_n_rows();\ Chris@49: const uword n_cols = P1.get_n_cols();\ Chris@49: const uword n_slices = P1.get_n_slices();\ Chris@49: \ Chris@49: out.set_size(n_rows, n_cols, n_slices);\ Chris@49: \ Chris@49: uword* out_mem = out.memptr();\ Chris@49: \ Chris@49: const bool prefer_at_accessor = (ProxyCube::prefer_at_accessor || ProxyCube::prefer_at_accessor);\ Chris@49: \ Chris@49: if(prefer_at_accessor == false)\ Chris@49: {\ Chris@49: typename ProxyCube::ea_type A = P1.get_ea();\ Chris@49: typename ProxyCube::ea_type B = P2.get_ea();\ Chris@49: \ Chris@49: const uword n_elem = out.n_elem;\ Chris@49: \ Chris@49: for(uword i=0; i::stored_type> tmp1(P1.Q);\ Chris@49: const unwrap_cube::stored_type> tmp2(P2.Q);\ Chris@49: \ Chris@49: out = (tmp1.M) operator_rel (tmp2.M);\ Chris@49: }\ Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: glue_rel_lt::apply Chris@49: ( Chris@49: Mat & out, Chris@49: const mtGlue& X Chris@49: ) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_applier_mat(<, "operator<"); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: glue_rel_gt::apply Chris@49: ( Chris@49: Mat & out, Chris@49: const mtGlue& X Chris@49: ) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_applier_mat(>, "operator>"); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: glue_rel_lteq::apply Chris@49: ( Chris@49: Mat & out, Chris@49: const mtGlue& X Chris@49: ) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_applier_mat(<=, "operator<="); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: glue_rel_gteq::apply Chris@49: ( Chris@49: Mat & out, Chris@49: const mtGlue& X Chris@49: ) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_applier_mat(>=, "operator>="); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: glue_rel_eq::apply Chris@49: ( Chris@49: Mat & out, Chris@49: const mtGlue& X Chris@49: ) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_applier_mat(==, "operator=="); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: glue_rel_noteq::apply Chris@49: ( Chris@49: Mat & out, Chris@49: const mtGlue& X Chris@49: ) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_applier_mat(!=, "operator!="); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // Chris@49: // Chris@49: // Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: glue_rel_lt::apply Chris@49: ( Chris@49: Cube & out, Chris@49: const mtGlueCube& X Chris@49: ) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_applier_cube(<, "operator<"); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: glue_rel_gt::apply Chris@49: ( Chris@49: Cube & out, Chris@49: const mtGlueCube& X Chris@49: ) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_applier_cube(>, "operator>"); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: glue_rel_lteq::apply Chris@49: ( Chris@49: Cube & out, Chris@49: const mtGlueCube& X Chris@49: ) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_applier_cube(<=, "operator<="); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: glue_rel_gteq::apply Chris@49: ( Chris@49: Cube & out, Chris@49: const mtGlueCube& X Chris@49: ) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_applier_cube(>=, "operator>="); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: glue_rel_eq::apply Chris@49: ( Chris@49: Cube & out, Chris@49: const mtGlueCube& X Chris@49: ) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_applier_cube(==, "operator=="); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: glue_rel_noteq::apply Chris@49: ( Chris@49: Cube & out, Chris@49: const mtGlueCube& X Chris@49: ) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arma_applier_cube(!=, "operator!="); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: #undef arma_applier_mat Chris@49: #undef arma_applier_cube Chris@49: Chris@49: Chris@49: Chris@49: //! @}