Skip to content

Commit c372eb3

Browse files
NathanJPhillipssmowton
authored andcommitted
Used typeinfo functions instead of rolling own
1 parent 95f6505 commit c372eb3

File tree

1 file changed

+16
-11
lines changed

1 file changed

+16
-11
lines changed

src/util/expr_cast.h

+16-11
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,6 @@
2323
/// \return true if \a base is of type \a T
2424
template<typename T> bool check_expr_type(const exprt &base);
2525

26-
template<typename T> struct remove_constt;
27-
template<typename T> struct remove_constt<const T> { using type=T; };
28-
template<typename T> struct ptr_typet;
29-
template<typename T> struct ptr_typet<T *> { using type=T; };
30-
template<typename T> struct ref_typet;
31-
template<typename T> struct ref_typet<T &> { using type=T; };
32-
3326

3427
/// \brief Cast a constant pointer to a generic exprt to a specific derived
3528
/// class
@@ -42,7 +35,7 @@ T expr_dynamic_cast(const exprt *base)
4235
{
4336
return expr_dynamic_cast<
4437
T,
45-
typename remove_constt<typename ptr_typet<T>::type>::type,
38+
typename std::remove_const<typename std::remove_pointer<T>::type>::type,
4639
const exprt>(base);
4740
}
4841

@@ -54,7 +47,10 @@ T expr_dynamic_cast(const exprt *base)
5447
template<typename T>
5548
T expr_dynamic_cast(exprt *base)
5649
{
57-
return expr_dynamic_cast<T, typename ptr_typet<T>::type, exprt>(base);
50+
return expr_dynamic_cast<
51+
T,
52+
typename std::remove_const<typename std::remove_pointer<T>::type>::type,
53+
exprt>(base);
5854
}
5955

6056
/// \brief Cast a pointer to a generic exprt to a specific derived class
@@ -66,6 +62,9 @@ T expr_dynamic_cast(exprt *base)
6662
template<typename T, typename TUnderlying, typename TExpr>
6763
T expr_dynamic_cast(TExpr *base)
6864
{
65+
static_assert(
66+
std::is_pointer<T>::value,
67+
"Tried to convert exprt * to non-pointer type");
6968
static_assert(
7069
std::is_base_of<exprt, TUnderlying>::value,
7170
"The template argument T must be derived from exprt.");
@@ -89,7 +88,7 @@ T expr_dynamic_cast(const exprt &base)
8988
{
9089
return expr_dynamic_cast<
9190
T,
92-
typename remove_constt<typename ref_typet<T>::type>::type,
91+
typename std::remove_const<typename std::remove_reference<T>::type>::type,
9392
const exprt>(base);
9493
}
9594

@@ -101,7 +100,10 @@ T expr_dynamic_cast(const exprt &base)
101100
template<typename T>
102101
T expr_dynamic_cast(exprt &base)
103102
{
104-
return expr_dynamic_cast<T, typename ref_typet<T>::type, exprt>(base);
103+
return expr_dynamic_cast<
104+
T,
105+
typename std::remove_const<typename std::remove_reference<T>::type>::type,
106+
exprt>(base);
105107
}
106108

107109
/// \brief Cast a reference to a generic exprt to a specific derived class
@@ -113,6 +115,9 @@ T expr_dynamic_cast(exprt &base)
113115
template<typename T, typename TUnderlying, typename TExpr>
114116
T expr_dynamic_cast(TExpr &base)
115117
{
118+
static_assert(
119+
std::is_reference<T>::value,
120+
"Tried to convert exprt & to non-reference type");
116121
static_assert(
117122
std::is_base_of<exprt, TUnderlying>::value,
118123
"The template argument T must be derived from exprt.");

0 commit comments

Comments
 (0)