summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2015-09-15 11:04:14 +0200
committerStephan Bergmann <sbergman@redhat.com>2015-09-15 12:31:50 +0000
commitfed145be5231c3045098e5a0942f0b9d3c229460 (patch)
tree2ce4c6d2e0c12dd5cf937e192acd5711f6f2ee1d
parentUse CPPUNIT_ASSERT_EQUAL (diff)
downloadcore-fed145be5231c3045098e5a0942f0b9d3c229460.tar.gz
core-fed145be5231c3045098e5a0942f0b9d3c229460.zip
Fix binary ops with two o3tl::type_flags<E>::Wrap params
(the original ones would never have been picked due to how template argument deduction works) Change-Id: I5a08c763d721d8e11b5a10af2344a6a24bb0b9b2 Reviewed-on: https://gerrit.libreoffice.org/18583 Reviewed-by: Stephan Bergmann <sbergman@redhat.com> Tested-by: Stephan Bergmann <sbergman@redhat.com>
-rw-r--r--include/o3tl/typed_flags_set.hxx54
-rw-r--r--o3tl/qa/test-typed_flags.cxx4
2 files changed, 37 insertions, 21 deletions
diff --git a/include/o3tl/typed_flags_set.hxx b/include/o3tl/typed_flags_set.hxx
index 0aab70b1d82f..b698ae3efb23 100644
--- a/include/o3tl/typed_flags_set.hxx
+++ b/include/o3tl/typed_flags_set.hxx
@@ -68,6 +68,9 @@ struct is_typed_flags {
class Wrap {
public:
+ typedef typename std::underlying_type<E>::type underlying_type;
+ typedef is_typed_flags Unwrapped;
+
explicit Wrap(typename std::underlying_type<E>::type value):
value_(value)
{
@@ -147,14 +150,17 @@ inline typename o3tl::typed_flags<E>::Wrap operator ^(
^ static_cast<typename std::underlying_type<E>::type>(rhs));
}
-template<typename E>
-inline typename o3tl::typed_flags<E>::Wrap operator ^(
- typename o3tl::typed_flags<E>::Wrap lhs,
- typename o3tl::typed_flags<E>::Wrap rhs)
+template<typename W>
+inline typename o3tl::typed_flags<typename W::Unwrapped::Self>::Wrap operator ^(
+ W lhs, W rhs)
{
- return static_cast<typename o3tl::typed_flags<E>::Wrap>(
- static_cast<typename std::underlying_type<E>::type>(lhs)
- ^ static_cast<typename std::underlying_type<E>::type>(rhs));
+ return static_cast<W>(
+ static_cast<
+ typename std::underlying_type<typename W::Unwrapped::Self>::type>(
+ lhs)
+ ^ static_cast<
+ typename std::underlying_type<typename W::Unwrapped::Self>::type>(
+ rhs));
}
template<typename E>
@@ -194,14 +200,17 @@ inline typename o3tl::typed_flags<E>::Wrap operator &(
& static_cast<typename std::underlying_type<E>::type>(rhs));
}
-template<typename E>
-inline typename o3tl::typed_flags<E>::Wrap operator &(
- typename o3tl::typed_flags<E>::Wrap lhs,
- typename o3tl::typed_flags<E>::Wrap rhs)
+template<typename W>
+inline typename o3tl::typed_flags<typename W::Unwrapped::Self>::Wrap operator &(
+ W lhs, W rhs)
{
- return static_cast<typename o3tl::typed_flags<E>::Wrap>(
- static_cast<typename std::underlying_type<E>::type>(lhs)
- & static_cast<typename std::underlying_type<E>::type>(rhs));
+ return static_cast<W>(
+ static_cast<
+ typename std::underlying_type<typename W::Unwrapped::Self>::type>(
+ lhs)
+ & static_cast<
+ typename std::underlying_type<typename W::Unwrapped::Self>::type>(
+ rhs));
}
template<typename E>
@@ -241,14 +250,17 @@ inline typename o3tl::typed_flags<E>::Wrap operator |(
| static_cast<typename std::underlying_type<E>::type>(rhs));
}
-template<typename E>
-inline typename o3tl::typed_flags<E>::Wrap operator |(
- typename o3tl::typed_flags<E>::Wrap lhs,
- typename o3tl::typed_flags<E>::Wrap rhs)
+template<typename W>
+inline typename o3tl::typed_flags<typename W::Unwrapped::Self>::Wrap operator |(
+ W lhs, W rhs)
{
- return static_cast<typename o3tl::typed_flags<E>::Wrap>(
- static_cast<typename std::underlying_type<E>::type>(lhs)
- | static_cast<typename std::underlying_type<E>::type>(rhs));
+ return static_cast<W>(
+ static_cast<
+ typename std::underlying_type<typename W::Unwrapped::Self>::type>(
+ lhs)
+ | static_cast<
+ typename std::underlying_type<typename W::Unwrapped::Self>::type>(
+ rhs));
}
template<typename E>
diff --git a/o3tl/qa/test-typed_flags.cxx b/o3tl/qa/test-typed_flags.cxx
index d2a4154fd71b..0612fc190cbe 100644
--- a/o3tl/qa/test-typed_flags.cxx
+++ b/o3tl/qa/test-typed_flags.cxx
@@ -47,6 +47,10 @@ public:
nHint &= ConfigurationChangedHint::ONE;
CPPUNIT_ASSERT( bool(nHint &= ConfigurationChangedHint::ONE) );
+ CPPUNIT_ASSERT(
+ !((ConfigurationChangedHint::NONE | ConfigurationChangedHint::ONE)
+ & (ConfigurationChangedHint::NONE
+ | ConfigurationChangedHint::TWO)));
}
// Change the following lines only, if you add, remove or rename