@@ -163,7 +163,7 @@ class any {
163163 mutable cstring r;
164164 mutable fn f;
165165 mutable eff_fn e;
166− mutable void * u;
166+ mutable void * v;
167167 mutable managed<string> s;
168168 mutable managed<array> a;
169169 mutable managed<Closure> l;
@@ -181,15 +181,12 @@ class any {
181181
182182 any(const double val) noexcept : tag(Tag::Double), d(val) {}
183183 any(const char val) noexcept : tag(Tag::Character), c(val) {}
184+ any(const char32_t val) noexcept : tag(Tag::Integer), i(val) {}
184185
185186 template <typename T, typename = typename std::enable_if<std::is_same<bool,T>::value>::type>
186187 any(const T val) noexcept : tag(Tag::Boolean), b(val) {}
187188
188− template <size_t N>
189− any(const char (&val)[N]) noexcept : tag(Tag::StringLiteral), r(val) {}
190189 any(const char * val) : tag(Tag::String), s(make_managed<string>(val)) {}
191− any(char * val) : tag(Tag::String), s(make_managed<string>(val)) {}
192−
193190 any(const string& val) : tag(Tag::String), s(make_managed<string>(val)) {}
194191 any(string&& val) noexcept : tag(Tag::String), s(make_managed<string>(std::move(val))) {}
195192
@@ -240,9 +237,9 @@ class any {
240237 // Explicit void* to raw pointer value
241238 template <typename T>
242239 any(const T& val, typename std::enable_if<std::is_same<T,void*>::value>::type* = 0) noexcept
243− : tag(Tag::RawPointer), u(val) {}
240+ : tag(Tag::RawPointer), v(val) {}
244241
245− any(nullptr_t) noexcept : tag(Tag::RawPointer), u(nullptr) {}
242+ any(nullptr_t) noexcept : tag(Tag::RawPointer), v(nullptr) {}
246243
247244
248245#if !defined(USE_GC)
@@ -272,7 +269,7 @@ class any {
272269 case Tag::StringLiteral: r = other.r; break;
273270 case Tag::Function: f = other.f; break;
274271 case Tag::EffFunction: e = other.e; break;
275− case Tag::RawPointer: u = other.u; break;
272+ case Tag::RawPointer: v = other.v; break;
276273
277274 case Tag::String: new (&s) managed<string>(move_if_rvalue<T>(other.s)); break;
278275 case Tag::Array: new (&a) managed<array>(move_if_rvalue<T>(other.a)); break;
@@ -340,7 +337,7 @@ class any {
340337 operator bool() const;
341338 operator char() const;
342339 operator size_t() const;
343− operator cstring() const;
340+ operator const char *() const;
344341 operator const array&() const;
345342
346343 auto operator[](const size_t) const -> const any&;
@@ -354,66 +351,51 @@ class any {
354351 auto rawPointer() const -> void* {
355352 const any& variant = unthunkVariant(*this);
356353 assert(tag == Tag::RawPointer);
357− return variant.u;
354+ return variant.v;
358355 }
359356
360357 static auto unthunkVariant(const any&) -> const any&;
361358
362− #define DEFINE_OPERATOR(op, ty, rty) \
363− inline friend auto operator op (const any& lhs, ty rhs) -> rty { \
364− return (ty)lhs op rhs; \
359+ #define DEFINE_OPERATOR(op) \
360+ template <typename T> \
361+ inline friend auto operator op (const any& lhs, T rhs) -> T { \
362+ return static_cast<T>(lhs) op rhs; \
365363 } \
366− inline friend auto operator op (ty lhs, const any& rhs) -> rty { \
367− return lhs op (ty)rhs; \
364+ template <typename T> \
365+ inline friend auto operator op (T lhs, const any& rhs) -> T { \
366+ return lhs op static_cast<T>(rhs); \
368367 } \
368+ friend auto operator op (const any&, const any&) -> any;
369369
370− #define DECLARE_COMPARISON_OPERATOR(op) \
370+ #define DEFINE_COMPARISON_OPERATOR(op) \
371+ template <typename T> \
372+ inline friend auto operator op (const any& lhs, T rhs) -> bool { \
373+ return static_cast<T>(lhs) op rhs; \
374+ } \
375+ template <typename T> \
376+ inline friend auto operator op (T lhs, const any& rhs) -> bool { \
377+ return lhs op static_cast<T>(rhs); \
378+ } \
371379 friend auto operator op (const any&, const any&) -> bool; \
372− DEFINE_OPERATOR(op, int, bool) \
373− DEFINE_OPERATOR(op, double, bool) \
374− DEFINE_OPERATOR(op, char, bool) \
375− DEFINE_OPERATOR(op, bool, bool) \
376380 friend auto operator op (const any&, const char * const) -> bool; \
377381 friend auto operator op (const char * const, const any&) -> bool;
378382
379− DECLARE_COMPARISON_OPERATOR(==)
380− DECLARE_COMPARISON_OPERATOR(!=)
381− DECLARE_COMPARISON_OPERATOR(<)
382− DECLARE_COMPARISON_OPERATOR(<=)
383− DECLARE_COMPARISON_OPERATOR(>)
384− DECLARE_COMPARISON_OPERATOR(>=)
383+ DEFINE_COMPARISON_OPERATOR(==)
384+ DEFINE_COMPARISON_OPERATOR(!=)
385+ DEFINE_COMPARISON_OPERATOR(<)
386+ DEFINE_COMPARISON_OPERATOR(<=)
387+ DEFINE_COMPARISON_OPERATOR(>)
388+ DEFINE_COMPARISON_OPERATOR(>=)
385389
386− friend auto operator+(const any&, const any&) -> any;
390+ DEFINE_OPERATOR(+)
391+ DEFINE_OPERATOR(-)
392+ DEFINE_OPERATOR(*)
393+ DEFINE_OPERATOR(/)
394+ DEFINE_OPERATOR(%)
387395
388− DEFINE_OPERATOR(+, int, int)
389− DEFINE_OPERATOR(+, double, double)
390− DEFINE_OPERATOR(+, char, char)
391396 friend auto operator+(const any& lhs, const char * const rhs) -> string;
392397 friend auto operator+(const char * const lhs, const any& rhs) -> string;
393398
394− friend auto operator-(const any&, const any&) -> any;
395−
396− DEFINE_OPERATOR(-, int, int)
397− DEFINE_OPERATOR(-, double, double)
398− DEFINE_OPERATOR(-, char, char)
399−
400− friend auto operator*(const any&, const any&) -> any;
401−
402− DEFINE_OPERATOR(*, int, int)
403− DEFINE_OPERATOR(*, double, double)
404− DEFINE_OPERATOR(*, char, char)
405−
406− friend auto operator/(const any&, const any&) -> any;
407−
408− DEFINE_OPERATOR(/, int, int)
409− DEFINE_OPERATOR(/, double, double)
410− DEFINE_OPERATOR(/, char, char)
411−
412− friend auto operator%(const any&, const any&) -> any;
413−
414− DEFINE_OPERATOR(%, int, int)
415− DEFINE_OPERATOR(%, char, char)
416−
417399 friend auto operator-(const any&) -> any; // unary negate
418400
419401}; // class any
@@ -447,7 +429,7 @@ constexpr auto cast(const T& a) -> const T& {
447429template <typename T>
448430inline auto cast(const any& a) ->
449431 typename std::enable_if<std::is_arithmetic<T>::value ||
450− std::is_same<T,cstring>::value, T>::type {
432+ std::is_same<T,const char *>::value, T>::type {
451433 return a;
452434}
453435
@@ -466,7 +448,7 @@ inline auto cast(const any& a) ->
466448template <typename T,
467449 typename = typename std::enable_if<std::is_pointer<T>::value &&
468450 !std::is_same<T,void*>::value &&
469− !std::is_same<T,cstring>::value>::type>
451+ !std::is_same<T,const char *>::value>::type>
470452inline auto cast(const any& a) -> T {
471453 return static_cast<T>(a.extractPointer(IF_DEBUG(Private::TagHelper<T>::tag)));
472454}
@@ -568,6 +550,6 @@ namespace data {
568550#undef WITH_ALLOCATOR
569551#undef IS_POINTER_TYPE
570552#undef DEFINE_OPERATOR
571−#undef DECLARE_COMPARISON_OPERATOR
553+#undef DEFINE_COMPARISON_OPERATOR
572554
573555#endif // PureScript_HH