33 void SkipEmptyLines(std::istream &input);
 
   34 void SkipWSCharacters(std::istream &input);
 
   35 bool NextCharacterIsEOL(std::istream &input);
 
   59 template<
class> 
struct InvalidTupleType;
 
   62 struct InvalidTupleType<TNtuple>
 
   70 struct InvalidTupleType<TNtupleD>
 
   79 template<
class DataType, 
class Tuple>
 
   80 Long64_t FillNtupleFromStream(std::istream &inputStream, Tuple &tuple, 
char delimiter, 
bool strictMode)
 
   82    InvalidTupleType<Tuple> typeChecker;
 
   84    if (delimiter == 
'\r' || delimiter == 
'\n') {
 
   85       ::Error(
"FillNtupleFromStream", 
"invalid delimiter - newline character");
 
   89    if (delimiter == 
'#') {
 
   90       ::Error(
"FillNtuplesFromStream", 
"invalid delimiter, '#' symbols can only start a comment");
 
   94    const Int_t nVars = tuple.GetNvar();
 
   96       ::Error(
"FillNtupleFromStream", 
"invalid number of elements");
 
  100    DataType *args = tuple.GetArgs();
 
  101    assert(args != 0 && 
"FillNtupleFromStream, args buffer is a null");
 
  109          SkipEmptyLines(inputStream);
 
  111          if (!inputStream.good()) {
 
  113                ::Error(
"FillNtupleFromStream", 
"no data read");
 
  118          for (Int_t i = 0; i < nVars; ++i) {
 
  119             SkipWSCharacters(inputStream);
 
  120             if (!inputStream.good()) {
 
  121                ::Error(
"FillNtupleFromStream", 
"failed to read a tuple (not enough values found)");
 
  125             if (i > 0 && !std::isspace(delimiter)) {
 
  126                const char test = inputStream.peek();
 
  127                if (!inputStream.good() || test != delimiter) {
 
  128                   ::Error(
"FillNtupleFromStream", 
"delimiter expected");
 
  133                SkipWSCharacters(inputStream);
 
  136             if (NextCharacterIsEOL(inputStream)) {
 
  138                ::Error(
"FillNtupleFromStream", 
"unexpected character or eof found");
 
  142             inputStream>>args[i];
 
  144             if (!(inputStream.eof() && i + 1 == nVars) && !inputStream.good()){
 
  145                ::Error(
"FillNtupleFromStream", 
"error while reading a value");
 
  150          SkipWSCharacters(inputStream);
 
  151          if (!NextCharacterIsEOL(inputStream)) {
 
  152             ::Error(
"FillNtupleFromStream",
 
  153                     "only whitespace and new line can follow the last number on the line");
 
  159          static_cast<TTree &
>(tuple).Fill();
 
  168          SkipEmptyLines(inputStream);
 
  170          if (!inputStream.good()) {
 
  173                ::Error(
"FillNtupleFromStream", 
"no data read");
 
  175                ::Error(
"FillNtupleFromStream", 
"unexpected character or eof found");
 
  179          if (i > 0 && !std::isspace(delimiter)) {
 
  181             const char test = inputStream.peek();
 
  182             if (!inputStream.good() || test != delimiter) {
 
  183                ::Error(
"FillNtupleFromStream", 
"delimiter expected (non-strict mode)");
 
  188             SkipEmptyLines(inputStream);
 
  192          inputStream>>args[i];
 
  194          if (!(inputStream.eof() && i + 1 == nVars) && !inputStream.good()){
 
  195             ::Error(
"FillNtupleFromStream", 
"error while reading a value");
 
  199          if (i + 1 == nVars) {
 
  201             static_cast<TTree &
>(tuple).Fill();
 
  212 template Long64_t FillNtupleFromStream<Float_t, TNtuple>(std::istream &, TNtuple &, char, bool);
 
  213 template Long64_t FillNtupleFromStream<Double_t, TNtupleD>(std::istream &, TNtupleD &, char, bool);
 
  240 void SkipComment(std::istream &input)
 
  242    while (input.good()) {
 
  243       const char next = input.peek();
 
  246          if (next == 
'\r' || next == 
'\n')
 
  259 void SkipEmptyLines(std::istream &input)
 
  261    while (input.good()) {
 
  262       const char c = input.peek();
 
  268       else if (!std::isspace(c))
 
  280 void SkipWSCharacters(std::istream &input)
 
  282    while (input.good()) {
 
  283       const char next = input.peek();
 
  285          if (std::isspace(next) && next != 
'\n' && next != 
'\r')
 
  298 bool NextCharacterIsEOL(std::istream &input)
 
  303    const char next = input.peek();
 
  307    return next == 
'\r' || next == 
'\n';