mirror of https://github.com/KLayout/klayout.git
226 lines
5.8 KiB
C++
226 lines
5.8 KiB
C++
|
|
/*
|
|
|
|
KLayout Layout Viewer
|
|
Copyright (C) 2006-2017 Matthias Koefferlein
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
*/
|
|
|
|
|
|
#ifndef _HDR_tlEvents
|
|
#define _HDR_tlEvents
|
|
|
|
#include "tlObject.h"
|
|
#include "tlException.h"
|
|
|
|
#include <vector>
|
|
#include <algorithm>
|
|
|
|
namespace tl
|
|
{
|
|
|
|
/**
|
|
* @brief A helper function to handle event exceptions of tl::Exception type
|
|
*/
|
|
void handle_event_exception (tl::Exception &ex);
|
|
|
|
/**
|
|
* @brief A helper function to handle event exceptions of std::exception type
|
|
*/
|
|
void handle_event_exception (std::exception &ex);
|
|
|
|
/**
|
|
* @brief A framework of observer and observables
|
|
*
|
|
* This framework competes with the signal/event concept of Qt. It is provided because
|
|
* the latter has some weaknesses, namely:
|
|
*
|
|
* - Signals/slots cannot be a defined for templates
|
|
* - The involved objects need to be derived from QObject
|
|
* - The Qt concept requires the meta object compiler
|
|
*
|
|
* the framework provided herein is based on C++ meta programming alone and avoids
|
|
* some of these issues.
|
|
*
|
|
* Events are used the following way:
|
|
* - Instantiate an event object inside the observable class
|
|
* - Expose this event object
|
|
* - Use add/remove to attach or detach receivers
|
|
*
|
|
* @code
|
|
*
|
|
* // Object with event
|
|
* class Observed
|
|
* {
|
|
* public:
|
|
* tl::event<Observed *, int> &event () { return m_event; }
|
|
* void trigger_event ()
|
|
* {
|
|
* // issue event
|
|
* m_event (this, -1);
|
|
* }
|
|
* private:
|
|
* tl::event<Observed *, int> m_event;
|
|
* };
|
|
*
|
|
* // Observer
|
|
* class Observer : public tl::Object
|
|
* {
|
|
* public:
|
|
* void receives_event (Observed *, int) { ... }
|
|
* };
|
|
*
|
|
* // Connect this
|
|
* Observed x;
|
|
* Observer y;
|
|
* x.event ().add (&y, &Observed::receives_event);
|
|
* x.trigger_event ();
|
|
*
|
|
* @endcode
|
|
*
|
|
* Events can be given a disamibguation or client data parameter:
|
|
*
|
|
* @code
|
|
*
|
|
* // Observer
|
|
* class Observer : public tl::Object
|
|
* {
|
|
* public:
|
|
* // The first parameter is the client data parameter which is given as
|
|
* // third parameter in "add"
|
|
* void receives_event (int, Observed *, int) { ... }
|
|
* };
|
|
*
|
|
* // Connect this
|
|
* Observed x;
|
|
* Observer y;
|
|
* x.event ().add (&y, &Observed::receives_event, 1);
|
|
* x.trigger_event ();
|
|
*
|
|
* @endcode
|
|
*/
|
|
|
|
template <class A1 = void, class A2 = void, class A3 = void, class A4 = void, class A5 = void> class event_function_base;
|
|
template <class T, class A1 = void, class A2 = void, class A3 = void, class A4 = void, class A5 = void> class event_function;
|
|
template <class T, class D, class A1 = void, class A2 = void, class A3 = void, class A4 = void, class A5 = void> class event_function_with_data;
|
|
template <class T, class A1 = void, class A2 = void, class A3 = void, class A4 = void, class A5 = void> class generic_event_function;
|
|
template <class T, class D, class A1 = void, class A2 = void, class A3 = void, class A4 = void, class A5 = void> class generic_event_function_with_data;
|
|
template <class A1 = void, class A2 = void, class A3 = void, class A4 = void, class A5 = void> class event;
|
|
typedef event<> Event;
|
|
|
|
#define _COUNT 0
|
|
#define _TMPLARGS
|
|
#define _TMPLARGLIST
|
|
#define _TMPLARGLISTP void, void, void, void, void
|
|
#define _CALLARGS
|
|
#define _CALLARGLIST
|
|
#define _CALLARGPTRS 0
|
|
|
|
#include "tlEventsVar.h"
|
|
|
|
#undef _VOIDLIST
|
|
#undef _CALLARGPTRS
|
|
#undef _CALLARGLIST
|
|
#undef _CALLARGS
|
|
#undef _TMPLARGLISTP
|
|
#undef _TMPLARGLIST
|
|
#undef _TMPLARGS
|
|
#undef _COUNT
|
|
|
|
#define _COUNT 1
|
|
#define _TMPLARGS class A1
|
|
#define _TMPLARGLIST A1
|
|
#define _TMPLARGLISTP A1, void, void, void, void
|
|
#define _CALLARGS a1
|
|
#define _CALLARGLIST A1 a1
|
|
#define _CALLARGPTRS (void *)&a1
|
|
|
|
#include "tlEventsVar.h"
|
|
|
|
#undef _VOIDLIST
|
|
#undef _CALLARGPTRS
|
|
#undef _CALLARGLIST
|
|
#undef _CALLARGS
|
|
#undef _TMPLARGLISTP
|
|
#undef _TMPLARGLIST
|
|
#undef _TMPLARGS
|
|
#undef _COUNT
|
|
|
|
#define _COUNT 2
|
|
#define _TMPLARGS class A1, class A2
|
|
#define _TMPLARGLIST A1, A2
|
|
#define _TMPLARGLISTP A1, A2, void, void, void
|
|
#define _CALLARGS a1, a2
|
|
#define _CALLARGLIST A1 a1, A2 a2
|
|
#define _VOIDLIST void, void, void
|
|
#define _CALLARGPTRS (void *)&a1, (void *)&a2
|
|
|
|
#include "tlEventsVar.h"
|
|
|
|
#undef _VOIDLIST
|
|
#undef _CALLARGPTRS
|
|
#undef _CALLARGLIST
|
|
#undef _CALLARGS
|
|
#undef _TMPLARGLISTP
|
|
#undef _TMPLARGLIST
|
|
#undef _TMPLARGS
|
|
#undef _COUNT
|
|
|
|
#define _COUNT 3
|
|
#define _TMPLARGS class A1, class A2, class A3
|
|
#define _TMPLARGLIST A1, A2, A3
|
|
#define _TMPLARGLISTP A1, A2, A3, void, void
|
|
#define _CALLARGS a1, a2, a3
|
|
#define _CALLARGLIST A1 a1, A2 a2, A3 a3
|
|
#define _VOIDLIST void, void
|
|
#define _CALLARGPTRS (void *)&a1, (void *)&a2, (void *)&a3
|
|
|
|
#include "tlEventsVar.h"
|
|
|
|
#undef _VOIDLIST
|
|
#undef _CALLARGPTRS
|
|
#undef _CALLARGLIST
|
|
#undef _CALLARGS
|
|
#undef _TMPLARGLISTP
|
|
#undef _TMPLARGLIST
|
|
#undef _TMPLARGS
|
|
#undef _COUNT
|
|
|
|
#define _COUNT 4
|
|
#define _TMPLARGS class A1, class A2, class A3, class A4
|
|
#define _TMPLARGLIST A1, A2, A3, A4
|
|
#define _TMPLARGLISTP A1, A2, A3, A4, void
|
|
#define _CALLARGS a1, a2, a3, a4
|
|
#define _CALLARGLIST A1 a1, A2 a2, A3 a3, A4 a4
|
|
#define _VOIDLIST void
|
|
#define _CALLARGPTRS (void *)&a1, (void *)&a2, (void *)&a3, (void *)&a4
|
|
|
|
#include "tlEventsVar.h"
|
|
|
|
#undef _VOIDLIST
|
|
#undef _CALLARGPTRS
|
|
#undef _CALLARGLIST
|
|
#undef _CALLARGS
|
|
#undef _TMPLARGLISTP
|
|
#undef _TMPLARGLIST
|
|
#undef _TMPLARGS
|
|
#undef _COUNT
|
|
|
|
}
|
|
|
|
#endif
|