Go to the documentation of this file.00001
00002 #ifndef mbl_parse_sequence_h_
00003 #define mbl_parse_sequence_h_
00004
00005
00006
00007
00008
00009
00010 #include <vcl_algorithm.h>
00011 #include <vcl_istream.h>
00012 #include <vcl_iterator.h>
00013 #include <mbl/mbl_exception.h>
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 template <class ITER, class T>
00029 inline void mbl_parse_sequence(vcl_istream &afs, ITER insert_iter, T )
00030 {
00031
00032
00033
00034
00035
00036 if (!afs) return;
00037 char brace1, brace2;
00038 afs >> vcl_ws >> brace1;
00039 if (afs.eof()) return;
00040
00041 if ( brace1 == '{')
00042 {
00043 vcl_copy(vcl_istream_iterator<T>(afs),
00044 vcl_istream_iterator<T>(), insert_iter);
00045
00046 if (afs.fail())
00047 afs.clear();
00048
00049 afs >> vcl_ws >> brace2;
00050 if (!afs || brace2 != '}')
00051 {
00052 afs.putback(brace2);
00053 afs.clear(vcl_ios::failbit);
00054 throw mbl_exception_parse_error(
00055 "mbl_parse_sequence failed to find closing brace.");
00056 }
00057 }
00058 else
00059 {
00060 afs.putback(brace1);
00061
00062 vcl_copy(vcl_istream_iterator<T>(afs),
00063 vcl_istream_iterator<T>(), insert_iter);
00064
00065 if (afs.fail())
00066 afs.clear();
00067
00068 char c;
00069 afs >> c;
00070 if (!(!afs))
00071 {
00072 afs.putback(c);
00073 afs.clear(vcl_ios::failbit);
00074
00075 throw mbl_exception_parse_error(
00076 "mbl_parse_sequence failed to find EOF.");
00077 }
00078 afs.clear(vcl_ios::eofbit);
00079 }
00080 }
00081
00082 #endif // mbl_parse_sequence_h_