00001 /* 00002 * Copyright (C) 2010, Willow Garage, Inc. 00003 * 00004 * Redistribution and use in source and binary forms, with or without 00005 * modification, are permitted provided that the following conditions are met: 00006 * * Redistributions of source code must retain the above copyright notice, 00007 * this list of conditions and the following disclaimer. 00008 * * Redistributions in binary form must reproduce the above copyright 00009 * notice, this list of conditions and the following disclaimer in the 00010 * documentation and/or other materials provided with the distribution. 00011 * * Neither the names of Stanford University or Willow Garage, Inc. nor the names of its 00012 * contributors may be used to endorse or promote products derived from 00013 * this software without specific prior written permission. 00014 * 00015 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00016 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00017 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00018 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 00019 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00020 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 00021 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00022 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00023 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 00024 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00025 * POSSIBILITY OF SUCH DAMAGE. 00026 */ 00027 00028 #ifndef ROSCPP_PARAMETER_ADAPTER_H 00029 #define ROSCPP_PARAMETER_ADAPTER_H 00030 00031 #include "ros/forwards.h" 00032 #include "ros/message_event.h" 00033 #include <ros/static_assert.h> 00034 00035 #include <boost/type_traits/add_const.hpp> 00036 #include <boost/type_traits/remove_const.hpp> 00037 #include <boost/type_traits/remove_reference.hpp> 00038 00039 namespace ros 00040 { 00041 00068 template<typename M> 00069 struct ParameterAdapter 00070 { 00071 typedef typename boost::remove_reference<typename boost::remove_const<M>::type>::type Message; 00072 typedef ros::MessageEvent<Message const> Event; 00073 typedef M Parameter; 00074 static const bool is_const = true; 00075 00076 static Parameter getParameter(const Event& event) 00077 { 00078 return *event.getMessage(); 00079 } 00080 }; 00081 00082 template<typename M> 00083 struct ParameterAdapter<const boost::shared_ptr<M const>& > 00084 { 00085 typedef typename boost::remove_reference<typename boost::remove_const<M>::type>::type Message; 00086 typedef ros::MessageEvent<Message const> Event; 00087 typedef const boost::shared_ptr<Message const> Parameter; 00088 static const bool is_const = true; 00089 00090 static Parameter getParameter(const Event& event) 00091 { 00092 return event.getMessage(); 00093 } 00094 }; 00095 00096 template<typename M> 00097 struct ParameterAdapter<const boost::shared_ptr<M>& > 00098 { 00099 typedef typename boost::remove_reference<typename boost::remove_const<M>::type>::type Message; 00100 typedef ros::MessageEvent<Message const> Event; 00101 typedef boost::shared_ptr<Message> Parameter; 00102 static const bool is_const = false; 00103 00104 static Parameter getParameter(const Event& event) 00105 { 00106 return ros::MessageEvent<Message>(event).getMessage(); 00107 } 00108 }; 00109 00110 template<typename M> 00111 struct ParameterAdapter<const M&> 00112 { 00113 typedef typename boost::remove_reference<typename boost::remove_const<M>::type>::type Message; 00114 typedef ros::MessageEvent<Message const> Event; 00115 typedef const M& Parameter; 00116 static const bool is_const = true; 00117 00118 static Parameter getParameter(const Event& event) 00119 { 00120 return *event.getMessage(); 00121 } 00122 }; 00123 00124 template<typename M> 00125 struct ParameterAdapter<boost::shared_ptr<M const> > 00126 { 00127 typedef typename boost::remove_reference<typename boost::remove_const<M>::type>::type Message; 00128 typedef ros::MessageEvent<Message const> Event; 00129 typedef boost::shared_ptr<Message const> Parameter; 00130 static const bool is_const = true; 00131 00132 static Parameter getParameter(const Event& event) 00133 { 00134 return event.getMessage(); 00135 } 00136 }; 00137 00138 template<typename M> 00139 struct ParameterAdapter<boost::shared_ptr<M> > 00140 { 00141 typedef typename boost::remove_reference<typename boost::remove_const<M>::type>::type Message; 00142 typedef ros::MessageEvent<Message const> Event; 00143 typedef boost::shared_ptr<Message> Parameter; 00144 static const bool is_const = false; 00145 00146 static Parameter getParameter(const Event& event) 00147 { 00148 return ros::MessageEvent<Message>(event).getMessage(); 00149 } 00150 }; 00151 00152 template<typename M> 00153 struct ParameterAdapter<const ros::MessageEvent<M const>& > 00154 { 00155 typedef typename boost::remove_reference<typename boost::remove_const<M>::type>::type Message; 00156 typedef ros::MessageEvent<Message const> Event; 00157 typedef const ros::MessageEvent<Message const>& Parameter; 00158 static const bool is_const = true; 00159 00160 static Parameter getParameter(const Event& event) 00161 { 00162 return event; 00163 } 00164 }; 00165 00166 template<typename M> 00167 struct ParameterAdapter<const ros::MessageEvent<M>& > 00168 { 00169 typedef typename boost::remove_reference<typename boost::remove_const<M>::type>::type Message; 00170 typedef ros::MessageEvent<Message const> Event; 00171 typedef ros::MessageEvent<Message> Parameter; 00172 static const bool is_const = false; 00173 00174 static Parameter getParameter(const Event& event) 00175 { 00176 return ros::MessageEvent<Message>(event); 00177 } 00178 }; 00179 00180 } 00181 00182 #endif // ROSCPP_PARAMETER_ADAPTER_H