#include <iostream>
enum class NumericType {
None = 0,
PadWithZero = 0x01,
NegativeSign = 0x02,
PositiveSign = 0x04,
SpacePrefix = 0x08
};
class NumericTypeFlags {
static const NumericTypeFlags all_;
unsigned flags_;
NumericTypeFlags (unsigned f) : flags_(f) {}
public:
NumericTypeFlags () : flags_(0) {}
NumericTypeFlags (NumericType t) : flags_(static_cast<unsigned>(t)) {}
// test
NumericTypeFlags operator & (const NumericTypeFlags &t) const {
return flags_ & t.flags_;
}
NumericTypeFlags operator | (const NumericTypeFlags &t) const {
return flags_ | t.flags_;
}
operator bool () const { return flags_; }
// set
const NumericTypeFlags & operator &= (const NumericTypeFlags &t) {
flags_ &= t.flags_;
return *this;
}
const NumericTypeFlags & operator |= (const NumericTypeFlags &t) {
flags_ |= t.flags_;
return *this;
}
// complement
NumericTypeFlags operator ~ () const {
return all_.flags_ & ~flags_;
}
};
NumericTypeFlags operator | (NumericType a, NumericType b)
{
return NumericTypeFlags(a)|b;
}
NumericTypeFlags operator ~ (NumericType a)
{
return ~NumericTypeFlags(a);
}
const NumericTypeFlags NumericTypeFlags::all_ = (
NumericType::PadWithZero |
NumericType::NegativeSign |
NumericType::PositiveSign |
NumericType::SpacePrefix
);
void foo (NumericTypeFlags f) {
if (f) {
if (f & NumericType::PadWithZero) std::cout << "+PWZ";
if (f & NumericType::NegativeSign) std::cout << "+NS";
if (f & NumericType::PositiveSign) std::cout << "+PS";
if (f & NumericType::SpacePrefix) std::cout << "+SP";
} else {
std::cout << "None";
}
std::cout << std::endl;
}
int main ()
{
foo(NumericTypeFlags());
foo(NumericType::PadWithZero
|NumericType::SpacePrefix
|NumericType::NegativeSign);
foo(NumericType::PositiveSign);
foo(~NumericType::SpacePrefix);
NumericTypeFlags flags(NumericType::PadWithZero
|NumericType::SpacePrefix
|NumericType::NegativeSign);
flags &= ~NumericType::NegativeSign;
foo(flags);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKZW51bSBjbGFzcyBOdW1lcmljVHlwZSB7CiAgICBOb25lICAgICAgICAgICAgICAgICAgICA9IDAsCiAgICBQYWRXaXRoWmVybyAgICAgICAgICAgICA9IDB4MDEsCiAgICBOZWdhdGl2ZVNpZ24gICAgICAgICAgICA9IDB4MDIsCiAgICBQb3NpdGl2ZVNpZ24gICAgICAgICAgICA9IDB4MDQsCiAgICBTcGFjZVByZWZpeCAgICAgICAgICAgICA9IDB4MDgKfTsKCmNsYXNzIE51bWVyaWNUeXBlRmxhZ3MgewogICAgc3RhdGljIGNvbnN0IE51bWVyaWNUeXBlRmxhZ3MgYWxsXzsKICAgIHVuc2lnbmVkIGZsYWdzXzsKICAgIE51bWVyaWNUeXBlRmxhZ3MgKHVuc2lnbmVkIGYpIDogZmxhZ3NfKGYpIHt9CnB1YmxpYzoKICAgIE51bWVyaWNUeXBlRmxhZ3MgKCkgOiBmbGFnc18oMCkge30KICAgIE51bWVyaWNUeXBlRmxhZ3MgKE51bWVyaWNUeXBlIHQpIDogZmxhZ3NfKHN0YXRpY19jYXN0PHVuc2lnbmVkPih0KSkge30KICAgIC8vIHRlc3QKICAgIE51bWVyaWNUeXBlRmxhZ3Mgb3BlcmF0b3IgJiAoY29uc3QgTnVtZXJpY1R5cGVGbGFncyAmdCkgY29uc3QgewogICAgICAgIHJldHVybiBmbGFnc18gJiB0LmZsYWdzXzsKICAgIH0KICAgIE51bWVyaWNUeXBlRmxhZ3Mgb3BlcmF0b3IgfCAoY29uc3QgTnVtZXJpY1R5cGVGbGFncyAmdCkgY29uc3QgewogICAgICAgIHJldHVybiBmbGFnc18gfCB0LmZsYWdzXzsKICAgIH0KICAgIG9wZXJhdG9yIGJvb2wgKCkgY29uc3QgeyByZXR1cm4gZmxhZ3NfOyB9CiAgICAvLyBzZXQKICAgIGNvbnN0IE51bWVyaWNUeXBlRmxhZ3MgJiBvcGVyYXRvciAmPSAoY29uc3QgTnVtZXJpY1R5cGVGbGFncyAmdCkgewogICAgICAgIGZsYWdzXyAmPSB0LmZsYWdzXzsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgICBjb25zdCBOdW1lcmljVHlwZUZsYWdzICYgb3BlcmF0b3IgfD0gKGNvbnN0IE51bWVyaWNUeXBlRmxhZ3MgJnQpIHsKICAgICAgICBmbGFnc18gfD0gdC5mbGFnc187CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQogICAgLy8gY29tcGxlbWVudAogICAgTnVtZXJpY1R5cGVGbGFncyBvcGVyYXRvciB+ICgpIGNvbnN0IHsKICAgICAgICByZXR1cm4gYWxsXy5mbGFnc18gJiB+ZmxhZ3NfOwogICAgfQp9OwoKTnVtZXJpY1R5cGVGbGFncyBvcGVyYXRvciB8IChOdW1lcmljVHlwZSBhLCBOdW1lcmljVHlwZSBiKQp7CiAgICByZXR1cm4gTnVtZXJpY1R5cGVGbGFncyhhKXxiOwp9CgpOdW1lcmljVHlwZUZsYWdzIG9wZXJhdG9yIH4gKE51bWVyaWNUeXBlIGEpCnsKICAgIHJldHVybiB+TnVtZXJpY1R5cGVGbGFncyhhKTsKfQoKY29uc3QgTnVtZXJpY1R5cGVGbGFncyBOdW1lcmljVHlwZUZsYWdzOjphbGxfID0gKAogICAgTnVtZXJpY1R5cGU6OlBhZFdpdGhaZXJvIHwKICAgIE51bWVyaWNUeXBlOjpOZWdhdGl2ZVNpZ24gfAogICAgTnVtZXJpY1R5cGU6OlBvc2l0aXZlU2lnbiB8CiAgICBOdW1lcmljVHlwZTo6U3BhY2VQcmVmaXgKKTsKCnZvaWQgZm9vIChOdW1lcmljVHlwZUZsYWdzIGYpIHsKICAgIGlmIChmKSB7CiAgICAgICAgaWYgKGYgJiBOdW1lcmljVHlwZTo6UGFkV2l0aFplcm8pIHN0ZDo6Y291dCA8PCAiK1BXWiI7CiAgICAgICAgaWYgKGYgJiBOdW1lcmljVHlwZTo6TmVnYXRpdmVTaWduKSBzdGQ6OmNvdXQgPDwgIitOUyI7CiAgICAgICAgaWYgKGYgJiBOdW1lcmljVHlwZTo6UG9zaXRpdmVTaWduKSBzdGQ6OmNvdXQgPDwgIitQUyI7CiAgICAgICAgaWYgKGYgJiBOdW1lcmljVHlwZTo6U3BhY2VQcmVmaXgpIHN0ZDo6Y291dCA8PCAiK1NQIjsKICAgIH0gZWxzZSB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJOb25lIjsKICAgIH0KICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7Cn0KCmludCBtYWluICgpCnsKICAgIGZvbyhOdW1lcmljVHlwZUZsYWdzKCkpOwogICAgZm9vKE51bWVyaWNUeXBlOjpQYWRXaXRoWmVybwogICAgICAgIHxOdW1lcmljVHlwZTo6U3BhY2VQcmVmaXgKICAgICAgICB8TnVtZXJpY1R5cGU6Ok5lZ2F0aXZlU2lnbik7CiAgICBmb28oTnVtZXJpY1R5cGU6OlBvc2l0aXZlU2lnbik7CiAgICBmb28ofk51bWVyaWNUeXBlOjpTcGFjZVByZWZpeCk7CgogICAgTnVtZXJpY1R5cGVGbGFncyBmbGFncyhOdW1lcmljVHlwZTo6UGFkV2l0aFplcm8KICAgICAgICAgICAgICAgICAgICAgICAgICAgfE51bWVyaWNUeXBlOjpTcGFjZVByZWZpeAogICAgICAgICAgICAgICAgICAgICAgICAgICB8TnVtZXJpY1R5cGU6Ok5lZ2F0aXZlU2lnbik7CiAgICBmbGFncyAmPSB+TnVtZXJpY1R5cGU6Ok5lZ2F0aXZlU2lnbjsKICAgIGZvbyhmbGFncyk7Cn0K