SST/macro
spkt_string.h
Go to the documentation of this file.
1 #ifndef SPKT_STRING_H
2 #define SPKT_STRING_H
3 
4 #include <sstream>
5 #include <sprockit/spkt_config.h>
6 #if !SPKT_HAVE_CPP11 && defined(SPKT_HAVE_BOOST)
7 #include <boost/algorithm/string.hpp>
8 #else
9 #include <cctype>
10 #include <algorithm>
11 #endif
12 
13 namespace sprockit {
14 
15 #define spkt_cstr(x) x->to_string().c_str()
16 
17 template <class A>
18 void
20  std::ostream& os,
21  const A& a)
22 {
23  os << a;
24 }
25 
26 template <class A, class B>
27 void
29  std::ostream& os,
30  const A& a,
31  const B& b)
32 {
33  os << a << b;
34 }
35 
36 template <class A, class B, class C>
37 void
39  std::ostream& os,
40  const A& a,
41  const B& b,
42  const C& c)
43 {
44  os << a << b << c;
45 }
46 
47 template <class A, class B, class C, class D>
48 void
50  std::ostream& os,
51  const A& a,
52  const B& b,
53  const C& c,
54  const D& d)
55 {
56  os << a << b << c
57  << d;
58 }
59 
60 template <class A, class B, class C, class D,
61  class E>
62 void
64  std::ostream& os,
65  const A& a,
66  const B& b,
67  const C& c,
68  const D& d,
69  const E& e)
70 {
71  os << a << b << c
72  << d << e;
73 }
74 
75 template <class A, class B, class C, class D,
76  class E, class F>
77 void
79  std::ostream& os,
80  const A& a,
81  const B& b,
82  const C& c,
83  const D& d,
84  const E& e,
85  const F& f)
86 {
87  os << a << b << c
88  << d << e << f;
89 }
90 
91 template <class A, class B, class C, class D,
92  class E, class F, class G>
93 void
95  std::ostream& os,
96  const A& a,
97  const B& b,
98  const C& c,
99  const D& d,
100  const E& e,
101  const F& f,
102  const G& g)
103 {
104  os << a << b << c
105  << d << e << f
106  << g;
107 }
108 
109 template <class A, class B, class C, class D,
110  class E, class F, class G, class H>
111 void
113  std::ostream& os,
114  const A& a,
115  const B& b,
116  const C& c,
117  const D& d,
118  const E& e,
119  const F& f,
120  const G& g,
121  const H& h)
122 {
123  os << a << b << c
124  << d << e << f
125  << g << h;
126 }
127 
128 template <class A, class B, class C, class D,
129  class E, class F, class G, class H,
130  class I>
131 void
133  std::ostream& os,
134  const A& a,
135  const B& b,
136  const C& c,
137  const D& d,
138  const E& e,
139  const F& f,
140  const G& g,
141  const H& h,
142  const I& i)
143 {
144  os << a << b << c
145  << d << e << f
146  << g << h << i;
147 }
148 
149 template <class A, class B, class C, class D,
150  class E, class F, class G, class H,
151  class I, class J>
152 void
154  std::ostream& os,
155  const char* file, int line,
156  const A& a,
157  const B& b,
158  const C& c,
159  const D& d,
160  const E& e,
161  const F& f,
162  const G& g,
163  const H& h,
164  const I& i,
165  const J& j)
166 {
167  os << a << b << c
168  << d << e << f
169  << g << h << i
170  << j;
171 }
172 
173 template <class A, class B, class C, class D,
174  class E, class F, class G, class H,
175  class I, class J, class K>
176 void
178  std::ostream& os,
179  const A& a,
180  const B& b,
181  const C& c,
182  const D& d,
183  const E& e,
184  const F& f,
185  const G& g,
186  const H& h,
187  const I& i,
188  const J& j,
189  const K& k)
190 {
191  os << a << b << c
192  << d << e << f
193  << g << h << i
194  << j << k;
195 }
196 
197 template <class A, class B, class C, class D,
198  class E, class F, class G, class H,
199  class I, class J, class K, class L>
200 void
202  std::ostream& os,
203  const A& a,
204  const B& b,
205  const C& c,
206  const D& d,
207  const E& e,
208  const F& f,
209  const G& g,
210  const H& h,
211  const I& i,
212  const J& j,
213  const K& k,
214  const L& l)
215 {
216  os << a << b << c
217  << d << e << f
218  << g << h << i
219  << j << k << l;
220 }
221 
222 template <class A, class B, class C, class D,
223  class E, class F, class G, class H,
224  class I, class J, class K, class L,
225  class M>
226 void
228  std::ostream& os,
229  const A& a,
230  const B& b,
231  const C& c,
232  const D& d,
233  const E& e,
234  const F& f,
235  const G& g,
236  const H& h,
237  const I& i,
238  const J& j,
239  const K& k,
240  const L& l,
241  const M& m)
242 {
243  os << a << b << c
244  << d << e << f
245  << g << h << i
246  << j << k << l
247  << m;
248 }
249 
250 template <class A, class B, class C, class D,
251  class E, class F, class G, class H,
252  class I, class J, class K, class L,
253  class M, class N>
254 void
256  std::ostream& os,
257  const A& a,
258  const B& b,
259  const C& c,
260  const D& d,
261  const E& e,
262  const F& f,
263  const G& g,
264  const H& h,
265  const I& i,
266  const J& j,
267  const K& k,
268  const L& l,
269  const M& m,
270  const N& n)
271 {
272  os << a << b << c
273  << d << e << f
274  << g << h << i
275  << j << k << l
276  << m << n;
277 }
278 
279 template <class A, class B, class C, class D,
280  class E, class F, class G, class H,
281  class I, class J, class K, class L,
282  class M, class N, class O>
283 void
285  std::ostream& os,
286  const A& a,
287  const B& b,
288  const C& c,
289  const D& d,
290  const E& e,
291  const F& f,
292  const G& g,
293  const H& h,
294  const I& i,
295  const J& j,
296  const K& k,
297  const L& l,
298  const M& m,
299  const N& n,
300  const O& o)
301 {
302  os << a << b << c
303  << d << e << f
304  << g << h << i
305  << j << k << l
306  << m << n << o;
307 }
308 
309 #define prim_printf_type(ty) \
310  inline ty to_pod(ty t){ return t; }
311 
312 prim_printf_type(const char*)
313 prim_printf_type(void*)
314 prim_printf_type(double)
315 prim_printf_type(float)
316 prim_printf_type(unsigned long)
317 prim_printf_type(long)
318 prim_printf_type(unsigned int)
319 prim_printf_type(int)
320 prim_printf_type(unsigned short)
321 prim_printf_type(short)
322 prim_printf_type(unsigned long long)
323 prim_printf_type(long long)
324 
325 inline const char*
326 to_pod(const std::string& str){
327  return str.c_str();
328 }
329 
330 std::string
331 printf(const char* fmt, ...);
332 
333 #if SPKT_HAVE_CPP11 || defined(SPKT_HAVE_BOOST)
334 
335 template<typename WritableRangeT>
336 void to_upper(WritableRangeT& input)
337 {
338 #if SPKT_HAVE_CPP11
339  for(char& ch : input) {
340  ch = (char)std::toupper(ch);
341  }
342 #elif defined(SPKT_HAVE_BOOST)
343  boost::algorithm::to_upper(input);
344 #elif SPKT_DISABLE_REGEXP
345  //do nothing
346 #else
347 # error "Either C++11 or Boost is required to build sprockit"
348 #endif
349 }
350 
351 template<typename WritableRangeT>
352 void to_lower(WritableRangeT& input)
353 {
354 #if SPKT_HAVE_CPP11
355  for(char& ch : input) {
356  ch = (char)std::tolower(ch);
357  }
358 #elif defined(SPKT_HAVE_BOOST)
359  boost::algorithm::to_lower(input);
360 #else
361 # error "Either C++11 or Boost is required to build sprockit"
362 #endif
363 }
364 
365 template<typename SequenceT>
366 void trim(SequenceT& input)
367 {
368 #if SPKT_HAVE_CPP11
369  auto check_isspace = [](decltype(*input.begin())& ch) { return (bool)std::isspace(ch); };
370  const auto& first_non_space = std::find_if_not(input.begin(), input.end(), check_isspace);
371  if(first_non_space == input.end()) {
372  input = SequenceT(input.begin(), input.begin()+1);
373  }
374  else {
375  const auto& last_non_space = std::find_if_not(input.rbegin(), input.rend(), check_isspace);
376  if(last_non_space == input.rbegin() + 1) {
377  input = SequenceT(first_non_space, input.end());
378  }
379  else {
380  input = SequenceT(first_non_space, last_non_space.base() + 1);
381  }
382  }
383 #elif defined(SPKT_HAVE_BOOST)
384  boost::algorithm::trim(input);
385 #else
386 # error "Either C++11 or Boost is required to build sprockit"
387 #endif
388 }
389 
390 #endif
391 
392 }
393 
394 
395 #endif // SPKT_STRING_H
396 
void spkt_to_stream(std::ostream &os, const A &a)
Definition: spkt_string.h:19
std::string printf(const char *fmt,...)
prim_printf_type(const char *) prim_printf_type(void *) prim_printf_type(double) prim_printf_type(float) prim_printf_type(unsigned long) prim_printf_type(long) prim_printf_type(unsigned int) prim_printf_type(int) prim_printf_type(unsigned short) prim_printf_type(short) prim_printf_type(unsigned long long) prim_printf_type(long long) inline const char *to_pod(const std
Definition: spkt_string.h:312
std::basic_string< CharType, Traits, Alloc > trim(const typename std::basic_string< CharType, Traits, Alloc > &s, const typename std::basic_string< CharType, Traits, Alloc > &spaces=" \t")
A utility function to trim spaces off a std::string.