I'm trying to represent card providers as an enum
. Basically a credit card (based on BIN number) can be Visa or Mastercard, and the subtype can be Credit or Debit (simplified example, but I want to handle all cases (Maestro, Visa Electron, UATP...)
It seems to work, but see the last case it's possible to do CardProvider Visa | CardProvider MasterCard
which is incorrect as we know.
I there a way to prevent this? Besides that is the current enum
structure correct?
enum CardProvider
{
CardProviderNone = 0,
CardProviderMasterCard = 1 << 0,
CardProviderMasterCardDebit = 1 << 1,
CardProviderMasterCardCredit = 1 << 2,
CardProviderVisa = 2 << 0,
CardProviderVisaDebit = 2 << 1,
CardProviderVisaCredit = 2 << 2
};
CardProvider cardType1 = CardProviderMasterCard;
CardProvider cardType2 = CardProviderMasterCard | CardProviderMasterCardCredit;
CardProvider cardType3 = CardProviderMasterCard | CardProviderMasterCardDebit;
CardProvider cardType4 = CardProviderVisa | CardProviderVisaDebit;
// possible to prevent?
CardProvider cardType5 = CardProvider Visa | CardProvider MasterCard;
// works as expected:
assert(cardType1 & CardProviderMasterCard);
assert(cardType2 & CardProviderMasterCardCredit);
assert(cardType2 & CardProviderMasterCard);
assert(cardType3 & CardProviderMasterCard);
assert(!(cardType4 & CardProviderMasterCard));
assert(cardType4 & CardProviderVisa);
// works but shouldn't be allowed
assert(cardType5 & CardProviderVisa);