nmpp
tnmvecpack.h
1//------------------------------------------------------------------------
2//
3// $Workfile:: tnmvec. $
4//
5// Векторно-матричная библиотека
6//
7// Copyright (c) RC Module Inc.
8//
9// $Revision: 1.1 $ $Date: 2004/11/22 13:50:17 $
10//
19//------------------------------------------------------------------------
20#ifndef _TNMVECPACK_H_INCLUDED_
21#define _TNMVECPACK_H_INCLUDED_
22
23#include <string.h>
24#include "tnmint.h"
25#include "nmpl.h"
26
27
28template <class T> class nmintpack
29{
30public:
31 T *m_container;
32 int m_disp;
33 nmintpack(T* base,int idx)
34 {
35 m_container=base;//(T*)((int*)(base)+intdisp(idx));
36 m_disp=idx;//bitdisp(idx);
37 }
38
39 nmintpack<T>& operator= (const nmintpack<T>& val)
40 {
41 int n=val;
42 nmppsPut_((T*)m_container,m_disp,n);
43 return (*this);
44 }
45
46 nmintpack<T>& operator= (const int& val)
47 {
48 nmppsPut_((T*)m_container,m_disp,val);
49 return (*this);
50 }
51
52 operator int (void) const
53 {
54
55 int n;
56 n=nmppsGetVal_((T*)m_container,m_disp);
57 return n;//get();
58 }
59
60
61 __INLINE__ int intdisp(int indx);
62 __INLINE__ int bitdisp(int indx);
63};
64
65__INLINE__ int nmintpack<nm1>::intdisp(int indx)
66{
67 return indx>>5;
68}
69
70__INLINE__ int nmintpack<nm2s>::intdisp(int indx)
71{
72 return indx>>4;
73}
74
75__INLINE__ int nmintpack<nm4s>::intdisp(int indx)
76{
77 return indx>>3;
78}
79
80__INLINE__ int nmintpack<nm8s>::intdisp(int indx)
81{
82 return indx>>2;
83}
84
85__INLINE__ int nmintpack<nm16s>::intdisp(int indx)
86{
87 return indx>>1;
88}
89
90__INLINE__ int nmintpack<nm1>::bitdisp(int indx)
91{
92 return indx&0x1F;
93}
94__INLINE__ int nmintpack<nm2s>::bitdisp(int indx)
95{
96 return indx&0xF;
97}
98__INLINE__ int nmintpack<nm4s>::bitdisp(int indx)
99{
100 return indx&0x7;
101}
102
103__INLINE__ int nmintpack<nm8s>::bitdisp(int indx)
104{
105 return indx&3;
106}
107
108__INLINE__ int nmintpack<nm16s>::bitdisp(int indx)
109{
110 return indx&2;
111}
112
113
114//*****************************************************************************
133//*****************************************************************************
134
135
136
137template<class T> class nmvecpack
138{
139protected:
140 T* m_container;
141 int m_border;
142public:
143 int m_size;
144 T* m_data;
145
146
147
148 nmvecpack(void* Data, int Size, int Border=0):m_data((T*)Data),m_size(Size),m_container(0),m_border(Border){};
149
150 nmvecpack(int Size, int Border=0):m_size(Size),m_border(Border)
151 {
152 //m_container=new T[m_size+2*m_border];
153 //m_data=m_container+m_border;
154 //tmalloc(m_container,m_size+2*m_border);
155 nmppsMalloc_64s((T**)&m_container,m_size+2*m_border);
156 nmintpack<T> first(m_container,m_border);
157 m_data=first.m_container;// ERROR here nmppsAddr_((T*)m_container,m_border);
158 reset();
159
160 }
161
163 {
164 m_size=vec.m_size;
165 m_border=vec.m_border;
166 //m_container=new T[m_size+2*m_border];
167 //m_data=m_container+m_border;
168 //memcpy(m_data,vec.m_data,m_size*sizeof(T));
169 nmppsMalloc_64s(&m_container,m_size+2*m_border);
170 m_data=nmppsAddr_(m_container,m_border);
171 nmppsCopy_(vec.m_data,m_data,m_size);
172 };
173
174
175 ~nmvecpack()
176 {
177 if (m_container)
178 //delete []m_container;
179 nmppsFree(m_container);
180 m_container=0;
181 }
182
183 nmvecpack<T>& operator= (const nmvecpack<T>& vec) // спец. добавил const - nmcpp ругается
184 {
185 _ASSERTE(vec.m_size==m_size);
186 //memcpy(m_data,vec.m_data,m_size*sizeof(T));
187 nmppsCopy_(vec.m_data,m_data,m_size);
188 return *this;
189 }
190
191 __INLINE__ nmintpack<T> operator [] (int idx)
192 {
193 //_ASSERTE(idx>=-m_border);
194 //_ASSERTE(idx<m_size+m_border);
195 nmintpack<T> nm(m_data,idx);
196 return nm;
197 }
198
199 template <class T2> nmvecpack<T2>& operator*= (const nmint<T2> val)
200 {
201 for(int idx=0;idx<m_size;idx++)
202 m_data[idx]*=val.m_value;
203 return (*this);
204 }
205
207
208 template <class T2> nmvecpack<T2> operator* (const nmint<T2>& val) const
209 {
210 nmvecpack<T2> res(m_size);
211 for(int idx=0;idx<m_size;idx++)
212 res.m_data[idx]=m_data[idx]*val.m_value;
213 return res;
214 }
215 template <class T2> nmint<T2> operator* (const nmvecpack<T2>& vec) const
216 {
217 _ASSERTE(m_size==vec.m_size);
218 nmint<T2> res;
219 for (int idx=0;idx<m_size;idx++)
220 res.m_value+=m_data[idx]*vec.m_data[idx];
221 return res;
222 }
223
225
226 nmvecpack<T>& operator+= (const nmint<T> &val)
227 {
228 for(int idx=0;idx<m_size;idx++)
229 m_data[idx]+=val.m_value;
230 return (*this);
231 }
232
233 nmvecpack<T>& operator+= (const nmvecpack<T> &vec)
234 {
235 _ASSERTE (vec.m_size==m_size);
236 for(int idx=0;idx<m_size;idx++)
237 m_data[idx]+=vec.m_data[idx];
238 return (*this);
239 }
240
242
243 nmvecpack<T> operator+ (const nmint<T>& val) const
244 {
245 nmvecpack<T> res(*this);
246 res+=val;
247 return res;
248 }
249
250 nmvecpack<T> operator+ (const nmvecpack<T>& vec) const
251 {
252 _ASSERTE (vec.m_size==m_size);
253 nmvecpack<T> res(*this);
254 res+=vec;
255 return res;
256 }
258
259 nmvecpack<T>& operator-= (const nmint<T> &val)
260 {
261 for(int idx=0;idx<m_size;idx++)
262 m_data[idx]-=val.m_value;
263 return (*this);
264 }
265
266 nmvecpack<T>& operator-= (const nmvecpack<T> &vec)
267 {
268 _ASSERTE (vec.m_size==m_size);
269 for(int idx=0;idx<m_size;idx++)
270 m_data[idx]-=vec.m_data[idx];
271 return (*this);
272 }
273
275
276 nmvecpack<T> operator- () const
277 {
278 nmvecpack<T> res(*this);
279 for(int idx=0;idx<m_size;idx++)
280 m_data[idx]=-m_data[idx];
281 return res;
282 }
283
284 nmvecpack<T> operator- (const nmint<T>& val) const
285 {
286 nmvecpack<T> res(*this);
287 res-=val;
288 return res;
289 }
290
291
292 nmvecpack<T> operator- (const nmvecpack<T>& vec) const
293 {
294 _ASSERTE (vec.m_size==m_size);
295 nmvecpack <T> res(*this);
296 res-=vec;
297 return res;
298 }
299
301
302
303 nmvecpack<T>& operator/=(const nmint<T> val)
304 {
305 _ASSERTE(val.m_value!=0);
306 for(int idx=0;idx<m_size;idx++)
307 m_data[idx]/=val.m_value;
308 return (*this);
309 }
310
312 nmvecpack<T> operator/ (const T val) const
313 {
314 nmvecpack<T> res(*this);
315 res/=val;
316 return res;
317 }
318
320 nmvecpack<T>& operator>>=(const int shr)
321 {
322 _ASSERTE(shr>=0);
323 if (shr==0)
324 return(*this);
325 for(int idx=0;idx<m_size;idx++)
326 m_data[idx]>>=shr;
327 return (*this);
328 }
329
330 nmvecpack<T> operator>> (const int shr) const
331 {
332 _ASSERTE(shr>=0);
333 nmvecpack<T> res(*this);
334 res>>=shr;
335 return res;
336 }
337
338 nmvecpack<T>& operator<<=(const int shl)
339 {
340 _ASSERTE(shl>=0);
341 if (shl==0)
342 return(*this);
343 for(int idx=0;idx<m_size;idx++)
344 m_data[idx]<<=shl;
345 return (*this);
346 }
347
348 nmvecpack<T> operator<< (const int shl) const
349 {
350 _ASSERTE(shl>=0);
351 nmvecpack<T> res(*this);
352 res<<=shl;
353 return res;
354 }
356 nmvecpack<T>& operator|= (const nmint<T> &val)
357 {
358 for(int idx=0;idx<m_size;idx++)
359 m_data[idx]|=val;
360 return (*this);
361 }
362
363 nmvecpack<T>& operator|= (const nmvecpack<T> &vec)
364 {
365 _ASSERTE (vec.m_size==m_size);
366 for(int idx=0;idx<m_size;idx++)
367 m_data[idx]|=vec.m_data[idx];
368 return (*this);
369 }
370
372 nmvecpack<T> operator| (const nmint<T>& val) const
373 {
374 nmvecpack <T> res(*this);
375 res|=val;
376 return res;
377 }
378
379 nmvecpack<T> operator| (const nmvecpack<T>& vec) const
380 {
381 _ASSERTE (vec.m_size==m_size);
382 nmvecpack <T> res(*this);
383 res-=vec;
384 return res;
385 }
386
388 nmvecpack<T>& operator&= (const nmint<T> &val)
389 {
390 for(int idx=0;idx<m_size;idx++)
391 m_data[idx]&=val;
392 return (*this);
393 }
394
395 nmvecpack<T>& operator&= (const nmvecpack<T> &vec)
396 {
397 _ASSERTE (vec.m_size==m_size);
398 for(int idx=0;idx<m_size;idx++)
399 m_data[idx]&=vec.m_data[idx];
400 return (*this);
401 }
403 nmvecpack<T> operator& (const nmint<T>& val) const
404 {
405 nmvecpack <T> res(*this);
406 res&=val;
407 return res;
408 }
409
410 nmvecpack<T> operator& (const nmvecpack<T>& vec) const
411 {
412 _ASSERTE (vec.m_size==m_size);
413 nmvecpack <T> res(*this);
414 res&=vec;
415 return res;
416 }
417
419 nmvecpack<T>& operator^= (const nmint<T> &val)
420 {
421 for(int idx=0;idx<m_size;idx++)
422 m_data[idx]^=val;
423 return (*this);
424 }
425
426 nmvecpack<T>& operator^= (const nmvecpack<T> &vec)
427 {
428 _ASSERTE (vec.m_size==m_size);
429 for(int idx=0;idx<m_size;idx++)
430 m_data[idx]^=vec.m_data[idx];
431 return (*this);
432 }
433
435 nmvecpack<T> operator^ (const nmint<T>& val) const
436 {
437 nmvecpack <T> res(*this);
438 res^=val;
439 return res;
440 }
441
442 nmvecpack<T> operator^ (const nmvecpack<T>& vec) const
443 {
444 nmvecpack <T> res(*this);
445 res^=vec;
446 return res;
447 }
448
449
450 nmvecpack<T>& operator~ () const
451 {
452 nmvecpack<T> res(*this);
453 for(int idx=0;idx<m_size;idx++)
454 res.m_data[idx]=~m_data[idx];
455 return res;
456 }
457
458
459 bool operator== (const nmvecpack<T>& vec) const
460 {
461 _ASSERTE (vec.m_size==m_size);
462 for(int idx=0;idx<m_size;idx++)
463 if (m_data[idx]!=vec.m_data[idx])
464 return false;
465 return true;
466
467 }
468
469 bool operator!= (const nmvecpack<T>& vec) const
470 {
471 _ASSERTE (vec.m_size==m_size);
472 for(int idx=0;idx<m_size;idx++)
473 if (m_data[idx]==vec.m_data[idx])
474 return false;
475 return true;
476 }
477
478 template<class T2> void SetData(T2* Data)
479 {
480 for(int i=0;i<m_size;i++)
481 m_data[i]=Data[i];
482 }
483
484 template<class T2> void GetData(T2* Data)
485 {
486 for(int i=0;i<m_size;i++)
487 Data[i]=(T2)m_data[i].value;
488 }
489
490 void reset()
491 {
492 memset(m_container,0,(m_size+2*m_border)*sizeof(T));
493 }
494
495
496
497};
498
499
500
501
502typedef nmvecpack<nm1> nmvec1;
507
508#ifndef WIN32
513#endif
514
515
516#endif
Definition: tnmvecpack.h:29
Definition: tnmvecpack.h:138
Definition: tvector.h:80