Git-Url: 
http://git.frugalware.org/gitweb/gitweb.cgi?p=pacman-g2.git;a=commitdiff;h=aed13590bd6c2d74ad82b5e26e01cdf27f787a1c

commit aed13590bd6c2d74ad82b5e26e01cdf27f787a1c
Author: Michel Hermier <[email protected]>
Date:   Thu May 29 07:54:00 2014 +0200

libpacman: Merge FFsignal in a single definition thanks to std::enable_if.

diff --git a/lib/libpacman/kernel/fsignal.h b/lib/libpacman/kernel/fsignal.h
index 02681a5..5a59cd5 100644
--- a/lib/libpacman/kernel/fsignal.h
+++ b/lib/libpacman/kernel/fsignal.h
@@ -31,16 +31,12 @@
namespace flib
{

-namespace detail
-{
-
template <typename>
-class FSignalBase;
+class FSignal;

template <typename R, typename... Args>
-class FSignalBase<R(Args...)>
+class FSignal<R(Args...)>
{
-protected:
typedef std::vector<flib::FFunction<R(Args...)>> connections_container;
typedef typename connections_container::value_type value_type;
typedef typename connections_container::const_reference const_reference;
@@ -48,6 +44,25 @@ protected:
connections_container m_connections;

public:
+       template <typename Accumulator = flib::FAccumulator<void>>
+       typename std::enable_if<!std::is_void<R>::value, Accumulator>::type 
operator()(Args... args) const
+       {
+               Accumulator accumulator = 
flib::fdefault_constructor<Accumulator>();
+
+               for(const_reference connection : m_connections) {
+                       accumulator += connection(args...);
+               }
+               return accumulator;
+       }
+
+       template <typename Accumulator = void>
+       typename std::enable_if<std::is_void<R>::value, Accumulator>::type 
operator()(Args... args) const
+       {
+               for(const_reference connection : m_connections) {
+                       connection(args...);
+               }
+       }
+
bool connect(const flib::FFunction<R(Args...)>& function)
{
ASSERT(function, return false);
@@ -67,57 +82,17 @@ public:
{
return connect(flib::FFunction<R(Args...)>(pointer, method, (const Receiver 
*)nullptr));
}
-};
-
-}
-
-template <typename>
-class FSignal;

-template <typename R, typename... Args>
-class FSignal<R(Args...)>
-       : public flib::detail::FSignalBase<R(Args...)>
-{
-       typedef flib::detail::FSignalBase<R(Args...)> super_type;
-       typedef typename super_type::const_reference const_reference;
-
-public:
template <typename Accumulator = flib::FAccumulator<void>>
-       Accumulator operator()(Args... args) const
-       {
-               Accumulator accumulator = 
flib::fdefault_constructor<Accumulator>();
-
-               for(const_reference connection : super_type::m_connections) {
-                       accumulator += connection(args...);
-               }
-               return accumulator;
-       }
-
-       template <typename Accumulator = flib::FAccumulator<void>>
-       inline Accumulator emit(Args... args) const
+       inline typename std::enable_if<!std::is_void<R>::value, 
Accumulator>::type emit(Args... args) const
{
return operator()<Accumulator> (args...);
}
-};
-
-template <typename... Args>
-class FSignal<void(Args...)>
-       : public flib::detail::FSignalBase<void(Args...)>
-{
-       typedef flib::detail::FSignalBase<void(Args...)> super_type;
-       typedef typename super_type::const_reference const_reference;
-
-public:
-       void operator()(Args... args) const
-       {
-               for(const_reference connection : super_type::m_connections) {
-                       connection(args...);
-               }
-       }

-       inline void emit(Args... args) const
+       template <typename Accumulator = void>
+       inline typename std::enable_if<std::is_void<R>::value, 
Accumulator>::type emit(Args... args) const
{
-               operator()(args...);
+               operator()<void> (args...);
}
};
_______________________________________________
Frugalware-git mailing list
[email protected]
http://frugalware.org/mailman/listinfo/frugalware-git

Reply via email to