#ifndef MARISA_POPCOUNT_H_
#define MARISA_POPCOUNT_H_

#include "base.h"

namespace marisa {

class PopCount {
 public:
  PopCount(UInt32 x) : value_() {
    x = (x & 0x55555555U) + ((x & 0xAAAAAAAAU) >> 1);
    x = (x & 0x33333333U) + ((x & 0xCCCCCCCCU) >> 2);
    x = (x + (x >> 4)) & 0x0F0F0F0FU;
    x += x << 8;
    x += x << 16;
    value_ = x;
  }

  UInt32 lo8() const {
    return value_ & 0xFFU;
  }
  UInt32 lo16() const {
    return (value_ >> 8) & 0xFFU;
  }
  UInt32 lo24() const {
    return (value_ >> 16) & 0xFFU;
  }
  UInt32 lo32() const {
    return value_ >> 24;
  }

 private:
  UInt32 value_;
};

}  // namespace marisa

#endif  // MARISA_POPCOUNT_H_