@@ -44,7 +44,7 @@
45namespace PureScript {
45namespace PureScript {
47−using cstring = const char *;
47+using cstring = const char *; // TODO: deprecated
48using std::string;
48using std::string;
49using std::nullptr_t;
49using std::nullptr_t;
50using std::runtime_error;
50using std::runtime_error;
@@ -193,6 +193,9 @@ class any {
193 assert(val >= std::numeric_limits<decltype(i)>::min() &&
193 assert(val >= std::numeric_limits<decltype(i)>::min() &&
194 val <= std::numeric_limits<decltype(i)>::max());
194 val <= std::numeric_limits<decltype(i)>::max());
196+ any(const size_t val) noexcept : tag(Tag::Integer), i(static_cast<decltype(i)>(val)) {
197+ assert(val <= std::numeric_limits<decltype(i)>::max());
196 any(const double val) noexcept : tag(Tag::Double), d(val) {}
199 any(const double val) noexcept : tag(Tag::Double), d(val) {}
197 any(const char32_t val) noexcept : tag(Tag::Character), c(val) {}
200 any(const char32_t val) noexcept : tag(Tag::Character), c(val) {}
198 any(const char val) noexcept : tag(Tag::Character), c(val) {}
201 any(const char val) noexcept : tag(Tag::Character), c(val) {}
@@ -333,14 +336,14 @@ class any {
333 operator const record&() const;
336 operator const record&() const;
335 operator void *() const {
338 operator void *() const {
336− return extractPointer(IF_DEBUG(Tag::RawPointer));
339+ return rawPointer();
339 template <typename T,
342 template <typename T,
340 typename = typename std::enable_if<std::is_pointer<T>::value &&
343 typename = typename std::enable_if<std::is_pointer<T>::value &&
341 std::is_class<typename std::remove_pointer<T>::type>::value>::type>
344 std::is_class<typename std::remove_pointer<T>::type>::value>::type>
342 operator T() const {
345 operator T() const {
343− return static_cast<T>(extractPointer(IF_DEBUG(Tag::RawPointer)));
346+ return static_cast<T>(rawPointer());
346 auto operator[](const size_t) const -> const any&;
349 auto operator[](const size_t) const -> const any&;
@@ -419,77 +422,24 @@ class any {
420}; // class any
423}; // class any
423− template <typename T, typename U=void>
424− struct TagHelper {};
427− struct TagHelper<string> {
428− static constexpr any::Tag tag = any::Tag::String;
432− struct TagHelper<const char *> {
433− static constexpr any::Tag tag = any::Tag::String;
437− struct TagHelper<any::dict<N>> {
438− static constexpr any::Tag tag = any::Tag::Dictionary;
442− struct TagHelper<any::data<N>> {
443− static constexpr any::Tag tag = any::Tag::Data;
447− struct TagHelper<any::array> {
448− static constexpr any::Tag tag = any::Tag::Array;
452− struct TagHelper<any::record> {
453− static constexpr any::Tag tag = any::Tag::Record;
456− template <typename T>
457− struct TagHelper<T> {
458− static constexpr any::Tag tag = any::Tag::Pointer;
463−template <typename T>
464−constexpr auto cast(const T& a) -> const T& {
468−template <typename T>
469−inline auto cast(const any& a) ->
470− typename std::enable_if<std::is_arithmetic<T>::value ||
471− std::is_same<T,const char *>::value, T>::type {
475template <typename T,
425template <typename T,
476 typename = typename std::enable_if<std::is_class<T>::value>::type>
426 typename = typename std::enable_if<std::is_class<T>::value>::type>
477−inline auto cast(const any& a) -> T& {
427+inline auto cast_managed(const any& a) -> T& {
478− return *static_cast<T*>(a.extractPointer(IF_DEBUG(Private::TagHelper<T>::tag)));
428+ return *static_cast<T*>(a.extractPointer(IF_DEBUG(any::Tag::Pointer)));
431+// TODO: Deprecated - use static_cast
481template <typename T,
432template <typename T,
482− typename = typename std::enable_if<std::is_pointer<T>::value &&
433+ typename = typename std::enable_if<!std::is_class<T>::value>::type>
483− !std::is_same<T,void*>::value &&
484− !std::is_same<T,const char *>::value>::type>
485inline auto cast(const any& a) -> T {
434inline auto cast(const any& a) -> T {
486− return static_cast<T>(a.extractPointer(IF_DEBUG(Private::TagHelper<T>::tag)));
435+ return static_cast<T>(a);
438+// TODO: Deprecated - use cast_managed
489−template <typename T>
439+template <typename T,
440+ typename = typename std::enable_if<std::is_class<T>::value>::type>
490−inline auto cast(const any& a) ->
441+inline auto cast(const any& a) -> T& {
491− typename std::enable_if<std::is_same<void*, T>::value, T>::type {
442+ return cast_managed<T>(a);
492− return a.rawPointer();
495namespace dict {
445namespace dict {
@@ -501,7 +451,7 @@ namespace dict {
502 template <size_t N>
452 template <size_t N>
503 inline auto get(const any& a) -> const any& {
453 inline auto get(const any& a) -> const any& {
504− return cast<any::dict<N+1>>(a)[N].second;
454+ return (*static_cast<const any::dict<N+1>*>(a.extractPointer(IF_DEBUG(any::Tag::Dictionary))))[N].second;
507 template <size_t N>
457 template <size_t N>
@@ -519,7 +469,7 @@ namespace dict {
521 inline auto get(const Private::Symbol key, const any& a) -> const any& {
471 inline auto get(const Private::Symbol key, const any& a) -> const any& {
522− return get(key, cast<any::dict<unknown_size>>(a));
472+ return get(key, *static_cast<const any::dict<unknown_size>*>(a.extractPointer(IF_DEBUG(any::Tag::Dictionary))));
525 #define P(N) any::dict_pair&& arg ## N
475 #define P(N) any::dict_pair&& arg ## N
@@ -567,7 +517,7 @@ namespace data {
568 template <size_t N>
518 template <size_t N>
569 inline auto get(const any& a) -> const any& {
519 inline auto get(const any& a) -> const any& {
570− return cast<any::data<N+1>>(a)[N];
520+ return (*static_cast<const any::data<N+1>*>(a.extractPointer(IF_DEBUG(any::Tag::Data))))[N];
573 template <typename T>
523 template <typename T>