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