42 word(
void) : M_initialized(false), M_word(0xdead12344321deadUL) { }
44 word(
int value) : M_initialized(true), M_word(0) { assert(value == 0); }
46 explicit word(uint64_t value) : M_initialized(true), M_word(value) { }
49 word(
word const& w) : M_initialized(w.M_initialized), M_word(w.M_word) { assert(M_initialized); }
51 ~
word() { M_initialized =
false; M_word = 0xdeaddeaddeaddeadUL; }
54 word& operator=(
word const& w) { assert(w.M_initialized); M_initialized = w.M_initialized; M_word = w.M_word;
return *
this; }
56 word& operator=(
int value)
65 friend bool operator==(
word const& w1,
word const& w2) { assert(w1.M_initialized && w2.M_initialized);
return w1.M_word == w2.M_word; }
66 friend bool operator!=(
word const& w1,
word const& w2) { assert(w1.M_initialized && w2.M_initialized);
return w1.M_word != w2.M_word; }
69 word operator~(
void)
const {
return word(~M_word); }
72 word operator-(
void)
const
74 assert((M_word & ~1UL) == 0);
79 friend word operator^(
word const& w1,
word const& w2) { assert(w1.M_initialized && w2.M_initialized);
return word(w1.M_word ^ w2.M_word); }
80 friend word operator&(
word const& w1,
word const& w2) { assert(w1.M_initialized && w2.M_initialized);
return word(w1.M_word & w2.M_word); }
81 friend word operator|(
word const& w1,
word const& w2) { assert(w1.M_initialized && w2.M_initialized);
return word(w1.M_word | w2.M_word); }
82 word& operator^=(
word const& w) { assert(M_initialized && w.M_initialized); M_word ^= w.M_word;
return *
this; }
83 word& operator&=(
word const& w) { assert(M_initialized && w.M_initialized); M_word &= w.M_word;
return *
this; }
84 word& operator|=(
word const& w) { assert(M_initialized && w.M_initialized); M_word |= w.M_word;
return *
this; }
87 friend word operator<<(
word const& w,
size_t shift) { assert(w.M_initialized); assert(shift < 64);
return word(w.M_word << shift); }
88 friend word operator<<(
word const& w,
int shift) { assert(w.M_initialized); assert(shift >= 0 && shift < 64);
return word(w.M_word << shift); }
89 friend word operator>>(
word const& w,
size_t shift) { assert(w.M_initialized); assert(shift < 64);
return word(w.M_word >> shift); }
90 friend word operator>>(
word const& w,
int shift) { assert(w.M_initialized); assert(shift >= 0 && shift < 64);
return word(w.M_word >> shift); }
91 word& operator<<=(
int shift) { assert(M_initialized); assert(shift >= 0 && shift < 64); M_word <<= shift;
return *
this; }
92 word& operator>>=(
int shift) { assert(M_initialized); assert(shift >= 0 && shift < 64); M_word >>= shift;
return *
this; }
95 static void init_array(
word*
const& a,
wi_t size)
97 for (
wi_t i = 0; i < size; ++i)
102 BIT convert_to_BIT(
void)
const
104 assert(M_initialized);
105 assert((M_word & ~1UL) == 0);
108 int convert_to_int(
void)
const
110 assert(M_initialized);
111 assert(M_word <= 0x7fffffffU);
114 uint64_t convert_to_uint64_t(
void)
const { assert(M_initialized);
return M_word; }
117 bool operator!(
void)
const {
return !M_word; }
119 operator bool(
void)
const { assert(M_initialized);
return M_word != 0; }
123 operator int(
void)
const { assert(
false);
return 0; }
126 #define __M4RI_CONVERT_TO_BIT(w) ((w).convert_to_BIT())
127 #define __M4RI_CONVERT_TO_INT(w) ((w).convert_to_int())
128 #define __M4RI_CONVERT_TO_UINT64_T(w) ((w).convert_to_uint64_t())
129 #define __M4RI_CONVERT_TO_WORD(i) word((uint64_t)(i))
131 #endif // M4RI_DOXYGEN