30#include "mongo/bson/util/builder.h"
48 stream& operator<<(
const T& v) {
52 operator std::string ()
const {
return ss.str(); }
55 inline bool startsWith(
const char *str,
const char *prefix) {
57 const char *p = prefix;
59 if( *p != *s )
return false;
64 inline bool startsWith(
const std::string& s,
const std::string& p) {
65 return startsWith(s.c_str(), p.c_str());
69 inline bool startsWith(
const char *p,
char ch) {
return *p == ch; }
70 inline bool startsWith(
const std::string& s,
char ch) {
return startsWith(s.c_str(), ch); }
72 inline bool endsWith(
const std::string& s,
const std::string& p) {
75 if( x < l )
return false;
76 return strncmp(s.c_str()+x-l, p.c_str(), l) == 0;
78 inline bool endsWith(
const char *s,
char p) {
79 size_t len = strlen(s);
80 return len && s[len-1] == p;
82 inline bool endsWith(
const char *p,
const char *suffix) {
84 size_t b = strlen(suffix);
85 if ( b > a )
return false;
86 return strcmp(p + a - b, suffix) == 0;
89 inline bool equals(
const char * a ,
const char * b ) {
return strcmp( a , b ) == 0; }
92 inline const char * after(
const char *s,
char x) {
93 const char *p = strchr(s, x);
94 return (p != 0) ? p+1 :
"";
96 inline std::string after(
const std::string& s,
char x) {
97 const char *p = strchr(s.c_str(), x);
98 return (p != 0) ? std::string(p+1) :
"";
102 inline const char * after(
const char *s,
const char *x) {
103 const char *p = strstr(s, x);
104 return (p != 0) ? p+strlen(x) :
"";
106 inline std::string after(
const std::string& s,
const std::string& x) {
107 const char *p = strstr(s.c_str(), x.c_str());
108 return (p != 0) ? std::string(p+x.size()) :
"";
114 inline bool contains(
const std::string& s,
const std::string& x) {
115 return strstr(s.c_str(), x.c_str()) != 0;
117 inline bool contains(
const std::string& s,
char x) {
119 return strchr(s.c_str(), x) != 0;
123 inline std::string before(
const std::string& s,
char x) {
124 const char *p = strchr(s.c_str(), x);
125 return (p != 0) ? s.substr(0, p-s.c_str()) : s;
129 inline std::string before(
const std::string& s,
const std::string& x) {
130 const char *p = strstr(s.c_str(), x.c_str());
131 return (p != 0) ? s.substr(0, p-s.c_str()) : s;
136 inline int shareCommonPrefix(
const char *p,
const char *q) {
139 if( *p == 0 || *q == 0 )
147 inline int shareCommonPrefix(
const std::string &a,
const std::string &b)
148 {
return shareCommonPrefix(a.c_str(), b.c_str()); }
151 inline unsigned toUnsigned(
const std::string& a) {
153 const char *p = a.c_str();
157 x = x * 10 + (*p -
'0');
168 inline bool splitOn(
const std::string &s,
char c, std::string& L, std::string& R) {
169 const char *start = s.c_str();
170 const char *p = strchr(start, c);
175 L = std::string(start, p-start);
176 R = std::string(p+1);
180 inline bool rSplitOn(
const std::string &s,
char c, std::string& L, std::string& R) {
181 const char *start = s.c_str();
182 const char *p = strrchr(start, c);
187 L = std::string(start, p-start);
188 R = std::string(p+1);
193 inline unsigned count(
const std::string& s ,
char c ) {
195 for (
unsigned i=0; i<s.size(); i++ )
202 inline std::string ltrim(
const std::string& s) {
203 const char *p = s.c_str();
204 while( *p ==
' ' ) p++;
209 inline void stripTrailing(std::string& s,
const char *chars) {
210 std::string::iterator to = s.begin();
211 for ( std::string::iterator i = s.begin(); i != s.end(); i++ ) {
215 if ( !contains(chars, *i) ) {
217 s.replace(to, to + 1, 1, *i);
221 s.erase(to, s.end());
232 inline int strcasecmp(
const char* s1,
const char* s2) {
return _stricmp(s1, s2);}
std::stringstream deals with locale so this is a lot faster than std::stringstream for UTF8
Definition builder.h:299
the idea here is to make one liners easy.
Definition str.h:44
the main MongoDB namespace
Definition bulk_operation_builder.h:24
String utilities.
Definition str.h:32