1// Copyright (C) 2004, 2009 Free Software Foundation, Inc.
2//
3// This file is part of the GNU ISO C++ Library.  This library is free
4// software; you can redistribute it and/or modify it under the
5// terms of the GNU General Public License as published by the
6// Free Software Foundation; either version 3, or (at your option)
7// any later version.
8
9// This library is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12// GNU General Public License for more details.
13
14// You should have received a copy of the GNU General Public License along
15// with this library; see the file COPYING3.  If not see
16// <http://www.gnu.org/licenses/>.
17
18
19#include <cstdio>
20#include <fstream>
21#include <string>
22#include <testsuite_performance.h>
23
24// libstdc++/15002
25int main()
26{
27  using namespace std;
28  using namespace __gnu_test;
29
30  time_counter time;
31  resource_counter resource;
32
33  const char filename[] = "tmp_getline.txt";
34  const unsigned lines = 1000000;
35  const unsigned line_length = 200;
36
37  char* line = new char[line_length + 2];
38
39  // Construct data.
40  {
41    memset(line, 'x', line_length);
42    line[line_length] = '\n';
43    line[line_length + 1] = '\0';
44
45    ofstream out(filename);
46    for (unsigned i = 0; i < lines; ++i)
47      out << line;
48  }
49
50  // C
51  {
52    // Fill the cache.
53    FILE *file = fopen(filename, "r");
54    while (fgets(line, line_length + 2, file));
55    fclose(file);
56
57    file = fopen(filename, "r");
58    start_counters(time, resource);
59    while (fgets(line, line_length + 2, file));
60    stop_counters(time, resource);
61    fclose(file);
62    report_performance(__FILE__, "C (fgets)", time, resource);
63    clear_counters(time, resource);
64  }
65
66  // getline(basic_istream<_CharT, _Traits>& __in,
67  //         basic_string<_CharT, _Traits, _Alloc>& __str, _CharT __delim)
68  {
69    ifstream file(filename);
70    string string_line;
71
72    start_counters(time, resource);
73    while (getline(file, string_line));
74    stop_counters(time, resource);
75    report_performance(__FILE__, "C++ (string)", time, resource);
76    clear_counters(time, resource);
77  }
78
79  // getline(char_type* __s, streamsize __n, char_type __delim)
80  {
81    ifstream file(filename);
82
83    start_counters(time, resource);
84    while (file.getline(line, line_length + 2));
85    stop_counters(time, resource);
86    report_performance(__FILE__, "C++ (char array)", time, resource);
87    clear_counters(time, resource);
88  }
89
90  delete[] line;
91  unlink(filename);
92  return 0;
93}
94