#ifndef MSL_BITSET_H_ #define MSL_BITSET_H_ #include #include #include #include "PowerPC_EABI_Support/MSL_C/MSL_Common/abort_exit.h" namespace std { // TODO: where does this go? inline void __msl_error(const char *param_0) { fprintf(stderr, param_0); abort(); } template class __bitset_base { public: __bitset_base(); void set(size_t pos, bool val); void reset(size_t pos); bool test(size_t pos) const; bool any() const; private: size_t data[N]; }; template __bitset_base::__bitset_base() { std::fill(data, data + N, 0); } template bool __bitset_base::any() const { for (size_t i = 0; i < N; i++) { if (data[i] != 0) return true; } return false; } template bool __bitset_base::test(size_t pos) const { size_t i = pos / (sizeof(size_t) * 8); size_t mask = 1 << (pos % (sizeof(size_t) * 8)); return data[i] & mask; } template void __bitset_base::set(size_t pos, bool val) { size_t i = pos / (sizeof(size_t) * 8); size_t mask = 1 << (pos % (sizeof(size_t) * 8)); if (val) { data[i] |= mask; } else { data[i] &= ~mask; } } template void __bitset_base::reset(size_t pos) { size_t i = pos / (sizeof(size_t) * 8); size_t mask = 1 << (pos % (sizeof(size_t) * 8)); data[i] &= ~mask; } template class bitset : private __bitset_base<(N - 1) / (sizeof(size_t) * 8) + 1> { public: typedef __bitset_base<(N - 1) / (sizeof(size_t) * 8) + 1> base; bitset() {} bool any() const { return base::any(); } void set(size_t pos, bool val) { if (pos >= N) { __msl_error("index out of range of bitset::set"); } base::set(pos, val); } void reset(size_t pos) { if (pos >= N) { __msl_error("index out of range of bitset::reset"); } base::reset(pos); } bool test(size_t pos) const { if (pos >= N) { __msl_error("index out of range of bitset::test"); } return base::test(pos); } }; } // namespace std #endif