@@ -35,7 +35,7 @@ template<typename T> bool can_cast_expr(const exprt &base);
35
35
// / validate particular types.
36
36
inline void validate_expr (const exprt &) {}
37
37
38
- namespace detail
38
+ namespace detail // NOLINT
39
39
{
40
40
41
41
// We hide this in a namespace so that only functions that it only
@@ -50,9 +50,12 @@ namespace detail
50
50
// / \param base Reference to a generic \ref exprt
51
51
// / \return Reference to object of type \a TUnderlying
52
52
// / or valueless optional if \a base is not an instance of \a TUnderlying
53
- template <typename T, typename TConst, typename TUnderlying, typename TExpr>
54
- optionalt<std::reference_wrapper<TConst>> expr_try_dynamic_cast (TExpr &base)
53
+ template <typename T, typename TExpr>
54
+ optionalt<std::reference_wrapper<typename std::remove_reference<T>::type>>
55
+ expr_try_dynamic_cast (TExpr &base)
55
56
{
57
+ typedef typename std::decay<T>::type TUnderlying;
58
+ typedef typename std::remove_reference<T>::type TConst;
56
59
static_assert (
57
60
std::is_same<typename std::remove_const<TExpr>::type, exprt>::value,
58
61
" Tried to expr_try_dynamic_cast from something that wasn't an exprt" );
@@ -63,10 +66,10 @@ optionalt<std::reference_wrapper<TConst>> expr_try_dynamic_cast(TExpr &base)
63
66
std::is_base_of<exprt, TUnderlying>::value,
64
67
" The template argument T must be derived from exprt." );
65
68
if (!can_cast_expr<TUnderlying>(base))
66
- return optionalt<std::reference_wrapper<TConst>>() ;
69
+ return {} ;
67
70
T value=static_cast <T>(base);
68
71
validate_expr (value);
69
- return optionalt< std::reference_wrapper<TConst> >(value);
72
+ return std::reference_wrapper<TConst>(value);
70
73
}
71
74
72
75
} // namespace detail
@@ -81,11 +84,7 @@ template<typename T>
81
84
optionalt<std::reference_wrapper<typename std::remove_reference<T>::type>>
82
85
expr_try_dynamic_cast (const exprt &base)
83
86
{
84
- return detail::expr_try_dynamic_cast<
85
- T,
86
- typename std::remove_reference<T>::type,
87
- typename std::decay<T>::type,
88
- const exprt>(base);
87
+ return detail::expr_try_dynamic_cast<T>(base);
89
88
}
90
89
91
90
// / \brief Try to cast a reference to a generic exprt to a specific derived
@@ -98,14 +97,10 @@ template<typename T>
98
97
optionalt<std::reference_wrapper<typename std::remove_reference<T>::type>>
99
98
expr_try_dynamic_cast (exprt &base)
100
99
{
101
- return detail::expr_try_dynamic_cast<
102
- T,
103
- typename std::remove_reference<T>::type,
104
- typename std::decay<T>::type,
105
- exprt>(base);
100
+ return detail::expr_try_dynamic_cast<T>(base);
106
101
}
107
102
108
- namespace detail
103
+ namespace detail // NOLINT
109
104
{
110
105
111
106
// We hide this in a namespace so that only functions that it only
@@ -120,9 +115,10 @@ namespace detail
120
115
// / \throw std::bad_cast If \a base is not an instance of \a TUnderlying
121
116
// / \remark If CBMC assertions (PRECONDITION) are set to abort then this will
122
117
// / abort rather than throw if \a base is not an instance of \a TUnderlying
123
- template <typename T, typename TUnderlying, typename TExpr>
118
+ template <typename T, typename TExpr>
124
119
T expr_dynamic_cast (TExpr &base)
125
120
{
121
+ typedef typename std::decay<T>::type TUnderlying;
126
122
static_assert (
127
123
std::is_same<typename std::remove_const<TExpr>::type, exprt>::value,
128
124
" Tried to expr_dynamic_cast from something that wasn't an exprt" );
@@ -153,10 +149,7 @@ T expr_dynamic_cast(TExpr &base)
153
149
template <typename T>
154
150
T expr_dynamic_cast (const exprt &base)
155
151
{
156
- return detail::expr_dynamic_cast<
157
- T,
158
- typename std::decay<T>::type,
159
- const exprt>(base);
152
+ return detail::expr_dynamic_cast<T>(base);
160
153
}
161
154
162
155
// / \brief Cast a reference to a generic exprt to a specific derived class
@@ -169,10 +162,7 @@ T expr_dynamic_cast(const exprt &base)
169
162
template <typename T>
170
163
T expr_dynamic_cast (exprt &base)
171
164
{
172
- return detail::expr_dynamic_cast<
173
- T,
174
- typename std::decay<T>::type,
175
- exprt>(base);
165
+ return detail::expr_dynamic_cast<T>(base);
176
166
}
177
167
178
168
inline void validate_operands (
0 commit comments