00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef USERMODE_H
00017 #define USERMODE_H
00018
00019 #ifndef USE_PCH
00020 #include <cctype>
00021 #endif
00022
00023 #include "Watched.h"
00024 #include "MessageIn.h"
00025
00026
00027
00028 inline uint32_t make_uppercase_usermode_mask(char c)
00029 {
00030 ASSERT(std::isupper(c));
00031 return 1 << (c - 'A');
00032 }
00033
00034
00035
00036 inline uint32_t make_lowercase_usermode_mask(char c)
00037 {
00038 ASSERT(std::islower(c));
00039 return 1 << (c - 'a');
00040 }
00041
00042
00043
00044 struct UserModeMask {
00045 uint32_t uppercase_modes;
00046 uint32_t lowercase_modes;
00047
00048
00049 UserModeMask() : uppercase_modes(0), lowercase_modes(0) { }
00050
00051 UserModeMask(char c) : uppercase_modes(0), lowercase_modes(0) { *this = c; }
00052
00053
00054 UserModeMask& operator=(char c);
00055
00056 UserModeMask& operator|=(char c);
00057
00058 UserModeMask& operator|=(UserModeMask const& um);
00059
00060 UserModeMask& operator&=(char c);
00061
00062 UserModeMask& operator&=(UserModeMask const& um);
00063
00064 UserModeMask& operator^=(char c);
00065
00066 UserModeMask& operator^=(UserModeMask const& um);
00067
00068
00069 friend bool operator==(UserModeMask const& um1, UserModeMask const& um2)
00070 {
00071 return um1.lowercase_modes == um2.lowercase_modes &&
00072 um2.uppercase_modes == um2.uppercase_modes;
00073 }
00074
00075
00076 friend bool operator!=(UserModeMask const& um1, UserModeMask const& um2)
00077 {
00078 return um1.lowercase_modes != um2.lowercase_modes ||
00079 um2.uppercase_modes != um2.uppercase_modes;
00080 }
00081
00082 #ifdef CWDEBUG
00083
00084 friend std::ostream& operator<<(std::ostream& os, UserModeMask const& um)
00085 {
00086 os << "\"+";
00087 char c = 'a';
00088 for (uint32_t m = 1; c <= 'z'; ++c, m <<= 1)
00089 if ((um.lowercase_modes & m))
00090 os << c;
00091 c = 'A';
00092 for (uint32_t m = 1; c <= 'z'; ++c, m <<= 1)
00093 if ((um.uppercase_modes & m))
00094 os << c;
00095 return os << '"';
00096 }
00097 #endif
00098 };
00099
00100
00101 inline UserModeMask operator|(UserModeMask const& um, char c)
00102 {
00103 UserModeMask result(um);
00104 return result |= c;
00105 }
00106
00107
00108 inline UserModeMask operator|(UserModeMask const& um1, UserModeMask const& um2)
00109 {
00110 UserModeMask result(um1);
00111 return result |= um2;
00112 }
00113
00114
00115 inline UserModeMask operator&(UserModeMask const& um, char c)
00116 {
00117 UserModeMask result(um);
00118 return result &= c;
00119 }
00120
00121
00122 inline UserModeMask operator&(UserModeMask const& um1, UserModeMask const& um2)
00123 {
00124 UserModeMask result(um1);
00125 return result &= um2;
00126 }
00127
00128
00129 inline UserModeMask operator^(UserModeMask const& um, char c)
00130 {
00131 UserModeMask result(um);
00132 return result ^= c;
00133 }
00134
00135
00136 inline UserModeMask operator^(UserModeMask const& um1, UserModeMask const& um2)
00137 {
00138 UserModeMask result(um1);
00139 return result ^= um2;
00140 }
00141
00142
00143 class UserMode {
00144 private:
00145 Watched<UserModeMask> M_mask;
00146 public:
00147 #ifdef CWDEBUG
00148
00149 UserMode(void) : M_mask("UserMode::M_mask") { }
00150 #endif
00151
00152
00153 WatchedExpression<UserModeMask> operator*(void) { return *M_mask; }
00154
00155 void new_server_message_received(ServerMessageIn const& msg);
00156 };
00157
00158 #endif // USERMODE_H