1b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak#ifndef MARISA_ALPHA_POPCOUNT_H_ 2b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak#define MARISA_ALPHA_POPCOUNT_H_ 3b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak 4b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak#include "base.h" 5b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak 6b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniaknamespace marisa_alpha { 7b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak 8b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniakclass PopCount { 9b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak public: 10b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak PopCount(UInt32 x) : value_() { 11b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak x = (x & 0x55555555U) + ((x & 0xAAAAAAAAU) >> 1); 12b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak x = (x & 0x33333333U) + ((x & 0xCCCCCCCCU) >> 2); 13b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak x = (x + (x >> 4)) & 0x0F0F0F0FU; 14b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak x += x << 8; 15b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak x += x << 16; 16b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak value_ = x; 17b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak } 18b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak 19b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak UInt32 lo8() const { 20b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak return value_ & 0xFFU; 21b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak } 22b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak UInt32 lo16() const { 23b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak return (value_ >> 8) & 0xFFU; 24b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak } 25b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak UInt32 lo24() const { 26b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak return (value_ >> 16) & 0xFFU; 27b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak } 28b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak UInt32 lo32() const { 29b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak return value_ >> 24; 30b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak } 31b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak 32b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak private: 33b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak UInt32 value_; 34b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak}; 35b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak 36b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak} // namespace marisa_alpha 37b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak 38b4acd09676fe12e9d95b2a5f3f742e9a1a0483b1Przemyslaw Szczepaniak#endif // MARISA_ALPHA_POPCOUNT_H_ 39