nmpp
nmshort.h
1#ifndef NMSHORT_DEFINED
2#define NMSHORT_DEFINED
3
4#include <stdlib.h>
5#include <string.h>
6//extern unsigned int crc;
7class uint16ptr;
8class nmshort{
9public:
10 unsigned int *adr;
11 int idx;
12 __INLINE__ nmshort(){
13 //adr=0;
14 //idx=0;
15 }
16 __INLINE__ nmshort(nmshort& ch){
17 adr=ch.adr;
18 idx=ch.idx;
19// crc^=ch;
20 }
21 __INLINE__ nmshort& operator = (nmshort ch){
22 unsigned char val=(ch);
23 (*adr) &= ~(0xFFFF<<(idx*16));
24 (*adr) |= (val) <<(idx*16);
25// crc^=ch;
26 //adr=ch.adr;
27 //idx=ch.idx;
28 return *this;
29 }
30 __INLINE__ unsigned int operator + (nmshort& ch){
31 unsigned int a=(ch);
32 unsigned int b=(*this);
33 a+=b;
34// crc^=a;
35 return a;
36 }
37
38 __INLINE__ nmshort& operator = (unsigned int val){
39 (*adr) &= ~(0xFFFF<<(idx*16));
40 (*adr) |= (val&0xFFFF) <<(idx*16);
41// crc^=val;
42 return *this;
43 }
44 __INLINE__ operator unsigned char(){
45 unsigned char ret=((*adr)>>(idx*4));
46 ret&=0xFF;
47// crc^=ret;
48 return ret;
49 }
50
51 __INLINE__ uint16ptr operator &();
52
53};
54
55
56
57class uint16ptr {
58public:
59 unsigned int *addr;
60 int indx;
61 nmshort arref;
62 __INLINE__ uint16ptr (){
63 addr=0;
64 indx=0;
65 }
66 //uint16ptr(uint16ptr& p){
67 // indx=p.indx;
68 // addr=p.addr;
69 //}
70
71 //uint16ptr(uint16ptr& p){
72 // indx=p.indx;
73 // addr=p.addr;
74 //}
75
76 __INLINE__ unsigned char* x86addr(){
77 return ((unsigned char*)addr)+indx;
78 }
79 __INLINE__ uint16ptr (void* p){
80 addr=(unsigned int*)p;
81 indx=0;
82 }
83 __INLINE__ uint16ptr (unsigned short* p){
84 addr=(unsigned int*)p;
85 indx=0;
86 }
87 __INLINE__ uint16ptr (short* p){
88 addr=(unsigned int*)p;
89 indx=0;
90 }
91
92 __INLINE__ uint16ptr(const uint16ptr& p){
93 indx=p.indx;
94 addr=p.addr;
95 }
96 //uint16ptr(int* p){
97 // addr=(unsigned*)p;
98 // indx=0;
99 //}
100 __INLINE__ uint16ptr(unsigned int*p){
101 addr=p;
102 indx=0;
103 }
104 __INLINE__ uint16ptr(unsigned int*p,int offset){
105 addr=p+(offset>>1);
106 indx=offset&1;
107 }
108
109 //operator int(){
110 // return int(addr);
111 //}
112
113 __INLINE__ nmshort& operator [](int idx){
114
115 arref.adr=addr+(indx+idx)/2;
116 arref.idx=(indx+idx)%2;
117 return arref;
118 }
119
120 //uint16ptr& operator = (unsigned ptr){
121 // addr=(unsigned*)ptr;
122 // indx=0;
123 // return (*this);
124 //}
125
126
127 __INLINE__ uint16ptr& operator = (unsigned int* ptr){
128 addr=(unsigned*)ptr;
129 indx=0;
130 return (*this);
131 }
132
133 __INLINE__ bool operator < (uint16ptr ptr){
134 if (addr<ptr.addr)
135 return 1;
136 if (addr==ptr.addr)
137 if (indx<ptr.indx)
138 return 1;
139 return 0;
140 }
141
142 __INLINE__ bool operator >= (uint16ptr ptr){
143 if (addr>ptr.addr)
144 return 1;
145 if (addr==ptr.addr)
146 if (indx>=ptr.indx)
147 return 1;
148 return 0;
149 }
150
151
152 __INLINE__ int operator - (uint16ptr ptr){
153 int a=(int)addr;
154 int b=(int)ptr.addr;
155
156#ifdef __NM__
157 //a&=0x0FFFFFFF;
158 //b&=0x0FFFFFFF;
159 a<<=1;
160 b<<=1;
161#endif
162 a+=indx;
163 b+=ptr.indx;
164 return a-b;
165 }
166
167
168// uint16ptr& operator = (unsigned char* ptr){
169// addr=(unsigned int*)ptr;
170// indx=0;
171// return (*this);
172// }
173
174
175
176 __INLINE__ uint16ptr& operator = (const uint16ptr& p){
177 addr=p.addr;
178 indx=p.indx;
179 return (*this);
180 }
181
182 __INLINE__ unsigned int* ptr(){
183 if (indx==0)
184 return addr;
185 //}
186 else {
187 int g=1;
188 return (unsigned int*)-1;
189 }
190 }
191 __INLINE__ nmshort& operator *(){
192
193 return (nmshort&)(*this);
194 }
195
196/*
197uint16ptr operator + (int idx){
198uint16ptr tmp(*this);
199tmp.addr=addr+(indx+idx)/2;
200tmp.indx=(indx+idx)&0x1;
201return tmp;
202}
203
204uint16ptr operator- (int idx){
205uint16ptr tmp(*this);
206tmp.addr=addr+(indx-idx)/2;
207tmp.indx=(indx-idx)&0x1;
208return tmp;
209}
210
211uint16ptr& operator+= (int idx){
212addr=addr+(indx+idx)/2;
213indx=(indx+idx)&0x1;
214return *this;
215}
216
217uint16ptr& operator-= (int idx){
218addr=addr+(indx-idx)/2;
219indx=(indx-idx)&0x1;
220return *this;
221}
222*/
223 __INLINE__ uint16ptr operator + (int idx){
224 uint16ptr tmp(*this);
225 tmp.addr=addr+((indx+idx)>>1);
226 tmp.indx=(indx+idx)&0x1;
227 return tmp;
228 }
229
230 __INLINE__ uint16ptr operator- (int idx){
231 uint16ptr tmp(*this);
232 tmp.addr=addr+((indx-idx)>>1);
233 tmp.indx=(indx-idx)&0x1;
234 return tmp;
235 }
236
237
238 __INLINE__ uint16ptr& operator+= (int idx){
239 addr=addr+((indx+idx)>>1);
240 indx=(indx+idx)&0x1;
241 return *this;
242 }
243
244 __INLINE__ uint16ptr& operator-= (int idx){
245 addr=addr+((indx-idx)>>1);
246 indx=(indx-idx)&0x1;
247 return *this;
248 }
249
250 __INLINE__ uint16ptr operator++ (int){
251 uint16ptr tmp(*this);
252 if (indx==1){
253 indx=0;
254 addr++;
255 }
256 else {
257 indx++;
258 }
259 return tmp;
260 }
261
262 __INLINE__ uint16ptr& operator++ (){
263 if (indx==1){
264 indx=0;
265 addr++;
266 }
267 else {
268 indx++;
269 }
270 return *this;
271 }
272
273 __INLINE__ unsigned int operator== (unsigned int N){
274 return (((unsigned int)addr)==N);
275 }
276
277 __INLINE__ bool operator == (uint16ptr ptr){
278 if (addr==ptr.addr && indx==ptr.indx)
279 return 1;
280 return 0;
281 }
282
283};
284
285__INLINE__ uint16ptr nmshort::operator &(){
286 uint16ptr p;
287 p.addr=adr;
288 p.indx=idx;
289 return p;
290}
291
292template <int Y,int X> class nmshort2D {
293public:
294 uint16ptr arr;
295 unsigned int data[Y*X/2];
296
297 nmshort2D(){
298 }
299
300 uint16ptr& operator [](int idx){
301 arr.addr=data+X*idx/2;
302 arr.indx=0;
303 return arr;
304 }
305 unsigned int* ptr(){
306 return data;
307 }
308};
309/*
310template<int N> class nmshort1D {
311public:
312 nmshort deref;
313 unsigned int data[(N+3)/4];
314
315 nmshort1D(){
316 }
317
318 __INLINE__ nmshort& operator [](int idx){
319 addr=data+idx/4;
320 indx=idx%4;
321 return deref;
322 }
323
324 __INLINE__ operator uint16ptr(){
325 uint16ptr p;
326 p.addr=data;
327 p.indx=0;
328 return p;
329 }
330 __INLINE__ unsigned int* ptr(){
331 return data;
332 }
333
334
335};
336*/
337__INLINE__ void free(uint16ptr& p){
338 free(p.addr);
339}
340
341__INLINE__ void nmshort_memcpy (uint16ptr dst, uint16ptr src, unsigned int len){
342
343
344 #ifdef __NM__
345 memcpy((void*)dst.x86addr(), (void*)src.x86addr(),len);
346 #else
347 if (dst.indx==src.indx){
348 // copy n bytes to align pointers
349 if (dst.indx){
350 int n=4-dst.indx;
351 if (len<n)
352 n=len;
353 for(int i=0; i<n; i++){
354 *dst=*src;
355 dst++;
356 src++;
357 }
358 len-=n;
359 }
360 int words=len>>2;
361 memcpy(dst.addr, src.addr, words);
362 dst.addr+=words;
363 src.addr+=words;
364 len%=4;
365 // copy rest bytes
366 for(int i=0;i<len;i++){
367 *dst=*src;
368 dst++;
369 src++;
370 }
371 }
372 else {
373 for(int i=0; i<len; i++){
374 *dst=*src;
375 src++;
376 dst++;
377 }
378 }
379
380 #endif
381}
382
383__INLINE__ void nmshort_memset (uint16ptr dst, int setvalue, unsigned int len){
384
385
386 #ifdef __NM__
387 memset((void*)dst.x86addr(), setvalue,len);
388 #else
389
390 // copy n bytes to align pointers
391 if (dst.indx){
392 int n=4-dst.indx;
393 if (len<n)
394 n=len;
395 for(int i=0; i<n; i++){
396 *dst=setvalue;
397 dst++;
398 }
399 len-=n;
400 }
401 int words=len>>2;
402
403 setvalue&=0xFF;
404 setvalue|=(setvalue<<8);
405 setvalue|=(setvalue<<16);
406 memset(dst.addr, setvalue, words);
407 dst.addr+=words;
408 len%=4;
409 // copy rest bytes
410 setvalue&=0xFF;
411 for(int i=0;i<len;i++){
412 *dst=setvalue;
413 dst++;
414 }
415
416
417 #endif
418}
419
420#endif
Definition: nmshort.h:292
Definition: nmshort.h:8
Definition: nmshort.h:57