Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "List.H"
00027 #include <OpenFOAM/Istream.H>
00028 #include <OpenFOAM/token.H>
00029 #include <OpenFOAM/SLList.H>
00030 #include <OpenFOAM/contiguous.H>
00031
00032
00033
00034
00035 template<class T>
00036 Foam::List<T>::List(Istream& is)
00037 :
00038 UList<T>(NULL, 0)
00039 {
00040 operator>>(is, *this);
00041 }
00042
00043
00044 template<class T>
00045 Foam::Istream& Foam::operator>>(Istream& is, List<T>& L)
00046 {
00047
00048 L.setSize(0);
00049
00050 is.fatalCheck("operator>>(Istream&, List<T>&)");
00051
00052 token firstToken(is);
00053
00054 is.fatalCheck("operator>>(Istream&, List<T>&) : reading first token");
00055
00056 if (firstToken.isCompound())
00057 {
00058 L.transfer
00059 (
00060 dynamicCast<token::Compound<List<T> > >
00061 (
00062 firstToken.transferCompoundToken()
00063 )
00064 );
00065 }
00066 else if (firstToken.isLabel())
00067 {
00068 label s = firstToken.labelToken();
00069
00070
00071 L.setSize(s);
00072
00073
00074
00075 if (is.format() == IOstream::ASCII || !contiguous<T>())
00076 {
00077
00078 char delimiter = is.readBeginList("List");
00079
00080 if (s)
00081 {
00082 if (delimiter == token::BEGIN_LIST)
00083 {
00084 for (register label i=0; i<s; i++)
00085 {
00086 is >> L[i];
00087
00088 is.fatalCheck
00089 (
00090 "operator>>(Istream&, List<T>&) : reading entry"
00091 );
00092 }
00093 }
00094 else
00095 {
00096 T element;
00097 is >> element;
00098
00099 is.fatalCheck
00100 (
00101 "operator>>(Istream&, List<T>&) : "
00102 "reading the single entry"
00103 );
00104
00105 for (register label i=0; i<s; i++)
00106 {
00107 L[i] = element;
00108 }
00109 }
00110 }
00111
00112
00113 is.readEndList("List");
00114 }
00115 else
00116 {
00117 if (s)
00118 {
00119 is.read(reinterpret_cast<char*>(L.data()), s*sizeof(T));
00120
00121 is.fatalCheck
00122 (
00123 "operator>>(Istream&, List<T>&) : reading the binary block"
00124 );
00125 }
00126 }
00127 }
00128 else if (firstToken.isPunctuation())
00129 {
00130 if (firstToken.pToken() != token::BEGIN_LIST)
00131 {
00132 FatalIOErrorIn("operator>>(Istream&, List<T>&)", is)
00133 << "incorrect first token, expected '(', found "
00134 << firstToken.info()
00135 << exit(FatalIOError);
00136 }
00137
00138
00139 is.putBack(firstToken);
00140
00141
00142 SLList<T> sll(is);
00143
00144
00145 L = sll;
00146 }
00147 else
00148 {
00149 FatalIOErrorIn("operator>>(Istream&, List<T>&)", is)
00150 << "incorrect first token, expected <int> or '(', found "
00151 << firstToken.info()
00152 << exit(FatalIOError);
00153 }
00154
00155 return is;
00156 }
00157
00158
00159 template<class T>
00160 Foam::List<T> Foam::readList(Istream& is)
00161 {
00162 List<T> L;
00163 token firstToken(is);
00164 is.putBack(firstToken);
00165
00166 if (firstToken.isPunctuation())
00167 {
00168 if (firstToken.pToken() != token::BEGIN_LIST)
00169 {
00170 FatalIOErrorIn("readList<T>(Istream&)", is)
00171 << "incorrect first token, expected '(', found "
00172 << firstToken.info()
00173 << exit(FatalIOError);
00174 }
00175
00176
00177 L = SLList<T>(is);
00178 }
00179 else
00180 {
00181
00182 L.setSize(1);
00183
00184 is >> L[0];
00185 }
00186
00187 return L;
00188 }
00189
00190
00191