fork download
#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);
}
Success #stdin #stdout 0s 2852KB
stdin
Standard input is empty
stdout
None
+PWZ+NS+SP
+PS
+PWZ+NS+PS
+PWZ+SP