[PPL-devel] [GIT] ppl/ppl(floating_point): Added is and as methods.
Abramo Bagnara
abramo.bagnara at gmail.com
Wed Jul 28 00:47:39 CEST 2010
Module: ppl/ppl
Branch: floating_point
Commit: 743a6e470392137a963641956f7c273b84b04f05
URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=743a6e470392137a963641956f7c273b84b04f05
Author: Abramo Bagnara <abramo.bagnara at gmail.com>
Date: Wed Jul 28 00:47:30 2010 +0200
Added is and as methods.
---
src/Concrete_Expression.defs.hh | 18 ++++++++++++++++++
src/linearize.hh | 8 ++++----
tests/Concrete_Expression/C_Expr.defs.hh | 1 +
3 files changed, 23 insertions(+), 4 deletions(-)
diff --git a/src/Concrete_Expression.defs.hh b/src/Concrete_Expression.defs.hh
index 88fbca8..3bafbbd 100644
--- a/src/Concrete_Expression.defs.hh
+++ b/src/Concrete_Expression.defs.hh
@@ -123,6 +123,24 @@ public:
//! Returns the kind of \* this.
Concrete_Expression_Kind kind() const;
+
+ template <template <typename T> class Derived>
+ bool is() const {
+ return Concrete_Expression<Target>::kind() == Derived<Target>::KIND;
+ }
+
+ template <template <typename T> class Derived>
+ Derived<Target>* as() {
+ PPL_ASSERT(is<Derived>());
+ return static_cast<Derived<Target>*>(this);
+ }
+
+ template <template <typename T> class Derived>
+ const Derived<Target>* as() const {
+ PPL_ASSERT(is<Derived>());
+ return static_cast<const Derived<Target>*>(this);
+ }
+
};
template <typename Target>
diff --git a/src/linearize.hh b/src/linearize.hh
index ee8abc1..5fee0da 100644
--- a/src/linearize.hh
+++ b/src/linearize.hh
@@ -630,7 +630,7 @@ linearize(const Concrete_Expression<Target>& expr,
case Floating_Point_Constant<Target>::KIND:
{
const Floating_Point_Constant<Target>* fpc_expr =
- static_cast<const Floating_Point_Constant<Target>* >(&expr);
+ expr.template as<Floating_Point_Constant>();
result = FP_Linear_Form(FP_Interval_Type(fpc_expr->get_value_as_string()));
return true;
break;
@@ -638,7 +638,7 @@ linearize(const Concrete_Expression<Target>& expr,
case Unary_Operator<Target>::KIND:
{
const Unary_Operator<Target>* uop_expr =
- static_cast<const Unary_Operator<Target>* >(&expr);
+ expr.template as<Unary_Operator>();
switch (uop_expr->unary_operator()) {
case Unary_Operator<Target>::UPLUS:
return linearize(*(uop_expr->argument()), int_store, lf_store, result);
@@ -661,7 +661,7 @@ linearize(const Concrete_Expression<Target>& expr,
case Binary_Operator<Target>::KIND:
{
const Binary_Operator<Target>* bop_expr =
- static_cast<const Binary_Operator<Target>* >(&expr);
+ expr.template as<Binary_Operator>();
switch (bop_expr->binary_operator()) {
case Binary_Operator<Target>::ADD:
return add_linearize(*bop_expr, int_store, lf_store, result);
@@ -692,7 +692,7 @@ linearize(const Concrete_Expression<Target>& expr,
case Approximable_Reference<Target>::KIND:
{
const Approximable_Reference<Target>* ref_expr =
- static_cast<const Approximable_Reference<Target>* >(&expr);
+ expr.template as<Approximable_Reference>();
/* Variable references are the only that we are currently
able to analyze */
dimension_type variable_index = ref_expr->associated_dimension();
diff --git a/tests/Concrete_Expression/C_Expr.defs.hh b/tests/Concrete_Expression/C_Expr.defs.hh
index 96bc1cd..0391a9c 100644
--- a/tests/Concrete_Expression/C_Expr.defs.hh
+++ b/tests/Concrete_Expression/C_Expr.defs.hh
@@ -49,6 +49,7 @@ public:
//! Returns the kind of \* this.
Concrete_Expression_Kind kind() const;
+
private:
//! The expression's kind.
C_Expr_Kind expr_kind;
More information about the PPL-devel
mailing list