197403Sobrien// std::moneypunct implementation details, generic version -*- C++ -*-
297403Sobrien
3169691Skan// Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
497403Sobrien//
597403Sobrien// This file is part of the GNU ISO C++ Library.  This library is free
697403Sobrien// software; you can redistribute it and/or modify it under the
797403Sobrien// terms of the GNU General Public License as published by the
897403Sobrien// Free Software Foundation; either version 2, or (at your option)
997403Sobrien// any later version.
1097403Sobrien
1197403Sobrien// This library is distributed in the hope that it will be useful,
1297403Sobrien// but WITHOUT ANY WARRANTY; without even the implied warranty of
1397403Sobrien// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1497403Sobrien// GNU General Public License for more details.
1597403Sobrien
1697403Sobrien// You should have received a copy of the GNU General Public License along
1797403Sobrien// with this library; see the file COPYING.  If not, write to the Free
18169691Skan// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
1997403Sobrien// USA.
2097403Sobrien
2197403Sobrien// As a special exception, you may use this file as part of a free software
2297403Sobrien// library without restriction.  Specifically, if other files instantiate
2397403Sobrien// templates or use macros or inline functions from this file, or you compile
2497403Sobrien// this file and link it with other files to produce an executable, this
2597403Sobrien// file does not by itself cause the resulting executable to be covered by
2697403Sobrien// the GNU General Public License.  This exception does not however
2797403Sobrien// invalidate any other reasons why the executable file might be covered by
2897403Sobrien// the GNU General Public License.
2997403Sobrien
3097403Sobrien//
3197403Sobrien// ISO C++ 14882: 22.2.6.3.2  moneypunct virtual functions
3297403Sobrien//
3397403Sobrien
3497403Sobrien// Written by Benjamin Kosnik <bkoz@redhat.com>
3597403Sobrien
3697403Sobrien#include <locale>
3797403Sobrien
38169691Skan_GLIBCXX_BEGIN_NAMESPACE(std)
39169691Skan
4097403Sobrien  // Construct and return valid pattern consisting of some combination of:
4197403Sobrien  // space none symbol sign value
4297403Sobrien  money_base::pattern
4397403Sobrien  money_base::_S_construct_pattern(char, char, char)
4497403Sobrien  { return _S_default_pattern; }
4597403Sobrien
4697403Sobrien  template<>
4797403Sobrien    void
48102782Skan    moneypunct<char, true>::_M_initialize_moneypunct(__c_locale, const char*)
4997403Sobrien    {
50132720Skan      // "C" locale.
51132720Skan      if (!_M_data)
52132720Skan	_M_data = new __moneypunct_cache<char, true>;
53132720Skan
54132720Skan      _M_data->_M_decimal_point = '.';
55132720Skan      _M_data->_M_thousands_sep = ',';
56132720Skan      _M_data->_M_grouping = "";
57132720Skan      _M_data->_M_grouping_size = 0;
58132720Skan      _M_data->_M_curr_symbol = "";
59132720Skan      _M_data->_M_curr_symbol_size = 0;
60132720Skan      _M_data->_M_positive_sign = "";
61132720Skan      _M_data->_M_positive_sign_size = 0;
62132720Skan      _M_data->_M_negative_sign = "";
63132720Skan      _M_data->_M_negative_sign_size = 0;
64132720Skan      _M_data->_M_frac_digits = 0;
65132720Skan      _M_data->_M_pos_format = money_base::_S_default_pattern;
66132720Skan      _M_data->_M_neg_format = money_base::_S_default_pattern;
67132720Skan
68132720Skan      for (size_t __i = 0; __i < money_base::_S_end; ++__i)
69132720Skan	_M_data->_M_atoms[__i] = money_base::_S_atoms[__i];
7097403Sobrien    }
7197403Sobrien
7297403Sobrien  template<>
7397403Sobrien    void
74102782Skan    moneypunct<char, false>::_M_initialize_moneypunct(__c_locale, const char*)
7597403Sobrien    {
76132720Skan      // "C" locale.
77132720Skan      if (!_M_data)
78132720Skan	_M_data = new __moneypunct_cache<char, false>;
79132720Skan
80132720Skan      _M_data->_M_decimal_point = '.';
81132720Skan      _M_data->_M_thousands_sep = ',';
82132720Skan      _M_data->_M_grouping = "";
83132720Skan      _M_data->_M_grouping_size = 0;
84132720Skan      _M_data->_M_curr_symbol = "";
85132720Skan      _M_data->_M_curr_symbol_size = 0;
86132720Skan      _M_data->_M_positive_sign = "";
87132720Skan      _M_data->_M_positive_sign_size = 0;
88132720Skan      _M_data->_M_negative_sign = "";
89132720Skan      _M_data->_M_negative_sign_size = 0;
90132720Skan      _M_data->_M_frac_digits = 0;
91132720Skan      _M_data->_M_pos_format = money_base::_S_default_pattern;
92132720Skan      _M_data->_M_neg_format = money_base::_S_default_pattern;
93132720Skan
94132720Skan      for (size_t __i = 0; __i < money_base::_S_end; ++__i)
95132720Skan	_M_data->_M_atoms[__i] = money_base::_S_atoms[__i];
9697403Sobrien    }
9797403Sobrien
9897403Sobrien  template<>
9997403Sobrien    moneypunct<char, true>::~moneypunct()
100132720Skan    { delete _M_data; }
10197403Sobrien
10297403Sobrien  template<>
10397403Sobrien    moneypunct<char, false>::~moneypunct()
104132720Skan    { delete _M_data; }
10597403Sobrien
106132720Skan#ifdef _GLIBCXX_USE_WCHAR_T
10797403Sobrien  template<>
10897403Sobrien    void
109102782Skan    moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale,
110102782Skan							const char*)
11197403Sobrien    {
11297403Sobrien      // "C" locale
113132720Skan      if (!_M_data)
114132720Skan	_M_data = new __moneypunct_cache<wchar_t, true>;
115132720Skan
116132720Skan      _M_data->_M_decimal_point = L'.';
117132720Skan      _M_data->_M_thousands_sep = L',';
118132720Skan      _M_data->_M_grouping = "";
119132720Skan      _M_data->_M_grouping_size = 0;
120132720Skan      _M_data->_M_curr_symbol = L"";
121132720Skan      _M_data->_M_curr_symbol_size = 0;
122132720Skan      _M_data->_M_positive_sign = L"";
123132720Skan      _M_data->_M_positive_sign_size = 0;
124132720Skan      _M_data->_M_negative_sign = L"";
125132720Skan      _M_data->_M_negative_sign_size = 0;
126132720Skan      _M_data->_M_frac_digits = 0;
127132720Skan      _M_data->_M_pos_format = money_base::_S_default_pattern;
128132720Skan      _M_data->_M_neg_format = money_base::_S_default_pattern;
129132720Skan
130132720Skan      for (size_t __i = 0; __i < money_base::_S_end; ++__i)
131169691Skan	_M_data->_M_atoms[__i] =
132169691Skan	  static_cast<wchar_t>(money_base::_S_atoms[__i]);
13397403Sobrien    }
13497403Sobrien
13597403Sobrien  template<>
13697403Sobrien    void
137102782Skan    moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale,
138102782Skan							 const char*)
13997403Sobrien    {
14097403Sobrien      // "C" locale
141132720Skan      if (!_M_data)
142132720Skan	_M_data = new __moneypunct_cache<wchar_t, false>;
143132720Skan
144132720Skan      _M_data->_M_decimal_point = L'.';
145132720Skan      _M_data->_M_thousands_sep = L',';
146132720Skan      _M_data->_M_grouping = "";
147132720Skan      _M_data->_M_grouping_size = 0;
148132720Skan      _M_data->_M_curr_symbol = L"";
149132720Skan      _M_data->_M_curr_symbol_size = 0;
150132720Skan      _M_data->_M_positive_sign = L"";
151132720Skan      _M_data->_M_positive_sign_size = 0;
152132720Skan      _M_data->_M_negative_sign = L"";
153132720Skan      _M_data->_M_negative_sign_size = 0;
154132720Skan      _M_data->_M_frac_digits = 0;
155132720Skan      _M_data->_M_pos_format = money_base::_S_default_pattern;
156132720Skan      _M_data->_M_neg_format = money_base::_S_default_pattern;
157132720Skan
158132720Skan      for (size_t __i = 0; __i < money_base::_S_end; ++__i)
159169691Skan	_M_data->_M_atoms[__i] =
160169691Skan	  static_cast<wchar_t>(money_base::_S_atoms[__i]);
16197403Sobrien    }
16297403Sobrien
16397403Sobrien  template<>
16497403Sobrien    moneypunct<wchar_t, true>::~moneypunct()
165132720Skan    { delete _M_data; }
16697403Sobrien
16797403Sobrien  template<>
16897403Sobrien    moneypunct<wchar_t, false>::~moneypunct()
169132720Skan    { delete _M_data; }
17097403Sobrien#endif
171169691Skan
172169691Skan_GLIBCXX_END_NAMESPACE
173