1// Copyright (C) 2003-2015 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 <cstring>
21#include <fstream>
22#include <langinfo.h>
23#include <iconv.h>
24#include <testsuite_performance.h>
25
26// libstdc++/11602
27int main(int argc, char** argv)
28{
29  using namespace std;
30  using namespace __gnu_test;
31
32  time_counter time;
33  resource_counter resource;
34  const int iters = 300000;
35
36  wchar_t wbuf[1024];
37  char cbuf[1024];
38
39  wmemset(wbuf, L'a', 1024);
40
41  // C (iconv)
42  iconv_t cd = iconv_open(nl_langinfo(CODESET), "WCHAR_T");
43  start_counters(time, resource);
44  for (int i = 0; i < iters; ++i)
45    {
46      size_t inbytesleft = 1024 * sizeof(wchar_t);
47      size_t outbytesleft = 1024;
48      char* in = reinterpret_cast<char*>(wbuf);
49      char* out = cbuf;
50      iconv(cd, &in, &inbytesleft, &out, &outbytesleft);
51    }
52  stop_counters(time, resource);
53  iconv_close(cd);
54  report_performance(__FILE__, "C (iconv)", time, resource);
55  clear_counters(time, resource);
56
57  // C++ (codecvt)
58  locale loc;
59  const codecvt<wchar_t, char, mbstate_t>& cvt =
60    use_facet<codecvt<wchar_t, char, mbstate_t> >(loc);
61  mbstate_t state;
62  memset(&state, 0, sizeof(state));
63  start_counters(time, resource);
64  for (int i = 0; i < iters; ++i)
65    {
66      const wchar_t* from_next;
67      char* to_next;
68      cvt.out(state, wbuf, wbuf + 1024, from_next,
69	      cbuf, cbuf + 1024, to_next);
70    }
71  stop_counters(time, resource);
72  report_performance(__FILE__, "C++ (codecvt)", time, resource);
73
74  return 0;
75}
76