1// Copyright (C) 2003, 2009 Free Software Foundation
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// 22.2.2.2.1  num_put members
19
20#include <locale>
21#include <sstream>
22#include <testsuite_hooks.h>
23
24struct Ctype: std::ctype<wchar_t>
25{
26  wchar_t
27  do_widen(char c) const
28  { return L'A' + c % 26; }
29
30  const char*
31  do_widen(const char* lo, const char* hi, wchar_t* to) const
32  {
33    for (; lo != hi; *to++ = Ctype::do_widen(*lo++));
34    return hi;
35  }
36};
37
38// See http://gcc.gnu.org/ml/libstdc++/2003-11/msg00154.html
39void test01()
40{
41  using namespace std;
42  bool test __attribute__((unused)) = true;
43
44  wostringstream oss;
45  oss.imbue(locale(locale::classic(), new Ctype));
46  const num_put<wchar_t>& np = use_facet<num_put<wchar_t> >(oss.getloc());
47
48  const wstring empty;
49  wstring result;
50  long inum = 123;
51  double fnum = 123.456;
52
53  np.put(oss.rdbuf(), oss, L'+', inum);
54  result = oss.str();
55  VERIFY( result == L"XYZ" );
56
57  oss.clear();
58  oss.str(empty);
59  np.put(oss.rdbuf(), oss, L'+', fnum);
60  result = oss.str();
61  VERIFY( result == L"XYZ.ABC" );
62}
63
64int main()
65{
66  test01();
67}
68