/****************************************************************************
**
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the tools applications of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this
** file. Please review the following information to ensure the GNU Lesser
** General Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU General
** Public License version 3.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of this
** file. Please review the following information to ensure the GNU General
** Public License version 3.0 requirements will be met:
** http://www.gnu.org/copyleft/gpl.html.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/

#ifndef DEBUGGER_CALLBACK_H
#define DEBUGGER_CALLBACK_H

#include "symbianutils_global.h"

namespace trk {
namespace Internal {

/* Helper class for the 1-argument functor:
 * Cloneable base class for the implementation which is
 * invokeable with the argument. */
template <class Argument>
class CallbackImplBase
{
    Q_DISABLE_COPY(CallbackImplBase)
public:
    CallbackImplBase() {}
    virtual CallbackImplBase *clone() const = 0;
    virtual void invoke(Argument a) = 0;
    virtual ~CallbackImplBase() {}
};

/* Helper class for the 1-argument functor: Implementation for
 * a class instance with a member function pointer. */
template <class Class, class Argument>
class CallbackMemberPtrImpl : public CallbackImplBase<Argument>
{
public:
    typedef void (Class::*MemberFuncPtr)(Argument);

    CallbackMemberPtrImpl(Class *instance,
                          MemberFuncPtr memberFunc) :
                          m_instance(instance),
                          m_memberFunc(memberFunc) {}

    virtual CallbackImplBase<Argument> *clone() const
    {
        return new CallbackMemberPtrImpl<Class, Argument>(m_instance, m_memberFunc);
    }

    virtual void invoke(Argument a)
        { (m_instance->*m_memberFunc)(a); }
private:
    Class *m_instance;
    MemberFuncPtr m_memberFunc;
};

} // namespace Internal

/* Default-constructible, copyable 1-argument functor providing an
 * operator()(Argument) that invokes a member function of a class:
 * \code
class Foo {
public:
    void print(const std::string &);
};
...
Foo foo;
Callback<const std::string &> f1(&foo, &Foo::print);
f1("test");
\endcode */

template <class Argument>
class Callback
{
public:
    Callback() : m_impl(0) {}

    template <class Class>
    Callback(Class *instance, void (Class::*memberFunc)(Argument)) :
        m_impl(new Internal::CallbackMemberPtrImpl<Class,Argument>(instance, memberFunc))
    {}

    ~Callback()
    {
        clean();
    }

    Callback(const Callback &rhs) :
        m_impl(0)
    {
        if (rhs.m_impl)
            m_impl = rhs.m_impl->clone();
    }

    Callback &operator=(const Callback &rhs)
    {
        if (this != &rhs) {
            clean();
            if (rhs.m_impl)
                m_impl = rhs.m_impl->clone();
        }
        return *this;
    }

    bool isNull() const { return m_impl == 0; }
    operator bool() const { return !isNull(); }

    void operator()(Argument a)
    {
        if (m_impl)
            m_impl->invoke(a);
    }

private:
    void clean()
    {
        if (m_impl) {
            delete m_impl;
            m_impl = 0;
        }
    }

    Internal::CallbackImplBase<Argument> *m_impl;
};

} // namespace trk

#endif // DEBUGGER_CALLBACK_H
