nmpp
tnmvec.h
1//------------------------------------------------------------------------
2//
3// $Workfile:: tnmvec. $
4//
5// Векторно-матричная библиотека
6//
7// Copyright (c) RC Module Inc.
8//
9// $Revision: 1.2 $ $Date: 2004/12/21 16:52:31 $
10//
19//------------------------------------------------------------------------
20#ifndef _TNMVEC_H_INCLUDED_
21#define _TNMVEC_H_INCLUDED_
22#ifdef __cplusplus
23
24#include <string.h>
25#include "tnmint.h"
26//#include "nmpl.h"
27
28
29//*****************************************************************************
48//*****************************************************************************
49
50
51
52template<class T> class nmvec
53{
54protected:
55 T* m_container;
56 int m_border;
57public:
58 int size;
59 T* m_data;
60
61 nmvec(void* Data, int Size, int Border=0):m_data((T*)Data),size(Size),m_container(0),m_border(Border)
62 {
63
64 };
65
66 nmvec(int Size, int Border=0):size(Size),m_border(Border)
67 {
68 m_container=new T[size+2*m_border];
69 m_data=m_container+m_border;
70 //tmalloc(m_container,size+2*m_border);
71// nmppsMalloc_64s(&m_container,size+2*m_border);
72// m_data=nmppsAddr_(m_container,m_border);
73 }
74
75 nmvec(const nmvec<T> &vec)
76 {
77 size=vec.size;
78 m_border=vec.m_border;
79 m_container=new T[size+2*m_border];
80 m_data=m_container+m_border;
81 memcpy(m_data,vec.m_data,size*sizeof(T));
82// nmppsMalloc_64s(&m_container,size+2*m_border);
83// m_data=nmppsAddr_(m_container,m_border);
84// nmppsCopy_(vec.m_data,m_data,size);
85 };
86
87
88 ~nmvec()
89 {
90 if (m_container)
91 //delete []m_container;
92// nmppsFree(m_container);
93 m_container=0;
94
95
96 }
97
98 inline nmvec<T>& operator= (const nmvec<T>& vec) // спец. добавил const - nmcpp ругается
99 {
100 ASSERTE(vec.size==size);
101 memcpy(m_data,vec.m_data,size*sizeof(T));
102// nmppsCopy_(vec.m_data,m_data,size);
103 return *this;
104 }
105
106 inline nmint<T>& operator [] (int idx)
107 {
108 ASSERTE(idx>=-m_border);
109 ASSERTE(idx<size+m_border);
110 nmint<T>* res=(nmint<T>*)(m_data+idx);
111 return *res;
112 }
113
114 template <class T2> nmvec<T2>& operator*= (const nmint<T2> val)
115 {
116 for(int idx=0;idx<size;idx++)
117 m_data[idx]*=val.m_value;
118 return (*this);
119 }
120
122
123 template <class T2> nmvec<T2> operator* (const nmint<T2>& val) const
124 {
125 nmvec<T2> res(size);
126 for(int idx=0;idx<size;idx++)
127 res.m_data[idx]=m_data[idx]*val.m_value;
128 return res;
129 }
130 template <class T2> nmint<T2> operator* (const nmvec<T2>& vec) const
131 {
132 ASSERTE(size==vec.size);
133 nmint<T2> res;
134 for (int idx=0;idx<size;idx++)
135 res.m_value+=m_data[idx]*vec.m_data[idx];
136 return res;
137 }
138
140
141 nmvec<T>& operator+= (const nmint<T> &val)
142 {
143 for(int idx=0;idx<size;idx++)
144 m_data[idx]+=val.m_value;
145 return (*this);
146 }
147
148 nmvec<T>& operator+= (const nmvec<T> &vec)
149 {
150 ASSERTE (vec.size==size);
151 for(int idx=0;idx<size;idx++)
152 m_data[idx]+=vec.m_data[idx];
153 return (*this);
154 }
155
157
158 nmvec<T> operator+ (const nmint<T>& val) const
159 {
160 nmvec<T> res(*this);
161 res+=val;
162 return res;
163 }
164
165 nmvec<T> operator+ (const nmvec<T>& vec) const
166 {
167 ASSERTE (vec.size==size);
168 nmvec<T> res(*this);
169 res+=vec;
170 return res;
171 }
173
174 nmvec<T>& operator-= (const nmint<T> &val)
175 {
176 for(int idx=0;idx<size;idx++)
177 m_data[idx]-=val.m_value;
178 return (*this);
179 }
180
181 nmvec<T>& operator-= (const nmvec<T> &vec)
182 {
183 ASSERTE (vec.size==size);
184 for(int idx=0;idx<size;idx++)
185 m_data[idx]-=vec.m_data[idx];
186 return (*this);
187 }
188
190
191 nmvec<T> operator- () const
192 {
193 nmvec<T> res(*this);
194 for(int idx=0;idx<size;idx++)
195 m_data[idx]=-m_data[idx];
196 return res;
197 }
198
199 nmvec<T> operator- (const nmint<T>& val) const
200 {
201 nmvec<T> res(*this);
202 res-=val;
203 return res;
204 }
205
206
207 nmvec<T> operator- (const nmvec<T>& vec) const
208 {
209 ASSERTE (vec.size==size);
210 nmvec <T> res(*this);
211 res-=vec;
212 return res;
213 }
214
216
217
218 nmvec<T>& operator/=(const nmint<T> val)
219 {
220 ASSERTE(val.m_value!=0);
221 for(int idx=0;idx<size;idx++)
222 m_data[idx]/=val.m_value;
223 return (*this);
224 }
225
227 nmvec<T> operator/ (const T val) const
228 {
229 nmvec<T> res(*this);
230 res/=val;
231 return res;
232 }
233
235 nmvec<T>& operator>>=(const int shr)
236 {
237 ASSERTE(shr>=0);
238 if (shr==0)
239 return(*this);
240 for(int idx=0;idx<size;idx++)
241 m_data[idx]>>=shr;
242 return (*this);
243 }
244
245 nmvec<T> operator>> (const int shr) const
246 {
247 ASSERTE(shr>=0);
248 nmvec<T> res(*this);
249 res>>=shr;
250 return res;
251 }
252
253 nmvec<T>& operator<<=(const int shl)
254 {
255 ASSERTE(shl>=0);
256 if (shl==0)
257 return(*this);
258 for(int idx=0;idx<size;idx++)
259 m_data[idx]<<=shl;
260 return (*this);
261 }
262
263 nmvec<T> operator<< (const int shl) const
264 {
265 ASSERTE(shl>=0);
266 nmvec<T> res(*this);
267 res<<=shl;
268 return res;
269 }
271 nmvec<T>& operator|= (const nmint<T> &val)
272 {
273 for(int idx=0;idx<size;idx++)
274 m_data[idx]|=val;
275 return (*this);
276 }
277
278 nmvec<T>& operator|= (const nmvec<T> &vec)
279 {
280 ASSERTE (vec.size==size);
281 for(int idx=0;idx<size;idx++)
282 m_data[idx]|=vec.m_data[idx];
283 return (*this);
284 }
285
287 nmvec<T> operator| (const nmint<T>& val) const
288 {
289 nmvec <T> res(*this);
290 res|=val;
291 return res;
292 }
293
294 nmvec<T> operator| (const nmvec<T>& vec) const
295 {
296 ASSERTE (vec.size==size);
297 nmvec <T> res(*this);
298 res-=vec;
299 return res;
300 }
301
303 nmvec<T>& operator&= (const nmint<T> &val)
304 {
305 for(int idx=0;idx<size;idx++)
306 m_data[idx]&=val;
307 return (*this);
308 }
309
310 nmvec<T>& operator&= (const nmvec<T> &vec)
311 {
312 ASSERTE (vec.size==size);
313 for(int idx=0;idx<size;idx++)
314 m_data[idx]&=vec.m_data[idx];
315 return (*this);
316 }
318 nmvec<T> operator& (const nmint<T>& val) const
319 {
320 nmvec <T> res(*this);
321 res&=val;
322 return res;
323 }
324
325 nmvec<T> operator& (const nmvec<T>& vec) const
326 {
327 ASSERTE (vec.size==size);
328 nmvec <T> res(*this);
329 res&=vec;
330 return res;
331 }
332
334 nmvec<T>& operator^= (const nmint<T> &val)
335 {
336 for(int idx=0;idx<size;idx++)
337 m_data[idx]^=val;
338 return (*this);
339 }
340
341 nmvec<T>& operator^= (const nmvec<T> &vec)
342 {
343 ASSERTE (vec.size==size);
344 for(int idx=0;idx<size;idx++)
345 m_data[idx]^=vec.m_data[idx];
346 return (*this);
347 }
348
350 nmvec<T> operator^ (const nmint<T>& val) const
351 {
352 nmvec <T> res(*this);
353 res^=val;
354 return res;
355 }
356
357 nmvec<T> operator^ (const nmvec<T>& vec) const
358 {
359 nmvec <T> res(*this);
360 res^=vec;
361 return res;
362 }
363
364
365 nmvec<T>& operator~ () const
366 {
367 nmvec<T> res(*this);
368 for(int idx=0;idx<size;idx++)
369 res.m_data[idx]=~m_data[idx];
370 return res;
371 }
372
373
374 bool operator== (const nmvec<T>& vec) const
375 {
376 ASSERTE (vec.size==size);
377 for(int idx=0;idx<size;idx++)
378 if (m_data[idx]!=vec.m_data[idx])
379 return false;
380 return true;
381
382 }
383
384 bool operator!= (const nmvec<T>& vec) const
385 {
386 ASSERTE (vec.size==size);
387 for(int idx=0;idx<size;idx++)
388 if (m_data[idx]==vec.m_data[idx])
389 return false;
390 return true;
391 }
392
393// template<class T2> void setetData(T2* Data)
394// {
395// for(int i=0;i<size;i++)
396// m_data[i]=Data[i];
397// }
398//
399// template<class T2> void GetData(T2* Data)
400// {
401// for(int i=0;i<size;i++)
402// Data[i]=(T2)m_data[i].value;
403// }
404 void set(const T& val)
405 {
406 nmppsSet_(m_data,val,size);
407 }
408
409 void reset()
410 {
411 memset(m_container,0,(size+2*m_border)*sizeof(T));
412 }
413
414};
415
416#ifdef __NM__
417#else
418typedef nmvec<char> nmvec8s;
419typedef nmvec<unsigned char> nmvec8u;
420
421typedef nmvec< short> nmvec16s;
422typedef nmvec<unsigned short> nmvec16u;
423#endif
424
425typedef nmvec<int> nmvec32s;
426typedef nmvec<long long> nmvec64s;
427
428typedef nmvec<unsigned int> nmvec32u;
429typedef nmvec<unsigned long long> nmvec64u;
430
431
432#endif
433#endif
Definition: tnmvecpack.h:138
Definition: tvector.h:80
__INLINE__ ostream & operator<<(ostream &s, mtr< unsigned char > &mtr)
Definition: nmtlio.h:64