listener.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:5k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /**
  2.  * @file   listener.h
  3.  * @author Nat Goodspeed
  4.  * @date   2009-03-06
  5.  * @brief  Useful for tests of the LLEventPump family of classes
  6.  * 
  7.  * $LicenseInfo:firstyear=2009&license=viewergpl$
  8.  * 
  9.  * Copyright (c) 2009-2010, Linden Research, Inc.
  10.  * 
  11.  * Second Life Viewer Source Code
  12.  * The source code in this file ("Source Code") is provided by Linden Lab
  13.  * to you under the terms of the GNU General Public License, version 2.0
  14.  * ("GPL"), unless you have obtained a separate licensing agreement
  15.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  16.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  17.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  18.  * 
  19.  * There are special exceptions to the terms and conditions of the GPL as
  20.  * it is applied to this Source Code. View the full text of the exception
  21.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  22.  * online at
  23.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  24.  * 
  25.  * By copying, modifying or distributing this software, you acknowledge
  26.  * that you have read and understood your obligations described above,
  27.  * and agree to abide by those obligations.
  28.  * 
  29.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  30.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  31.  * COMPLETENESS OR PERFORMANCE.
  32.  * $/LicenseInfo$
  33.  */
  34. #if ! defined(LL_LISTENER_H)
  35. #define LL_LISTENER_H
  36. #include "llsd.h"
  37. #include <iostream>
  38. /*****************************************************************************
  39. *   test listener class
  40. *****************************************************************************/
  41. class Listener;
  42. std::ostream& operator<<(std::ostream&, const Listener&);
  43. /// Bear in mind that this is strictly for testing
  44. class Listener
  45. {
  46. public:
  47.     /// Every Listener is instantiated with a name
  48.     Listener(const std::string& name):
  49.         mName(name)
  50.     {
  51. //      std::cout << *this << ": ctorn";
  52.     }
  53. /*==========================================================================*|
  54.     // These methods are only useful when trying to track Listener instance
  55.     // lifespan
  56.     Listener(const Listener& that):
  57.         mName(that.mName),
  58.         mLastEvent(that.mLastEvent)
  59.     {
  60.         std::cout << *this << ": copyn";
  61.     }
  62.     virtual ~Listener()
  63.     {
  64.         std::cout << *this << ": dtorn";
  65.     }
  66. |*==========================================================================*/
  67.     /// You can request the name
  68.     std::string getName() const { return mName; }
  69.     /// This is a typical listener method that returns 'false' when done,
  70.     /// allowing subsequent listeners on the LLEventPump to process the
  71.     /// incoming event.
  72.     bool call(const LLSD& event)
  73.     {
  74. //      std::cout << *this << "::call(" << event << ")n";
  75.         mLastEvent = event;
  76.         return false;
  77.     }
  78.     /// This is an alternate listener that returns 'true' when done, which
  79.     /// stops processing of the incoming event.
  80.     bool callstop(const LLSD& event)
  81.     {
  82. //      std::cout << *this << "::callstop(" << event << ")n";
  83.         mLastEvent = event;
  84.         return true;
  85.     }
  86.     /// ListenMethod can represent either call() or callstop().
  87.     typedef bool (Listener::*ListenMethod)(const LLSD&);
  88.     /**
  89.      * This helper method is only because our test code makes so many
  90.      * repetitive listen() calls to ListenerMethods. In real code, you should
  91.      * call LLEventPump::listen() directly so it can examine the specific
  92.      * object you pass to boost::bind().
  93.      */
  94.     LLBoundListener listenTo(LLEventPump& pump,
  95.                              ListenMethod method=&Listener::call,
  96.                              const LLEventPump::NameList& after=LLEventPump::empty,
  97.                              const LLEventPump::NameList& before=LLEventPump::empty)
  98.     {
  99.         return pump.listen(getName(), boost::bind(method, this, _1), after, before);
  100.     }
  101.     /// Both call() and callstop() set mLastEvent. Retrieve it.
  102.     LLSD getLastEvent() const
  103.     {
  104. //      std::cout << *this << "::getLastEvent() -> " << mLastEvent << "n";
  105.         return mLastEvent;
  106.     }
  107.     /// Reset mLastEvent to a known state.
  108.     void reset(const LLSD& to = LLSD())
  109.     {
  110. //      std::cout << *this << "::reset(" << to << ")n";
  111.         mLastEvent = to;
  112.     }
  113. private:
  114.     std::string mName;
  115.     LLSD mLastEvent;
  116. };
  117. std::ostream& operator<<(std::ostream& out, const Listener& listener)
  118. {
  119.     out << "Listener(" << listener.getName() /* << "@" << &listener */ << ')';
  120.     return out;
  121. }
  122. /**
  123.  * This class tests the relative order in which various listeners on a given
  124.  * LLEventPump are called. Each listen() call binds a particular string, which
  125.  * we collect for later examination. The actual event is ignored.
  126.  */
  127. struct Collect
  128. {
  129.     bool add(const std::string& bound, const LLSD& event)
  130.     {
  131.         result.push_back(bound);
  132.         return false;
  133.     }
  134.     void clear() { result.clear(); }
  135.     typedef std::vector<std::string> StringList;
  136.     StringList result;
  137. };
  138. std::ostream& operator<<(std::ostream& out, const Collect::StringList& strings)
  139. {
  140.     out << '(';
  141.     Collect::StringList::const_iterator begin(strings.begin()), end(strings.end());
  142.     if (begin != end)
  143.     {
  144.         out << '"' << *begin << '"';
  145.         while (++begin != end)
  146.         {
  147.             out << ", "" << *begin << '"';
  148.         }
  149.     }
  150.     out << ')';
  151.     return out;
  152. }
  153. #endif /* ! defined(LL_LISTENER_H) */