File: dword.hh

package info (click to toggle)
maq 0.7.1-7
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 1,476 kB
  • ctags: 1,130
  • sloc: cpp: 5,025; ansic: 3,333; sh: 3,303; perl: 2,547; makefile: 31
file content (107 lines) | stat: -rw-r--r-- 3,572 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#ifndef LH3_DWORD_H
#define LH3_DWORD_H

#include "const.h"

template<class TYPE>
struct dword_t
{
	TYPE w1, w2;
	static const int n_bits = sizeof(TYPE) * 8;
	inline dword_t() { w1 = TYPE(0); w2 = TYPE(0); }
	inline dword_t(bit16_t _w1) { w1 = TYPE(_w1); w2 = TYPE(0); }
	inline dword_t(bit32_t _w1) { w1 = TYPE(_w1); w2 = TYPE(0); }
	inline dword_t(bit64_t _w1) { w1 = TYPE(_w1); w2 = TYPE(0); }
	inline dword_t(int _w1) : w1(TYPE(_w1)), w2(TYPE(0)) {}
	inline dword_t(const TYPE &_w1, const TYPE &_w2) : w1(_w1), w2(_w2) {}
	inline dword_t(const dword_t<TYPE> &x) : w1(x.w1), w2(x.w2) {}
	inline const dword_t<TYPE> &operator >>= (int k) {
		if (k == 0) return *this;
		if (k < n_bits) {
			w1 = (w1>>k) | (TYPE(w2)<<(-k)); w2 >>= k;
		} else if (k < n_bits*2) {
			w1 = TYPE(w2)>>(k-n_bits); w2 = TYPE(0);
		} else w1 = w2 = TYPE(0);
		return *this;
	}
	inline const dword_t<TYPE> &operator <<= (int k) {
		if (k == 0) return *this;
		if (k < n_bits) {
			w2 = (w2<<k) | (w1>>(n_bits-k)); w1 <<= k;
		} else if (k < n_bits*2) {
			w2 = w1 << (k-n_bits); w1 = TYPE(0);
		} else w1 = w2 = TYPE(0);
		return *this;
	}
	inline const dword_t<TYPE> &operator &= (const dword_t<TYPE> &w) {
		w1 &= w.w1; w2 &= w.w2;
		return *this;
	}
	inline const dword_t<TYPE> &operator |= (const dword_t<TYPE> &w) {
		w1 |= w.w1; w2 |= w.w2;
		return *this;
	}
	inline dword_t<TYPE> &operator |= (int w) {
		w1 |= w;
		return *this;
	}
	inline dword_t<TYPE> &operator ^= (const dword_t<TYPE> &w) {
		w1 ^= w.w1; w2 ^= w.w2;
		return *this;
	}
	inline operator bit64_t() const { return bit64_t(w1); }
};

template<class TYPE>
inline dword_t<TYPE> operator >> (const dword_t<TYPE> &w, int k) {
	return (k == 0)? w
		: (k < dword_t<TYPE>::n_bits)? dword_t<TYPE>((w.w1>>k) | (TYPE(w.w2)<<(dword_t<TYPE>::n_bits-k)), w.w2>>k)
		: (k < dword_t<TYPE>::n_bits*2)? dword_t<TYPE>(TYPE(w.w2)>>(k-dword_t<TYPE>::n_bits), TYPE(0))
		: dword_t<TYPE>(TYPE(0), TYPE(0));
}
template<class TYPE>
inline dword_t<TYPE> operator << (const dword_t<TYPE> &w, int k) {
	return (k == 0)? w
		: (k < dword_t<TYPE>::n_bits)? dword_t<TYPE>(w.w1<<k, (w.w2<<k) | (w.w1>>(dword_t<TYPE>::n_bits-k)))
		: (k < dword_t<TYPE>::n_bits*2)? dword_t<TYPE>(TYPE(0), TYPE(w.w1<<(k-dword_t<TYPE>::n_bits)))
		: dword_t<TYPE>(TYPE(0), TYPE(0));
	
}
template<class TYPE>
inline dword_t<TYPE> operator & (const dword_t<TYPE> &w, const dword_t<TYPE> &ww) {
	return dword_t<TYPE>(w.w1 & ww.w1, w.w2 & ww.w2);
}
template<class TYPE>
inline int operator < (const dword_t<TYPE> &w, const dword_t<TYPE> &ww) {
	return (w.w2 < ww.w2 || (w.w2 == ww.w2 && w.w1 < ww.w1));
}
template<class TYPE>
inline dword_t<TYPE> operator | (const dword_t<TYPE> &w, const dword_t<TYPE> &ww) {
	return dword_t<TYPE>(w.w1 | ww.w1, w.w2 | ww.w2);
}
template<class TYPE>
inline dword_t<TYPE> operator ^ (const dword_t<TYPE> &w, const dword_t<TYPE> &ww) {
	return dword_t<TYPE>(w.w1 ^ ww.w1, w.w2 ^ ww.w2);
}
template<class TYPE>
inline int operator != (const dword_t<TYPE> &w, const dword_t<TYPE> &ww) {
	return (w.w1 != ww.w1 || w.w2 != ww.w2);
}
template<class TYPE>
inline int operator == (const dword_t<TYPE> &w, const dword_t<TYPE> &ww) {
	return (w.w1 == ww.w1 && w.w2 == ww.w2);
}
template<class TYPE>
inline dword_t<TYPE> operator ~ (const dword_t<TYPE> &w) {
	return dword_t<TYPE>(~w.w1, ~w.w2);
}
template<class TYPE, class T2>
inline T2 operator & (const dword_t<TYPE> &w, T2 k) {
	return T2(w.w1 & k);
}
template<class TYPE, class T2>
inline dword_t<TYPE> operator | (const dword_t<TYPE> &w, T2 k) {
	return dword_t<TYPE>(w.w1 | k, w.w2);
}

#endif