28 #ifndef stl_extensions_H
29 #define stl_extensions_H
56 using namespace mrpt::utils::metaprogramming;
61 #define MRPTSTL_SERIALIZABLE_SEQ_CONTAINER( CONTAINER ) \
63 template <class T,class _Ax> \
64 CStream& operator << (CStream& out, const CONTAINER<T,_Ax> &obj) \
66 out << string(#CONTAINER) << TTypeName<T>::get(); \
67 out << static_cast<uint32_t>(obj.size()); \
68 for_each( obj.begin(), obj.end(), ObjectWriteToStream(&out) ); \
72 template <class T,class _Ax> \
73 CStream& operator >> (CStream& in, CONTAINER<T,_Ax> &obj) \
76 string pref,stored_T; \
78 if (pref!=#CONTAINER) THROW_EXCEPTION(format("Error: serialized container %s<%s>'s preambles is wrong: '%s'",#CONTAINER,TTypeName<T>::get().c_str(),pref.c_str() )) \
80 if (stored_T != TTypeName<T>::get() ) THROW_EXCEPTION(format("Error: serialized container %s< %s != %s >",#CONTAINER,stored_T.c_str(),TTypeName<T>::get().c_str() )) \
84 for_each( obj.begin(), obj.end(), ObjectReadFromStream(&in) ); \
89 #define MRPTSTL_SERIALIZABLE_ASSOC_CONTAINER( CONTAINER ) \
91 template <class K,class V, class _Pr, class _Alloc> \
92 CStream& operator << (CStream& out, const CONTAINER<K,V,_Pr,_Alloc> &obj) \
94 out << string(#CONTAINER) << TTypeName<K>::get() << TTypeName<V>::get(); \
95 out << static_cast<uint32_t>(obj.size()); \
96 for (typename CONTAINER<K,V,_Pr,_Alloc>::const_iterator it=obj.begin();it!=obj.end();++it) \
97 out << it->first << it->second; \
101 template <class K,class V, class _Pr, class _Alloc> \
102 CStream& operator >> (CStream& in, CONTAINER<K,V,_Pr,_Alloc> &obj) \
105 string pref,stored_K,stored_V; \
107 if (pref!=#CONTAINER) THROW_EXCEPTION(format("Error: serialized container %s<%s,%s>'s preamble is wrong: '%s'",#CONTAINER, TTypeName<K>::get().c_str(), TTypeName<V>::get().c_str() ,pref.c_str())) \
109 if (stored_K != TTypeName<K>::get()) THROW_EXCEPTION(format("Error: serialized container %s key type %s != %s",#CONTAINER,stored_K.c_str(), TTypeName<K>::get().c_str())) \
111 if (stored_V != TTypeName<V>::get()) THROW_EXCEPTION(format("Error: serialized container %s value type %s != %s",#CONTAINER,stored_V.c_str(), TTypeName<V>::get().c_str())) \
114 for (uint32_t i=0;i<n;i++) \
119 typename CONTAINER<K,V,_Pr,_Alloc>::iterator it_new = obj.insert(obj.begin(), std::make_pair(key_obj, V()) ); \
120 in >> it_new->second; \
133 #define MRPTSTL_SERIALIZABLE_SIMPLE_ASSOC_CONTAINER( CONTAINER ) \
135 template <class K,class _Pr,class _Alloc> \
136 CStream& operator << (CStream& out, const CONTAINER<K,_Pr,_Alloc> &obj) \
138 out << string(#CONTAINER) << TTypeName<K>::get(); \
139 out << static_cast<uint32_t>(obj.size()); \
140 for (typename CONTAINER<K,_Pr,_Alloc>::const_iterator it=obj.begin();it!=obj.end();++it) \
145 template <class K,class _Pr,class _Alloc> \
146 CStream& operator >> (CStream& in, CONTAINER<K,_Pr,_Alloc> &obj) \
149 string pref,stored_K; \
151 if (pref!=#CONTAINER) THROW_EXCEPTION(format("Error: serialized container %s<%s>'s preamble is wrong: '%s'",#CONTAINER, TTypeName<K>::get().c_str(),pref.c_str())) \
153 if (stored_K != TTypeName<K>::get()) THROW_EXCEPTION(format("Error: serialized container %s key type %s != %s",#CONTAINER,stored_K.c_str(), TTypeName<K>::get().c_str())) \
156 for (uint32_t i=0;i<n;i++) \
160 obj.insert(key_obj); \
166 MRPTSTL_SERIALIZABLE_SIMPLE_ASSOC_CONTAINER(std::multiset)
170 template <class T1,class T2>
174 out << obj.first << obj.second;
178 template <
class T1,
class T2>
181 string pref,stored_K,stored_V;
188 in >> obj.first >> obj.second;
195 template <
class T,
class CONTAINER>
201 return std::string::npos;
207 return cont.erase(it);
232 template <
typename T>
235 std::string ret =
"[";
236 const size_t N = V.size();
237 for (
size_t i=0;i<N;i++)
240 if (i!=(N-1)) ret+=
",";
246 template <
typename Derived>
247 std::string
sprintf_vector(
const char *fmt,
const Eigen::MatrixBase<Derived> &V )
249 std::string ret =
"[";
250 const size_t N = V.size();
251 for (
size_t i=0;i<N;i++)
254 if (i!=(N-1)) ret+=
",";
261 template <
typename T>
268 struct ci_less : std::binary_function<std::string,std::string,bool>
272 bool operator()(
const char c1,
const char c2)
const {
return tolower(c1)<tolower(c2); }
274 bool operator() (
const std::string & s1,
const std::string & s2)
const {
275 return std::lexicographical_compare(s1.begin(),s1.end(), s2.begin(),s2.end(),
nocase_compare());