#include <vector>
+/// Optimized set of C chars, with quick membership test and merge support
class CharacterSet
{
public:
- CharacterSet(const char *label, const char * const c) : name(label), chars_(std::vector<bool>(256,false)) {
- size_t clen = strlen(c);
+ typedef std::vector<uint8_t> vector_type;
+
+ CharacterSet(const char *label, const char * const c)
+ : name(label == NULL ? "anonymous" : label), chars_(vector_type(256,0))
+ {
+ const size_t clen = strlen(c);
for (size_t i = 0; i < clen; ++i)
- chars_[static_cast<uint8_t>(c[i])] = true;
+ add(c[i]);
}
/// whether a given character exists in the set
bool operator[](unsigned char c) const {return chars_[static_cast<uint8_t>(c)];}
- /// add a given char to the character set. c must be >= 0.
+ /// add a given char to the character set.
CharacterSet & add(const unsigned char c) {chars_[static_cast<uint8_t>(c)] = true; return *this; }
/// add all characters from the given CharacterSet to this one
const CharacterSet &operator +=(const CharacterSet &src) {
//precondition: src.chars_.size() == chars_.size()
- std::vector<bool>::const_iterator s = src.chars_.begin();
- const std::vector<bool>::const_iterator e = src.chars_.end();
- std::vector<bool>::iterator d = chars_.begin();
+ vector_type::const_iterator s = src.chars_.begin();
+ const vector_type::const_iterator e = src.chars_.end();
+ vector_type::iterator d = chars_.begin();
while (s != e) {
if (*s)
*d = true;
return *this;
}
- /// name of this character set
+ /// optional set label fdebugging (default: "anonymous")
const char * name;
private:
- /// characters defined in this set
- std::vector<bool> chars_; //std::vector<bool> is optimized
+ /// characters present in this set
+ vector_type chars_;
};
#endif /* _SQUID_SRC_PARSER_CHARACTERSET_H */