0031687: Draw Harness, ViewerTest - extend command vrenderparams with option updating...
[occt.git] / src / math / math_IntegerVector.hxx
1 // Copyright (c) 1997-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15 #ifndef _math_IntegerVector_HeaderFile
16 #define _math_IntegerVector_HeaderFile
17
18 #include <NCollection_Array1.hxx>
19 #include <NCollection_LocalArray.hxx>
20
21 // resolve name collisions with X11 headers
22 #ifdef Opposite
23   #undef Opposite
24 #endif
25
26 //! This class implements the real IntegerVector abstract data type.
27 //! IntegerVectors can have an arbitrary range which must be define at
28 //! the declaration and cannot be changed after this declaration.
29 //! Example:
30 //! @code
31 //!    math_IntegerVector V1(-3, 5); // an IntegerVector with range [-3..5]
32 //! @endcode
33 //!
34 //! IntegerVector is copied through assignement :
35 //! @code
36 //!    math_IntegerVector V2( 1, 9);
37 //!    ....
38 //!    V2 = V1;
39 //!    V1(1) = 2.0; // the IntegerVector V2 will not be modified.
40 //! @endcode
41 //!
42 //! The Exception RangeError is raised when trying to access outside
43 //! the range of an IntegerVector :
44 //! @code
45 //!    V1(11) = 0 // --> will raise RangeError;
46 //! @endcode
47 //!
48 //! The Exception DimensionError is raised when the dimensions of two
49 //! IntegerVectors are not compatible :
50 //! @code
51 //!    math_IntegerVector V3(1, 2);
52 //!    V3 = V1;    // --> will raise DimensionError;
53 //!    V1.Add(V3)  // --> will raise DimensionError;
54 //! @endcode
55 class math_IntegerVector
56 {
57 public:
58
59   DEFINE_STANDARD_ALLOC
60
61   //! contructs an IntegerVector in the range [Lower..Upper]
62   Standard_EXPORT math_IntegerVector(const Standard_Integer theFirst, const Standard_Integer theLast);
63
64   //! contructs an IntegerVector in the range [Lower..Upper]
65   //! with all the elements set to theInitialValue.
66   Standard_EXPORT math_IntegerVector(const Standard_Integer theFirst, const Standard_Integer theLast, const Standard_Integer theInitialValue);
67
68   //! Initialize an IntegerVector with all the elements
69   //! set to theInitialValue.
70   Standard_EXPORT void Init(const Standard_Integer theInitialValue);
71
72   //! constructs an IntegerVector in the range [Lower..Upper]
73   //! which share the "c array" theTab.
74   Standard_EXPORT math_IntegerVector(const Standard_Integer* theTab, const Standard_Integer theFirst, const Standard_Integer theLast);
75
76   //! constructs a copy for initialization.
77   //! An exception is raised if the lengths of the IntegerVectors
78   //! are different.
79   Standard_EXPORT math_IntegerVector(const math_IntegerVector& theOther);
80
81   //! returns the length of an IntegerVector
82   inline Standard_Integer Length() const
83   {
84     return Array.Length();
85   }
86
87   //! returns the value of the Lower index of an IntegerVector.
88   inline Standard_Integer Lower() const
89   {
90     return Array.Lower();
91   }
92
93   //! returns the value of the Upper index of an IntegerVector.
94   inline Standard_Integer Upper() const
95   {
96     return Array.Upper();
97   }
98
99   //! returns the value of the norm of an IntegerVector.
100   Standard_EXPORT Standard_Real Norm() const;
101
102   //! returns the value of the square of the norm of an IntegerVector.
103   Standard_EXPORT Standard_Real Norm2() const;
104
105   //! returns the value of the Index of the maximum element of an IntegerVector.
106   Standard_EXPORT Standard_Integer Max() const;
107
108   //! returns the value of the Index of the minimum element of an IntegerVector.
109   Standard_EXPORT Standard_Integer Min() const;
110
111   //! inverses an IntegerVector.
112   Standard_EXPORT void Invert();
113
114   //! returns the inverse IntegerVector of an IntegerVector.
115   Standard_EXPORT math_IntegerVector Inverse() const;
116
117   //! sets an IntegerVector from "theI1" to "theI2" to the IntegerVector "theV";
118   //! An exception is raised if "theI1" is less than "LowerIndex" or "theI2" is greater than "UpperIndex" or "theI1" is greater than "theI2".
119   //! An exception is raised if "theI2-theI1+1" is different from the Length of "theV".
120   Standard_EXPORT void Set(const Standard_Integer theI1, const Standard_Integer theI2, const math_IntegerVector& theV);
121
122   //! slices the values of the IntegerVector between "theI1" and "theI2":
123   //! Example: [2, 1, 2, 3, 4, 5] becomes [2, 4, 3, 2, 1, 5] between 2 and 5.
124   //! An exception is raised if "theI1" is less than "LowerIndex" or "theI2" is greater than "UpperIndex".
125   Standard_EXPORT math_IntegerVector Slice(const Standard_Integer theI1, const Standard_Integer theI2) const;
126
127   //! returns the product of an IntegerVector by an integer value.
128   Standard_EXPORT void Multiply(const Standard_Integer theRight);
129
130   void operator *=(const Standard_Integer theRight)
131   {
132     Multiply(theRight);
133   }
134
135   //! returns the product of an IntegerVector by an integer value.
136   Standard_NODISCARD Standard_EXPORT math_IntegerVector Multiplied(const Standard_Integer theRight) const;
137
138   Standard_NODISCARD math_IntegerVector operator*(const Standard_Integer theRight) const
139   {
140     return Multiplied(theRight);
141   }
142
143   //! returns the product of a vector and a real value.
144   Standard_NODISCARD Standard_EXPORT math_IntegerVector TMultiplied(const Standard_Integer theRight) const;
145
146   friend inline math_IntegerVector operator* (const Standard_Integer theLeft, const math_IntegerVector& theRight)
147   {
148     return theRight.Multiplied(theLeft);
149   }
150
151   //! adds the IntegerVector "theRight" to an IntegerVector.
152   //! An exception is raised if the IntegerVectors have not the same length.
153   //! An exception is raised if the lengths are not equal.
154   Standard_EXPORT void Add(const math_IntegerVector& theRight);
155
156   void operator +=(const math_IntegerVector& theRight)
157   {
158     Add(theRight);
159   }
160
161   //! adds the IntegerVector "theRight" to an IntegerVector.
162   //! An exception is raised if the IntegerVectors have not the same length.
163   //! An exception is raised if the lengths are not equal.
164   Standard_NODISCARD Standard_EXPORT math_IntegerVector Added(const math_IntegerVector& theRight) const;
165
166   Standard_NODISCARD math_IntegerVector operator+(const math_IntegerVector& theRight) const
167   {
168     return Added(theRight);
169   }
170
171   //! sets an IntegerVector to the sum of the IntegerVector
172   //! "theLeft" and the IntegerVector "theRight".
173   //! An exception is raised if the lengths are different.
174   Standard_EXPORT void Add(const math_IntegerVector& theLeft, const math_IntegerVector& theRight);
175
176   //! sets an IntegerVector to the substraction of "theRight" from "theLeft".
177   //! An exception is raised if the IntegerVectors have not the same length.
178   Standard_EXPORT void Subtract(const math_IntegerVector& theLeft, const math_IntegerVector& theRight);
179
180   //! accesses the value of index theNum of an IntegerVector.
181   const Standard_Integer& Value (const Standard_Integer theNum) const
182   {
183     return Array(theNum);
184   }
185
186   //! accesses (in read or write mode) the value of index theNum of an IntegerVector.
187   inline Standard_Integer& Value (const Standard_Integer theNum)
188   {
189     return Array(theNum);
190   }
191
192   const Standard_Integer& operator()(const Standard_Integer theNum) const
193   {
194     return Value(theNum);
195   }
196
197   Standard_Integer& operator()(const Standard_Integer theNum)
198   {
199     return Value(theNum);
200   }
201
202   //! Initialises an IntegerVector by copying "theOther".
203   //! An exception is raised if the Lengths are different.
204   Standard_EXPORT math_IntegerVector& Initialized(const math_IntegerVector& theOther);
205
206   math_IntegerVector& operator=(const math_IntegerVector& theOther) 
207   {
208     return Initialized(theOther);
209   }
210
211   //! returns the inner product of 2 IntegerVectors.
212   //! An exception is raised if the lengths are not equal.
213   Standard_NODISCARD Standard_EXPORT Standard_Integer Multiplied(const math_IntegerVector& theRight) const;
214
215   Standard_NODISCARD Standard_Integer operator*(const math_IntegerVector& theRight) const
216   {
217     return Multiplied(theRight);
218   }
219
220   //! returns the opposite of an IntegerVector.
221   Standard_EXPORT math_IntegerVector Opposite();
222
223   math_IntegerVector operator-()
224   {
225     return Opposite();
226   }
227
228   //! returns the subtraction of "theRight" from "me".
229   //! An exception is raised if the IntegerVectors have not the same length.
230   Standard_EXPORT void Subtract(const math_IntegerVector& theRight);
231
232   void operator-=(const math_IntegerVector& theRight)
233   {
234     Subtract(theRight);
235   }
236
237   //! returns the subtraction of "theRight" from "me".
238   //! An exception is raised if the IntegerVectors have not the same length.
239   Standard_NODISCARD Standard_EXPORT math_IntegerVector Subtracted(const math_IntegerVector& theRight) const;
240
241   Standard_NODISCARD math_IntegerVector operator-(const math_IntegerVector& theRight) const
242   {
243     return Subtracted(theRight);
244   }
245
246   //! returns the multiplication of an integer by an IntegerVector.
247   Standard_EXPORT void Multiply(const Standard_Integer theLeft,const math_IntegerVector& theRight);
248
249   //! Prints on the stream theO information on the current state of the object.
250   //! Is used to redefine the operator <<.
251   Standard_EXPORT void Dump(Standard_OStream& theO) const;
252
253   friend inline Standard_OStream& operator<<(Standard_OStream& theO, const math_IntegerVector& theVec)
254   {
255     theVec.Dump(theO);
256     return theO;
257   }
258
259 protected:
260
261   //! is used internally to set the Lower value of the IntegerVector.
262   void SetFirst(const Standard_Integer theFirst);
263
264 private:
265
266   NCollection_LocalArray<Standard_Integer, 512> myLocArray;
267   NCollection_Array1<Standard_Integer> Array;
268
269 };
270
271 #endif
272