-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcompositematrix.cpp
More file actions
90 lines (66 loc) · 2.32 KB
/
compositematrix.cpp
File metadata and controls
90 lines (66 loc) · 2.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include "compositematrix.h"
#include <iostream>
#include <string>
#include <sstream>
//! Luodaan uusi CompositeMatrix
//! op1 ja op2 ovat vapaamuotoisia neliömatriiseja
//! opr on +, - tai * operaatio
//! ops on matematiikkaoperaation symboli
CompositeSquareMatrix::CompositeSquareMatrix(const SquareMatrix& op1, const SquareMatrix& op2, const std::function<ConcreteSquareMatrix(const ConcreteSquareMatrix&, const ConcreteSquareMatrix&)>& opr, char ops){
if(ops == '+' || ops == '-' || ops == '*'){
op_sym = ops;
}
else{throw std::invalid_argument("Symboli täytyy olla +, - tai *");}
oprnd1 = std::shared_ptr<SquareMatrix>(op1.clone());
oprnd2 = std::shared_ptr<SquareMatrix>(op2.clone());
oprtor = opr;
}
//! Luodaan uusi matriisi joka on samanlainen kuin parametriolio
CompositeSquareMatrix::CompositeSquareMatrix(const CompositeSquareMatrix& m){
oprnd1 = m.oprnd1;
oprnd2 = m.oprnd2;
oprtor = m.oprtor;
op_sym = m.op_sym;
}
//! Siirretään parametrin tiedot toiseen olioon
//! Parametrinä annettu matriisi muuttuu tyhjäksi
CompositeSquareMatrix::CompositeSquareMatrix(CompositeSquareMatrix&& m){
oprnd1 = std::move(m.oprnd1);
oprnd2 = std::move(m.oprnd2);
oprtor = std::move(m.oprtor);
op_sym = std::move(m.op_sym);
}
//! Kopiointioperaattori
CompositeSquareMatrix& CompositeSquareMatrix::operator=(const CompositeSquareMatrix& m){
oprnd1 = m.oprnd1;
oprnd2 = m.oprnd2;
oprtor = m.oprtor;
op_sym = m.op_sym;
return *this;
}
//! Moveoperaattori
CompositeSquareMatrix& CompositeSquareMatrix::operator=(CompositeSquareMatrix&& m){
oprnd1 = std::move(m.oprnd1);
oprnd2 = std::move(m.oprnd2);
oprtor = std::move(m.oprtor);
op_sym = std::move(m.op_sym);
return *this;
}
//! Luo pointterin oliosta
SquareMatrix* CompositeSquareMatrix::clone() const{
return new CompositeSquareMatrix(*this);
}
//! Tulostaa olion sisällön
void CompositeSquareMatrix::print(std::ostream& os) const{
os << toString();
}
//! Muuttaa olion sisällön stringiksi
std::string CompositeSquareMatrix::toString() const{
std::stringstream ss;
ss << '(' << *oprnd1 << op_sym << *oprnd2 << ')';
return ss.str();
}
//! Evaluoi operandit ja palauttaa niillä lasketun operaation tuloksen
ConcreteSquareMatrix CompositeSquareMatrix::evaluate(const Valuation& v)const{
return oprtor(oprnd1->evaluate(v), oprnd2->evaluate(v));
}