git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
C++: fix issues with cast changes
commitb36e9fef969b04f16521dd68963e92049a4d0b56 authorAndy Arvanitis <andyarvanitis@gmail.com> dateThu 2 Mar 2017, 20:50 (10 years ago) parent99b2705
1 file changed+44−4
pcc/runtime/purescript.hh+44−4
pcc/runtime/purescript.hh+44−4
@@ -422,10 +422,50 @@ class any {
422422
423423}; // class any
424424
425+namespace Private {
426+ template <typename T, typename U=void>
427+ struct TagHelper {};
428+
429+ template <>
430+ struct TagHelper<string> {
431+ static constexpr any::Tag tag = any::Tag::String;
432+ };
433+
434+ template <>
435+ struct TagHelper<const char *> {
436+ static constexpr any::Tag tag = any::Tag::String;
437+ };
438+
439+ template <size_t N>
440+ struct TagHelper<any::dict<N>> {
441+ static constexpr any::Tag tag = any::Tag::Dictionary;
442+ };
443+
444+ template <size_t N>
445+ struct TagHelper<any::data<N>> {
446+ static constexpr any::Tag tag = any::Tag::Data;
447+ };
448+
449+ template <>
450+ struct TagHelper<any::array> {
451+ static constexpr any::Tag tag = any::Tag::Array;
452+ };
453+
454+ template <>
455+ struct TagHelper<any::record> {
456+ static constexpr any::Tag tag = any::Tag::Record;
457+ };
458+
459+ template <typename T>
460+ struct TagHelper<T> {
461+ static constexpr any::Tag tag = any::Tag::Pointer;
462+ };
463+}
464+
425465template <typename T,
426466 typename = typename std::enable_if<std::is_class<T>::value>::type>
427467inline auto cast_managed(const any& a) -> T& {
428− return *static_cast<T*>(a.extractPointer(IF_DEBUG(any::Tag::Pointer)));
468+ return *static_cast<T*>(a.extractPointer(IF_DEBUG(Private::TagHelper<T>::tag)));
429469}
430470
431471// TODO: Deprecated - use static_cast
@@ -451,7 +491,7 @@ namespace dict {
451491
452492 template <size_t N>
453493 inline auto get(const any& a) -> const any& {
454− return (*static_cast<const any::dict<N+1>*>(a.extractPointer(IF_DEBUG(any::Tag::Dictionary))))[N].second;
494+ return cast_managed<any::dict<N+1>>(a)[N].second;
455495 }
456496
457497 template <size_t N>
@@ -469,7 +509,7 @@ namespace dict {
469509 }
470510
471511 inline auto get(const Private::Symbol key, const any& a) -> const any& {
472− return get(key, *static_cast<const any::dict<unknown_size>*>(a.extractPointer(IF_DEBUG(any::Tag::Dictionary))));
512+ return get(key, cast_managed<any::dict<unknown_size>>(a));
473513 }
474514
475515 #define P(N) any::dict_pair&& arg ## N
@@ -517,7 +557,7 @@ namespace data {
517557
518558 template <size_t N>
519559 inline auto get(const any& a) -> const any& {
520− return (*static_cast<const any::data<N+1>*>(a.extractPointer(IF_DEBUG(any::Tag::Data))))[N];
560+ return cast_managed<any::data<N+1>>(a)[N];
521561 }
522562
523563 template <typename T>