⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 listener.h

📁 很多二维 三维几何计算算法 C++ 类库
💻 H
字号:
// Copyright (c) 2005  Stanford University (USA).// All rights reserved.//// This file is part of CGAL (www.cgal.org); you can redistribute it and/or// modify it under the terms of the GNU Lesser General Public License as// published by the Free Software Foundation; version 2.1 of the License.// See the file LICENSE.LGPL distributed with CGAL.//// Licensees holding a valid commercial license may use this file in// accordance with the commercial license agreement provided with the software.//// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.//// $URL: svn+ssh://scm.gforge.inria.fr/svn/cgal/branches/CGAL-3.3-branch/Kinetic_data_structures/include/CGAL/Kinetic/Listener.h $// $Id: Listener.h 29334 2006-03-10 00:00:09Z drussel $// //// Author(s)     : Daniel Russel <drussel@alumni.princeton.edu>#ifndef CGAL_TOOLS_LISTENER_BASE_H#define CGAL_TOOLS_LISTENER_BASE_H#include <CGAL/Kinetic/basic.h>CGAL_KINETIC_BEGIN_NAMESPACE//! This is the base class for all listener objects./*!  An object which wishes to provide runtime notifications to other  objects should provide a contained class which uses this base. To  use this base class, implement a class, here called Interface, which  defines a type Interface::Notification_type and a type  Interface::Notifier_pointer.  The Notification_type is generally an enum with one value for each  type of notification which can be used.  The Notifier_pointer is the type of a (ref counted) pointer to the  object providing the notifications. The ref counter pointer must  provide a nested type Pointer which is the type of a raw pointer.  This object maintains a ref counted pointer to the object performing  notifications. It is registered for notifications on construction  and unregistered on destruction using the function set_listener on  the object providing the notifications. The use of ref counted  pointers means that as long as the notification object exists, the  object providing the notifications must exist, ensuring that the  object providing the notifications is not prematurely destroyed.  These objects cannot be copied since the notifier only support one  listener.  Boost provides a similar functionality in the Boost.Signal  package. However, it is quite a bit more complex (and  flexible). This complexity add significantly to compile time and  (although I did not test this directly), I suspect it is much slower  at runtime due to the overhead of worrying about signal orders and  not supporting single signals. In addition, it does not get on well  with Qt due to collisions with the Qt moc keywords.  There is also the TinyTL library which implements signals. As of  writing it did not have any easy support for making sure all  pointers are valid, so it did not seem to offer significant code  saving over writing my own.*/template <class Interface>class Listener: public Interface{  typedef Listener<Interface> LB_this;public:  typedef typename Interface::Notifier_handle::element_type Notifier;  //typedef typename Notifier::Handle Notifier_handle;  Listener(typename Interface::Notifier_handle &nh): h_(nh) {    CGAL_precondition(h_->listener()==NULL);    h_->set_listener(this);  }  Listener(Notifier* nh): h_(nh) {    CGAL_precondition(h_->listener()==NULL);    h_->set_listener(this);  }  Listener(){}  virtual ~Listener() {    CGAL_precondition(h_->listener()==this);    h_->set_listener(NULL);  }  //! Access the object providing notifications.  /*!  This pointer is not intended to be stored, so a bare pointer is    passed. Wrap it with a Notifier_pointer if you for some reason    which to store it.  */  typename Interface::Notifier_handle::element_type* notifier() {    return h_.get();  }  //! Constant version.  /*!    See Listener::notifier()  */  const typename Interface::Notifier_handle::element_type* notifier() const  {    return h_.get();  }  //! The method called when there is a runtime notification to be made  /*!  The Notification_type is the type of notification to be made,    generally an enum with the name of a field of the object providing    notifications.  */  virtual void new_notification(typename Interface::Notification_type nt)=0;private:  Listener(const LB_this &o) {    h_->this_is_not_a_function();    CGAL_assertion(0);  }  const LB_this& operator=(const LB_this &o) {    CGAL_assertion(0);    h_->this_is_not_a_function();    return *this;  }protected:  typename Interface::Notifier_handle h_;};CGAL_KINETIC_END_NAMESPACE#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -