00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00039 #ifndef MONGO_ROS_METADATA_H
00040 #define MONGO_ROS_METADATA_H
00041
00042
00043
00044 #ifdef __APPLE__
00045 #include <malloc/malloc.h>
00046 #else
00047 #include <malloc.h>
00048 #endif
00049 #include <mongo_ros/config.h>
00050 #include <ros/ros.h>
00051
00052
00053 namespace mongo_ros
00054 {
00055
00056 using mongo::LT;
00057 using mongo::LTE;
00058 using mongo::GT;
00059 using mongo::GTE;
00060 using mongo::BSONObj;
00061 using mongo::BSONObjBuilder;
00062
00067 class WrappedBSON : public BSONObj
00068 {
00069 public:
00070 WrappedBSON () :
00071 BSONObj(), builder_(new BSONObjBuilder())
00072 {}
00073
00074 WrappedBSON (const WrappedBSON& other) :
00075 BSONObj(), builder_(other.builder_)
00076 {
00077 update();
00078 }
00079
00080 WrappedBSON (const std::string& json) :
00081 BSONObj(), builder_(new BSONObjBuilder())
00082 {
00083 builder_->appendElements(mongo::fromjson(json.c_str()));
00084 update();
00085 }
00086
00087 protected:
00088
00089 boost::shared_ptr<BSONObjBuilder> builder_;
00090
00091 void update ()
00092 {
00093 BSONObj::operator=(builder_->asTempObj());
00094 }
00095 };
00096
00097
00107 class Query : public WrappedBSON
00108 {
00109 public:
00110 Query () : WrappedBSON ()
00111 {}
00112
00113 Query (const Query& other) :
00114 WrappedBSON(other)
00115 {}
00116
00117 template <class T>
00118 Query (const std::string& name, const T& val) :
00119 WrappedBSON ()
00120 {
00121 append(name, val);
00122 }
00123
00124 template <class T, class S>
00125 Query (const std::string& name, const S& rel, const T& val) :
00126 WrappedBSON ()
00127 {
00128 append(name, rel, val);
00129 }
00130
00131 template <class T>
00132 Query& append (const std::string& name,
00133 const T& val)
00134 {
00135 *builder_ << name << val;
00136 update();
00137 return *this;
00138 }
00139
00140 template <class T, class S>
00141 Query& append (const std::string& name,
00142 const T& rel,
00143 const S& val)
00144 {
00145 *builder_ << name << rel << val;
00146 update();
00147 return *this;
00148 }
00149
00150
00151 };
00152
00153
00154
00165 class Metadata : public WrappedBSON
00166 {
00167 public:
00168 Metadata() :
00169 WrappedBSON ()
00170 {
00171 initialize();
00172 }
00173
00174 Metadata(const std::string& json) :
00175 WrappedBSON (json)
00176 {
00177 update();
00178 }
00179
00180 Metadata (const Metadata& other) :
00181 WrappedBSON(other)
00182 {
00183 update();
00184 }
00185
00186 template <class T>
00187 Metadata (const std::string& name, const T& val) :
00188 WrappedBSON ()
00189 {
00190 initialize();
00191 append(name, val);
00192 }
00193
00194 template <class T, class T2>
00195 Metadata (const std::string& n, const T& v,
00196 const std::string& n2, const T2& v2) :
00197 WrappedBSON ()
00198 {
00199 initialize();
00200 append(n, v);
00201 append(n2, v2);
00202 }
00203
00204 template <class T1, class T2, class T3>
00205 Metadata (const std::string& n1, const T1& v1,
00206 const std::string& n2, const T2& v2,
00207 const std::string& n3, const T3& v3) :
00208 WrappedBSON ()
00209 {
00210 initialize();
00211 append(n1, v1);
00212 append(n2, v2);
00213 append(n3, v3);
00214 }
00215
00216 template <class T1, class T2, class T3>
00217 Metadata (const std::string& n1, const T1& v1,
00218 const std::string& n2, const T2& v2,
00219 const std::string& n3, const T3& v3,
00220 const std::string& n4, const T3& v4) :
00221 WrappedBSON ()
00222 {
00223 initialize();
00224 append(n1, v1);
00225 append(n2, v2);
00226 append(n3, v3);
00227 append(n4, v4);
00228 }
00229
00230 template <class T1, class T2, class T3>
00231 Metadata (const std::string& n1, const T1& v1,
00232 const std::string& n2, const T2& v2,
00233 const std::string& n3, const T3& v3,
00234 const std::string& n4, const T3& v4,
00235 const std::string& n5, const T3& v5) :
00236 WrappedBSON ()
00237 {
00238 initialize();
00239 append(n1, v1);
00240 append(n2, v2);
00241 append(n3, v3);
00242 append(n4, v4);
00243 append(n5, v5);
00244 }
00245
00246 template <class T>
00247 Metadata& append (const std::string& name,
00248 const T& val)
00249 {
00250 builder_->append(name, val);
00251 update();
00252 return *this;
00253 }
00254
00255 private:
00256
00257 void initialize()
00258 {
00259 builder_->genOID();
00260 builder_->append("creation_time", ros::Time::now().toSec());
00261 update();
00262 }
00263 };
00264
00265
00266
00267
00268 }
00269
00270 #endif // include guard