18 #ifndef SHEVEK_IOSTRING_HH
19 #define SHEVEK_IOSTRING_HH
37 std::stack <Glib::ustring::size_type> pos;
41 bool read_var (Glib::ustring
const &format, T &ret, Glib::ustring::size_type &inpos);
44 void del_whitespace ();
47 bool read_const (Glib::ustring
const &format, Glib::ustring::size_type &inpos);
55 void init (Glib::ustring
const &str)
56 { data = str;
while (!pos.empty ()) pos.pop (); pos.push (0); }
60 void push () { pos.push (pos.top ()); }
65 int pop (
bool keep =
false);
67 void reset () { pos.top () = 0; }
70 Glib::ustring
rest ()
const {
return data.substr (pos.top ()); }
73 void skip (Glib::ustring::size_type p) { pos.top () += p; }
79 Glib::ustring::size_type inpos = 0;
80 bool ret = read_const (format, inpos)
81 && inpos == format.size ();
87 template <
typename T1>
91 Glib::ustring::size_type inpos = 0;
92 bool ret = read_const (format, inpos)
93 && read_var (format, arg1, inpos)
94 && read_const (format, inpos)
95 && inpos == format.size ();
101 template <
typename T1,
typename T2>
106 Glib::ustring::size_type inpos = 0;
107 bool ret = read_const (format, inpos)
108 && read_var (format, arg1, inpos)
109 && read_const (format, inpos)
110 && read_var (format, arg2, inpos)
111 && read_const (format, inpos)
112 && inpos == format.size ();
118 template <
typename T1,
typename T2,
typename T3>
123 Glib::ustring::size_type inpos = 0;
124 bool ret = read_const (format, inpos)
125 && read_var (format, arg1, inpos)
126 && read_const (format, inpos)
127 && read_var (format, arg2, inpos)
128 && read_const (format, inpos)
129 && read_var (format, arg3, inpos)
130 && read_const (format, inpos)
131 && inpos == format.size ();
137 template <
typename T1,
typename T2,
typename T3,
typename T4>
139 T2 &arg2, T3 &arg3, T4 &arg4)
142 Glib::ustring::size_type inpos = 0;
143 bool ret = read_const (format, inpos)
144 && read_var (format, arg1, inpos)
145 && read_const (format, inpos)
146 && read_var (format, arg2, inpos)
147 && read_const (format, inpos)
148 && read_var (format, arg3, inpos)
149 && read_const (format, inpos)
150 && read_var (format, arg4, inpos)
151 && read_const (format, inpos)
152 && inpos == format.size ();
158 template <
typename T1,
typename T2,
typename T3,
typename T4,
161 T2 &arg2, T3 &arg3, T4 &arg4, T5 &arg5)
164 Glib::ustring::size_type inpos = 0;
165 bool ret = read_const (format, inpos)
166 && read_var (format, arg1, inpos)
167 && read_const (format, inpos)
168 && read_var (format, arg2, inpos)
169 && read_const (format, inpos)
170 && read_var (format, arg3, inpos)
171 && read_const (format, inpos)
172 && read_var (format, arg4, inpos)
173 && read_const (format, inpos)
174 && read_var (format, arg5, inpos)
175 && read_const (format, inpos)
176 && inpos == format.size ();
182 template <
typename T1,
typename T2,
typename T3,
typename T4,
183 typename T5,
typename T6>
185 T2 &arg2, T3 &arg3, T4 &arg4, T5 &arg5,
189 Glib::ustring::size_type inpos = 0;
190 bool ret = read_const (format, inpos)
191 && read_var (format, arg1, inpos)
192 && read_const (format, inpos)
193 && read_var (format, arg2, inpos)
194 && read_const (format, inpos)
195 && read_var (format, arg3, inpos)
196 && read_const (format, inpos)
197 && read_var (format, arg4, inpos)
198 && read_const (format, inpos)
199 && read_var (format, arg5, inpos)
200 && read_const (format, inpos)
201 && read_var (format, arg6, inpos)
202 && read_const (format, inpos)
203 && inpos == format.size ();
209 template <
typename T1,
typename T2,
typename T3,
typename T4,
210 typename T5,
typename T6,
typename T7>
212 T2 &arg2, T3 &arg3, T4 &arg4, T5 &arg5,
216 Glib::ustring::size_type inpos = 0;
217 bool ret = read_const (format, inpos)
218 && read_var (format, arg1, inpos)
219 && read_const (format, inpos)
220 && read_var (format, arg2, inpos)
221 && read_const (format, inpos)
222 && read_var (format, arg3, inpos)
223 && read_const (format, inpos)
224 && read_var (format, arg4, inpos)
225 && read_const (format, inpos)
226 && read_var (format, arg5, inpos)
227 && read_const (format, inpos)
228 && read_var (format, arg6, inpos)
229 && read_const (format, inpos)
230 && read_var (format, arg7, inpos)
231 && read_const (format, inpos)
232 && inpos == format.size ();
238 template <
typename T1,
typename T2,
typename T3,
typename T4,
239 typename T5,
typename T6,
typename T7,
typename T8>
241 T2 &arg2, T3 &arg3, T4 &arg4, T5 &arg5,
242 T6 &arg6, T7 &arg7, T8 &arg8)
245 Glib::ustring::size_type inpos = 0;
246 bool ret = read_const (format, inpos)
247 && read_var (format, arg1, inpos)
248 && read_const (format, inpos)
249 && read_var (format, arg2, inpos)
250 && read_const (format, inpos)
251 && read_var (format, arg3, inpos)
252 && read_const (format, inpos)
253 && read_var (format, arg4, inpos)
254 && read_const (format, inpos)
255 && read_var (format, arg5, inpos)
256 && read_const (format, inpos)
257 && read_var (format, arg6, inpos)
258 && read_const (format, inpos)
259 && read_var (format, arg7, inpos)
260 && read_const (format, inpos)
261 && read_var (format, arg8, inpos)
262 && read_const (format, inpos)
263 && inpos == format.size ();
272 template <
typename T>
273 static T
direct (Glib::ustring
const &data,
274 Glib::ustring
const &format,
279 if (!tmp (format, ret))
289 template <
typename T>
290 bool istring::read_var (Glib::ustring
const &format, T &ret,
291 Glib::ustring::size_type &inpos)
294 std::istringstream s (data.substr (pos.top ()));
296 std::streampos p = s.tellg ();
304 template <>
bool istring::read_var <double> (Glib::ustring
const &format,
double &ret, Glib::ustring::size_type &inpos);
307 template <>
bool istring::read_var <float> (Glib::ustring
const &format,
float &ret, Glib::ustring::size_type &inpos);
310 template <>
bool istring::read_var <Glib::ustring> (Glib::ustring
const &format, Glib::ustring &ret, Glib::ustring::size_type &inpos);
313 template <>
bool istring::read_var <int> (Glib::ustring
const &format,
int &ret, Glib::ustring::size_type &inpos);
316 template <>
bool istring::read_var <unsigned> (Glib::ustring
const &format,
unsigned &ret, Glib::ustring::size_type &inpos);
325 Glib::ustring format;
326 Glib::ustring::size_type pos;
328 template <
typename T>
void write_var (T
const &a,
329 Glib::ustring
const &flags,
330 unsigned width,
unsigned precision);
331 template <
typename T>
void write_var_raw (T
const &a);
332 ostring &init (Glib::ustring
const &f);
335 template <
typename T>
ostring &operator ()(T
const &a) { write_const (); write_var_raw (a);
return *
this; }
339 operator Glib::ustring ()
const {
return data; }
341 Glib::ustring
operator+ (Glib::ustring
const &that)
const {
return data + that; }
345 ostring (Glib::ustring
const &fmt) { init (fmt)(); }
347 template <
typename T1>
348 ostring (Glib::ustring
const &fmt, T1
const &a1)
349 { init (fmt)(a1)(); }
351 template <
typename T1,
typename T2>
352 ostring (Glib::ustring
const &fmt, T1
const &a1, T2
const &a2)
353 { init (fmt)(a1)(a2)(); }
355 template <
typename T1,
typename T2,
typename T3>
356 ostring (Glib::ustring
const &fmt, T1
const &a1, T2
const &a2,
358 { init (fmt)(a1)(a2)(a3)(); }
360 template <
typename T1,
typename T2,
typename T3,
typename T4>
361 ostring (Glib::ustring
const &fmt, T1
const &a1, T2
const &a2,
362 T3
const &a3, T4
const &a4)
363 { init (fmt)(a1)(a2)(a3)(a4)(); }
365 template <
typename T1,
typename T2,
typename T3,
typename T4,
367 ostring (Glib::ustring
const &fmt, T1
const &a1, T2
const &a2,
368 T3
const &a3, T4
const &a4, T5
const &a5)
369 { init (fmt)(a1)(a2)(a3)(a4)(a5)(); }
371 template <
typename T1,
typename T2,
typename T3,
typename T4,
372 typename T5,
typename T6>
373 ostring (Glib::ustring
const &fmt, T1
const &a1, T2
const &a2,
374 T3
const &a3, T4
const &a4, T5
const &a5,
376 { init (fmt)(a1)(a2)(a3)(a4)(a5)(a6)(); }
378 template <
typename T1,
typename T2,
typename T3,
typename T4,
379 typename T5,
typename T6,
typename T7>
380 ostring (Glib::ustring
const &fmt, T1
const &a1, T2
const &a2,
381 T3
const &a3, T4
const &a4, T5
const &a5,
382 T6
const &a6, T7
const &a7)
383 { init (fmt)(a1)(a2)(a3)(a4)(a5)(a6)(a7)(); }
385 template <
typename T1,
typename T2,
typename T3,
typename T4,
386 typename T5,
typename T6,
typename T7 ,
typename T8>
387 ostring (Glib::ustring
const &fmt, T1
const &a1, T2
const &a2,
388 T3
const &a3, T4
const &a4, T5
const &a5,
389 T6
const &a6, T7
const &a7, T8
const &a8)
390 { init (fmt)(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(); }
392 template <
typename T1,
typename T2,
typename T3,
typename T4,
393 typename T5,
typename T6,
typename T7 ,
typename T8,
395 ostring (Glib::ustring
const &fmt, T1
const &a1, T2
const &a2,
396 T3
const &a3, T4
const &a4, T5
const &a5,
397 T6
const &a6, T7
const &a7, T8
const &a8,
399 { init (fmt)(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(); }
405 template <
typename T>
void ostring::write_var_raw (T
const &a)
407 unsigned width = 0, precision = 0;
409 while (pos < format.size ()
410 && (format[pos] <
'a' || format[pos] >
'z')
411 && (format[pos] <
'A' || format[pos] >
'Z')
412 && (format[pos] <
'1' || format[pos] >
'9'))
413 flags += format[pos++];
414 while (pos < format.size () && format[pos] >=
'0'
415 && format[pos] <=
'9')
418 width += format[pos++] -
'0';
420 if (pos < format.size () && format[pos] ==
'.')
423 while (pos < format.size () && format[pos] >=
'0'
424 && format[pos] <=
'9')
427 precision += format[pos++] -
'0';
430 return write_var (a, flags, width, precision);
436 template <
typename T>
void ostring::write_var (T
const &a,
437 Glib::ustring
const &flags,
438 unsigned width,
unsigned precision)
443 if (pos < format.size ())
445 std::ostringstream s;
451 template <>
void ostring::write_var <unsigned short> (
unsigned short const &a, Glib::ustring
const &flags,
unsigned width,
unsigned precision);
453 template <>
void ostring::write_var <short> (
short const &a, Glib::ustring
const &flags,
unsigned width,
unsigned precision);
455 template <>
void ostring::write_var <unsigned> (
unsigned const &a, Glib::ustring
const &flags,
unsigned width,
unsigned precision);
457 template <>
void ostring::write_var <int> (
int const &a, Glib::ustring
const &flags,
unsigned width,
unsigned precision);
459 template <>
void ostring::write_var <Glib::ustring> (Glib::ustring
const &a, Glib::ustring
const &flags,
unsigned width,
unsigned precision);
465 template <>
void ostring::write_var_raw <std::string> (std::string
const &a);
466 template <>
bool istring::read_var <std::string> (Glib::ustring
const &format, std::string &ret, Glib::ustring::size_type &inpos);
474 std::stack <std::string::size_type> pos;
477 template <
typename T>
478 bool read_var (std::string
const &format, T &ret, std::string::size_type &inpos);
481 void del_whitespace ();
484 bool read_const (std::string
const &format, std::string::size_type &inpos);
492 void init (std::string
const &str) { data = str;
while (!pos.empty ()) pos.pop (); pos.push (0); }
496 void push () { pos.push (pos.top ()); }
501 int pop (
bool keep =
false);
506 std::string
rest ()
const {
return data.substr (pos.top ()); }
509 void skip (std::string::size_type p) { pos.top () += p; }
515 std::string::size_type inpos = 0;
516 bool ret = read_const (format, inpos)
517 && inpos == format.size ();
523 template <
typename T1>
527 std::string::size_type inpos = 0;
528 bool ret = read_const (format, inpos)
529 && read_var (format, arg1, inpos)
530 && read_const (format, inpos)
531 && inpos == format.size ();
537 template <
typename T1,
typename T2>
542 std::string::size_type inpos = 0;
543 bool ret = read_const (format, inpos)
544 && read_var (format, arg1, inpos)
545 && read_const (format, inpos)
546 && read_var (format, arg2, inpos)
547 && read_const (format, inpos)
548 && inpos == format.size ();
554 template <
typename T1,
typename T2,
typename T3>
559 std::string::size_type inpos = 0;
560 bool ret = read_const (format, inpos)
561 && read_var (format, arg1, inpos)
562 && read_const (format, inpos)
563 && read_var (format, arg2, inpos)
564 && read_const (format, inpos)
565 && read_var (format, arg3, inpos)
566 && read_const (format, inpos)
567 && inpos == format.size ();
573 template <
typename T1,
typename T2,
typename T3,
typename T4>
575 T2 &arg2, T3 &arg3, T4 &arg4)
578 std::string::size_type inpos = 0;
579 bool ret = read_const (format, inpos)
580 && read_var (format, arg1, inpos)
581 && read_const (format, inpos)
582 && read_var (format, arg2, inpos)
583 && read_const (format, inpos)
584 && read_var (format, arg3, inpos)
585 && read_const (format, inpos)
586 && read_var (format, arg4, inpos)
587 && read_const (format, inpos)
588 && inpos == format.size ();
594 template <
typename T1,
typename T2,
typename T3,
typename T4,
597 T2 &arg2, T3 &arg3, T4 &arg4, T5 &arg5)
600 std::string::size_type inpos = 0;
601 bool ret = read_const (format, inpos)
602 && read_var (format, arg1, inpos)
603 && read_const (format, inpos)
604 && read_var (format, arg2, inpos)
605 && read_const (format, inpos)
606 && read_var (format, arg3, inpos)
607 && read_const (format, inpos)
608 && read_var (format, arg4, inpos)
609 && read_const (format, inpos)
610 && read_var (format, arg5, inpos)
611 && read_const (format, inpos)
612 && inpos == format.size ();
618 template <
typename T1,
typename T2,
typename T3,
typename T4,
619 typename T5,
typename T6>
621 T2 &arg2, T3 &arg3, T4 &arg4, T5 &arg5,
625 std::string::size_type inpos = 0;
626 bool ret = read_const (format, inpos)
627 && read_var (format, arg1, inpos)
628 && read_const (format, inpos)
629 && read_var (format, arg2, inpos)
630 && read_const (format, inpos)
631 && read_var (format, arg3, inpos)
632 && read_const (format, inpos)
633 && read_var (format, arg4, inpos)
634 && read_const (format, inpos)
635 && read_var (format, arg5, inpos)
636 && read_const (format, inpos)
637 && read_var (format, arg6, inpos)
638 && read_const (format, inpos)
639 && inpos == format.size ();
645 template <
typename T1,
typename T2,
typename T3,
typename T4,
646 typename T5,
typename T6,
typename T7>
648 T2 &arg2, T3 &arg3, T4 &arg4, T5 &arg5,
652 std::string::size_type inpos = 0;
653 bool ret = read_const (format, inpos)
654 && read_var (format, arg1, inpos)
655 && read_const (format, inpos)
656 && read_var (format, arg2, inpos)
657 && read_const (format, inpos)
658 && read_var (format, arg3, inpos)
659 && read_const (format, inpos)
660 && read_var (format, arg4, inpos)
661 && read_const (format, inpos)
662 && read_var (format, arg5, inpos)
663 && read_const (format, inpos)
664 && read_var (format, arg6, inpos)
665 && read_const (format, inpos)
666 && read_var (format, arg7, inpos)
667 && read_const (format, inpos)
668 && inpos == format.size ();
674 template <
typename T1,
typename T2,
typename T3,
typename T4,
675 typename T5,
typename T6,
typename T7,
typename T8>
677 T2 &arg2, T3 &arg3, T4 &arg4, T5 &arg5,
678 T6 &arg6, T7 &arg7, T8 &arg8)
681 std::string::size_type inpos = 0;
682 bool ret = read_const (format, inpos)
683 && read_var (format, arg1, inpos)
684 && read_const (format, inpos)
685 && read_var (format, arg2, inpos)
686 && read_const (format, inpos)
687 && read_var (format, arg3, inpos)
688 && read_const (format, inpos)
689 && read_var (format, arg4, inpos)
690 && read_const (format, inpos)
691 && read_var (format, arg5, inpos)
692 && read_const (format, inpos)
693 && read_var (format, arg6, inpos)
694 && read_const (format, inpos)
695 && read_var (format, arg7, inpos)
696 && read_const (format, inpos)
697 && read_var (format, arg8, inpos)
698 && read_const (format, inpos)
699 && inpos == format.size ();
708 template <
typename T>
709 static T
direct (std::string
const &data,
710 std::string
const &format,
715 if (!tmp (format, ret))
725 template <
typename T>
726 bool ristring::read_var (std::string
const &format, T &ret,
727 std::string::size_type &inpos)
730 std::istringstream s (data.substr (pos.top ()));
732 std::streampos p = s.tellg ();
741 bool ristring::read_var <double> (std::string
const &format,
742 double &ret, std::string::size_type &inpos);
746 bool ristring::read_var <float> (std::string
const &format,
747 float &ret, std::string::size_type &inpos);
751 bool ristring::read_var <std::string> (std::string
const &format,
752 std::string &ret, std::string::size_type &inpos);
756 bool ristring::read_var <int> (std::string
const &format,
757 int &ret, std::string::size_type &inpos);
761 bool ristring::read_var <unsigned> (std::string
const &format,
762 unsigned &ret, std::string::size_type &inpos);
769 std::string::size_type pos;
771 template <
typename T>
void write_var (T
const &a,
772 std::string
const &flags,
773 unsigned width,
unsigned precision);
774 template <
typename T>
void write_var_raw (T
const &a);
775 rostring &init (std::string
const &f);
776 template <
typename T>
rostring &operator ()(T
const &a)
777 { write_const (); write_var_raw (a);
return *
this; }
781 operator std::string ()
const {
return data; }
783 std::string
operator+ (std::string
const &that)
const {
return data + that; }
790 template <
typename T1>
792 { init (fmt)(a1)(); }
794 template <
typename T1,
typename T2>
795 rostring (std::string
const &fmt, T1
const &a1, T2
const &a2)
796 { init (fmt)(a1)(a2)(); }
798 template <
typename T1,
typename T2,
typename T3>
799 rostring (std::string
const &fmt, T1
const &a1, T2
const &a2, T3
const &a3)
800 { init (fmt)(a1)(a2)(a3)(); }
802 template <
typename T1,
typename T2,
typename T3,
typename T4>
803 rostring (std::string
const &fmt, T1
const &a1, T2
const &a2, T3
const &a3, T4
const &a4)
804 { init (fmt)(a1)(a2)(a3)(a4)(); }
806 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5>
807 rostring (std::string
const &fmt, T1
const &a1, T2
const &a2, T3
const &a3, T4
const &a4, T5
const &a5)
808 { init (fmt)(a1)(a2)(a3)(a4)(a5)(); }
810 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6>
811 rostring (std::string
const &fmt, T1
const &a1, T2
const &a2, T3
const &a3, T4
const &a4, T5
const &a5, T6
const &a6)
812 { init (fmt)(a1)(a2)(a3)(a4)(a5)(a6)(); }
814 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6,
typename T7>
815 rostring (std::string
const &fmt, T1
const &a1, T2
const &a2, T3
const &a3, T4
const &a4, T5
const &a5, T6
const &a6, T7
const &a7)
816 { init (fmt)(a1)(a2)(a3)(a4)(a5)(a6)(a7)(); }
818 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6,
typename T7 ,
typename T8>
819 rostring (std::string
const &fmt, T1
const &a1, T2
const &a2, T3
const &a3, T4
const &a4, T5
const &a5, T6
const &a6, T7
const &a7, T8
const &a8)
820 { init (fmt)(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(); }
822 template <
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
typename T6,
typename T7 ,
typename T8,
typename T9>
823 rostring (std::string
const &fmt, T1
const &a1, T2
const &a2, T3
const &a3, T4
const &a4, T5
const &a5, T6
const &a6, T7
const &a7, T8
const &a8, T9
const &a9)
824 { init (fmt)(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(); }
830 template <
typename T>
void rostring::write_var_raw (T
const &a)
832 unsigned width = 0, precision = 0;
834 while (pos < format.size ()
835 && (format[pos] <
'a' || format[pos] >
'z')
836 && (format[pos] <
'A' || format[pos] >
'Z')
837 && (format[pos] <
'1' || format[pos] >
'9'))
838 flags += format[pos++];
839 while (pos < format.size () && format[pos] >=
'0'
840 && format[pos] <=
'9')
843 width += format[pos++] -
'0';
845 if (pos < format.size () && format[pos] ==
'.')
848 while (pos < format.size () && format[pos] >=
'0'
849 && format[pos] <=
'9')
852 precision += format[pos++] -
'0';
855 return write_var (a, flags, width, precision);
861 template <
typename T>
void rostring::write_var (T
const &a, std::string
const &flags,
unsigned width,
unsigned precision)
866 if (pos < format.size ())
868 std::ostringstream s;
876 template <>
void rostring::write_var <unsigned> (
unsigned const &a, std::string
const &flags,
unsigned width,
unsigned precision);
880 template <>
void rostring::write_var <int> (
int const &a, std::string
const &flags,
unsigned width,
unsigned precision);
886 template <>
void rostring::write_var_raw <Glib::ustring> (Glib::ustring
const &a);
887 template <>
bool ristring::read_var <Glib::ustring> (std::string
const &format, Glib::ustring &ret, std::string::size_type &inpos);