nmpp
tnmcvec.h
1//------------------------------------------------------------------------
2//
3// $Workfile:: tnmcvec. $
4//
5// Векторно-матричная библиотека
6//
7// Copyright (c) RC Module Inc.
8//
9// $Revision: 1.2 $ $Date: 2005/05/03 13:22:40 $
10//
19//------------------------------------------------------------------------
20#ifndef _Tnmcvec_H_INCLUDED_
21#define _Tnmcvec_H_INCLUDED_
22
23#ifdef __cplusplus
24
25#ifdef ENABLE_ASSERTE
26#include <crtdbg.h>
27#define ASSERTE _ASSERTE
28#else
29#define ASSERTE(expression)
30#endif
31
32#include "tnmint.h"
33
34//*****************************************************************************
53//*****************************************************************************
54
55
56
57template<class T> class nmcvec
58{
59protected:
60 cmplx<nmint<T> > * m_container;
61 bool m_flag_new;
62public:
63 int m_size;
64 cmplx<nmint<T> > * m_data;
65
66 nmcvec(cmplx<nmint<T> >* Data, int Size):m_data(Data),m_size(Size),m_flag_new(false){};
67
68 nmcvec(int Size,int Reserve=0):m_size(Size),m_flag_new(true)
69 {
70 m_container=new cmplx<nmint<T> >[m_size+2*Reserve];
71 m_data=m_container+Reserve;
72 }
73
74 //nmcvec(T * Data, int Size):m_data(Data),m_size(Size),m_flag_new(false){};
75
76
77 nmcvec(const nmcvec<T> &vec)
78 {
79 m_flag_new=true;
80 m_size=vec.m_size;
81 m_data=m_container=new T[m_size];
82 memcpy(m_data,vec.m_data,m_size*sizeof(T));
83 };
84
85
86 ~nmcvec()
87 {
88 if (m_flag_new)
89 delete []m_container;
90
91 }
92
93 nmcvec<T>& operator= (nmcvec<T>& vec)
94 {
95 ASSERTE(vec.m_size==m_size);
96 memcpy(m_data,vec.m_data,m_size*sizeof(T));
97 return *this;
98 }
99
100#ifndef NMTL_DISABLE_INDEX_CHECK
101 inline cmplx<nmint<T> >& operator [] (int idx)
102 {
103 ASSERTE(idx>=0);
104 ASSERTE(idx<m_size);
105 cmplx<nmint<T> >* res=(cmplx<nmint<T> >*)(m_data+idx);
106 return *res;
107 }
108#else
109 inline cmplx<nmint<T> >& operator [] (int idx)
110 {
111 return (cmplx<nmint<T> >*)(m_data+idx);
112 }
113#endif
114
115 template <class T2> nmcvec<T2>& operator*= (const cmplx<nmint<T2> > val)
116 {
117 for(int idx=0;idx<m_size;idx++)
118 m_data[idx]*=val.m_value;
119 return (*this);
120 }
121
122 template <class T2> nmcvec<T2> operator* (const cmplx<nmint<T2> >& val) const
123 {
124 nmcvec<T2> res(m_size);
125 for(int idx=0;idx<m_size;idx++)
126 res.m_data[idx]=m_data[idx]*val.m_value;
127 return res;
128 }
129 template <class T2> nmint<T2> operator* (const nmcvec<T2>& vec) const
130 {
131 ASSERTE(m_size==vec.m_size);
132 nmint<T2> res;
133 for (int idx=0;idx<m_size;idx++)
134 res.m_value+=m_data[idx]*vec.m_data[idx];
135 return res;
136 }
137
138 nmcvec<T>& operator+= (const cmplx<nmint<T> > &val)
139 {
140 for(int idx=0;idx<m_size;idx++)
141 m_data[idx]+=val.m_value;
142 return (*this);
143 }
144
145 nmcvec<T>& operator+= (const nmcvec<T> &vec)
146 {
147 ASSERTE (vec.m_size==m_size);
148 for(int idx=0;idx<m_size;idx++)
149 m_data[idx]+=vec.m_data[idx];
150 return (*this);
151 }
152
153 nmcvec<T> operator+ (const cmplx<nmint<T> >& val) const
154 {
155 nmcvec<T> res(*this);
156 res+=val;
157 return res;
158 }
159
160 nmcvec<T> operator+ (const nmcvec<T>& vec) const
161 {
162 ASSERTE (vec.m_size==m_size);
163 nmcvec<T> res(*this);
164 res+=vec;
165 return res;
166 }
167
168 nmcvec<T>& operator-= (const nmcvec<T> &vec)
169 {
170 ASSERTE (vec.m_size==m_size);
171 for(int idx=0;idx<m_size;idx++)
172 m_data[idx]-=vec.m_data[idx];
173 return (*this);
174 }
175
176 nmcvec<T> operator- (const nmcvec<T>& vec) const
177 {
178 ASSERTE (vec.m_size==m_size);
179 nmcvec <T> res(*this);
180 res-=vec;
181 return res;
182 }
183
184 nmcvec<T> operator- () const
185 {
186 nmcvec<T> res(*this);
187 for(int idx=0;idx<m_size;idx++)
188 m_data[idx]=-m_data[idx];
189 return res;
190 }
191
192 nmcvec<T>& operator/=(const cmplx<nmint<T> > val)
193 {
194 ASSERTE(val.m_value!=0);
195 for(int idx=0;idx<m_size;idx++)
196 m_data[idx]/=val.m_value;
197 return (*this);
198 }
199
200 nmcvec<T> operator/ (const T val) const
201 {
202 nmcvec<T> res(*this);
203 res/=val;
204 return res;
205 }
206
207 nmcvec<T>& operator>>=(const int shr)
208 {
209 ASSERTE(shr>=0);
210 if (shr==0) return(*this);
211 for(int idx=0;idx<m_size;idx++)
212 m_data[idx]>>=shr;
213 return (*this);
214 }
215
216 nmcvec<T> operator>> (const int shr) const
217 {
218 ASSERTE(shr>=0);
219 nmcvec<T> res(*this);
220 res>>=shr;
221 return res;
222 }
223
224 nmcvec<T>& operator<<=(const int shl)
225 {
226 ASSERTE(shl>=0);
227 if (shl==0) return(*this);
228 for(int idx=0;idx<m_size;idx++)
229 m_data[idx]<<=shl;
230 return (*this);
231 }
232
233 nmcvec<T> operator<< (const int shl) const
234 {
235 ASSERTE(shl>=0);
236 nmcvec<T> res(*this);
237 res<<=shl;
238 return res;
239 }
240
241 template<class T2> void SetData(T2* Data)
242 {
243 for(int i=0;i<m_size;i++)
244 m_data[i]=Data[i];
245 }
246
247 template<class T2> void GetData(T2* Data)
248 {
249 for(int i=0;i<m_size;i++)
250 Data[i]=(T2)m_data[i].value;
251 }
252
253 void SetConst(const cmplx<nmint<T > > val)
254 {
255 for (int idx=0;idx<m_size;idx++)
256 m_data[idx]=val;
257
258 }
259};
260/*
261template <class T> void InitInc2(nmcvec<T>& A,cmplx<nmint<T> > StartValue=0,cmplx<nmint<T> > Increment=1)
262{
263 for (int idx=0;idx<A.m_size;idx++,StartValue+=Increment)
264 A[idx]=StartValue;
265}
266*/
267//bool operator== (const nmcvec<T>& vec) const
268//bool operator!= (const nmcvec<T>& vec) const;
269
270#ifdef __NM__
271#else
272typedef nmcvec<char > nmvec8sc;
273typedef nmcvec<short > nmvec16sc;
274#endif
275typedef nmcvec<int > nmvec32sc;
276typedef nmcvec<long long> nmvec64sc;
277
278#endif
279
280#endif
Definition: tvector.h:80
__INLINE__ ostream & operator<<(ostream &s, mtr< unsigned char > &mtr)
Definition: nmtlio.h:64