aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2019-01-17 15:48:05 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2019-01-18 13:59:31 +0300
commit7d79d5298f56c4768a90df629b689d1bc3ebbb31 (patch)
tree668ef735fa24ac7042f150bd823bcfcebebb5a92
parentd7fffb8fbd0743e6dfcf76eb4373bfead92bffc7 (diff)
Add function_wrapper::cast() that cleanly cast to an incompatible function type
-rw-r--r--odb/database.cxx2
-rw-r--r--odb/details/function-wrapper.hxx5
-rw-r--r--odb/details/function-wrapper.ixx10
-rw-r--r--odb/schema-catalog.cxx2
4 files changed, 17 insertions, 2 deletions
diff --git a/odb/database.cxx b/odb/database.cxx
index 7dd540f..f9e1043 100644
--- a/odb/database.cxx
+++ b/odb/database.cxx
@@ -67,7 +67,7 @@ namespace odb
else
{
typedef void (*caller) (const void*, const char*, connection_type&);
- reinterpret_cast<caller> (fw.function) (fw.std_function, name, c);
+ fw.cast<caller> () (fw.std_function, name, c);
}
return true;
diff --git a/odb/details/function-wrapper.hxx b/odb/details/function-wrapper.hxx
index 3a8ebfc..165df18 100644
--- a/odb/details/function-wrapper.hxx
+++ b/odb/details/function-wrapper.hxx
@@ -59,6 +59,11 @@ namespace odb
void swap (function_wrapper<F>&);
+ // Cleanly cast to an incompatible function type.
+ //
+ template <typename R> R
+ cast () const;
+
// Conversion to bool.
//
public:
diff --git a/odb/details/function-wrapper.ixx b/odb/details/function-wrapper.ixx
index d73d578..9ec19ec 100644
--- a/odb/details/function-wrapper.ixx
+++ b/odb/details/function-wrapper.ixx
@@ -36,5 +36,15 @@ namespace odb
swap (const_cast<function_wrapper<F>&> (x));
return *this;
}
+
+ template <typename F>
+ template <typename R>
+ inline R function_wrapper<F>::
+ cast () const
+ {
+ union { F* f; R r; } r;
+ r.f = function;
+ return r.r;
+ }
}
}
diff --git a/odb/schema-catalog.cxx b/odb/schema-catalog.cxx
index b767bca..946884f 100644
--- a/odb/schema-catalog.cxx
+++ b/odb/schema-catalog.cxx
@@ -227,7 +227,7 @@ namespace odb
else
{
typedef void (*caller) (const void*, database&);
- reinterpret_cast<caller> (m.function) (m.std_function, db);
+ m.cast<caller> () (m.std_function, db);
}
r++;
}