Squid Web Cache master
Loading...
Searching...
No Matches
CharacterSet.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 1996-2025 The Squid Software Foundation and contributors
3 *
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
7 */
8
9#ifndef SQUID_SRC_BASE_CHARACTERSET_H
10#define SQUID_SRC_BASE_CHARACTERSET_H
11
12#include <initializer_list>
13#include <iosfwd>
14#include <vector>
15
18{
19public:
20 typedef std::vector<uint8_t> Storage;
21
23 explicit CharacterSet(const char *label = "anonymous", const char * const chars = "");
24
28 CharacterSet(const char *label, unsigned char low, unsigned char high);
29
33 CharacterSet(const char *label, std::initializer_list<std::pair<uint8_t,uint8_t>> ranges);
34
36 bool isEmpty() const { return chars_.empty(); }
37
39 bool operator[](unsigned char c) const {return chars_[static_cast<uint8_t>(c)] != 0;}
40
42 CharacterSet & add(const unsigned char c);
43
45 CharacterSet & remove(const unsigned char c);
46
48 CharacterSet & addRange(unsigned char low, unsigned char high);
49
52
55
58 CharacterSet complement(const char *complementLabel = nullptr) const;
59
61 CharacterSet &rename(const char *label) { name = label; return *this; }
62
64 bool operator == (const CharacterSet &cs) const { return chars_ == cs.chars_; }
66 bool operator != (const CharacterSet &cs) const { return !operator==(cs); }
67
69 void printChars(std::ostream &os) const;
70
72 const char * name;
73
74 // common character sets, RFC 5234
75 // A-Za-z
76 static const CharacterSet ALPHA;
77 // 0-1
78 static const CharacterSet BIT;
79 // carriage return
80 static const CharacterSet CR;
81 // controls
82 static const CharacterSet CTL;
83 // 0-9
84 static const CharacterSet DIGIT;
85 // double quote
86 static const CharacterSet DQUOTE;
87 // 0-9aAbBcCdDeEfF
88 static const CharacterSet HEXDIG;
89 // horizontal tab
90 static const CharacterSet HTAB;
91 // line feed
92 static const CharacterSet LF;
93 // white space
94 static const CharacterSet SP;
95 // visible (printable) characters
96 static const CharacterSet VCHAR;
97 // <space><tab>
98 static const CharacterSet WSP;
99
100 // HTTP character sets, RFC 7230
101 // ctext
102 static const CharacterSet CTEXT;
103 // XXX: maybe field-vchar = VCHAR / obs-text
104 // any VCHAR except for SPECIAL
105 static const CharacterSet TCHAR;
106 // special VCHARs
107 static const CharacterSet SPECIAL;
108 // qdtext
109 static const CharacterSet QDTEXT;
110 // obs-text
111 static const CharacterSet OBSTEXT;
112
113 // HTTP character sets, RFC 7232
114 // etagc
115 static const CharacterSet ETAGC;
116
117 // HTTP character sets, RFC 7235
118 // token68 (internal characters only, excludes '=' terminator)
119 static const CharacterSet TOKEN68C;
120
122 static const CharacterSet &RFC3986_UNRESERVED();
123
124private:
131};
132
139operator+ (CharacterSet lhs, const CharacterSet &rhs);
140
147operator- (CharacterSet lhs, const CharacterSet &rhs);
148
149std::ostream&
150operator <<(std::ostream &, const CharacterSet &);
151
152#endif /* SQUID_SRC_BASE_CHARACTERSET_H */
153
CharacterSet operator+(CharacterSet lhs, const CharacterSet &rhs)
CharacterSet operator-(CharacterSet lhs, const CharacterSet &rhs)
std::ostream & operator<<(std::ostream &, const CharacterSet &)
optimized set of C chars, with quick membership test and merge support
bool operator[](unsigned char c) const
whether a given character exists in the set
static const CharacterSet TOKEN68C
CharacterSet complement(const char *complementLabel=nullptr) const
bool isEmpty() const
whether the set lacks any members
std::vector< uint8_t > Storage
static const CharacterSet TCHAR
static const CharacterSet ETAGC
static const CharacterSet SP
CharacterSet & rename(const char *label)
change name; handy in const declarations that use operators
CharacterSet & operator-=(const CharacterSet &rhs)
set subtraction: remove all characters that are also in rhs
CharacterSet & addRange(unsigned char low, unsigned char high)
add a list of character ranges, expressed as pairs [low,high], including both ends
CharacterSet & add(const unsigned char c)
add a given character to the character set
static const CharacterSet CTEXT
static const CharacterSet WSP
bool operator==(const CharacterSet &cs) const
static const CharacterSet DQUOTE
static const CharacterSet DIGIT
CharacterSet & operator+=(const CharacterSet &rhs)
set addition: add to this set all characters that are also in rhs
static const CharacterSet ALPHA
static const CharacterSet QDTEXT
static const CharacterSet HEXDIG
static const CharacterSet VCHAR
static const CharacterSet LF
const char * name
optional set label for debugging (default: "anonymous")
static const CharacterSet SPECIAL
CharacterSet & remove(const unsigned char c)
remove a given character from the character set
bool operator!=(const CharacterSet &cs) const
static const CharacterSet CR
static const CharacterSet & RFC3986_UNRESERVED()
allowed URI characters that do not have a reserved purpose, RFC 3986
static const CharacterSet OBSTEXT
static const CharacterSet CTL
static const CharacterSet HTAB
static const CharacterSet BIT
void printChars(std::ostream &os) const
prints all chars in arbitrary order, without any quoting/escaping