RSB  0.17.0
QueuePushHandler.h
Go to the documentation of this file.
1 /* ============================================================
2  *
3  * This file is a part of RSB project
4  *
5  * Copyright (C) 2010-2013 by Johannes Wienke <jwienke at techfak dot uni-bielefeld dot de>
6  *
7  * This file may be licensed under the terms of the
8  * GNU Lesser General Public License Version 3 (the ``LGPL''),
9  * or (at your option) any later version.
10  *
11  * Software distributed under the License is distributed
12  * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
13  * express or implied. See the LGPL for the specific language
14  * governing rights and limitations.
15  *
16  * You should have received a copy of the LGPL along with this
17  * program. If not, go to http://www.gnu.org/licenses/lgpl.html
18  * or write to the Free Software Foundation, Inc.,
19  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20  *
21  * The development of this software was supported by:
22  * CoR-Lab, Research Institute for Cognition and Robotics
23  * Bielefeld University
24  *
25  * ============================================================ */
26 
27 #pragma once
28 
29 #include <boost/shared_ptr.hpp>
30 #include <boost/type_traits.hpp>
31 
32 #include <rsc/threading/SynchronizedQueue.h>
33 #include <rsc/misc/langutils.h>
34 
35 #include "../Handler.h"
36 
37 namespace rsb {
38 namespace util {
39 
49 template<class T, class DisableEventWarning = void>
50 class QueuePushHandler: public Handler {
51 private:
52  boost::shared_ptr<rsc::threading::SynchronizedQueue<boost::shared_ptr<T> > >
54 public:
55 
56  // Catch the common error that people use this class to receive complete events
57  STATIC_ASSERT_WARN_TEMPLATE(QUEUE_PUSH_HANDLER_EVENT_WARNING,
58  (boost::is_same<DisableEventWarning, Event>::value || !boost::is_same<T, Event>::value),
59  "You probably do not want to use QueuePushHandler with type Event. \
60 If you want to receive complete Event instances inside a queue, you need to use EventQueuePushHandler. \
61 If you really want to use this class and want to get rid of this warning, define the second template parameter of this class to Event, too.");
62 
70  boost::shared_ptr<rsc::threading::SynchronizedQueue<
71  boost::shared_ptr<T> > > queue,
72  const std::string& method = "") :
73  Handler(method), queue(queue) {
74  }
75 
76  std::string getClassName() const {
77  return "QueuePushHandler";
78  }
79 
80  void printContents(std::ostream& stream) const {
81  stream << "queue = " << queue;
82  }
83 
84  void handle(EventPtr event) {
85  queue->push(boost::static_pointer_cast<T>(event->getData()));
86  }
87 };
88 
89 }
90 }
std::string getClassName() const
void printContents(std::ostream &stream) const
Asynchronously called handler interface on the client level.
Definition: Handler.h:53
QueuePushHandler(boost::shared_ptr< rsc::threading::SynchronizedQueue< boost::shared_ptr< T > > > queue, const std::string &method="")
Constructs a new instance.
boost::shared_ptr< rsc::threading::SynchronizedQueue< boost::shared_ptr< T > > > queue
A rsb::Handler for rsb::Listener s that pushes all received data on a rsc::SynchronizedQueue.
STATIC_ASSERT_WARN_TEMPLATE(QUEUE_PUSH_HANDLER_EVENT_WARNING,(boost::is_same< DisableEventWarning, Event >::value||!boost::is_same< T, Event >::value),"You probably do not want to use QueuePushHandler with type Event. \ If you want to receive complete Event instances inside a queue, you need to use EventQueuePushHandler. \ If you really want to use this class and want to get rid of this warning, define the second template parameter of this class to Event, too.")
void handle(EventPtr event)
Handle event.
boost::shared_ptr< Event > EventPtr
Definition: Event.h:264