0022904: Clean up sccsid variables
[occt.git] / src / Expr / Expr_PolyExpression.cxx
1 // Copyright:   Matra-Datavision 1991
2 // File:        Expr_PolyExpression.cxx
3 // Created:     Tue Apr 16 09:55:23 1991
4 // Author:      Arnaud BOUZY
5 //              <adn>
6
7 #include <Expr_PolyExpression.ixx>
8 #include <Expr_NamedUnknown.hxx>
9 #include <Expr_InvalidOperand.hxx>
10 #include <Standard_OutOfRange.hxx>
11 #include <Standard_DimensionMismatch.hxx>
12
13 Expr_PolyExpression::Expr_PolyExpression()
14 {
15 }
16
17 Standard_Integer Expr_PolyExpression::NbOperands () const
18 {
19   return myOperands.Length();
20 }
21
22 void Expr_PolyExpression::SetOperand (const Handle(Expr_GeneralExpression)& exp, const Standard_Integer index)
23 {
24   Handle(Expr_PolyExpression) me = this;
25   if (exp == me) {
26     Expr_InvalidOperand::Raise();
27   }
28   if (exp->Contains(me)) {
29     Expr_InvalidOperand::Raise();
30   }
31   myOperands(index) = exp;
32 }
33
34 void Expr_PolyExpression::AddOperand (const Handle(Expr_GeneralExpression)& exp)
35 {
36   myOperands.Append(exp);
37 }
38
39 void Expr_PolyExpression::RemoveOperand (const Standard_Integer index)
40 {
41   if (myOperands.Length() <= 2) {
42     Standard_DimensionMismatch::Raise();
43   }
44   myOperands.Remove(index);
45 }
46
47 Standard_Integer Expr_PolyExpression::NbSubExpressions () const
48 {
49   return NbOperands();
50 }
51
52 const Handle(Expr_GeneralExpression)& Expr_PolyExpression::SubExpression (const Standard_Integer I) const
53 {
54   return Operand(I);
55 }
56
57 Standard_Boolean Expr_PolyExpression::ContainsUnknowns () const 
58 {
59   Standard_Boolean found = Standard_False;
60   Standard_Integer nbop = NbOperands();
61   Standard_Integer i = 1;
62   Handle(Expr_GeneralExpression) expop;
63
64   while ((!found) && (i <= nbop)) {
65     expop = Operand(i);
66     found = expop->IsKind(STANDARD_TYPE(Expr_NamedUnknown));
67     i++;
68   }
69   i = 1;
70   while ((!found) && (i <= nbop)) {
71     expop = Operand(i);
72     found = expop->ContainsUnknowns();
73     i++;
74   }
75   return found;
76 }
77
78 Standard_Boolean Expr_PolyExpression::Contains (const Handle(Expr_GeneralExpression)& exp) const
79 {
80   Standard_Boolean found = Standard_False;
81   Standard_Integer nbop = NbOperands();
82   Standard_Integer i = 1;
83   Handle(Expr_GeneralExpression) expop;
84
85   while ((!found) && (i <= nbop)) {
86     expop = Operand(i);
87     found = (expop == exp);
88     i++;
89   }
90   i = 1;
91   while ((!found) && (i <= nbop)) {
92     expop = Operand(i);
93     found = expop->Contains(exp);
94     i++;
95   }
96   return found;
97 }
98
99 void Expr_PolyExpression::Replace (const Handle(Expr_NamedUnknown)& var, const Handle(Expr_GeneralExpression)& with)
100 {
101   Standard_Integer nbop = NbOperands();
102   Standard_Integer i;
103   Handle(Expr_GeneralExpression) expop;
104
105   for(i=1;i <= nbop; i++) {
106     expop = Operand(i);
107     if (expop == var) {
108       SetOperand(with,i);
109     }
110     else {
111       if (expop->Contains(var)) {
112         expop->Replace(var,with);
113       }
114     }
115   }
116 }
117
118
119 Handle(Expr_GeneralExpression) Expr_PolyExpression::Simplified() const
120 {
121   Handle(Expr_PolyExpression) cop = Handle(Expr_PolyExpression)::DownCast(Copy());
122   Standard_Integer i;
123   Standard_Integer max = cop->NbOperands();
124   Handle(Expr_GeneralExpression) op;
125   for (i=1; i<= max; i++) {
126     op = cop->Operand(i);
127     cop->SetOperand(op->Simplified(),i);
128   }
129   return cop->ShallowSimplified();
130 }
131