| 13 | #endif |
| 14 | |
| 15 | class CharacterSet { |
| 16 | int size; |
| 17 | bool valueAfter; |
| 18 | bool *bset; |
| 19 | public: |
| 20 | enum setBase { |
| 21 | setNone=0, |
| 22 | setLower=1, |
| 23 | setUpper=2, |
| 24 | setDigits=4, |
| 25 | setAlpha=setLower|setUpper, |
| 26 | setAlphaNum=setAlpha|setDigits |
| 27 | }; |
| 28 | CharacterSet(setBase base=setNone, const char *initialSet="", int size_=0x80, bool valueAfter_=false) { |
| 29 | size = size_; |
| 30 | valueAfter = valueAfter_; |
| 31 | bset = new bool[size]; |
| 32 | for (int i=0; i < size; i++) { |
| 33 | bset[i] = false; |
| 34 | } |
| 35 | AddString(initialSet); |
| 36 | if (base & setLower) |
| 37 | AddString("abcdefghijklmnopqrstuvwxyz"); |
| 38 | if (base & setUpper) |
| 39 | AddString("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); |
| 40 | if (base & setDigits) |
| 41 | AddString("0123456789"); |
| 42 | } |
| 43 | CharacterSet(const CharacterSet &other) { |
| 44 | size = other.size; |
| 45 | valueAfter = other.valueAfter; |
| 46 | bset = new bool[size]; |
| 47 | for (int i=0; i < size; i++) { |
| 48 | bset[i] = other.bset[i]; |
| 49 | } |
| 50 | } |
| 51 | ~CharacterSet() { |
| 52 | delete []bset; |
| 53 | bset = 0; |
| 54 | size = 0; |
| 55 | } |
| 56 | CharacterSet &operator=(const CharacterSet &other) { |
| 57 | if (this != &other) { |
| 58 | bool *bsetNew = new bool[other.size]; |
| 59 | for (int i=0; i < other.size; i++) { |
| 60 | bsetNew[i] = other.bset[i]; |
| 61 | } |
| 62 | delete []bset; |
| 63 | size = other.size; |
| 64 | valueAfter = other.valueAfter; |
| 65 | bset = bsetNew; |
| 66 | } |
| 67 | return *this; |
| 68 | } |
| 69 | void Add(int val) { |
| 70 | assert(val >= 0); |
| 71 | assert(val < size); |
| 72 | bset[val] = true; |