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