1 // SPDX-License-Identifier: Apache-2.0
2 //
3 // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
4 // Copyright 2008-2016 National ICT Australia (NICTA)
5 //
6 // Licensed under the Apache License, Version 2.0 (the "License");
7 // you may not use this file except in compliance with the License.
8 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 // ------------------------------------------------------------------------
17 
18 
19 //! \addtogroup SpToDOp
20 //! @{
21 
22 
23 
24 //! Class for storing data required for delayed unary operations on a sparse
25 //! matrix that produce a dense matrix; the data for storage may include
26 //! the operand (eg. the matrix to which the operation is to be applied) and the unary operator (eg. inverse).
27 //! The operand is stored as a reference (which can be optimised away),
28 //! while the operator is "stored" through the template definition (op_type).
29 //! The operands can be 'SpMat', 'SpRow', 'SpCol', 'SpOp', and 'SpGlue'.
30 //! Note that as 'SpGlue' can be one of the operands, more than one matrix can be stored.
31 //!
32 //! For example, we could have:
33 //! SpToDOp< SpGlue< SpMat, SpMat, sp_glue_times >, op_sp_plus >
34 
35 template<typename T1, typename op_type>
36 class SpToDOp : public Base< typename T1::elem_type, SpToDOp<T1, op_type> >
37   {
38   public:
39 
40   typedef typename T1::elem_type                   elem_type;
41   typedef typename get_pod_type<elem_type>::result pod_type;
42 
43   inline explicit SpToDOp(const T1& in_m);
44   inline          SpToDOp(const T1& in_m, const elem_type in_aux);
45   inline         ~SpToDOp();
46 
47   arma_aligned const T1&       m;            //!< the operand; must be derived from SpBase
48   arma_aligned       elem_type aux;          //!< auxiliary data, using the element type as used by T1
49 
50   static constexpr bool is_row  = op_type::template traits<T1>::is_row;
51   static constexpr bool is_col  = op_type::template traits<T1>::is_col;
52   static constexpr bool is_xvec = op_type::template traits<T1>::is_xvec;
53   };
54 
55 
56 
57 //! @}
58