@@ -60,10 +60,16 @@ any::operator bool() const {
60 RETURN_VALUE(Tag::Boolean, b,)
60 RETURN_VALUE(Tag::Boolean, b,)
63−any::operator char() const {
63+any::operator char32_t() const {
64 RETURN_VALUE(Tag::Character, c,)
64 RETURN_VALUE(Tag::Character, c,)
67+any::operator char() const {
68+ const auto val = cast<decltype(c)>(*this);
69+ assert(val <= std::numeric_limits<char>::max());
70+ return static_cast<char>(val);
67any::operator size_t() const {
73any::operator size_t() const {
68 const auto sz = cast<int>(*this);
74 const auto sz = cast<int>(*this);
69 assert(sz >= 0);
75 assert(sz >= 0);
@@ -197,7 +203,7 @@ auto operator+(const any& lhs_, const any& rhs_) -> any {
197 switch (lhs.tag) {
203 switch (lhs.tag) {
198 case any::Tag::Integer: assert(lhs.tag == any::Tag::Integer); return lhs.i + rhs.i;
204 case any::Tag::Integer: assert(lhs.tag == any::Tag::Integer); return lhs.i + rhs.i;
199 case any::Tag::Double: assert(lhs.tag == any::Tag::Double); return lhs.d + rhs.d;
205 case any::Tag::Double: assert(lhs.tag == any::Tag::Double); return lhs.d + rhs.d;
200− case any::Tag::Character: assert(lhs.tag == any::Tag::Character); return any(char(lhs.c + rhs.c));
206+ case any::Tag::Character: assert(lhs.tag == any::Tag::Character); return decltype(any::c){lhs.c + rhs.c};
201 case any::Tag::StringLiteral:
207 case any::Tag::StringLiteral:
202 assert(lhs.tag == any::Tag::StringLiteral || lhs.tag == any::Tag::String);
208 assert(lhs.tag == any::Tag::StringLiteral || lhs.tag == any::Tag::String);
203 assert(rhs.tag == any::Tag::StringLiteral || rhs.tag == any::Tag::String);
209 assert(rhs.tag == any::Tag::StringLiteral || rhs.tag == any::Tag::String);
@@ -230,7 +236,7 @@ auto operator-(const any& lhs_, const any& rhs_) -> any {
230 switch (lhs.tag) {
236 switch (lhs.tag) {
231 case any::Tag::Integer: return lhs.i - rhs.i;
237 case any::Tag::Integer: return lhs.i - rhs.i;
232 case any::Tag::Double: return lhs.d - rhs.d;
238 case any::Tag::Double: return lhs.d - rhs.d;
233− case any::Tag::Character: return any(char(lhs.c - rhs.c));
239+ case any::Tag::Character: return decltype(any::c){lhs.c - rhs.c};
234 default: assert(false && "Unsupported tag for '-' operator");
240 default: assert(false && "Unsupported tag for '-' operator");
236 return nullptr;
242 return nullptr;
@@ -243,7 +249,7 @@ auto operator*(const any& lhs_, const any& rhs_) -> any {
243 switch (lhs.tag) {
249 switch (lhs.tag) {
244 case any::Tag::Integer: return lhs.i * rhs.i;
250 case any::Tag::Integer: return lhs.i * rhs.i;
245 case any::Tag::Double: return lhs.d * rhs.d;
251 case any::Tag::Double: return lhs.d * rhs.d;
246− case any::Tag::Character: return any(char(lhs.c * rhs.c));
252+ case any::Tag::Character: return decltype(lhs.c){lhs.c - rhs.c};
247 default: assert(false && "Unsupported tag for '*' operator");
253 default: assert(false && "Unsupported tag for '*' operator");
249 return nullptr;
255 return nullptr;
@@ -256,7 +262,7 @@ auto operator/(const any& lhs_, const any& rhs_) -> any {
256 switch (lhs.tag) {
262 switch (lhs.tag) {
257 case any::Tag::Integer: return lhs.i / rhs.i;
263 case any::Tag::Integer: return lhs.i / rhs.i;
258 case any::Tag::Double: return lhs.d / rhs.d;
264 case any::Tag::Double: return lhs.d / rhs.d;
259− case any::Tag::Character: return any(char(lhs.c / rhs.c));
265+ case any::Tag::Character: return decltype(any::c){lhs.c / rhs.c};
260 default: assert(false && "Unsupported tag for '/' operator");
266 default: assert(false && "Unsupported tag for '/' operator");
262 return nullptr;
268 return nullptr;
@@ -268,7 +274,7 @@ auto operator%(const any& lhs_, const any& rhs_) -> any {
268 assert(lhs.tag == rhs.tag);
274 assert(lhs.tag == rhs.tag);
269 switch (lhs.tag) {
275 switch (lhs.tag) {
270 case any::Tag::Integer: return lhs.i % rhs.i;
276 case any::Tag::Integer: return lhs.i % rhs.i;
271− case any::Tag::Character: return any(char(lhs.c % rhs.c));
277+ case any::Tag::Character: return decltype(any::c){lhs.c % rhs.c};
272 default: assert(false && "Unsupported tag for '%' operator");
278 default: assert(false && "Unsupported tag for '%' operator");
274 return nullptr;
280 return nullptr;